Example #1
0
 def __load_register_args(self, args):
     check_dict_whitelist(args, 'register',
                          ['arch', 'block-device-mappings', 'description',
                           'platform', 'virtualization-type'])
     self.register_args.update(transform_dict(
         args,
         {'arch': 'Architecture',
          'description': 'Description',
          'platform': 'Platform',
          'virtualization-type': 'VirtualizationType'}))
     if not self.register_args.get('Architecture'):
         raise ValueError('register: arch is required')
     mappings = self.register_args.pop('block-device-mappings', None) or {}
     if not isinstance(mappings, dict):
         raise ValueError('register: block-device-mappings must be an '
                          'associative array')
     for device, mapping_info in mappings.items():
         mapping = {'DeviceName': device}
         if mapping_info == 'none':
             mapping['NoDevice'] = 'true'
         elif (isinstance(mapping_info, six.string_types) and
               mapping_info.startswith('ephemeral')):
             mapping['VirtualName'] = mapping_info
         elif isinstance(mapping_info, dict):
             mapping['Ebs'] = transform_dict(
                 mapping_info,
                 {'snapshot-id': 'SnapshotId',
                  'volume-size': 'VolumeSize',
                  'delete-on-termination': 'DeleteOnTermination'})
             if (not mapping['Ebs'].get('SnapshotId') and
                     not mapping['Ebs'].get('VolumeSize')):
                 raise ValueError('register: block device mapping {0} '
                                  'requires a volume-size')
         else:
             raise ValueError('register: unreadable block device mapping')
Example #2
0
 def from_fileobj(cls, fileobj):
     new_md = cls()
     metadata = yaml.safe_load(fileobj)
     check_dict_whitelist(metadata, 'pack', ['image', 'image_metadata',
                                             'version'])
     if metadata.get('version'):
         # This is the version of the pack metadata, not the image.
         # If we make backwards-incompatible changes this allows us
         # to tell what to expect so we can continue to handle packs
         # that precede those changes.
         #
         # Because there is only one metadata version right now this
         # method is rather dumb -- it accepts only version 1.
         if int(metadata['version']) != 1:
             raise ValueError('pack has metadata version {0}; expected 1'
                              .format(metadata['version']))
     image_info = metadata.get('image') or {}
     if not image_info.get('sha256sum'):
         raise ValueError('pack: image.sha256sum is missing or empty')
     new_md.image_sha256sum = image_info['sha256sum']
     if not image_info.get('size'):
         raise ValueError('pack: image.size is missing or zero')
     new_md.image_size = int(image_info['size'])
     image_md_info = metadata.get('image_metadata') or {}
     if not image_md_info.get('sha256sum'):
         raise ValueError(
             'pack: image_metadata.sha256sum is missing or empty')
     new_md.image_md_sha256sum = image_md_info['sha256sum']
     return new_md
Example #3
0
 def __load_register_args(self, args):
     check_dict_whitelist(args, 'register',
                          ['arch', 'block-device-mappings', 'description',
                           'platform', 'virtualization-type'])
     self.register_args.update(transform_dict(
         args,
         {'arch': 'Architecture',
          'description': 'Description',
          'platform': 'Platform',
          'virtualization-type': 'VirtualizationType'}))
     if not self.register_args.get('Architecture'):
         raise ValueError('register: arch is required')
     mappings = self.register_args.pop('block-device-mappings', None) or {}
     if not isinstance(mappings, dict):
         raise ValueError('register: block-device-mappings must be an '
                          'associative array')
     for device, mapping_info in mappings.iteritems():
         mapping = {'DeviceName': device}
         if mapping_info == 'none':
             mapping['NoDevice'] = 'true'
         elif (isinstance(mapping_info, six.string_types) and
               mapping_info.startswith('ephemeral')):
             mapping['VirtualName'] = mapping_info
         elif isinstance(mapping_info, dict):
             mapping['Ebs'] = transform_dict(
                 mapping_info,
                 {'snapshot-id': 'SnapshotId',
                  'volume-size': 'VolumeSize',
                  'delete-on-termination': 'DeleteOnTermination'})
             if (not mapping['Ebs'].get('SnapshotId') and
                     not mapping['Ebs'].get('VolumeSize')):
                 raise ValueError('register: block device mapping {0} '
                                  'requires a volume-size')
         else:
             raise ValueError('register: unreadable block device mapping')
Example #4
0
 def __load_tag_args(self, args):
     check_dict_whitelist(args, 'tag')
     tags = []
     for key, val in args.items():
         tags.append({'Key': key, 'Value': val})
     if tags:
         self.tag_args.setdefault('Tag', [])
         self.tag_args['Tag'].extend(tags)
Example #5
0
 def __load_tag_args(self, args):
     check_dict_whitelist(args, 'tag')
     tags = []
     for key, val in args.iteritems():
         tags.append({'Key': key, 'Value': val})
     if tags:
         self.tag_args.setdefault('Tag', [])
         self.tag_args['Tag'].extend(tags)
Example #6
0
    def __init__(self, profile_dict, arch):
        check_dict_whitelist(profile_dict, 'profile',
                             ['bundle', 'provides', 'register', 'tag'])
        self.bundle_args = {}
        self.register_args = {}
        self.tag_args = {}

        bundle_args = profile_dict.get('bundle') or {}
        bundle_args.setdefault('arch', arch)
        self.__load_bundle_args(bundle_args)
        register_args = profile_dict.get('register') or {}
        register_args.setdefault('arch', arch)
        self.__load_register_args(register_args)
        self.__load_tag_args(profile_dict.get('tag') or {})
Example #7
0
    def __init__(self, profile_dict, arch):
        check_dict_whitelist(profile_dict, 'profile',
                             ['bundle', 'provides', 'register', 'tag'])
        self.bundle_args = {}
        self.register_args = {}
        self.tag_args = {}

        bundle_args = profile_dict.get('bundle') or {}
        bundle_args.setdefault('arch', arch)
        self.__load_bundle_args(bundle_args)
        register_args = profile_dict.get('register') or {}
        register_args.setdefault('arch', arch)
        self.__load_register_args(register_args)
        self.__load_tag_args(profile_dict.get('tag') or {})
Example #8
0
 def from_fileobj(cls, fileobj):
     new_md = cls()
     metadata = yaml.safe_load(fileobj)
     check_dict_whitelist(metadata, 'image',
                          ['name', 'version', 'release', 'arch',
                           'description', 'profiles'])
     if not metadata.get('name'):
         raise ValueError('name is missing or empty')
     new_md.name = metadata['name']
     if not metadata.get('version'):
         raise ValueError('image "{0}": version is missing or empty'
                          .format(new_md.name))
     new_md.version = metadata['version']
     if not metadata.get('release'):
         raise ValueError('image "{0}": release is missing or empty'
                          .format(new_md.name))
     new_md.release = metadata['release']
     if metadata.get('epoch'):
         try:
             new_md.epoch = int(metadata['epoch'])
         except ValueError:
             raise ValueError('image "{0}": epoch must be an integer'
                              .format(new_md.name))
         if new_md.epoch < 0:
             raise ValueError('image "{0}": epoch must not be negative'
                              .format(new_md.name))
     if not metadata.get('arch'):
         raise ValueError('image "{0}": arch is missing or empty'
                          .format(new_md.name))
     new_md.arch = metadata['arch']
     if not metadata.get('description'):
         raise ValueError('image "{0}": description is missing or empty'
                          .format(new_md.name))
     new_md.description = metadata['description'].rstrip()
     profiles = metadata.get('profiles')
     if not profiles:
         raise ValueError('image "{0}" must have at least one profile '
                          '(use "default" for a single-profile image)'
                          .format(new_md.name))
     if not isinstance(profiles, dict):
         raise ValueError('image "{0}": profiles must be an associative '
                          'array'.format(new_md.name))
     for profile_name, profile_info in profiles.iteritems():
         new_md.profiles[profile_name] = build_image_profile(profile_info,
                                                             new_md.arch)
     return new_md
Example #9
0
 def from_fileobj(cls, fileobj):
     new_md = cls()
     metadata = yaml.safe_load(fileobj)
     check_dict_whitelist(metadata, "image", ["name", "version", "release", "arch", "description", "profiles"])
     if not metadata.get("name"):
         raise ValueError("name is missing or empty")
     new_md.name = metadata["name"]
     if not metadata.get("version"):
         raise ValueError('image "{0}": version is missing or empty'.format(new_md.name))
     new_md.version = metadata["version"]
     if not metadata.get("release"):
         raise ValueError('image "{0}": release is missing or empty'.format(new_md.name))
     new_md.release = metadata["release"]
     if metadata.get("epoch"):
         try:
             new_md.epoch = int(metadata["epoch"])
         except ValueError:
             raise ValueError('image "{0}": epoch must be an integer'.format(new_md.name))
         if new_md.epoch < 0:
             raise ValueError('image "{0}": epoch must not be negative'.format(new_md.name))
     if not metadata.get("arch"):
         raise ValueError('image "{0}": arch is missing or empty'.format(new_md.name))
     new_md.arch = metadata["arch"]
     if not metadata.get("description"):
         raise ValueError('image "{0}": description is missing or empty'.format(new_md.name))
     new_md.description = metadata["description"].rstrip()
     profiles = metadata.get("profiles")
     if not profiles:
         raise ValueError(
             'image "{0}" must have at least one profile '
             '(use "default" for a single-profile image)'.format(new_md.name)
         )
     if not isinstance(profiles, dict):
         raise ValueError('image "{0}": profiles must be an associative ' "array".format(new_md.name))
     for profile_name, profile_info in profiles.items():
         new_md.profiles[profile_name] = build_image_profile(profile_info, new_md.arch)
     return new_md
Example #10
0
 def __load_bundle_args(self, args):
     check_dict_whitelist(args, 'bundle', ['arch'])
     self.bundle_args.update(args)
     if not self.bundle_args.get('arch'):
         raise ValueError('register: arch is required')
Example #11
0
 def __load_bundle_args(self, args):
     check_dict_whitelist(args, 'bundle', ['arch'])
     self.bundle_args.update(args)
     if not self.bundle_args.get('arch'):
         raise ValueError('register: arch is required')