Beispiel #1
0
 def test_parameter_for_autopublish_version_bad(self):
     """Test Parameter is created for autopublish version run"""
     filename = 'test/fixtures/templates/bad/transform/auto_publish_alias.yaml'
     region = 'us-east-1'
     template = cfn_yaml.load(filename)
     transformed_template = Transform(filename, template, region)
     transformed_template.transform_template()
     self.assertDictEqual(transformed_template._parameters, {})
Beispiel #2
0
 def test_test_function_using_image_good(self):
     """Test Parameter is created for autopublish version run"""
     filename = 'test/fixtures/templates/good/transform/function_using_image.yaml'
     region = 'us-east-1'
     template = cfn_yaml.load(filename)
     transformed_template = Transform(filename, template, region)
     transformed_template.transform_template()
     self.assertDictEqual(transformed_template._parameters, {})
Beispiel #3
0
 def test_conversion_of_step_function_definition_uri(self):
     """ Tests that the a serverless step function can convert a local path to a s3 path """
     filename = 'test/fixtures/templates/good/transform/step_function_local_definition.yaml'
     region = 'us-east-1'
     template = cfn_yaml.load(filename)
     transformed_template = Transform(filename, template, region)
     transformed_template.transform_template()
     self.assertDictEqual(
         transformed_template._template.get('Resources').get(
             'StateMachine').get('Properties').get('DefinitionS3Location'),
         {
             'Bucket': 'bucket',
             'Key': 'value'
         })
Beispiel #4
0
 def test_parameter_for_autopublish_version(self):
     """Test Parameter is created for autopublish version run"""
     filename = 'test/fixtures/templates/good/transform/auto_publish_alias.yaml'
     region = 'us-east-1'
     template = cfn_yaml.load(filename)
     transformed_template = Transform(filename, template, region)
     transformed_template.transform_template()
     self.assertDictEqual(transformed_template._parameters, {
                          'Stage1': 'Alias', 'Stage2': 'Alias'})
     self.assertDictEqual(
         transformed_template._template.get('Resources').get(
             'SkillFunctionAliasAlias').get('Properties'),
         {
             'Name': 'Alias',
             'FunctionName': {'Ref': 'SkillFunction'},
             'FunctionVersion': {'Fn::GetAtt': ['SkillFunctionVersion55ff35af87', 'Version']}
         })
Beispiel #5
0
def is_cfn(filename):
    """Check if a file is a cloudformation template

    :param filename: name of the file to check
    :return        : True if it is, False otherwise
    """
    try:
        cfn = cfn_yaml.load(filename)
        if 'Resources' in cfn:
            return True
        else:
            with open(filename) as f:
                cfn = json.load(f)
            if 'Resources' in cfn:
                return True
            else:
                return False
    except:
        return False
        elif eval(stmnt, {}, {}) is True:
            matched_instances[instance_type] = instance
        # elif instance_type not in matched_instances:
        # print(f'{instance_type} does not match `{rendered_value} {condition} {actual}`')
    return matched_instances


if __name__ == '__main__':
    if not len(argv) == 2:
        print("Usage: update_instance_types.py <TEMPLATE_PATH>")
        exit(1)
    template_path = Path(argv[1]).expanduser().resolve()
    if not template_path.is_file():
        print(f"Cannot find template at {template_path}")
        exit(1)
    template = cfn_yaml.load(str(template_path))
    config = template.get('Metadata', {}).get('AutoInstance')
    if not config:
        print(f"Config not present in template at Metadata->AutoInstance")
        exit(1)
    for parameter, param_config in config.items():
        print(f"processing {parameter}")
        param = template.get('Parameters', {}).get(parameter)
        if not param:
            print(
                f"Cannot find parameter {parameter} in template at {template}")
            exit(1)
        auth_map = get_region_map()
        filters = template['Metadata']['AutoInstance'][parameter].get(
            'InstanceFilters', [])
        ordered_instances, region_support_map = get_instances(
Beispiel #7
0
def decode(filename, ignore_bad_template):
    """
        Decode filename into an object
    """
    template = None
    matches = []
    try:
        template = cfn_yaml.load(filename)
    except IOError as e:
        if e.errno == 2:
            LOGGER.error('Template file not found: %s', filename)
            matches.append(
                create_match_file_error(
                    filename, 'Template file not found: %s' % filename))
        elif e.errno == 21:
            LOGGER.error('Template references a directory, not a file: %s',
                         filename)
            matches.append(
                create_match_file_error(
                    filename,
                    'Template references a directory, not a file: %s' %
                    filename))
        elif e.errno == 13:
            LOGGER.error('Permission denied when accessing template file: %s',
                         filename)
            matches.append(
                create_match_file_error(
                    filename,
                    'Permission denied when accessing template file: %s' %
                    filename))

        if matches:
            return (None, matches)
    except UnicodeDecodeError as err:
        LOGGER.error('Cannot read file contents: %s', filename)
        matches.append(
            create_match_file_error(filename, 'Cannot read file contents: %s' %
                                    filename))
    except cfn_yaml.CfnParseError as err:
        err.match.Filename = filename
        matches = [err.match]
    except ParserError as err:
        matches = [create_match_yaml_parser_error(err, filename)]
    except ScannerError as err:
        if err.problem in [
                'found character \'\\t\' that cannot start any token',
                'found unknown escape character'
        ]:
            try:
                template = cfn_json.load(filename)
            except cfn_json.JSONDecodeError as json_err:
                json_err.match.filename = filename
                matches = [json_err.match]
            except JSONDecodeError as json_err:
                matches = [create_match_json_parser_error(json_err, filename)]
            except Exception as json_err:  # pylint: disable=W0703
                if ignore_bad_template:
                    LOGGER.info('Template %s is malformed: %s', filename,
                                err.problem)
                    LOGGER.info('Tried to parse %s as JSON but got error: %s',
                                filename, str(json_err))
                else:
                    LOGGER.error('Template %s is malformed: %s', filename,
                                 err.problem)
                    LOGGER.error('Tried to parse %s as JSON but got error: %s',
                                 filename, str(json_err))
                    return (None, [
                        create_match_file_error(
                            filename,
                            'Tried to parse %s as JSON but got error: %s' %
                            (filename, str(json_err)))
                    ])
        else:
            matches = [create_match_yaml_parser_error(err, filename)]
    except YAMLError as err:
        matches = [create_match_file_error(filename, err)]

    if not isinstance(template, dict) and not matches:
        # Template isn't a dict which means nearly nothing will work
        matches = [
            Match(1,
                  1,
                  1,
                  1,
                  filename,
                  ParseError(),
                  message='Template needs to be an object.')
        ]
    return (template, matches)