def _update_image_block_device_mapping(self, elevated_context, instance_type, instance_uuid, mappings): """tell vm driver to create ephemeral/swap device at boot time by updating BlockDeviceMapping """ for bdm in block_device.mappings_prepend_dev(mappings): LOG.debug(_("bdm %s"), bdm, instance_uuid=instance_uuid) virtual_name = bdm['virtual'] if virtual_name == 'ami' or virtual_name == 'root': continue if not block_device.is_swap_or_ephemeral(virtual_name): continue size = self._volume_size(instance_type, virtual_name) if size == 0: continue values = { 'instance_uuid': instance_uuid, 'device_name': bdm['device'], 'virtual_name': virtual_name, 'volume_size': size} self.db.block_device_mapping_update_or_create(elevated_context, values)
def _setup_block_device_mapping(self, context, instance, bdms): """setup volumes for block device mapping.""" block_device_mapping = [] swap = None ephemerals = [] for bdm in bdms: LOG.debug(_('Setting up bdm %s'), bdm, instance=instance) if bdm['no_device']: continue if bdm['virtual_name']: virtual_name = bdm['virtual_name'] device_name = bdm['device_name'] assert block_device.is_swap_or_ephemeral(virtual_name) if virtual_name == 'swap': swap = {'device_name': device_name, 'swap_size': bdm['volume_size']} elif block_device.is_ephemeral(virtual_name): eph = {'num': block_device.ephemeral_num(virtual_name), 'virtual_name': virtual_name, 'device_name': device_name, 'size': bdm['volume_size']} ephemerals.append(eph) continue if ((bdm['snapshot_id'] is not None) and (bdm['volume_id'] is None)): # TODO(yamahata): default name and description snapshot = self.volume_api.get_snapshot(context, bdm['snapshot_id']) vol = self.volume_api.create(context, bdm['volume_size'], '', '', snapshot) self._await_block_device_map_created(context, vol['id']) self.conductor_api.block_device_mapping_update( context, bdm['id'], {'volume_id': vol['id']}) bdm['volume_id'] = vol['id'] block_device_mapping.append(bdm) block_device_info = { 'root_device_name': instance['root_device_name'], 'swap': swap, 'ephemerals': ephemerals, 'block_device_mapping': block_device_mapping } return block_device_info
def _format_instance_mapping(self, ctxt, instance_ref): root_device_name = instance_ref['root_device_name'] if root_device_name is None: return _DEFAULT_MAPPINGS mappings = {} mappings['ami'] = block_device.strip_dev(root_device_name) mappings['root'] = root_device_name default_ephemeral_device = \ instance_ref.get('default_ephemeral_device') if default_ephemeral_device: mappings['ephemeral0'] = default_ephemeral_device default_swap_device = instance_ref.get('default_swap_device') if default_swap_device: mappings['swap'] = default_swap_device ebs_devices = [] # 'ephemeralN', 'swap' and ebs for bdm in db.block_device_mapping_get_all_by_instance( ctxt, instance_ref['id']): if bdm['no_device']: continue # ebs volume case if (bdm['volume_id'] or bdm['snapshot_id']): ebs_devices.append(bdm['device_name']) continue virtual_name = bdm['virtual_name'] if not virtual_name: continue if block_device.is_swap_or_ephemeral(virtual_name): mappings[virtual_name] = bdm['device_name'] # NOTE(yamahata): I'm not sure how ebs device should be numbered. # Right now sort by device name for deterministic # result. if ebs_devices: nebs = 0 ebs_devices.sort() for ebs in ebs_devices: mappings['ebs%d' % nebs] = ebs nebs += 1 return mappings
def _format_instance_mapping(self, ctxt, instance_ref): root_device_name = instance_ref['root_device_name'] if root_device_name is None: return _DEFAULT_MAPPINGS mappings = {} mappings['ami'] = block_device.strip_dev(root_device_name) mappings['root'] = root_device_name default_ephemeral_device = \ instance_ref.get('default_ephemeral_device') if default_ephemeral_device: mappings['ephemeral0'] = default_ephemeral_device default_swap_device = instance_ref.get('default_swap_device') if default_swap_device: mappings['swap'] = default_swap_device ebs_devices = [] # 'ephemeralN', 'swap' and ebs for bdm in db.block_device_mapping_get_all_by_instance( ctxt, instance_ref['id']): if bdm['no_device']: continue # ebs volume case if (bdm['volume_id'] or bdm['snapshot_id']): ebs_devices.append(bdm['device_name']) continue virtual_name = bdm['virtual_name'] if not virtual_name: continue if block_device.is_swap_or_ephemeral(virtual_name): mappings[virtual_name] = bdm['device_name'] # NOTE(yamahata): I'm not sure how ebs device should be numbered. # Right now sort by device name for deterministic # result. if ebs_devices: nebs = 0 ebs_devices.sort() for ebs in ebs_devices: mappings['ebs%d' % nebs] = ebs nebs += 1 return mappings
def _format_instance_mapping(ctxt, instance): root_device_name = instance["root_device_name"] if root_device_name is None: return _DEFAULT_MAPPINGS mappings = {} mappings["ami"] = block_device.strip_dev(root_device_name) mappings["root"] = root_device_name default_ephemeral_device = instance.get("default_ephemeral_device") if default_ephemeral_device: mappings["ephemeral0"] = default_ephemeral_device default_swap_device = instance.get("default_swap_device") if default_swap_device: mappings["swap"] = default_swap_device ebs_devices = [] # 'ephemeralN', 'swap' and ebs for bdm in db.block_device_mapping_get_all_by_instance(ctxt, instance["uuid"]): if bdm["no_device"]: continue # ebs volume case if bdm["volume_id"] or bdm["snapshot_id"]: ebs_devices.append(bdm["device_name"]) continue virtual_name = bdm["virtual_name"] if not virtual_name: continue if block_device.is_swap_or_ephemeral(virtual_name): mappings[virtual_name] = bdm["device_name"] # NOTE(yamahata): I'm not sure how ebs device should be numbered. # Right now sort by device name for deterministic # result. if ebs_devices: nebs = 0 ebs_devices.sort() for ebs in ebs_devices: mappings["ebs%d" % nebs] = ebs nebs += 1 return mappings
def _update_block_device_mapping(self, elevated_context, instance_type, instance_uuid, block_device_mapping): """tell vm driver to attach volume at boot time by updating BlockDeviceMapping """ LOG.debug(_("block_device_mapping %s"), block_device_mapping, instance_uuid=instance_uuid) for bdm in block_device_mapping: assert 'device_name' in bdm values = {'instance_uuid': instance_uuid} for key in ('device_name', 'delete_on_termination', 'virtual_name', 'snapshot_id', 'volume_id', 'volume_size', 'no_device'): values[key] = bdm.get(key) virtual_name = bdm.get('virtual_name') if (virtual_name is not None and block_device.is_swap_or_ephemeral(virtual_name)): size = self._volume_size(instance_type, virtual_name) if size == 0: continue values['volume_size'] = size # NOTE(yamahata): NoDevice eliminates devices defined in image # files by command line option. # (--block-device-mapping) if virtual_name == 'NoDevice': values['no_device'] = True for k in ('delete_on_termination', 'virtual_name', 'snapshot_id', 'volume_id', 'volume_size'): values[k] = None self.db.block_device_mapping_update_or_create(elevated_context, values)
def test_ephemeral(self): self.assertFalse(block_device.is_ephemeral('ephemeral')) self.assertTrue(block_device.is_ephemeral('ephemeral0')) self.assertTrue(block_device.is_ephemeral('ephemeral1')) self.assertTrue(block_device.is_ephemeral('ephemeral11')) self.assertFalse(block_device.is_ephemeral('root')) self.assertFalse(block_device.is_ephemeral('swap')) self.assertFalse(block_device.is_ephemeral('/dev/sda1')) self.assertEqual(block_device.ephemeral_num('ephemeral0'), 0) self.assertEqual(block_device.ephemeral_num('ephemeral1'), 1) self.assertEqual(block_device.ephemeral_num('ephemeral11'), 11) self.assertFalse(block_device.is_swap_or_ephemeral('ephemeral')) self.assertTrue(block_device.is_swap_or_ephemeral('ephemeral0')) self.assertTrue(block_device.is_swap_or_ephemeral('ephemeral1')) self.assertTrue(block_device.is_swap_or_ephemeral('swap')) self.assertFalse(block_device.is_swap_or_ephemeral('root')) self.assertFalse(block_device.is_swap_or_ephemeral('/dev/sda1'))
def test_ephemeral(self): self.assertFalse(block_device.is_ephemeral('ephemeral')) self.assertTrue(block_device.is_ephemeral('ephemeral0')) self.assertTrue(block_device.is_ephemeral('ephemeral1')) self.assertTrue(block_device.is_ephemeral('ephemeral11')) self.assertFalse(block_device.is_ephemeral('root')) self.assertFalse(block_device.is_ephemeral('swap')) self.assertFalse(block_device.is_ephemeral('/dev/sda1')) self.assertEqual(block_device.ephemeral_num('ephemeral0'), 0) self.assertEqual(block_device.ephemeral_num('ephemeral1'), 1) self.assertEqual(block_device.ephemeral_num('ephemeral11'), 11) self.assertFalse(block_device.is_swap_or_ephemeral('ephemeral')) self.assertTrue(block_device.is_swap_or_ephemeral('ephemeral0')) self.assertTrue(block_device.is_swap_or_ephemeral('ephemeral1')) self.assertTrue(block_device.is_swap_or_ephemeral('swap')) self.assertFalse(block_device.is_swap_or_ephemeral('root')) self.assertFalse(block_device.is_swap_or_ephemeral('/dev/sda1'))
def test_ephemeral(self): self.assertFalse(block_device.is_ephemeral("ephemeral")) self.assertTrue(block_device.is_ephemeral("ephemeral0")) self.assertTrue(block_device.is_ephemeral("ephemeral1")) self.assertTrue(block_device.is_ephemeral("ephemeral11")) self.assertFalse(block_device.is_ephemeral("root")) self.assertFalse(block_device.is_ephemeral("swap")) self.assertFalse(block_device.is_ephemeral("/dev/sda1")) self.assertEqual(block_device.ephemeral_num("ephemeral0"), 0) self.assertEqual(block_device.ephemeral_num("ephemeral1"), 1) self.assertEqual(block_device.ephemeral_num("ephemeral11"), 11) self.assertFalse(block_device.is_swap_or_ephemeral("ephemeral")) self.assertTrue(block_device.is_swap_or_ephemeral("ephemeral0")) self.assertTrue(block_device.is_swap_or_ephemeral("ephemeral1")) self.assertTrue(block_device.is_swap_or_ephemeral("swap")) self.assertFalse(block_device.is_swap_or_ephemeral("root")) self.assertFalse(block_device.is_swap_or_ephemeral("/dev/sda1"))