diff options
Diffstat (limited to 'nova/virt/libvirt/connection.py')
-rw-r--r-- | nova/virt/libvirt/connection.py | 133 |
1 files changed, 82 insertions, 51 deletions
diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index 4455dacec..37ad07736 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -54,7 +54,6 @@ from xml.etree import ElementTree from nova.auth import manager from nova import block_device -from nova.common import cfg from nova.compute import instance_types from nova.compute import power_state from nova import context as nova_context @@ -63,10 +62,13 @@ from nova import exception from nova import flags import nova.image from nova import log as logging +from nova.openstack.common import cfg from nova import utils -from nova.virt.disk import api as disk from nova.virt import driver from nova.virt import images +from nova.virt.disk import api as disk +from nova.virt.libvirt import firewall +from nova.virt.libvirt import imagecache from nova.virt.libvirt import utils as libvirt_utils @@ -186,10 +188,12 @@ class LibvirtConnection(driver.ComputeDriver): super(LibvirtConnection, self).__init__() self._host_state = None + self._initiator = None self._wrapped_conn = None self.container = None self.read_only = read_only - + if FLAGS.firewall_driver not in firewall.drivers: + FLAGS['firewall_driver'].SetDefault(firewall.drivers[0]) fw_class = utils.import_class(FLAGS.firewall_driver) self.firewall_driver = fw_class(get_connection=self._get_connection) self.vif_driver = utils.import_object(FLAGS.libvirt_vif_driver) @@ -209,6 +213,8 @@ class LibvirtConnection(driver.ComputeDriver): self.default_ephemeral_device = self._disk_prefix + 'b' self.default_swap_device = self._disk_prefix + 'c' + self.image_cache_manager = imagecache.ImageCacheManager() + @property def host_state(self): if not self._host_state: @@ -420,6 +426,16 @@ class LibvirtConnection(driver.ComputeDriver): if os.path.exists(target): shutil.rmtree(target) + def get_volume_connector(self, _instance): + if not self._initiator: + self._initiator = libvirt_utils.get_iscsi_initiator() + if not self._initiator: + LOG.warn(_('Could not determine iscsi initiator name')) + return { + 'ip': FLAGS.my_ip, + 'initiator': self._initiator, + } + def volume_driver_method(self, method_name, connection_info, *args, **kwargs): driver_type = connection_info.get('driver_volume_type') @@ -690,8 +706,7 @@ class LibvirtConnection(driver.ComputeDriver): block_device_info=block_device_info) domain = self._create_new_domain(xml) - LOG.debug(_("instance %s: is running"), instance['name'], - instance=instance) + LOG.debug(_("instance is running"), instance=instance) self.firewall_driver.apply_instance_filter(instance, network_info) def _wait_for_boot(): @@ -701,13 +716,13 @@ class LibvirtConnection(driver.ComputeDriver): try: state = self.get_info(instance_name)['state'] except exception.NotFound: - msg = _("During reboot, %s disappeared.") % instance_name - LOG.error(msg, instance=instance) + LOG.error(_("During reboot, instance disappeared."), + instance=instance) raise utils.LoopingCallDone if state == power_state.RUNNING: - msg = _("Instance %s spawned successfully.") % instance_name - LOG.info(msg, instance=instance) + LOG.info(_("Instance spawned successfully."), + instance=instance) raise utils.LoopingCallDone timer = utils.LoopingCall(_wait_for_boot) @@ -720,7 +735,7 @@ class LibvirtConnection(driver.ComputeDriver): if virsh_output.startswith('/dev/'): LOG.info(_("cool, it's a device")) out, err = utils.execute('dd', - "if=%s" % virsh_output, + 'if=%s' % virsh_output, 'iflag=nonblock', run_as_root=True, check_exit_code=False) @@ -734,10 +749,11 @@ class LibvirtConnection(driver.ComputeDriver): fp.write(data) return fpath - def _inject_files(self, instance, files): + def _inject_files(self, instance, files, partition): disk_path = os.path.join(FLAGS.instances_path, instance['name'], 'disk') - disk.inject_files(disk_path, files, use_cow=FLAGS.use_cow_images) + disk.inject_files(disk_path, files, partition=partition, + use_cow=FLAGS.use_cow_images) @exception.wrap_exception() def get_console_output(self, instance): @@ -748,7 +764,8 @@ class LibvirtConnection(driver.ComputeDriver): if FLAGS.libvirt_type == 'xen': # Xen is special - virsh_output = utils.execute('virsh', 'ttyconsole', + virsh_output = utils.execute('virsh', + 'ttyconsole', instance['name']) data = self._flush_xen_console(virsh_output) fpath = self._append_to_file(data, console_log) @@ -823,7 +840,6 @@ class LibvirtConnection(driver.ComputeDriver): """ generating = 'image_id' not in kwargs - if not os.path.exists(target): base_dir = os.path.join(FLAGS.instances_path, '_base') if not os.path.exists(base_dir): @@ -866,6 +882,16 @@ class LibvirtConnection(driver.ComputeDriver): """Grab image to raw format""" images.fetch_to_raw(context, image_id, target, user_id, project_id) + if FLAGS.checksum_base_images: + f = open(target, 'r') + checksum = utils.hash_file(f) + f.close() + + checksum_fname = '%s.sha1' % target + fd = os.open(checksum_filename, os.O_WRONLY, mode=0444) + os.write(fd, checksum) + os.close(fd) + @staticmethod def _create_local(target, local_size, unit='G', fs_format=None): """Create a blank image of specified size""" @@ -888,7 +914,7 @@ class LibvirtConnection(driver.ComputeDriver): libvirt_utils.create_image('raw', target, '%dM' % swap_mb) libvirt_utils.mkfs('swap', target) - def _create_image(self, context, inst, libvirt_xml, suffix='', + def _create_image(self, context, instance, libvirt_xml, suffix='', disk_images=None, network_info=None, block_device_info=None): if not suffix: @@ -897,13 +923,13 @@ class LibvirtConnection(driver.ComputeDriver): # syntactic nicety def basepath(fname='', suffix=suffix): return os.path.join(FLAGS.instances_path, - inst['name'], + instance['name'], fname + suffix) # ensure directories exist and are writable libvirt_utils.ensure_tree(basepath(suffix='')) - LOG.info(_('instance %s: Creating image'), inst['name']) + LOG.info(_('Creating image'), instance=instance) libvirt_utils.write_to_file(basepath('libvirt.xml'), libvirt_xml) if FLAGS.libvirt_type == 'lxc': @@ -914,9 +940,9 @@ class LibvirtConnection(driver.ComputeDriver): libvirt_utils.write_to_file(basepath('console.log', ''), '', 007) if not disk_images: - disk_images = {'image_id': inst['image_ref'], - 'kernel_id': inst['kernel_id'], - 'ramdisk_id': inst['ramdisk_id']} + disk_images = {'image_id': instance['image_ref'], + 'kernel_id': instance['kernel_id'], + 'ramdisk_id': instance['ramdisk_id']} if disk_images['kernel_id']: fname = disk_images['kernel_id'] @@ -925,8 +951,8 @@ class LibvirtConnection(driver.ComputeDriver): target=basepath('kernel'), fname=fname, image_id=disk_images['kernel_id'], - user_id=inst['user_id'], - project_id=inst['project_id']) + user_id=instance['user_id'], + project_id=instance['project_id']) if disk_images['ramdisk_id']: fname = disk_images['ramdisk_id'] self._cache_image(fn=libvirt_utils.fetch_image, @@ -934,19 +960,19 @@ class LibvirtConnection(driver.ComputeDriver): target=basepath('ramdisk'), fname=fname, image_id=disk_images['ramdisk_id'], - user_id=inst['user_id'], - project_id=inst['project_id']) + user_id=instance['user_id'], + project_id=instance['project_id']) root_fname = hashlib.sha1(str(disk_images['image_id'])).hexdigest() - size = inst['root_gb'] * 1024 * 1024 * 1024 + size = instance['root_gb'] * 1024 * 1024 * 1024 - inst_type_id = inst['instance_type_id'] + inst_type_id = instance['instance_type_id'] inst_type = instance_types.get_instance_type(inst_type_id) if size == 0 or suffix == '.rescue': size = None root_fname += "_sm" else: - root_fname += "_%d" % inst['root_gb'] + root_fname += "_%d" % instance['root_gb'] if not self._volume_in_mapping(self.default_root_device, block_device_info): @@ -956,31 +982,31 @@ class LibvirtConnection(driver.ComputeDriver): fname=root_fname, cow=FLAGS.use_cow_images, image_id=disk_images['image_id'], - user_id=inst['user_id'], - project_id=inst['project_id'], + user_id=instance['user_id'], + project_id=instance['project_id'], size=size) - ephemeral_gb = inst['ephemeral_gb'] + ephemeral_gb = instance['ephemeral_gb'] if ephemeral_gb and not self._volume_in_mapping( self.default_ephemeral_device, block_device_info): fn = functools.partial(self._create_ephemeral, fs_label='ephemeral0', - os_type=inst.os_type) + os_type=instance.os_type) self._cache_image(fn=fn, target=basepath('disk.local'), fname="ephemeral_%s_%s_%s" % - ("0", ephemeral_gb, inst.os_type), + ("0", ephemeral_gb, instance.os_type), cow=FLAGS.use_cow_images, ephemeral_size=ephemeral_gb) for eph in driver.block_device_info_get_ephemerals(block_device_info): fn = functools.partial(self._create_ephemeral, fs_label='ephemeral%d' % eph['num'], - os_type=inst.os_type) + os_type=instance.os_type) self._cache_image(fn=fn, target=basepath(_get_eph_disk(eph)), fname="ephemeral_%s_%s_%s" % - (eph['num'], eph['size'], inst.os_type), + (eph['num'], eph['size'], instance.os_type), cow=FLAGS.use_cow_images, ephemeral_size=eph['size']) @@ -1005,11 +1031,11 @@ class LibvirtConnection(driver.ComputeDriver): # partitioned disk image where the target partition is the first # partition target_partition = None - if not inst['kernel_id']: + if not instance['kernel_id']: target_partition = "1" - config_drive_id = inst.get('config_drive_id') - config_drive = inst.get('config_drive') + config_drive_id = instance.get('config_drive_id') + config_drive = instance.get('config_drive') if any((FLAGS.libvirt_type == 'lxc', config_drive, config_drive_id)): target_partition = None @@ -1020,14 +1046,14 @@ class LibvirtConnection(driver.ComputeDriver): target=basepath('disk.config'), fname=fname, image_id=config_drive_id, - user_id=inst['user_id'], - project_id=inst['project_id'],) + user_id=instance['user_id'], + project_id=instance['project_id'],) elif config_drive: self._create_local(basepath('disk.config'), 64, unit='M', fs_format='msdos') # 64MB - if inst['key_data']: - key = str(inst['key_data']) + if instance['key_data']: + key = str(instance['key_data']) else: key = None net = None @@ -1069,22 +1095,21 @@ class LibvirtConnection(driver.ComputeDriver): searchList=[{'interfaces': nets, 'use_ipv6': FLAGS.use_ipv6}])) - metadata = inst.get('metadata') + metadata = instance.get('metadata') if any((key, net, metadata)): - inst_name = inst['name'] + instance_name = instance['name'] if config_drive: # Should be True or None by now. injection_path = basepath('disk.config') img_id = 'config-drive' else: injection_path = basepath('disk') - img_id = inst.image_ref + img_id = instance.image_ref for injection in ('metadata', 'key', 'net'): if locals()[injection]: - LOG.info(_('instance %(inst_name)s: injecting ' - '%(injection)s into image %(img_id)s' - % locals())) + LOG.info(_('Injecting %(injection)s into image %(img_id)s' + % locals()), instance=instance) try: disk.inject_data(injection_path, key, net, metadata, partition=target_partition, @@ -1092,8 +1117,9 @@ class LibvirtConnection(driver.ComputeDriver): except Exception as e: # This could be a windows image, or a vmdk format disk - LOG.warn(_('instance %(inst_name)s: ignoring error injecting' - ' data into image %(img_id)s (%(e)s)') % locals()) + LOG.warn(_('Ignoring error injecting data into image ' + '%(img_id)s (%(e)s)') % locals(), + instance=instance) if FLAGS.libvirt_type == 'lxc': self.container = disk.setup_container(basepath('disk'), @@ -1103,9 +1129,10 @@ class LibvirtConnection(driver.ComputeDriver): if FLAGS.libvirt_type == 'uml': libvirt_utils.chown(basepath('disk'), 'root') - files_to_inject = inst.get('injected_files') + files_to_inject = instance.get('injected_files') if files_to_inject: - self._inject_files(inst, files_to_inject) + self._inject_files(instance, files_to_inject, + partition=target_partition) @staticmethod def _volume_in_mapping(mount_device, block_device_info): @@ -1996,6 +2023,10 @@ class LibvirtConnection(driver.ComputeDriver): """Sets the specified host's ability to accept new instances.""" pass + def manage_image_cache(self, context): + """Manage the local cache of images.""" + self.image_cache_manager.verify_base_images(context) + class HostState(object): """Manages information about the compute node through libvirt""" |