From 9ab003ca02a31a824d6d5d9643d2db8377aa7070 Mon Sep 17 00:00:00 2001 From: Dmitry Bogun Date: Mon, 26 Dec 2016 16:57:42 +0200 Subject: [PATCH] Parser for old data model Builds old data model using data stored in new data model. It is required to keep at least part of existing API of data-driver. We can't use existing code to build old data model, because it conatins at least 2 serious mistake(located during code analisys while creating parser for new object model). It is also tangled and and wry. Change-Id: Ic2418a1c2a6334aafb2048fd057d35ca7945c31e --- bareon/drivers/data/ironic.py | 91 +++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/bareon/drivers/data/ironic.py b/bareon/drivers/data/ironic.py index 3c38968..1c18bec 100644 --- a/bareon/drivers/data/ironic.py +++ b/bareon/drivers/data/ironic.py @@ -1019,3 +1019,94 @@ class StorageParser(object): idnr = objects.block_device.DevIdnr(idnr['type'], idnr['value']) idnr(self.disk_finder) return idnr + + +class DeprecatedPartitionSchemaBuilder(object): + def __init__(self, storage_claim, multiboot_partition): + self.storage_claim = storage_claim + self.multiboot_partition = multiboot_partition + + self.schema = objects.PartitionSchema() + + self._convert() + + def _convert(self): + for claim in self.storage_claim.items: + if isinstance(claim, objects.block_device.Disk): + self._convert_disk(claim) + elif isinstance(claim, objects.block_device.LVMvg): + self._convert_lvm_vg(claim) + elif isinstance(claim, objects.block_device.MDRaid): + self._convert_mdraid(claim) + + def _convert_disk(self, disk): + old_disk = self.schema.add_parted( + name=disk.dev, label='gpt', install_bootloader=True, + size=self._unpack_size(disk.size).bytes) + + for claim in disk.items: + args = {} + if isinstance(claim, objects.block_device.Partition): + args['keep_data'] = claim.keep_data_flag + partition = old_disk.add_partition( + size=self._unpack_size(claim.size).bytes, guid=claim.guid, + **args) + + if isinstance(claim, objects.block_device.FileSystemMixin): + self._add_fs(claim, partition.name) + + def _convert_lvm_vg(self, vg): + self.schema.add_vg(name=vg.idnr) + for claim in vg.items: + if isinstance(claim, objects.block_device.LVMpv): + args = {} + if claim.meta_size: + args['metadatasize'] = self._unpack_size( + claim.meta_size).in_unit('MiB').value_int + self.schema.add_pv(name=claim.vg_idnr, **args) + elif isinstance(claim, objects.block_device.LVMlv): + self.schema.add_lv( + name=claim.name, vgname=vg.idnr, + size=self._unpack_size(claim.size).bytes) + self._add_fs(claim, claim.name) + + def _convert_mdraid(self, md): + self.schema.add_md( + name=md.name, level=md.level, devices=[ + x.expected_dev for x in md.items]) + self._add_fs(md, md.name) + + def _add_fs(self, claim, dev): + mount = claim.mount + if claim is self.multiboot_partition: + mount = 'multiboot' + + if not mount: + return + + args = {k: v for k, v in ( + ('fstab_options', claim.mount_options), + ('fs_type', claim.file_system), + ('os_id', list(claim.os_binding))) if v} + + self.schema.add_fs( + device=dev, mount=mount, fstab_enabled=claim.fstab_member, **args) + + @staticmethod + def _unpack_size(size): + return size.size + + @staticmethod + def guid_code_to_parted_flags(code): + flags = set() + + if code == 0xEF02: + flags.add('bios_grub') + elif code == 0xEF00: + flags.add('boot') + elif code == 0xFD00: + flags.add('raid') + elif code == 0x8E00: + flags.add('lvm') + + return sorted(flags)