def test_ensure_integration_uninstall_permissions():
    mock_session = MagicMock()
    mock_session.client.return_value.simulate_principal_policy.return_value = {
        "EvaluationResults": [
            {"EvalActionName": "foo:bar", "EvalDecision": "allowed"},
            {"EvalActionName": "bar:baz", "EvalDecision": "denied"},
        ]
    }

    with raises(UsageError):
        ensure_integration_uninstall_permissions(
            integration_uninstall(session=mock_session)
        )

    mock_session.assert_has_calls([call.client("iam"), call.client("sts")])
    mock_session.assert_has_calls(
        [
            call.client().simulate_principal_policy(
                PolicySourceArn=ANY,
                ActionNames=ANY,
                ResourceArns=["*"],
                ContextEntries=[{}],
            ),
        ],
    )
Beispiel #2
0
def test_publish_duration_metric(mock_session):
    fake_datetime = datetime(2019, 1, 1)
    proxy = MetricsPublisherProxy(ACCOUNT_ID, RESOURCE_TYPE)
    proxy.add_metrics_publisher(mock_session)
    proxy.publish_duration_metric(fake_datetime, Action.CREATE, 100)

    expected_calls = [
        call.client("cloudwatch"),
        call.client().put_metric_data(
            Namespace="AWS/CloudFormation/123412341234/Aa/Bb/Cc",
            MetricData=[{
                "MetricName":
                MetricTypes.HandlerInvocationDuration.name,
                "Dimensions": [
                    {
                        "Name": "DimensionKeyActionType",
                        "Value": "CREATE"
                    },
                    {
                        "Name": "DimensionKeyResourceType",
                        "Value": "Aa::Bb::Cc"
                    },
                ],
                "Unit":
                StandardUnit.Milliseconds.name,
                "Timestamp":
                str(fake_datetime),
                "Value":
                100,
            }],
        ),
    ]
    assert mock_session.mock_calls == expected_calls
Beispiel #3
0
    def test_run(self):
        self.mock_ecs.run_task.return_value = {
            'tasks': [{
                'taskArn': 'tarn',
                'foo': 'bar'
            }]
        }

        def se_client(svcname):
            if svcname == 'ecs':
                return self.mock_ecs
            return self.mock_cw

        with patch('%s.boto3' % pbm) as m_boto:
            m_boto.client.side_effect = se_client
            with patch('%s._log_info_for_task' % pb, autospec=True) as m_lift:
                m_lift.return_value = {'c1': ('g1', 'p1'), 'c2': ('g2', 'p2')}
                res = self.cls.run()
        assert res is None
        assert self.cls._ecs == self.mock_ecs
        assert self.cls._cw == self.mock_cw
        assert self.cls._log_sources == {
            'c1': ('g1', 'p1'),
            'c2': ('g2', 'p2')
        }
        assert self.cls._started is True
        assert self.cls._start_time == datetime(2017, 10, 20, 12, 30, 00)
        assert self.cls._finished is False
        assert self.cls._task_arn == 'tarn'
        assert m_boto.mock_calls == [call.client('ecs'), call.client('logs')]
        assert self.mock_ecs.mock_calls == [
            call.run_task(cluster='clname', taskDefinition='famname', count=1)
        ]
        assert m_lift.mock_calls == [call(self.cls, 'famname')]
Beispiel #4
0
    def test_boto_with_args(self):
        assert self.cls.is_started is False
        assert self.cls.is_finished is False
        assert self.cls.exitcode is None
        assert self.cls.output is None
        self.cls._command = ['foo', 'bar', 'baz']

        m_client = Mock()
        m_body = Mock()
        m_body.read.return_value = 'myContent'
        m_client.get_object.return_value = {
            'Body': m_body
        }
        m_fd = Mock()

        with patch.multiple(
            pbm,
            **{
                'boto3': DEFAULT,
                'requests': DEFAULT,
                'mkstemp': DEFAULT,
                'chmod': DEFAULT,
                'fdopen': DEFAULT
            }
        ) as mocks:
            mocks['boto3'].client.return_value = m_client
            mocks['mkstemp'].return_value = m_fd, '/tmp/tmpfile'
            res = self.cls._get_script('s3://bktname/path/to/key')
        assert res == ['/tmp/tmpfile', 'foo', 'bar', 'baz']
        assert self.cls.is_started is False
        assert self.cls.is_finished is False
        assert self.cls.exitcode is None
        assert self.cls.output is None
        assert mocks['boto3'].mock_calls == [
            call.client('s3'),
            call.client().get_object(Bucket='bktname', Key='path/to/key')
        ]
        assert m_client.mock_calls == [
            call.get_object(Bucket='bktname', Key='path/to/key')
        ]
        assert mocks['requests'].mock_calls == []
        assert mocks['mkstemp'].mock_calls == [
            call('ecsjobs-jname')
        ]
        assert mocks['chmod'].mock_calls == [
            call('/tmp/tmpfile', S_IRUSR | S_IWUSR | S_IXUSR)
        ]
        assert mocks['fdopen'].mock_calls == [
            call(m_fd, 'w'),
            call().write('myContent'),
            call().close()
        ]
def test_remove_log_ingestion_function(success_mock):
    session = MagicMock()

    remove_log_ingestion_function(session)

    session.assert_has_calls(
        [
            call.client("cloudformation"),
            call.client().describe_stacks(StackName="NewRelicLogIngestion"),
            call.client().delete_stack(StackName="NewRelicLogIngestion"),
        ],
        any_order=True,
    )
    success_mock.assert_called_once()
Beispiel #6
0
def test_remove_log_ingestion_function_not_present(success_mock):
    describe_stack_mock = {
        "client.return_value.describe_stacks.side_effect": botocore.exceptions.ClientError(
            {"ResponseMetadata": {"HTTPStatusCode": 404}}, "test"
        )
    }
    session = MagicMock(**describe_stack_mock)

    remove_log_ingestion_function(integration_uninstall(session=session))

    session.assert_has_calls(
        [
            call.client("cloudformation"),
            call.client().describe_stacks(StackName="NewRelicLogIngestion"),
        ],
        any_order=True,
    )
    success_mock.assert_not_called()
Beispiel #7
0
def test_publish_log_delivery_exception_metric(mock_session):
    fake_datetime = datetime(2019, 1, 1)
    proxy = MetricsPublisherProxy(ACCOUNT_ID, RESOURCE_TYPE)
    proxy.add_metrics_publisher(mock_session)
    proxy.publish_log_delivery_exception_metric(fake_datetime,
                                                TypeError("test"))

    expected_calls = [
        call.client("cloudwatch"),
        call.client().put_metric_data(
            Namespace="AWS/CloudFormation/123412341234/Aa/Bb/Cc",
            MetricData=[{
                "MetricName":
                MetricTypes.HandlerException.name,
                "Dimensions": [
                    {
                        "Name": "DimensionKeyActionType",
                        "Value": "ProviderLogDelivery",
                    },
                    {
                        "Name": "DimensionKeyExceptionType",
                        "Value": "<class 'TypeError'>",
                    },
                    {
                        "Name": "DimensionKeyResourceType",
                        "Value": "Aa::Bb::Cc"
                    },
                ],
                "Unit":
                StandardUnit.Count.name,
                "Timestamp":
                str(fake_datetime),
                "Value":
                1.0,
            }],
        ),
    ]
    assert mock_session.mock_calls == expected_calls
Beispiel #8
0
def test_publish_exception_metric(mock_session):
    fake_datetime = datetime(2019, 1, 1)
    proxy = MetricsPublisherProxy(RESOURCE_TYPE)
    proxy.add_metrics_publisher(mock_session)
    proxy.publish_exception_metric(fake_datetime, Action.CREATE,
                                   Exception("fake-err"))
    expected_calls = [
        call.client("cloudwatch"),
        call.client().put_metric_data(
            Namespace="AWS/CloudFormation/Aa/Bb/Cc",
            MetricData=[{
                "MetricName":
                MetricTypes.HandlerException.name,
                "Dimensions": [
                    {
                        "Name": "DimensionKeyActionType",
                        "Value": "CREATE"
                    },
                    {
                        "Name": "DimensionKeyExceptionType",
                        "Value": "<class 'Exception'>",
                    },
                    {
                        "Name": "DimensionKeyResourceType",
                        "Value": "Aa::Bb::Cc"
                    },
                ],
                "Unit":
                StandardUnit.Count.name,
                "Timestamp":
                str(fake_datetime),
                "Value":
                1.0,
            }],
        ),
    ]
    assert mock_session.mock_calls == expected_calls