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')
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
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')
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)
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)
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 {})
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
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
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')