def test_block_device(self): swap = {"device_name": "/dev/sdb", "swap_size": 1} ephemerals = [{"num": 0, "virtual_name": "ephemeral0", "device_name": "/dev/sdc1", "size": 1}] block_device_mapping = [{"mount_device": "/dev/sde", "device_path": "fake_device"}] block_device_info = { "root_device_name": "/dev/sda", "swap": swap, "ephemerals": ephemerals, "block_device_mapping": block_device_mapping, } empty_block_device_info = {} self.assertEqual(driver.block_device_info_get_root(block_device_info), "/dev/sda") self.assertIsNone(driver.block_device_info_get_root(empty_block_device_info)) self.assertIsNone(driver.block_device_info_get_root(None)) self.assertEqual(driver.block_device_info_get_swap(block_device_info), swap) self.assertIsNone(driver.block_device_info_get_swap(empty_block_device_info)["device_name"]) self.assertEqual(driver.block_device_info_get_swap(empty_block_device_info)["swap_size"], 0) self.assertIsNone(driver.block_device_info_get_swap({"swap": None})["device_name"]) self.assertEqual(driver.block_device_info_get_swap({"swap": None})["swap_size"], 0) self.assertIsNone(driver.block_device_info_get_swap(None)["device_name"]) self.assertEqual(driver.block_device_info_get_swap(None)["swap_size"], 0) self.assertEqual(driver.block_device_info_get_ephemerals(block_device_info), ephemerals) self.assertEqual(driver.block_device_info_get_ephemerals(empty_block_device_info), []) self.assertEqual(driver.block_device_info_get_ephemerals(None), [])
def test_block_device(self): swap = {'device_name': '/dev/sdb', 'swap_size': 1} ephemerals = [{ 'num': 0, 'virtual_name': 'ephemeral0', 'device_name': '/dev/sdc1', 'size': 1 }] block_device_mapping = [{ 'mount_device': '/dev/sde', 'device_path': 'fake_device' }] block_device_info = { 'root_device_name': '/dev/sda', 'swap': swap, 'ephemerals': ephemerals, 'block_device_mapping': block_device_mapping } empty_block_device_info = {} self.assertEqual(driver.block_device_info_get_root(block_device_info), '/dev/sda') self.assertEqual( driver.block_device_info_get_root(empty_block_device_info), None) self.assertEqual(driver.block_device_info_get_root(None), None) self.assertEqual(driver.block_device_info_get_swap(block_device_info), swap) self.assertEqual( driver.block_device_info_get_swap(empty_block_device_info) ['device_name'], None) self.assertEqual( driver.block_device_info_get_swap(empty_block_device_info) ['swap_size'], 0) self.assertEqual( driver.block_device_info_get_swap({'swap': None})['device_name'], None) self.assertEqual( driver.block_device_info_get_swap({'swap': None})['swap_size'], 0) self.assertEqual( driver.block_device_info_get_swap(None)['device_name'], None) self.assertEqual( driver.block_device_info_get_swap(None)['swap_size'], 0) self.assertEqual( driver.block_device_info_get_ephemerals(block_device_info), ephemerals) self.assertEqual( driver.block_device_info_get_ephemerals(empty_block_device_info), []) self.assertEqual(driver.block_device_info_get_ephemerals(None), [])
def test_block_device(self): swap = {'device_name': '/dev/sdb', 'swap_size': 1} ephemerals = [{'num': 0, 'virtual_name': 'ephemeral0', 'device_name': '/dev/sdc1', 'size': 1}] block_device_mapping = [{'mount_device': '/dev/sde', 'device_path': 'fake_device'}] block_device_info = { 'root_device_name': '/dev/sda', 'swap': swap, 'ephemerals': ephemerals, 'block_device_mapping': block_device_mapping} empty_block_device_info = {} self.assertEqual( driver.block_device_info_get_root(block_device_info), '/dev/sda') self.assertEqual( driver.block_device_info_get_root(empty_block_device_info), None) self.assertEqual( driver.block_device_info_get_root(None), None) self.assertEqual( driver.block_device_info_get_swap(block_device_info), swap) self.assertEqual(driver.block_device_info_get_swap( empty_block_device_info)['device_name'], None) self.assertEqual(driver.block_device_info_get_swap( empty_block_device_info)['swap_size'], 0) self.assertEqual( driver.block_device_info_get_swap({'swap': None})['device_name'], None) self.assertEqual( driver.block_device_info_get_swap({'swap': None})['swap_size'], 0) self.assertEqual( driver.block_device_info_get_swap(None)['device_name'], None) self.assertEqual( driver.block_device_info_get_swap(None)['swap_size'], 0) self.assertEqual( driver.block_device_info_get_ephemerals(block_device_info), ephemerals) self.assertEqual( driver.block_device_info_get_ephemerals(empty_block_device_info), []) self.assertEqual( driver.block_device_info_get_ephemerals(None), [])
def _check_and_update_root_device(self, vm_gen, image_meta, block_device_info, slot_map): # either booting from volume, or booting from image/iso root_disk = {} root_device = (driver.block_device_info_get_root(block_device_info) or self._DEFAULT_ROOT_DEVICE) if self.is_boot_from_volume(block_device_info): root_volume = self._get_root_device_bdm( block_device_info, root_device) root_disk['type'] = constants.VOLUME root_disk['path'] = None root_disk['connection_info'] = root_volume['connection_info'] else: root_disk['type'] = self._TYPE_FOR_DISK_FORMAT.get( image_meta['disk_format']) if root_disk['type'] is None: raise exception.InvalidImageFormat( format=image_meta['disk_format']) root_disk['path'] = None root_disk['connection_info'] = None root_disk['disk_bus'] = (constants.CTRL_TYPE_IDE if vm_gen == constants.VM_GEN_1 else constants.CTRL_TYPE_SCSI) (root_disk['drive_addr'], root_disk['ctrl_disk_addr']) = self._get_available_controller_slot( root_disk['disk_bus'], slot_map) root_disk['boot_index'] = 0 root_disk['mount_device'] = root_device block_device_info['root_disk'] = root_disk
def _check_and_update_root_device(self, vm_gen, image_meta, block_device_info, slot_map): # either booting from volume, or booting from image/iso root_disk = {} root_device = (driver.block_device_info_get_root(block_device_info) or self._DEFAULT_ROOT_DEVICE) if self.is_boot_from_volume(block_device_info): root_volume = self._get_root_device_bdm(block_device_info, root_device) root_disk['type'] = constants.VOLUME root_disk['path'] = None root_disk['connection_info'] = root_volume['connection_info'] else: root_disk['type'] = self._TYPE_FOR_DISK_FORMAT.get( image_meta.disk_format) if root_disk['type'] is None: raise exception.InvalidImageFormat( format=image_meta.disk_format) root_disk['path'] = None root_disk['connection_info'] = None root_disk['disk_bus'] = (constants.CTRL_TYPE_IDE if vm_gen == constants.VM_GEN_1 else constants.CTRL_TYPE_SCSI) (root_disk['drive_addr'], root_disk['ctrl_disk_addr']) = self._get_available_controller_slot( root_disk['disk_bus'], slot_map) root_disk['boot_index'] = 0 root_disk['mount_device'] = root_device block_device_info['root_disk'] = root_disk
def _attach_block_device(self, context, instance, block_device_info): block_device_mapping = [] if block_device_info is not None: block_device_mapping = driver.block_device_info_get_mapping( block_device_info) if block_device_mapping: msg = "Block device information present: %s" % block_device_info LOG.debug(msg, instance=instance) root_device_name = \ driver.block_device_info_get_root(block_device_info) for disk in block_device_mapping: connection_info = disk['connection_info'] # if non root device, do attach. root device will automatic # attach when boot. if root_device_name != disk['mount_device']: self.attach_volume(context, connection_info, instance, None)
def get_disk_mapping(virt_type, instance, disk_bus, cdrom_bus, block_device_info=None, image_meta=None, rescue=False): """Determine how to map default disks to the virtual machine. This is about figuring out whether the default 'disk', 'disk.local', 'disk.swap' and 'disk.config' images have been overridden by the block device mapping. Returns the guest disk mapping for the devices. """ inst_type = flavors.extract_flavor(instance) mapping = {} pre_assigned_device_names = \ [block_device.strip_dev(get_device_name(bdm)) for bdm in itertools.chain( driver.block_device_info_get_ephemerals(block_device_info), [driver.block_device_info_get_swap(block_device_info)], driver.block_device_info_get_mapping(block_device_info)) if get_device_name(bdm)] if rescue: rescue_info = get_next_disk_info(mapping, disk_bus, boot_index=1) mapping['disk.rescue'] = rescue_info mapping['root'] = rescue_info os_info = get_next_disk_info(mapping, disk_bus) mapping['disk'] = os_info return mapping # NOTE (ndipanov): root_bdm can be None when we boot from image # as there is no driver represenation of local targeted images # and they will not be in block_device_info list. root_bdm = block_device.get_root_bdm( driver.block_device_info_get_mapping(block_device_info)) root_device_name = block_device.strip_dev( driver.block_device_info_get_root(block_device_info)) root_info = get_root_info(virt_type, image_meta, root_bdm, disk_bus, cdrom_bus, root_device_name) mapping['root'] = root_info # NOTE (ndipanov): This implicitly relies on image->local BDMs not # being considered in the driver layer - so missing # bdm with boot_index 0 means - use image, unless it was # overridden. This can happen when using legacy syntax and # no root_device_name is set on the instance. if not root_bdm and not block_device.volume_in_mapping(root_info['dev'], block_device_info): mapping['disk'] = root_info default_eph = has_default_ephemeral(instance, disk_bus, block_device_info, mapping) if default_eph: mapping['disk.local'] = default_eph for idx, eph in enumerate(driver.block_device_info_get_ephemerals( block_device_info)): eph_info = get_info_from_bdm( virt_type, eph, mapping, disk_bus, assigned_devices=pre_assigned_device_names) mapping[get_eph_disk(idx)] = eph_info update_bdm(eph, eph_info) swap = driver.block_device_info_get_swap(block_device_info) if swap and swap.get('swap_size', 0) > 0: swap_info = get_info_from_bdm(virt_type, swap, mapping, disk_bus) mapping['disk.swap'] = swap_info update_bdm(swap, swap_info) elif inst_type['swap'] > 0: swap_info = get_next_disk_info(mapping, disk_bus) if not block_device.volume_in_mapping(swap_info['dev'], block_device_info): mapping['disk.swap'] = swap_info block_device_mapping = driver.block_device_info_get_mapping( block_device_info) for vol in block_device_mapping: vol_info = get_info_from_bdm( virt_type, vol, mapping, assigned_devices=pre_assigned_device_names) mapping[block_device.prepend_dev(vol_info['dev'])] = vol_info update_bdm(vol, vol_info) if configdrive.required_by(instance): device_type = get_config_drive_type() disk_bus = get_disk_bus_for_device_type(virt_type, image_meta, device_type) config_info = get_next_disk_info(mapping, disk_bus, device_type, last_device=True) mapping['disk.config'] = config_info return mapping
def get_disk_mapping(virt_type, instance, disk_bus, cdrom_bus, block_device_info=None, image_meta=None, rescue=False): """Determine how to map default disks to the virtual machine. This is about figuring out whether the default 'disk', 'disk.local', 'disk.swap' and 'disk.config' images have been overriden by the block device mapping. Returns the guest disk mapping for the devices.""" inst_type = flavors.extract_instance_type(instance) mapping = {} if virt_type == "lxc": # NOTE(zul): This information is not used by the libvirt driver # however we need to populate mapping so the image can be # created when the instance is started. This can # be removed when we convert LXC to use block devices. root_disk_bus = disk_bus root_device_type = 'disk' root_info = get_next_disk_info(mapping, root_disk_bus, root_device_type) mapping['root'] = root_info mapping['disk'] = root_info return mapping if rescue: rescue_info = get_next_disk_info(mapping, disk_bus) mapping['disk.rescue'] = rescue_info mapping['root'] = rescue_info os_info = get_next_disk_info(mapping, disk_bus) mapping['disk'] = os_info return mapping if image_meta and image_meta.get('disk_format') == 'iso': root_disk_bus = cdrom_bus root_device_type = 'cdrom' else: root_disk_bus = disk_bus root_device_type = 'disk' root_device_name = driver.block_device_info_get_root(block_device_info) if root_device_name is not None: root_device = block_device.strip_dev(root_device_name) root_info = { 'bus': get_disk_bus_for_disk_dev(virt_type, root_device), 'dev': root_device, 'type': root_device_type } else: root_info = get_next_disk_info(mapping, root_disk_bus, root_device_type) mapping['root'] = root_info if not block_device.volume_in_mapping(root_info['dev'], block_device_info): mapping['disk'] = root_info eph_info = get_next_disk_info(mapping, disk_bus) ephemeral_device = False if not (block_device.volume_in_mapping(eph_info['dev'], block_device_info) or 0 in [ eph['num'] for eph in driver.block_device_info_get_ephemerals( block_device_info) ]): if instance['ephemeral_gb'] > 0: ephemeral_device = True if ephemeral_device: mapping['disk.local'] = eph_info for eph in driver.block_device_info_get_ephemerals(block_device_info): disk_dev = block_device.strip_dev(eph['device_name']) disk_bus = get_disk_bus_for_disk_dev(virt_type, disk_dev) mapping[get_eph_disk(eph)] = { 'bus': disk_bus, 'dev': disk_dev, 'type': 'disk' } swap = driver.block_device_info_get_swap(block_device_info) if driver.swap_is_usable(swap): disk_dev = block_device.strip_dev(swap['device_name']) disk_bus = get_disk_bus_for_disk_dev(virt_type, disk_dev) mapping['disk.swap'] = { 'bus': disk_bus, 'dev': disk_dev, 'type': 'disk' } elif inst_type['swap'] > 0: swap_info = get_next_disk_info(mapping, disk_bus) if not block_device.volume_in_mapping(swap_info['dev'], block_device_info): mapping['disk.swap'] = swap_info block_device_mapping = driver.block_device_info_get_mapping( block_device_info) for vol in block_device_mapping: disk_dev = vol['mount_device'].rpartition("/")[2] disk_bus = get_disk_bus_for_disk_dev(virt_type, disk_dev) mapping[vol['mount_device']] = { 'bus': disk_bus, 'dev': disk_dev, 'type': 'disk' } if configdrive.enabled_for(instance): config_info = get_next_disk_info(mapping, disk_bus, last_device=True) mapping['disk.config'] = config_info return mapping
def get_disk_mapping(virt_type, instance, disk_bus, cdrom_bus, image_meta, block_device_info=None, rescue=False): """Determine how to map default disks to the virtual machine. This is about figuring out whether the default 'disk', 'disk.local', 'disk.swap' and 'disk.config' images have been overridden by the block device mapping. Returns the guest disk mapping for the devices. """ mapping = {} if rescue: rescue_info = get_next_disk_info(mapping, disk_bus, boot_index=1) mapping['disk.rescue'] = rescue_info mapping['root'] = rescue_info os_info = get_next_disk_info(mapping, disk_bus) mapping['disk'] = os_info return mapping inst_type = instance.get_flavor() pre_assigned_device_names = \ [block_device.strip_dev(get_device_name(bdm)) for bdm in itertools.chain( driver.block_device_info_get_ephemerals(block_device_info), [driver.block_device_info_get_swap(block_device_info)], driver.block_device_info_get_mapping(block_device_info)) if get_device_name(bdm)] # NOTE (ndipanov): root_bdm can be None when we boot from image # as there is no driver represenation of local targeted images # and they will not be in block_device_info list. root_bdm = block_device.get_root_bdm( driver.block_device_info_get_mapping(block_device_info)) root_device_name = block_device.strip_dev( driver.block_device_info_get_root(block_device_info)) root_info = get_root_info( instance, virt_type, image_meta, root_bdm, disk_bus, cdrom_bus, root_device_name) mapping['root'] = root_info # NOTE (ndipanov): This implicitly relies on image->local BDMs not # being considered in the driver layer - so missing # bdm with boot_index 0 means - use image, unless it was # overridden. This can happen when using legacy syntax and # no root_device_name is set on the instance. if not root_bdm and not block_device.volume_in_mapping(root_info['dev'], block_device_info): mapping['disk'] = root_info elif root_bdm: # NOTE (ft): If device name is not set in root bdm, root_info has a # generated one. We have to copy device name to root bdm to prevent its # second generation in loop through bdms. If device name is already # set, nothing is changed. update_bdm(root_bdm, root_info) default_eph = has_default_ephemeral(instance, disk_bus, block_device_info, mapping) if default_eph: mapping['disk.local'] = default_eph for idx, eph in enumerate(driver.block_device_info_get_ephemerals( block_device_info)): eph_info = get_info_from_bdm( instance, virt_type, image_meta, eph, mapping, disk_bus, assigned_devices=pre_assigned_device_names) mapping[get_eph_disk(idx)] = eph_info update_bdm(eph, eph_info) swap = driver.block_device_info_get_swap(block_device_info) if swap and swap.get('swap_size', 0) > 0: swap_info = get_info_from_bdm( instance, virt_type, image_meta, swap, mapping, disk_bus) mapping['disk.swap'] = swap_info update_bdm(swap, swap_info) elif inst_type['swap'] > 0: swap_info = get_next_disk_info(mapping, disk_bus, assigned_devices=pre_assigned_device_names) if not block_device.volume_in_mapping(swap_info['dev'], block_device_info): mapping['disk.swap'] = swap_info block_device_mapping = driver.block_device_info_get_mapping( block_device_info) for vol in block_device_mapping: vol_info = get_info_from_bdm( instance, virt_type, image_meta, vol, mapping, assigned_devices=pre_assigned_device_names) mapping[block_device.prepend_dev(vol_info['dev'])] = vol_info update_bdm(vol, vol_info) if configdrive.required_by(instance): device_type = get_config_drive_type() disk_bus = get_disk_bus_for_device_type(instance, virt_type, image_meta, device_type) config_info = get_next_disk_info(mapping, disk_bus, device_type, last_device=True) mapping['disk.config'] = config_info return mapping
def get_disk_mapping(virt_type, instance, disk_bus, cdrom_bus, block_device_info=None, image_meta=None, rescue=False): """Determine how to map default disks to the virtual machine. This is about figuring out whether the default 'disk', 'disk.local', 'disk.swap' and 'disk.config' images have been overriden by the block device mapping. Returns the guest disk mapping for the devices. """ inst_type = flavors.extract_flavor(instance) mapping = {} if virt_type == "lxc": # NOTE(zul): This information is not used by the libvirt driver # however we need to populate mapping so the image can be # created when the instance is started. This can # be removed when we convert LXC to use block devices. root_disk_bus = disk_bus root_device_type = 'disk' root_info = get_next_disk_info(mapping, root_disk_bus, root_device_type) mapping['root'] = root_info mapping['disk'] = root_info return mapping if rescue: rescue_info = get_next_disk_info(mapping, disk_bus) mapping['disk.rescue'] = rescue_info mapping['root'] = rescue_info os_info = get_next_disk_info(mapping, disk_bus) mapping['disk'] = os_info return mapping if image_meta and image_meta.get('disk_format') == 'iso': root_disk_bus = cdrom_bus root_device_type = 'cdrom' else: root_disk_bus = disk_bus root_device_type = 'disk' root_device_name = driver.block_device_info_get_root(block_device_info) if root_device_name is not None: root_device = block_device.strip_dev(root_device_name) root_info = {'bus': get_disk_bus_for_disk_dev(virt_type, root_device), 'dev': root_device, 'type': root_device_type} else: root_info = get_next_disk_info(mapping, root_disk_bus, root_device_type) mapping['root'] = root_info if not block_device.volume_in_mapping(root_info['dev'], block_device_info): mapping['disk'] = root_info eph_info = get_next_disk_info(mapping, disk_bus) ephemeral_device = False if not (block_device.volume_in_mapping(eph_info['dev'], block_device_info) or 0 in [eph['num'] for eph in driver.block_device_info_get_ephemerals( block_device_info)]): if instance['ephemeral_gb'] > 0: ephemeral_device = True if ephemeral_device: mapping['disk.local'] = eph_info for eph in driver.block_device_info_get_ephemerals( block_device_info): disk_dev = block_device.strip_dev(eph['device_name']) disk_bus = get_disk_bus_for_disk_dev(virt_type, disk_dev) mapping[get_eph_disk(eph)] = {'bus': disk_bus, 'dev': disk_dev, 'type': 'disk'} swap = driver.block_device_info_get_swap(block_device_info) if driver.swap_is_usable(swap): disk_dev = block_device.strip_dev(swap['device_name']) disk_bus = get_disk_bus_for_disk_dev(virt_type, disk_dev) mapping['disk.swap'] = {'bus': disk_bus, 'dev': disk_dev, 'type': 'disk'} elif inst_type['swap'] > 0: swap_info = get_next_disk_info(mapping, disk_bus) if not block_device.volume_in_mapping(swap_info['dev'], block_device_info): mapping['disk.swap'] = swap_info block_device_mapping = driver.block_device_info_get_mapping( block_device_info) for vol in block_device_mapping: disk_dev = vol['mount_device'].rpartition("/")[2] disk_bus = get_disk_bus_for_disk_dev(virt_type, disk_dev) mapping[vol['mount_device']] = {'bus': disk_bus, 'dev': disk_dev, 'type': 'disk'} if configdrive.required_by(instance): config_info = get_next_disk_info(mapping, disk_bus, last_device=True) mapping['disk.config'] = config_info return mapping
def get_disk_mapping(virt_type, instance, disk_bus, cdrom_bus, block_device_info=None, image_meta=None, rescue=False): """Determine how to map default disks to the virtual machine. This is about figuring out whether the default 'disk', 'disk.local', 'disk.swap' and 'disk.config' images have been overridden by the block device mapping. Returns the guest disk mapping for the devices. """ inst_type = flavors.extract_flavor(instance) mapping = {} pre_assigned_device_names = \ [block_device.strip_dev(get_device_name(bdm)) for bdm in itertools.chain( driver.block_device_info_get_ephemerals(block_device_info), [driver.block_device_info_get_swap(block_device_info)], driver.block_device_info_get_mapping(block_device_info)) if get_device_name(bdm)] if virt_type == "lxc": # NOTE(zul): This information is not used by the libvirt driver # however we need to populate mapping so the image can be # created when the instance is started. This can # be removed when we convert LXC to use block devices. root_disk_bus = disk_bus root_device_type = 'disk' root_info = get_next_disk_info(mapping, root_disk_bus, root_device_type, boot_index=1) mapping['root'] = root_info mapping['disk'] = root_info return mapping if rescue: rescue_info = get_next_disk_info(mapping, disk_bus, boot_index=1) mapping['disk.rescue'] = rescue_info mapping['root'] = rescue_info os_info = get_next_disk_info(mapping, disk_bus) mapping['disk'] = os_info return mapping # NOTE (ndipanov): root_bdm can be None when we boot from image # as there is no driver represenation of local targeted images # and they will not be in block_device_info list. root_bdm = block_device.get_root_bdm( driver.block_device_info_get_mapping(block_device_info)) root_device_name = block_device.strip_dev( driver.block_device_info_get_root(block_device_info)) root_info = get_root_info(virt_type, image_meta, root_bdm, disk_bus, cdrom_bus, root_device_name) mapping['root'] = root_info # NOTE (ndipanov): This implicitly relies on image->local BDMs not # being considered in the driver layer - so missing # bdm with boot_index 0 means - use image, unless it was # overridden. This can happen when using legacy syntax and # no root_device_name is set on the instance. if not root_bdm and not block_device.volume_in_mapping(root_info['dev'], block_device_info): mapping['disk'] = root_info default_eph = has_default_ephemeral(instance, disk_bus, block_device_info, mapping) if default_eph: mapping['disk.local'] = default_eph for idx, eph in enumerate(driver.block_device_info_get_ephemerals( block_device_info)): eph_info = get_info_from_bdm( virt_type, eph, mapping, disk_bus, assigned_devices=pre_assigned_device_names) mapping[get_eph_disk(idx)] = eph_info update_bdm(eph, eph_info) swap = driver.block_device_info_get_swap(block_device_info) if swap and swap.get('swap_size', 0) > 0: swap_info = get_info_from_bdm(virt_type, swap, mapping, disk_bus) mapping['disk.swap'] = swap_info update_bdm(swap, swap_info) elif inst_type['swap'] > 0: swap_info = get_next_disk_info(mapping, disk_bus) if not block_device.volume_in_mapping(swap_info['dev'], block_device_info): mapping['disk.swap'] = swap_info block_device_mapping = driver.block_device_info_get_mapping( block_device_info) for vol in block_device_mapping: vol_info = get_info_from_bdm( virt_type, vol, mapping, assigned_devices=pre_assigned_device_names) mapping[block_device.prepend_dev(vol_info['dev'])] = vol_info update_bdm(vol, vol_info) if configdrive.required_by(instance): device_type = get_config_drive_type() disk_bus = get_disk_bus_for_device_type(virt_type, image_meta, device_type) config_info = get_next_disk_info(mapping, disk_bus, device_type, last_device=True) mapping['disk.config'] = config_info return mapping
def is_boot_from_volume(block_device_info): root_mount_device = driver.block_device_info_get_root(block_device_info) boot_from_volume = _volume_in_mapping(root_mount_device, block_device_info) return root_mount_device, boot_from_volume