def test_add_service_setting(self, mock_add_permitted_arns):

        interface = {
            'InterfaceId': 'gem_test-interface_1_0_0',
            'InterfaceUrl': 'test-interface-url',
            'InterfaceSwagger': 'test-interface-swagger'
        }

        stack = mock.MagicMock(name='stack')
        service_directory = mock.MagicMock(name='ServiceDirectory')
        service_directory.get_interface_services.return_value = [interface]

        props = properties.load(
            self.event, LambdaConfigurationResourceHandler.PROPERTIES_SCHEMA)
        services = props.Services
        service = services[0]

        service_settings = {}

        permitted_arns = []

        LambdaConfigurationResourceHandler._add_service_settings(
            stack, service_directory, service, service_settings,
            permitted_arns)

        service_directory.get_interface_services.assert_not_called()

        # If the interface is not from CloudGemFramework it should not be added here
        # Non-project interface references live in the lambda environment variables
        self.assertEquals(service_settings, {})
    def test_add_service_setting(self, mock_add_permitted_arns):

        interface = {
            'InterfaceId': 'gem_test-interface_1_0_0',
            'InterfaceUrl': 'test-interface-url',
            'InterfaceSwagger': 'test-interface-swagger'
        }

        stack = mock.MagicMock(name='stack')
        service_directory = mock.MagicMock(name='ServiceDirectory')
        service_directory.get_interface_services.return_value = [interface]

        props = properties.load(
            self.event, LambdaConfigurationResourceHandler.PROPERTIES_SCHEMA)
        services = props.Services
        service = services[0]

        service_settings = {}

        permitted_arns = []

        LambdaConfigurationResourceHandler._add_service_settings(
            stack, service_directory, service, service_settings,
            permitted_arns)

        service_directory.get_interface_services.assert_called_once_with(
            stack.deployment.deployment_name, service.InterfaceId)

        self.assertEquals(service_settings[service.InterfaceId], interface)

        mock_add_permitted_arns.assert_called_once_with(
            stack, interface, permitted_arns)
    def test_add_permitted_arns(self, mock_parse_interface_url):

        stack = mock.MagicMock(name='stack')
        stack.account_id = 'test-account-id'

        valid_operations = [
            'get', 'put', 'delete', 'post', 'head', 'options', 'patch', 'trace'
        ]
        invalid_operations = ['foo', 'bar']

        all_operations = []
        all_operations.extend(valid_operations)
        all_operations.extend(invalid_operations)

        paths = ['/path/a', '/path/b']

        swagger = {
            'paths': {
                path: {operation: {}
                       for operation in all_operations}
                for path in paths
            }
        }

        interface = {
            'InterfaceId': 'test-interface-id',
            'InterfaceUrl': 'test-interface-url',
            'InterfaceSwagger': json.dumps(swagger)
        }

        actual_permitted_arns = []

        interface_url_parts = LambdaConfigurationResourceHandler.InterfaceUrlParts(
            api_id='test-app-id',
            region='test-region',
            stage_name='test-stage',
            path='test-interface-path')

        mock_parse_interface_url.return_value = interface_url_parts

        LambdaConfigurationResourceHandler._add_permitted_arns(
            stack, interface, actual_permitted_arns)

        expected_permitted_arns = [
            'arn:aws:execute-api:{region}:{account_id}:{api_id}/{stage_name}/{HTTP_VERB}/{interface_path}/*'
            .format(region=interface_url_parts.region,
                    account_id=stack.account_id,
                    api_id=interface_url_parts.api_id,
                    stage_name=interface_url_parts.stage_name,
                    HTTP_VERB=operation.upper(),
                    interface_path=interface_url_parts.path)
            for operation in valid_operations for path in paths
        ]

        self.assertEquals(actual_permitted_arns,
                          AnyOrderListMatcher(expected_permitted_arns))
Beispiel #4
0
    def test_handler_update(self):

        self.event['RequestType'] = 'Update'
        self.event['PhysicalResourceId'] = 'TestStack-TestLogicalResourceId'

        expected_data = {
            'ConfigurationBucket': 'TestBucket',
            'ConfigurationKey': 'TestKey/lambda-function-code.zip',
            'Runtime': 'TestRuntime',
            'Role': 'TestRole'
        }

        expected_physical_id = self.event['PhysicalResourceId'] + "::{}"

        with mock.patch.object(
                custom_resource_response,
                'succeed') as mock_custom_resource_handler_response_succeed:
            with mock.patch.object(role_utils, 'get_access_control_role_arn'
                                   ) as mock_get_access_control_role_arn:
                mock_get_access_control_role_arn.return_value = expected_data[
                    'Role']
                with mock.patch.object(
                        LambdaConfigurationResourceHandler,
                        '_inject_settings') as mock_inject_settings:
                    with mock.patch.object(LambdaConfigurationResourceHandler,
                                           '_add_built_in_settings'
                                           ) as mock_add_built_in_settings:
                        with mock.patch.object(
                                LambdaConfigurationResourceHandler,
                                '_get_input_key') as mock_get_input_key:
                            mock_get_input_key.return_value = '{}/lambda-function-code.zip'.format(
                                self.event['ResourceProperties']
                                ['ConfigurationKey'])
                            mock_inject_settings.return_value = expected_data[
                                'ConfigurationKey']
                            LambdaConfigurationResourceHandler.handler(
                                self.event, self.context)
                            mock_custom_resource_handler_response_succeed.assert_called_once_with(
                                self.event, self.context, expected_data,
                                expected_physical_id)
                            mock_get_access_control_role_arn.assert_called_once_with(
                                {}, self.event['ResourceProperties']
                                ['FunctionName'])
                            mock_inject_settings.assert_called_once_with(
                                self.event['ResourceProperties']['Settings'],
                                self.event['ResourceProperties']['Runtime'],
                                self.event['ResourceProperties']
                                ['ConfigurationBucket'],
                                '{}/lambda-function-code.zip'.format(
                                    self.event['ResourceProperties']
                                    ['ConfigurationKey']), 'TestFunction')
                            mock_add_built_in_settings.assert_called_once_with(
                                self.event['ResourceProperties']['Settings'],
                                self.event['StackId'])
    def test_add_cgf_service_setting(self, mock_add_permitted_arns):
        interface = {
            'InterfaceId': 'CloudGemFramework_test_1_0_0',
            'InterfaceUrl': 'test-interface-url',
            'InterfaceSwagger': 'test-interface-swagger'
        }

        event = {
            'ResourceProperties': {
                'ConfigurationBucket':
                'TestBucket',
                'ConfigurationKey':
                'TestInputKey',
                'FunctionName':
                'TestFunction',
                'Runtime':
                'TestRuntime',
                'Settings': {
                    'TestSettingKey1': 'TestSettingValue1',
                    'TestSettingKey2': 'TestSettingValue2'
                },
                'Services': [{
                    "InterfaceId": "CloudGemFramework_test_1_0_0",
                    "Optional": True
                }, {
                    "InterfaceId": "Gem_TestInterface2_1_0_0",
                    "Optional": True
                }]
            },
            'StackId':
            'arn:aws:cloudformation:TestRegion:TestAccount:stack/TestStack/TestUUID',
            'LogicalResourceId': 'TestLogicalResourceId'
        }

        stack = mock.MagicMock(name='stack')
        service_directory = mock.MagicMock(name='ServiceDirectory')
        service_directory.get_interface_services.return_value = [interface]

        props = properties.load(
            event, LambdaConfigurationResourceHandler.PROPERTIES_SCHEMA)
        services = props.Services
        service = services[0]

        service_settings = {}

        permitted_arns = []

        LambdaConfigurationResourceHandler._add_service_settings(
            stack, service_directory, service, service_settings,
            permitted_arns)

        # For CloudGemFramework_* interfaces this should be called and service_settings should be populated
        service_directory.get_interface_services.assert_called_once()
        self.assertEquals(service_settings[service.InterfaceId], interface)
    def test_inject_settings_python(self):

        expected_settings = self.event['ResourceProperties']['Settings']
        expected_zip_name = 'cgf_lambda_settings/settings.json'

        zip_file = zipfile.ZipFile(StringIO.StringIO(), 'w')

        LambdaConfigurationResourceHandler._inject_settings_python(
            zip_file, expected_settings)

        with zip_file.open(expected_zip_name, 'r') as zip_content_file:
            actual_settings = json.load(zip_content_file)
            self.assertEquals(expected_settings, actual_settings)
Beispiel #7
0
    def test_inject_settings_python(self):
        
        expected_settings = self.event['ResourceProperties']['Settings']
        expected_zip_name = 'CloudCanvas/settings.py'

        zip_file = zipfile.ZipFile(StringIO.StringIO(), 'w')

        LambdaConfigurationResourceHandler._inject_settings_python(zip_file, expected_settings)                        

        with zip_file.open(expected_zip_name, 'r') as zip_content_file:
            globals = {}
            exec(zip_content_file.read(), globals)
            actual_settings = globals['settings']
            self.assertEquals(expected_settings, actual_settings)
Beispiel #8
0
    def test_inject_settings_nodejs(self):
        
        expected_settings = self.event['ResourceProperties']['Settings']
        expected_zip_name = 'CloudCanvas/settings.js'

        zip_file = zipfile.ZipFile(StringIO.StringIO(), 'w')

        LambdaConfigurationResourceHandler._inject_settings_nodejs(zip_file, expected_settings)                        

        with zip_file.open(expected_zip_name, 'r') as zip_content_file:
            content = zip_content_file.read()
            print content
            self.assertTrue('TestSettingKey1' in content)
            self.assertTrue('TestSettingValue1' in content)
            self.assertTrue('TestSettingKey2' in content)
            self.assertTrue('TestSettingValue2' in content)
Beispiel #9
0
    def test_inject_settings(self):

        with mock.patch.object(boto3, 'client') as mock_boto3_client:

            zip_content = StringIO.StringIO()
            zip_file = zipfile.ZipFile(zip_content, 'w')
            zip_file.close()

            mock_body = mock.MagicMock()
            mock_body.read = mock.MagicMock(return_value=zip_content.getvalue())

            mock_s3_client = mock_boto3_client.return_value
            mock_s3_client.get_object = mock.MagicMock(return_value={'Body': mock_body})
            mock_s3_client.put_object = mock.MagicMock()

            reload(LambdaConfigurationResourceHandler) # so it uses mocked methods

            settings = self.event['ResourceProperties']['Settings']
            runtime = self.event['ResourceProperties']['Runtime']
            bucket = self.event['ResourceProperties']['ConfigurationBucket']
            input_key = self.event['ResourceProperties']['ConfigurationKey']
            function_name = self.event['ResourceProperties']['FunctionName']

            mock_injector = mock.MagicMock()
            LambdaConfigurationResourceHandler._SETTINGS_INJECTORS[runtime] = mock_injector

            output_key = LambdaConfigurationResourceHandler._inject_settings(settings, runtime, bucket, input_key, function_name)

            mock_boto3_client.assert_called_with('s3')
            mock_s3_client.get_object.assert_called_once_with(Bucket=bucket, Key=input_key)
            mock_injector.assert_called_once_with(AnyZipFileObject(), settings)
            mock_s3_client.put_object.assert_called_once_with(Bucket='TestBucket', Key=output_key, Body=AnyValidZipFileContent())
    def test_handler_delete(self, mock_delete_role,
                            mock_custom_resource_handler_response_succeed):

        self.event['RequestType'] = 'Delete'
        self.event['PhysicalResourceId'] = 'TestStack-TestLogicalResourceId'

        expected_data = {}

        expected_physical_id = self.event['PhysicalResourceId'] + "::{}"

        LambdaConfigurationResourceHandler.handler(self.event, self.context)

        mock_custom_resource_handler_response_succeed.assert_called_once_with(
            self.event, self.context, expected_data, expected_physical_id)
        mock_delete_role.assert_called_once_with(
            {}, self.event['ResourceProperties']['FunctionName'])
Beispiel #11
0
    def test_handler_delete(self):

        self.event['RequestType'] = 'Delete'
        self.event['PhysicalResourceId'] = 'TestStack-TestLogicalResourceId'

        expected_data = {}

        expected_physical_id = self.event['PhysicalResourceId']
                
        with mock.patch.object(custom_resource_response, 'succeed') as mock_custom_resource_response_succeed:
            with mock.patch.object(role_utils, 'delete_role') as mock_delete_role:
                LambdaConfigurationResourceHandler.handler(self.event, self.context)
                mock_custom_resource_response_succeed.assert_called_once_with(self.event, self.context, expected_data, expected_physical_id)
                mock_delete_role.assert_called_once_with(
                    self.event['StackId'], 
                    self.event['LogicalResourceId'], 
                    LambdaConfigurationResourceHandler.POLICY_NAME)
    def test_get_settings_injector(self):

        python_injector = LambdaConfigurationResourceHandler._SETTINGS_INJECTORS.get(
            'python')
        self.assertIsNotNone(python_injector)

        nodejs_injector = LambdaConfigurationResourceHandler._SETTINGS_INJECTORS.get(
            'nodejs')
        self.assertIsNotNone(nodejs_injector)

        self.assertIs(
            python_injector,
            LambdaConfigurationResourceHandler._get_settings_injector(
                'python2.7'))
        self.assertIs(
            nodejs_injector,
            LambdaConfigurationResourceHandler._get_settings_injector(
                'nodejs4.3'))
        self.assertIs(
            nodejs_injector,
            LambdaConfigurationResourceHandler._get_settings_injector(
                'nodejs'))  # legacy support
        self.assertIs(
            python_injector,
            LambdaConfigurationResourceHandler._get_settings_injector(
                'python999'))
        self.assertIs(
            nodejs_injector,
            LambdaConfigurationResourceHandler._get_settings_injector(
                'nodejs999'))

        with self.assertRaises(RuntimeError):
            LambdaConfigurationResourceHandler._get_settings_injector(
                'something')
    def test_handler_create(self):

        self.event['RequestType'] = 'Create'

        expected_data = {
            'ConfigurationBucket': 'TestBucket',
            'ConfigurationKey': 'TestOutputKey',
            'Runtime': 'TestRuntime',
            'Role': 'TestRole'
        }

        expected_physical_id = 'TestStack-TestLogicalResourceId'

        with mock.patch.object(
                custom_resource_response,
                'succeed') as mock_custom_resource_response_succeed:
            with mock.patch.object(role_utils,
                                   'create_role') as mock_create_role:
                mock_create_role.return_value = expected_data['Role']
                with mock.patch.object(
                        LambdaConfigurationResourceHandler,
                        '_inject_settings') as mock_inject_settings:
                    mock_inject_settings.return_value = expected_data[
                        'ConfigurationKey']
                    LambdaConfigurationResourceHandler.handler(
                        self.event, self.context)
                    mock_custom_resource_response_succeed.assert_called_once_with(
                        self.event, self.context, expected_data,
                        expected_physical_id)
                    mock_create_role.assert_called_once_with(
                        self.event['StackId'], self.event['LogicalResourceId'],
                        LambdaConfigurationResourceHandler.POLICY_NAME,
                        'lambda.amazonaws.com',
                        LambdaConfigurationResourceHandler.
                        DEFAULT_POLICY_STATEMENTS, AnyFunction())
                    mock_inject_settings.assert_called_once_with(
                        self.event['ResourceProperties']['Settings'],
                        self.event['ResourceProperties']['Runtime'],
                        self.event['ResourceProperties']
                        ['ConfigurationBucket'],
                        '{}/lambda-function-code.zip'.format(
                            self.event['ResourceProperties']
                            ['ConfigurationKey']), 'TestFunction')
Beispiel #14
0
    def test_handler_delete(self):

        self.event['RequestType'] = 'Delete'
        self.event['PhysicalResourceId'] = 'TestStack-TestLogicalResourceId'

        expected_data = {}

        expected_physical_id = self.event['PhysicalResourceId'] + "::{}"

        with mock.patch.object(
                custom_resource_response,
                'succeed') as mock_custom_resource_handler_response_succeed:
            with mock.patch.object(
                    role_utils,
                    'delete_access_control_role') as mock_delete_role:
                LambdaConfigurationResourceHandler.handler(
                    self.event, self.context)
                mock_custom_resource_handler_response_succeed.assert_called_once_with(
                    self.event, self.context, expected_data,
                    expected_physical_id)
                mock_delete_role.assert_called_once_with(
                    {}, self.event['ResourceProperties']['FunctionName'])
    def test_add_services_setting_with_no_services(self):

        del self.event['ResourceProperties']['Services']

        props = properties.load(
            self.event, LambdaConfigurationResourceHandler.PROPERTIES_SCHEMA)
        settings = props.Settings.__dict__
        services = props.Services
        stack = mock.MagicMock('stack')

        actual_permittd_arns = LambdaConfigurationResourceHandler._add_services_settings(
            settings, services, stack)

        self.assertEquals(actual_permittd_arns, [])
    def test_add_services_settings(self, mock_ServiceDirectory,
                                   mock_add_service_settings):

        props = properties.load(
            self.event, LambdaConfigurationResourceHandler.PROPERTIES_SCHEMA)

        settings = props.Settings.__dict__
        services = props.Services

        stack = mock.MagicMock(name='stack')

        actual_permitted_arns = LambdaConfigurationResourceHandler._add_services_settings(
            stack, settings, services)

        self.assertEquals(actual_permitted_arns, [])

        mock_ServiceDirectory.assert_called_once_with(
            stack.project.configuration_bucket)

        mock_add_service_settings.assert_has_calls([
            mock.call(stack, mock_ServiceDirectory.return_value, service,
                      settings['Services'], actual_permitted_arns)
            for service in services
        ])
    def test_handler_create(self, mock_StackInfoManager,
                            mock_add_service_access_policy_to_role,
                            mock_add_services_settings, mock_get_input_key,
                            mock_get_project_service_lambda_arn,
                            mock_add_built_in_settings, mock_inject_settings,
                            mock_get_access_control_role_name,
                            mock_create_role,
                            mock_custom_resource_handler_response_succeed):

        mock_get_stack_info = mock_StackInfoManager.return_value.get_stack_info

        self.event['RequestType'] = 'Create'

        expected_data = {
            'ConfigurationBucket': 'TestBucket',
            'ConfigurationKey': 'TestOutputKey',
            'Runtime': 'TestRuntime',
            'Role': 'TestRole',
            'RoleName': 'TestRoleName',
            'ComposedLambdaConfiguration': {
                'Code': {
                    'S3Bucket': 'TestBucket',
                    'S3Key': 'TestOutputKey'
                },
                'Role': 'TestRole',
                'Runtime': 'TestRuntime'
            }
        }

        expected_physical_id = 'TestStack-TestLogicalResourceId::{}'

        mock_create_role.return_value = expected_data['Role']
        mock_get_access_control_role_name.return_value = expected_data[
            'RoleName']
        mock_get_input_key.return_value = '{}/lambda-function-code.zip'.format(
            self.event['ResourceProperties']['ConfigurationKey'])
        mock_inject_settings.return_value = expected_data['ConfigurationKey']
        mock_get_project_service_lambda_arn.return_value = None

        LambdaConfigurationResourceHandler.handler(self.event, self.context)

        mock_custom_resource_handler_response_succeed.assert_called_once_with(
            self.event, self.context, expected_data, expected_physical_id)

        mock_create_role.assert_called_once_with(
            mock_StackInfoManager.return_value, {},
            self.event['StackId'],
            self.event['ResourceProperties']['FunctionName'],
            'lambda.amazonaws.com',
            default_policy=LambdaConfigurationResourceHandler.
            get_default_policy(None))

        mock_inject_settings.assert_called_once_with(
            self.event['ResourceProperties']['Settings'],
            self.event['ResourceProperties']['Runtime'],
            self.event['ResourceProperties']['ConfigurationBucket'],
            '{}/lambda-function-code.zip'.format(
                self.event['ResourceProperties']['ConfigurationKey']),
            'TestFunction')

        mock_add_built_in_settings.assert_called_once_with(
            self.event['ResourceProperties']['Settings'],
            mock_get_stack_info.return_value)

        mock_get_project_service_lambda_arn.assert_called_once_with(
            mock_get_stack_info.return_value)

        mock_get_stack_info.assert_called_once_with(self.event['StackId'])

        mock_add_services_settings.assert_called_once_with(
            mock_get_stack_info.return_value,
            self.event['ResourceProperties']['Settings'], [
                PropertiesMatcher(i)
                for i in self.event['ResourceProperties']['Services']
            ])

        mock_add_service_access_policy_to_role.assert_called_once_with(
            expected_data['Role'], mock_add_services_settings.return_value)
Beispiel #18
0
    def test_integration_inject_settings_python(self):
        
        # we need both the s3 client below and the one created by the 
        # custom resource handler to use this region
        boto3.setup_default_session(region_name=TEST_REGION)
        reload(LambdaConfigurationResourceHandler) # reset global s3 client object

        s3 = boto3.client('s3')

        bucket = 'lmbr_aws_settings_test_' + str(int(time() * 1000))
        input_key = 'TestKey/lambda-function-code.zip'
        output_key = None

        s3.create_bucket(Bucket=bucket)

        try:

            zip_content = StringIO.StringIO()

            with zipfile.ZipFile(zip_content, 'w') as zip_file:
                zip_file.writestr('InitialName', 'InitialContent')

            body = zip_content.getvalue()
            s3.put_object(Bucket=bucket, Key=input_key, Body=body)

            zip_content.close()

            sleep(10) # seconds

            expected_settings = self.event['ResourceProperties']['Settings']
            runtime = 'python2.7'
            function_name = 'TestFunction'
            output_key = LambdaConfigurationResourceHandler._inject_settings(expected_settings, runtime, bucket, input_key, function_name)

            expected_zip_name = 'CloudCanvas/settings.py'

            sleep(10) # seconds

            print 'output_key', output_key
            print 'bucket', bucket
            res = s3.get_object(Bucket=bucket, Key=output_key)
            body = res['Body'].read()

            zip_content = StringIO.StringIO(body)
            with zipfile.ZipFile(zip_content, 'r') as zip_file:
                with zip_file.open('InitialName', 'r') as zip_content_file:
                    actual_zip_content = zip_content_file.read()
                    self.assertEquals('InitialContent', actual_zip_content)
                with zip_file.open(expected_zip_name, 'r') as zip_content_file:
                    globals = {}
                    exec(zip_content_file.read(), globals)
                    actual_settings = globals['settings']
                    self.assertEquals(expected_settings, actual_settings)
                    zip_content.close()

        finally:

            try:
                s3.delete_object(Bucket=bucket, Key=input_key)
            except Exception as e:
                print 'Error when deleting object {} from bucket {}: {}'.format(input_key, bucket, e)

            if output_key is not None:
                try:
                    s3.delete_object(Bucket=bucket, Key=output_key)
                except Exception as e:
                    print 'Error when deleting object {} from bucket {}: {}'.format(output_key, bucket, e)

            try:
                s3.delete_bucket(Bucket=bucket)
            except Exception as e:
                print 'Error when deleting bucket {}: {}'.format(bucket, e)
Beispiel #19
0
    def test_integration_create_update_delete_role(self):
        
        with mock.patch.object(discovery_utils,'ResourceGroupInfo') as mock_ResourceGroupInfo:

            mock_ResourceGroupInfo.return_value.resource_group_name = 'TestGroup'
            mock_ResourceGroupInfo.return_value.deployment = mock.MagicMock()
            mock_ResourceGroupInfo.return_value.deployment.deployment_name = 'TestDeployment'
            mock_ResourceGroupInfo.return_value.deployment.project = mock.MagicMock()
            mock_ResourceGroupInfo.return_value.deployment.project.project_name = 'TestProject'

            with mock.patch.object(custom_resource_response, 'succeed') as mock_custom_resource_response_succeed:

                with mock.patch.object(LambdaConfigurationResourceHandler, '_inject_settings') as mock_inject_settings:

                    mock_inject_settings.return_value = 'TestOutputConfigurationKey'

                    stack_arn = self._create_role_test_stack()

                    self.event['StackId'] = stack_arn

                    try:

                        capture_data = CaptureValue()
                        capture_physical_resource_id = CaptureValue()

                        # test create

                        self.event['RequestType'] = 'Create'
                        LambdaConfigurationResourceHandler.handler(self.event, self.context)

                        mock_custom_resource_response_succeed.assert_called_once_with(
                            self.event, 
                            self.context, 
                            capture_data, 
                            capture_physical_resource_id)

                        created_role_arn = capture_data.value['Role']

                        self._validate_role(created_role_arn, stack_arn)

                        # test update

                        mock_custom_resource_response_succeed.reset_mock()

                        self.event['RequestType'] = 'Update'
                        self.event['PhysicalResourceId'] = capture_physical_resource_id.value
                        LambdaConfigurationResourceHandler.handler(self.event, self.context)

                        mock_custom_resource_response_succeed.assert_called_once_with(
                            self.event, 
                            self.context, 
                            capture_data, 
                            capture_physical_resource_id)

                        updated_role_arn = capture_data.value['Role']

                        self.assertEquals(created_role_arn, updated_role_arn)
                        self._validate_role(updated_role_arn, stack_arn)

                        # rest delete

                        mock_custom_resource_response_succeed.reset_mock()

                        self.event['RequestType'] = 'Delete'
                        self.event['PhysicalResourceId'] = capture_physical_resource_id.value
                        LambdaConfigurationResourceHandler.handler(self.event, self.context)

                        mock_custom_resource_response_succeed.assert_called_once_with(
                            self.event, 
                            self.context, 
                            capture_data, 
                            capture_physical_resource_id)

                        self._validate_role_deleted(created_role_arn)

                    finally:

                        # self._delete_role_test_stack(stack_arn)
                        pass
Beispiel #20
0
    def test_handler_create(self):

        self.event['RequestType'] = 'Create'

        expected_data = {
            'ConfigurationBucket': 'TestBucket',
            'ConfigurationKey': 'TestOutputKey',
            'Runtime': 'TestRuntime',
            'Role': 'TestRole'
        }

        expected_physical_id = 'TestStack-TestLogicalResourceId::{}'

        with mock.patch.object(
                custom_resource_response,
                'succeed') as mock_custom_resource_handler_response_succeed:
            with mock.patch.object(
                    role_utils,
                    'create_access_control_role') as mock_create_role:
                mock_create_role.return_value = expected_data['Role']
                with mock.patch.object(
                        LambdaConfigurationResourceHandler,
                        '_inject_settings') as mock_inject_settings:
                    with mock.patch.object(LambdaConfigurationResourceHandler,
                                           '_add_built_in_settings'
                                           ) as mock_add_built_in_settings:
                        with mock.patch.object(
                                LambdaConfigurationResourceHandler,
                                '_get_project_service_lambda_arn'
                        ) as mock_get_project_service_lambda_arn:
                            with mock.patch.object(
                                    LambdaConfigurationResourceHandler,
                                    '_get_input_key') as mock_get_input_key:
                                mock_get_input_key.return_value = '{}/lambda-function-code.zip'.format(
                                    self.event['ResourceProperties']
                                    ['ConfigurationKey'])
                                mock_inject_settings.return_value = expected_data[
                                    'ConfigurationKey']
                                mock_get_project_service_lambda_arn.return_value = None
                                LambdaConfigurationResourceHandler.handler(
                                    self.event, self.context)
                                mock_custom_resource_handler_response_succeed.assert_called_once_with(
                                    self.event, self.context, expected_data,
                                    expected_physical_id)
                                mock_create_role.assert_called_once_with(
                                    {},
                                    self.event['StackId'],
                                    self.event['ResourceProperties']
                                    ['FunctionName'],
                                    'lambda.amazonaws.com',
                                    default_policy=
                                    LambdaConfigurationResourceHandler.
                                    get_default_policy(None))
                                mock_inject_settings.assert_called_once_with(
                                    self.event['ResourceProperties']
                                    ['Settings'],
                                    self.event['ResourceProperties']
                                    ['Runtime'],
                                    self.event['ResourceProperties']
                                    ['ConfigurationBucket'],
                                    '{}/lambda-function-code.zip'.format(
                                        self.event['ResourceProperties']
                                        ['ConfigurationKey']), 'TestFunction')
                                mock_add_built_in_settings.assert_called_once_with(
                                    self.event['ResourceProperties']
                                    ['Settings'], self.event['StackId'])
                                mock_get_project_service_lambda_arn.assert_called_once_with(
                                    self.event['StackId'])
Beispiel #21
0
    def test_handler_update(self, mock_StackInfoManager, mock_get_input_key,
                            mock_add_built_in_settings, mock_inject_settings,
                            mock_get_access_control_role_name,
                            mock_get_access_control_role_arn,
                            mock_custom_resource_handler_response_succeed):

        mock_get_stack_info = mock_StackInfoManager.return_value.get_stack_info

        self.event['RequestType'] = 'Update'
        self.event['PhysicalResourceId'] = 'TestStack-TestLogicalResourceId'

        expected_data = {
            'CCSettings': {
                'TestSettingKey1': 'TestSettingValue1',
                'TestSettingKey2': 'TestSettingValue2'
            },
            'ConfigurationBucket': 'TestBucket',
            'ConfigurationKey': 'TestKey/lambda-function-code.zip',
            'Runtime': 'TestRuntime',
            'Role': 'TestRole',
            'RoleName': 'TestRoleName',
            'ComposedLambdaConfiguration': {
                'Environment': {
                    'Variables': {
                        'TestSettingKey1': 'TestSettingValue1',
                        'TestSettingKey2': 'TestSettingValue2'
                    }
                },
                'Code': {
                    'S3Bucket': 'TestBucket',
                    'S3Key': 'TestKey/lambda-function-code.zip'
                },
                'Role': 'TestRole',
                'Runtime': 'TestRuntime'
            }
        }

        expected_physical_id = self.event['PhysicalResourceId'] + "::{}"

        mock_get_access_control_role_arn.return_value = expected_data['Role']
        mock_get_access_control_role_name.return_value = expected_data[
            'RoleName']
        mock_get_input_key.return_value = '{}/lambda-function-code.zip'.format(
            self.event['ResourceProperties']['ConfigurationKey'])
        mock_inject_settings.return_value = expected_data['ConfigurationKey']

        LambdaConfigurationResourceHandler.handler(self.event, self.context)

        mock_custom_resource_handler_response_succeed.assert_called_once_with(
            self.event, self.context, expected_data, expected_physical_id)

        mock_get_access_control_role_arn.assert_called_once_with(
            {}, self.event['ResourceProperties']['FunctionName'])

        mock_inject_settings.assert_called_once_with(
            self.event['ResourceProperties']['Settings'],
            self.event['ResourceProperties']['Runtime'],
            self.event['ResourceProperties']['ConfigurationBucket'],
            '{}/lambda-function-code.zip'.format(
                self.event['ResourceProperties']['ConfigurationKey']),
            'TestFunction')

        mock_add_built_in_settings.assert_called_once_with(
            self.event['ResourceProperties']['Settings'],
            mock_get_stack_info.return_value)

        mock_get_stack_info.assert_called_once_with(self.event['StackId'])