예제 #1
0
    def test_yaml_with_tags(self):
        output = yaml_parse(self.yaml_with_tags)
        self.assertEquals(self.parsed_yaml_dict, output)

        # Make sure formatter and parser work well with each other
        formatted_str = yaml_dump(output)
        output_again = yaml_parse(formatted_str)
        self.assertEquals(output, output_again)
예제 #2
0
    def test_yaml_with_tags(self):
        output = yaml_parse(self.yaml_with_tags)
        self.assertEquals(self.parsed_yaml_dict, output)

        # Make sure formatter and parser work well with each other
        formatted_str = yaml_dump(output)
        output_again = yaml_parse(formatted_str)
        self.assertEquals(output, output_again)
예제 #3
0
def combine_template(template_path):
    """jsonを読み込みくっつける."""
    with open(template_path, 'r+') as file:
        data = yaml_parse(file.read())
    # dict_data = data
    for i in data['Resources']:
        rootpath = template_path.split('/')[0]
        path = f'{rootpath}/_template-{i}.yaml'
        if os.path.exists(path):
            with open(path) as subfile:
                data2 = yaml_parse(subfile.read())
                data['Resources'][i].update(data2)
    print(str(data))
    return str(data)
예제 #4
0
파일: deploy.py 프로젝트: mabuaita/ops
    def _run_main(self, parsed_args, parsed_globals):
        cloudformation_client = \
            self._session.create_client(
                    'cloudformation', region_name=parsed_globals.region,
                    endpoint_url=parsed_globals.endpoint_url,
                    verify=parsed_globals.verify_ssl)

        template_path = parsed_args.template_file
        if not os.path.isfile(template_path):
            raise exceptions.InvalidTemplatePathError(
                    template_path=template_path)

        # Parse parameters
        with open(template_path, "r") as handle:
            template_str = handle.read()

        stack_name = parsed_args.stack_name
        parameter_overrides = self.parse_parameter_arg(
                parsed_args.parameter_overrides)

        template_dict = yaml_parse(template_str)

        parameters = self.merge_parameters(template_dict, parameter_overrides)

        deployer = Deployer(cloudformation_client)
        return self.deploy(deployer, stack_name, template_str,
                           parameters, parsed_args.capabilities,
                           parsed_args.execute_changeset, parsed_args.role_arn,
                           parsed_args.notification_arns)
    def __init__(self,
                 template_path,
                 parent_dir,
                 uploader,
                 resources_to_export=RESOURCES_EXPORT_LIST,
                 metadata_to_export=METADATA_EXPORT_LIST):
        """
        Reads the template and makes it ready for export
        """

        if not (is_local_folder(parent_dir) and os.path.isabs(parent_dir)):
            raise ValueError(
                "parent_dir parameter must be "
                "an absolute path to a folder {0}".format(parent_dir))

        abs_template_path = make_abs_path(parent_dir, template_path)
        template_dir = os.path.dirname(abs_template_path)

        with open(abs_template_path, "r") as handle:
            template_str = handle.read()

        self.template_dict = yaml_parse(template_str)
        self.template_dir = template_dir
        self.resources_to_export = resources_to_export
        self.metadata_to_export = metadata_to_export
        self.uploader = uploader
예제 #6
0
    def _run_main(self, parsed_args, parsed_globals):
        cloudformation_client = \
            self._session.create_client(
                    'cloudformation', region_name=parsed_globals.region,
                    endpoint_url=parsed_globals.endpoint_url,
                    verify=parsed_globals.verify_ssl)

        template_path = parsed_args.template_file
        if not os.path.isfile(template_path):
            raise exceptions.InvalidTemplatePathError(
                    template_path=template_path)

        # Parse parameters
        with open(template_path, "r") as handle:
            template_str = handle.read()

        stack_name = parsed_args.stack_name
        parameter_overrides = self.parse_parameter_arg(
                parsed_args.parameter_overrides)

        template_dict = yaml_parse(template_str)

        parameters = self.merge_parameters(template_dict, parameter_overrides)

        deployer = Deployer(cloudformation_client)
        return self.deploy(deployer, stack_name, template_str,
                           parameters, parsed_args.capabilities,
                           parsed_args.execute_changeset, parsed_args.role_arn,
                           parsed_args.notification_arns,
                           parsed_args.fail_on_empty_changeset)
예제 #7
0
    def test_parse_yaml_preserve_elements_order(self):
        input_template = ('B_Resource:\n'
                          '  Key2:\n'
                          '    Name: name2\n'
                          '  Key1:\n'
                          '    Name: name1\n'
                          'A_Resource:\n'
                          '  Key2:\n'
                          '    Name: name2\n'
                          '  Key1:\n'
                          '    Name: name1\n')
        output_dict = yaml_parse(input_template)
        expected_dict = OrderedDict([('B_Resource',
                                      OrderedDict([('Key2', {
                                          'Name': 'name2'
                                      }), ('Key1', {
                                          'Name': 'name1'
                                      })])),
                                     ('A_Resource',
                                      OrderedDict([('Key2', {
                                          'Name': 'name2'
                                      }), ('Key1', {
                                          'Name': 'name1'
                                      })]))])
        self.assertEqual(expected_dict, output_dict)

        output_template = yaml_dump(output_dict)
        self.assertEqual(input_template, output_template)
예제 #8
0
 def test_parse_json_preserve_elements_order(self):
     input_template = """
     {
         "B_Resource": {
             "Key2": {
                 "Name": "name2"
             },
             "Key1": {
                 "Name": "name1"
             }
         },
         "A_Resource": {
             "Key2": {
                 "Name": "name2"
             },
             "Key1": {
                 "Name": "name1"
             }
         }
     }
     """
     expected_dict = OrderedDict([
         ('B_Resource', OrderedDict([('Key2', {'Name': 'name2'}), ('Key1', {'Name': 'name1'})])),
         ('A_Resource', OrderedDict([('Key2', {'Name': 'name2'}), ('Key1', {'Name': 'name1'})]))
     ])
     output_dict = yaml_parse(input_template)
     self.assertEqual(expected_dict, output_dict)
예제 #9
0
 def test_parse_json_preserve_elements_order(self):
     input_template = """
     {
         "B_Resource": {
             "Key2": {
                 "Name": "name2"
             },
             "Key1": {
                 "Name": "name1"
             }
         },
         "A_Resource": {
             "Key2": {
                 "Name": "name2"
             },
             "Key1": {
                 "Name": "name1"
             }
         }
     }
     """
     expected_dict = OrderedDict([
         ('B_Resource', OrderedDict([('Key2', {'Name': 'name2'}), ('Key1', {'Name': 'name1'})])),
         ('A_Resource', OrderedDict([('Key2', {'Name': 'name2'}), ('Key1', {'Name': 'name1'})]))
     ])
     output_dict = yaml_parse(input_template)
     self.assertEqual(expected_dict, output_dict)
예제 #10
0
def combine_template(template_path):
    """templateを読み込みくっつける.

    ルール
    - 子テンプレートは親テンプレートと同じディレクトリにある
    - 子テンプレートのファイル名は_template-{リソース名}.yaml
    """
    with open(template_path, 'r+') as file:
        data = yaml_parse(file.read())
    for i in data['Resources']:
        rootpath = template_path.split('/')[0]
        path = f'{rootpath}/_template-{i}.yaml'
        if os.path.exists(path):
            with open(path) as subfile:
                subdata = yaml_parse(subfile.read())
                data['Resources'][i].update(subdata)
    # check_template(str(data))
    return str(data)
예제 #11
0
    def _run_main(self, parsed_args, parsed_globals):
        cloudformation_client = \
            self._session.create_client(
                    'cloudformation', region_name=parsed_globals.region,
                    endpoint_url=parsed_globals.endpoint_url,
                    verify=parsed_globals.verify_ssl)

        template_path = parsed_args.template_file
        if not os.path.isfile(template_path):
            raise exceptions.InvalidTemplatePathError(
                    template_path=template_path)

        # Parse parameters
        with open(template_path, "r") as handle:
            template_str = handle.read()

        stack_name = parsed_args.stack_name
        parameter_overrides = self.parse_key_value_arg(
                parsed_args.parameter_overrides,
                self.PARAMETER_OVERRIDE_CMD)

        tags_dict = self.parse_key_value_arg(parsed_args.tags, self.TAGS_CMD)
        tags = [{"Key": key, "Value": value}
                for key, value in tags_dict.items()]

        template_dict = yaml_parse(template_str)

        parameters = self.merge_parameters(template_dict, parameter_overrides)

        template_size = os.path.getsize(parsed_args.template_file)
        if template_size > 51200 and not parsed_args.s3_bucket:
            raise exceptions.DeployBucketRequiredError()

        bucket = parsed_args.s3_bucket
        if bucket:
            s3_client = self._session.create_client(
                "s3",
                config=Config(signature_version='s3v4'),
                region_name=parsed_globals.region,
                verify=parsed_globals.verify_ssl)

            s3_uploader = S3Uploader(s3_client,
                                      bucket,
                                      parsed_globals.region,
                                      parsed_args.s3_prefix,
                                      parsed_args.kms_key_id,
                                      parsed_args.force_upload)
        else:
            s3_uploader = None

        deployer = Deployer(cloudformation_client)
        return self.deploy(deployer, stack_name, template_str,
                           parameters, parsed_args.capabilities,
                           parsed_args.execute_changeset, parsed_args.role_arn,
                           parsed_args.notification_arns, s3_uploader,
                           tags,
                           parsed_args.fail_on_empty_changeset)
예제 #12
0
    def _run_main(self, parsed_args, parsed_globals):
        cloudformation_client = \
            self._session.create_client(
                    'cloudformation', region_name=parsed_globals.region,
                    endpoint_url=parsed_globals.endpoint_url,
                    verify=parsed_globals.verify_ssl)

        template_path = parsed_args.template_file
        if not os.path.isfile(template_path):
            raise exceptions.InvalidTemplatePathError(
                    template_path=template_path)

        # Parse parameters
        with open(template_path, "r") as handle:
            template_str = handle.read()

        stack_name = parsed_args.stack_name
        parameter_overrides = self.parse_key_value_arg(
                parsed_args.parameter_overrides,
                self.PARAMETER_OVERRIDE_CMD)

        tags_dict = self.parse_key_value_arg(parsed_args.tags, self.TAGS_CMD)
        tags = [{"Key": key, "Value": value}
                for key, value in tags_dict.items()]

        template_dict = yaml_parse(template_str)

        parameters = self.merge_parameters(template_dict, parameter_overrides)

        template_size = os.path.getsize(parsed_args.template_file)
        if template_size > 51200 and not parsed_args.s3_bucket:
            raise exceptions.DeployBucketRequiredError()

        bucket = parsed_args.s3_bucket
        if bucket:
            s3_client = self._session.create_client(
                "s3",
                config=Config(signature_version='s3v4'),
                region_name=parsed_globals.region,
                verify=parsed_globals.verify_ssl)

            s3_uploader = S3Uploader(s3_client,
                                      bucket,
                                      parsed_args.s3_prefix,
                                      parsed_args.kms_key_id,
                                      parsed_args.force_upload)
        else:
            s3_uploader = None

        deployer = Deployer(cloudformation_client)
        return self.deploy(deployer, stack_name, template_str,
                           parameters, parsed_args.capabilities,
                           parsed_args.execute_changeset, parsed_args.role_arn,
                           parsed_args.notification_arns, s3_uploader,
                           tags,
                           parsed_args.fail_on_empty_changeset)
예제 #13
0
 def test_yaml_merge_tag(self):
     test_yaml = """
     base: &base
         property: value
     test:
         <<: *base
     """
     output = yaml_parse(test_yaml)
     self.assertTrue(isinstance(output, OrderedDict))
     self.assertEqual(output.get('test').get('property'), 'value')
예제 #14
0
 def test_yaml_merge_tag(self):
     test_yaml = """
     base: &base
         property: value
     test:
         <<: *base
     """
     output = yaml_parse(test_yaml)
     self.assertTrue(isinstance(output, OrderedDict))
     self.assertEqual(output.get('test').get('property'), 'value')
예제 #15
0
    def test_yaml_getatt(self):
        # This is an invalid syntax for !GetAtt. But make sure the code does not crash when we encouter this syntax
        # Let CloudFormation interpret this value at runtime
        input = """
        Resource:
            Key: !GetAtt ["a", "b"]
        """

        output = {"Resource": {"Key": {"Fn::GetAtt": ["a", "b"]}}}

        actual_output = yaml_parse(input)
        self.assertEquals(actual_output, output)
예제 #16
0
    def test_yaml_getatt(self):
        # This is an invalid syntax for !GetAtt. But make sure the code does not crash when we encouter this syntax
        # Let CloudFormation interpret this value at runtime
        input = """
        Resource:
            Key: !GetAtt ["a", "b"]
        """

        output = {
            "Resource": {
               "Key": {
                "Fn::GetAtt": ["a", "b"]
               }

            }
        }

        actual_output = yaml_parse(input)
        self.assertEquals(actual_output, output)
예제 #17
0
    def __init__(self, template_path, parent_dir, uploader,
                 resources_to_export=EXPORT_DICT):
        """
        Reads the template and makes it ready for export
        """

        if not (is_local_folder(parent_dir) and os.path.isabs(parent_dir)):
            raise ValueError("parent_dir parameter must be "
                             "an absolute path to a folder {0}"
                             .format(parent_dir))

        abs_template_path = make_abs_path(parent_dir, template_path)
        template_dir = os.path.dirname(abs_template_path)

        with open(abs_template_path, "r") as handle:
            template_str = handle.read()

        self.template_dict = yaml_parse(template_str)
        self.template_dir = template_dir
        self.resources_to_export = resources_to_export
        self.uploader = uploader
예제 #18
0
    def test_parse_yaml_preserve_elements_order(self):
        input_template = (
        'B_Resource:\n'
        '  Key2:\n'
        '    Name: name2\n'
        '  Key1:\n'
        '    Name: name1\n'
        'A_Resource:\n'
        '  Key2:\n'
        '    Name: name2\n'
        '  Key1:\n'
        '    Name: name1\n'
        )
        output_dict = yaml_parse(input_template)
        expected_dict = OrderedDict([
            ('B_Resource', OrderedDict([('Key2', {'Name': 'name2'}), ('Key1', {'Name': 'name1'})])),
            ('A_Resource', OrderedDict([('Key2', {'Name': 'name2'}), ('Key1', {'Name': 'name1'})]))
        ])
        self.assertEqual(expected_dict, output_dict)

        output_template = yaml_dump(output_dict)
        self.assertEqual(input_template, output_template)
예제 #19
0
 def test_parse_json_with_tabs(self):
     template = '{\n\t"foo": "bar"\n}'
     output = yaml_parse(template)
     self.assertEqual(output, {'foo': 'bar'})
예제 #20
0
 def __load_yaml(self, filename):
     with open(filename) as f:
         return yaml_parse(f.read())
예제 #21
0
 def test_parse_json_with_tabs(self):
     template = '{\n\t"foo": "bar"\n}'
     output = yaml_parse(template)
     self.assertEqual(output, {'foo': 'bar'})