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=[{}], ), ], )
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
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')]
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()
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()
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
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