def test_process_post_resources(self, handle_sns_subscriptions_mock):
        custom_resource_yaml = dedent("""
        PostCustomResources:
            exposeTopicSubscription:
                Type: "Custom::SNS::Subscription"
                Properties:
                    TopicArn:
                      Ref: exposeTopicArn
                    QueueResourceName: exposeQueue
        """)

        custom_resource_dict = yaml.load(custom_resource_yaml)
        template = CloudFormationTemplate(custom_resource_dict, 'foo')
        stack = CloudFormationStack(template, {}, 'foo', 'foo-region')

        CustomResourceHandler.process_post_resources(stack)
        handle_sns_subscriptions_mock.assert_called_once_with(
            {
                'Type': 'Custom::SNS::Subscription',
                'Properties': {
                    'TopicArn': {
                        'Ref': 'exposeTopicArn'
                    },
                    'QueueResourceName': 'exposeQueue'
                }
            }, stack)
예제 #2
0
    def create_or_update_stacks(self):
        existing_stacks = self.cfn.get_stack_names()
        desired_stacks = self.config.stacks
        stack_processing_order = DependencyResolver().get_stack_order(desired_stacks)

        if len(stack_processing_order) > 1:
            self.logger.info(
                "Will process stacks in the following order: {0}".format(", ".join(stack_processing_order)))

        for stack_name in stack_processing_order:
            stack_config = self.config.stacks.get(stack_name)

            raw_template = FileLoader.get_file_from_url(stack_config.template_url, stack_config.working_dir)
            template = CloudFormationTemplateTransformer.transform_template(raw_template)

            combined_tags = dict(self.config.tags)
            combined_tags.update(stack_config.tags)

            parameters = self.parameter_resolver.resolve_parameter_values(stack_config.parameters, stack_name)
            stack = CloudFormationStack(template=template, parameters=parameters, tags=combined_tags,
                                        name=stack_name, region=self.config.region, timeout=stack_config.timeout)

            if stack_name in existing_stacks:

                self.cfn.validate_stack_is_ready_for_action(stack)
                self.cfn.update_stack(stack)
            else:
                self.cfn.create_stack(stack)

            CustomResourceHandler.process_post_resources(stack)
    def test_extract_topic_arn_by_parameter_reference_raises_exception_on_invalid_reference(self):
        parameters = {'exposeTopicArn': 'my-super-duper-arn'}
        resource_description = {'Type': 'Custom::SNS::Subscription',
                                'Properties': {'TopicArn': {'Ref': 'exposeTopicArnWithTypo'},
                                               'QueueArn': {'Ref': 'exposeQueue'}}}

        with self.assertRaises(CfnSphereException):
            CustomResourceHandler.extract_topic_arn(resource_description, parameters)
    def test_extract_topic_arn_by_parameter_value(self):
        resource_description = {'Type': 'Custom::SNS::Subscription',
                                'Properties': {'TopicArn': 'my-super-duper-arn',
                                               'QueueArn': {'Ref': 'exposeQueue'}}}

        result = CustomResourceHandler.extract_topic_arn(resource_description, {})
        self.assertEqual('my-super-duper-arn', result)
예제 #5
0
    def create_or_update_stacks(self):
        existing_stacks = self.cfn.get_stack_names()
        desired_stacks = self.config.stacks
        stack_processing_order = DependencyResolver().get_stack_order(
            desired_stacks)

        if len(stack_processing_order) > 1:
            self.logger.info(
                "Will process stacks in the following order: {0}".format(
                    ", ".join(stack_processing_order)))

        for stack_name in stack_processing_order:
            stack_config = self.config.stacks.get(stack_name)

            if stack_config.stack_policy_url:
                self.logger.info("Using stack policy from {0}".format(
                    stack_config.stack_policy_url))
                stack_policy = FileLoader.get_yaml_or_json_file(
                    stack_config.stack_policy_url, stack_config.working_dir)
            else:
                stack_policy = None

            template = TemplateHandler.get_template(stack_config.template_url,
                                                    stack_config.working_dir)
            parameters = self.parameter_resolver.resolve_parameter_values(
                stack_name, stack_config, self.cli_parameters)

            stack = CloudFormationStack(
                template=template,
                parameters=parameters,
                tags=stack_config.tags,
                name=stack_name,
                region=self.config.region,
                timeout=stack_config.timeout,
                service_role=stack_config.service_role,
                stack_policy=stack_policy,
                failure_action=stack_config.failure_action)

            if stack_name in existing_stacks:

                self.cfn.validate_stack_is_ready_for_action(stack)
                self.cfn.update_stack(stack)
            else:
                self.cfn.create_stack(stack)

            CustomResourceHandler.process_post_resources(stack)
예제 #6
0
    def create_or_update_stacks(self):
        existing_stacks = self.cfn.get_stack_names()
        desired_stacks = self.config.stacks
        stack_processing_order = DependencyResolver().get_stack_order(desired_stacks)

        if len(stack_processing_order) > 1:
            self.logger.info(
                "Will process stacks in the following order: {0}".format(", ".join(stack_processing_order)))

        for stack_name in stack_processing_order:
            stack_config = self.config.stacks.get(stack_name)

            template = FileLoader.get_cloudformation_template(stack_config.template_url,stack_config.working_dir)
            transformed_template = CloudFormationTemplateTransformer.transform_template(template)

            if stack_config.stack_policy_url:
                self.logger.info("Using stack policy from {0}".format(stack_config.stack_policy_url))
                stack_policy = FileLoader.get_yaml_or_json_file(stack_config.stack_policy_url, stack_config.working_dir)
            else:
                stack_policy = None

            parameters = self.parameter_resolver.resolve_parameter_values(stack_name, stack_config)
            merged_parameters = self.parameter_resolver.update_parameters_with_cli_parameters(
                parameters=parameters,
                cli_parameters=self.cli_parameters,
                stack_name=stack_name)

            self.logger.debug("Parameters after merging with cli options: {0}".format(merged_parameters))

            stack = CloudFormationStack(template=transformed_template,
                                        parameters=merged_parameters,
                                        tags=stack_config.tags,
                                        name=stack_name,
                                        region=self.config.region,
                                        timeout=stack_config.timeout,
                                        service_role=stack_config.service_role,
                                        stack_policy=stack_policy)

            if stack_name in existing_stacks:

                self.cfn.validate_stack_is_ready_for_action(stack)
                self.cfn.update_stack(stack)
            else:
                self.cfn.create_stack(stack)

            CustomResourceHandler.process_post_resources(stack)
    def test_extract_topic_arn_by_parameter_reference_raises_exception_on_invalid_reference(
            self):
        parameters = {'exposeTopicArn': 'my-super-duper-arn'}
        resource_description = {
            'Type': 'Custom::SNS::Subscription',
            'Properties': {
                'TopicArn': {
                    'Ref': 'exposeTopicArnWithTypo'
                },
                'QueueArn': {
                    'Ref': 'exposeQueue'
                }
            }
        }

        with self.assertRaises(CfnSphereException):
            CustomResourceHandler.extract_topic_arn(resource_description,
                                                    parameters)
예제 #8
0
    def create_or_update_stacks(self):
        existing_stacks = self.cfn.get_stack_names()
        desired_stacks = self.config.stacks
        stack_processing_order = DependencyResolver().get_stack_order(desired_stacks)

        if len(stack_processing_order) > 1:
            self.logger.info(
                "Will process stacks in the following order: {0}".format(", ".join(stack_processing_order))
            )

        for stack_name in stack_processing_order:
            stack_config = self.config.stacks.get(stack_name)

            if stack_config.stack_policy_url:
                self.logger.info("Using stack policy from {0}".format(stack_config.stack_policy_url))
                stack_policy = FileLoader.get_yaml_or_json_file(stack_config.stack_policy_url, stack_config.working_dir)
            else:
                stack_policy = None

            template = TemplateHandler.get_template(stack_config.template_url, stack_config.working_dir)
            parameters = self.parameter_resolver.resolve_parameter_values(stack_name, stack_config, self.cli_parameters)

            stack = CloudFormationStack(
                template=template,
                parameters=parameters,
                tags=stack_config.tags,
                name=stack_name,
                region=self.config.region,
                timeout=stack_config.timeout,
                service_role=stack_config.service_role,
                stack_policy=stack_policy,
                failure_action=stack_config.failure_action,
            )

            if stack_name in existing_stacks:

                self.cfn.validate_stack_is_ready_for_action(stack)
                self.cfn.update_stack(stack)
            else:
                self.cfn.create_stack(stack)

            CustomResourceHandler.process_post_resources(stack)
    def test_process_post_resources(self, handle_sns_subscriptions_mock):
        custom_resource_yaml = dedent("""
        PostCustomResources:
            exposeTopicSubscription:
                Type: "Custom::SNS::Subscription"
                Properties:
                    TopicArn:
                      Ref: exposeTopicArn
                    QueueResourceName: exposeQueue
        """)

        custom_resource_dict = yaml.load(custom_resource_yaml)
        template = CloudFormationTemplate(custom_resource_dict, 'foo')
        stack = CloudFormationStack(template, {}, 'foo', 'foo-region')

        CustomResourceHandler.process_post_resources(stack)
        handle_sns_subscriptions_mock.assert_called_once_with({'Type': 'Custom::SNS::Subscription',
                                                               'Properties': {'TopicArn': {'Ref': 'exposeTopicArn'},
                                                                              'QueueResourceName': 'exposeQueue'}},
                                                              stack)
    def test_extract_topic_arn_by_parameter_value(self):
        resource_description = {
            'Type': 'Custom::SNS::Subscription',
            'Properties': {
                'TopicArn': 'my-super-duper-arn',
                'QueueArn': {
                    'Ref': 'exposeQueue'
                }
            }
        }

        result = CustomResourceHandler.extract_topic_arn(
            resource_description, {})
        self.assertEqual('my-super-duper-arn', result)
예제 #11
0
    def create_or_update_stacks(self):
        existing_stacks = self.cfn.get_stack_names()
        desired_stacks = self.config.stacks
        stack_processing_order = DependencyResolver().get_stack_order(
            desired_stacks)

        if len(stack_processing_order) > 1:
            self.logger.info(
                "Will process stacks in the following order: {0}".format(
                    ", ".join(stack_processing_order)))

        for stack_name in stack_processing_order:
            stack_config = self.config.stacks.get(stack_name)

            raw_template = FileLoader.get_file_from_url(
                stack_config.template_url, stack_config.working_dir)
            template = CloudFormationTemplateTransformer.transform_template(
                raw_template)

            parameters = self.parameter_resolver.resolve_parameter_values(
                stack_config.parameters, stack_name)
            stack = CloudFormationStack(template=template,
                                        parameters=parameters,
                                        tags=(stack_config.tags),
                                        name=stack_name,
                                        region=self.region,
                                        timeout=stack_config.timeout)

            if stack_name in existing_stacks:

                self.cfn.validate_stack_is_ready_for_action(stack)
                self.cfn.update_stack(stack)
            else:
                self.cfn.create_stack(stack)

            CustomResourceHandler.process_post_resources(stack)