Andrew Bogott has uploaded a new change for review.
https://gerrit.wikimedia.org/r/297389
Change subject: Update our custom libvirt driver for 2015.1.4-0ubuntu2
......................................................................
Update our custom libvirt driver for 2015.1.4-0ubuntu2
Change-Id: I4781300c6bd97aeb82c6e150868552f0354be562
---
M modules/openstack/files/kilo/nova/virt-libvirt-driver
1 file changed, 91 insertions(+), 14 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/operations/puppet
refs/changes/89/297389/1
diff --git a/modules/openstack/files/kilo/nova/virt-libvirt-driver
b/modules/openstack/files/kilo/nova/virt-libvirt-driver
index 2c191a5..14a3a9e 100644
--- a/modules/openstack/files/kilo/nova/virt-libvirt-driver
+++ b/modules/openstack/files/kilo/nova/virt-libvirt-driver
@@ -33,6 +33,7 @@
import mmap
import operator
import os
+import platform
import shutil
import sys
import tempfile
@@ -95,6 +96,7 @@
from nova.virt.libvirt import host
from nova.virt.libvirt import imagebackend
from nova.virt.libvirt import imagecache
+from nova.virt.libvirt import instancejobtracker
from nova.virt.libvirt import lvm
from nova.virt.libvirt import rbd_utils
from nova.virt.libvirt import utils as libvirt_utils
@@ -464,6 +466,8 @@
{'actual': CONF.libvirt.sysinfo_serial,
'expect': ', '.join("'%s'" % k for k in
sysinfo_serial_funcs.keys())})
+
+ self.job_tracker = instancejobtracker.InstanceJobTracker()
def _get_volume_drivers(self):
return libvirt_volume_drivers
@@ -984,6 +988,8 @@
connector["wwnns"] = self._fc_wwnns
connector["wwpns"] = self._fc_wwpns
+ connector['platform'] = platform.machine()
+ connector['os_type'] = sys.platform
return connector
def _cleanup_resize(self, instance, network_info):
@@ -1327,10 +1333,23 @@
snapshot = self._image_api.get(context, image_id)
- disk_path = libvirt_utils.find_disk(virt_dom)
- source_format = libvirt_utils.get_disk_type(disk_path)
+ # source_format is an on-disk format
+ # source_type is a backend type
+ disk_path, source_format = libvirt_utils.find_disk(virt_dom)
+ source_type = libvirt_utils.get_disk_type_from_path(disk_path)
- image_format = CONF.libvirt.snapshot_image_format or source_format
+ # We won't have source_type for raw or qcow2 disks, because we can't
+ # determine that from the path. We should have it from the libvirt
+ # xml, though.
+ if source_type is None:
+ source_type = source_format
+ # For lxc instances we won't have it either from libvirt xml
+ # (because we just gave libvirt the mounted filesystem), or the path,
+ # so source_type is still going to be None. In this case,
+ # snapshot_backend is going to default to CONF.libvirt.images_type
+ # below, which is still safe.
+
+ image_format = CONF.libvirt.snapshot_image_format or source_type
# NOTE(bfilippov): save lvm and rbd as raw
if image_format == 'lvm' or image_format == 'rbd':
@@ -1356,7 +1375,7 @@
if (self._host.has_min_version(MIN_LIBVIRT_LIVESNAPSHOT_VERSION,
MIN_QEMU_LIVESNAPSHOT_VERSION,
REQ_HYPERVISOR_LIVESNAPSHOT)
- and source_format not in ('lvm', 'rbd')
+ and source_type not in ('lvm', 'rbd')
and not CONF.ephemeral_storage_encryption.enabled
and not CONF.workarounds.disable_libvirt_livesnapshot):
live_snapshot = True
@@ -1391,7 +1410,7 @@
snapshot_backend = self.image_backend.snapshot(instance,
disk_path,
- image_type=source_format)
+ image_type=source_type)
if live_snapshot:
LOG.info(_LI("Beginning live snapshot process"),
@@ -1410,7 +1429,8 @@
# NOTE(xqueralt): libvirt needs o+x in the temp directory
os.chmod(tmpdir, 0o701)
self._live_snapshot(context, instance, virt_dom, disk_path,
- out_path, image_format, base)
+ out_path, source_format, image_format,
+ base)
else:
snapshot_backend.snapshot_extract(out_path, image_format)
finally:
@@ -1520,7 +1540,7 @@
self._set_quiesced(context, instance, image_meta, False)
def _live_snapshot(self, context, instance, domain, disk_path, out_path,
- image_format, image_meta):
+ source_format, image_format, image_meta):
"""Snapshot an instance without downtime."""
# Save a copy of the domain's persistent XML file
xml = domain.XMLDesc(
@@ -1538,9 +1558,11 @@
# in QEMU 1.3. In order to do this, we need to create
# a destination image with the original backing file
# and matching size of the instance root disk.
- src_disk_size = libvirt_utils.get_disk_size(disk_path)
+ src_disk_size = libvirt_utils.get_disk_size(disk_path,
+ format=source_format)
src_back_path = libvirt_utils.get_disk_backing_file(disk_path,
- basename=False)
+ format=source_format,
+ basename=False)
disk_delta = out_path + '.delta'
libvirt_utils.create_cow_image(src_back_path, disk_delta,
src_disk_size)
@@ -2581,7 +2603,6 @@
def _create_local(target, local_size, unit='G',
fs_format=None, label=None):
"""Create a blank image of specified size."""
-
# Puppet hack from raw to qcow2
if not CONF.libvirt.images_type == "lvm":
libvirt_utils.create_image('qcow2', target,
@@ -5189,7 +5210,8 @@
else:
cpu = self._vcpu_model_to_cpu_config(guest_cpu)
- u = "http://libvirt.org/html/libvirt-libvirt.html#virCPUCompareResult"
+ u = ("http://libvirt.org/html/libvirt-libvirt-host.html#"
+ "virCPUCompareResult")
m = _("CPU doesn't have compatibility.\n\n%(ret)s\n\nRefer to %(u)s")
# unknown character exists in xml, then libvirt complains
try:
@@ -5808,6 +5830,24 @@
raise exception.DestinationDiskExists(path=instance_dir)
os.mkdir(instance_dir)
+ # Recreate the disk.info file and in doing so stop the
+ # imagebackend from recreating it incorrectly by inspecting the
+ # contents of each file when using the Raw backend.
+ if disk_info:
+ image_disk_info = {}
+ for info in jsonutils.loads(disk_info):
+ image_file = os.path.basename(info['path'])
+ image_path = os.path.join(instance_dir, image_file)
+ image_disk_info[image_path] = info['type']
+
+ LOG.debug('Creating disk.info with the contents: %s',
+ image_disk_info, instance=instance)
+
+ image_disk_info_path = os.path.join(instance_dir,
+ 'disk.info')
+ libvirt_utils.write_to_file(image_disk_info_path,
+ jsonutils.dumps(image_disk_info))
+
if not is_shared_block_storage:
# Ensure images and backing files are present.
self._create_images_and_backing(
@@ -5982,8 +6022,24 @@
# Disconnect from volume server
block_device_mapping = driver.block_device_info_get_mapping(
block_device_info)
+ connector = self.get_volume_connector(instance)
+ volume_api = self._volume_api
for vol in block_device_mapping:
- connection_info = vol['connection_info']
+ # Retrieve connection info from Cinder's initialize_connection API.
+ # The info returned will be accurate for the source server.
+ volume_id = vol['connection_info']['serial']
+ connection_info = volume_api.initialize_connection(context,
+ volume_id,
+ connector)
+
+ # Pull out multipath_id from the bdm information. The
+ # multipath_id can be placed into the connection info
+ # because it is based off of the volume and will be the
+ # same on the source and destination hosts.
+ if 'multipath_id' in vol['connection_info']['data']:
+ multipath_id = vol['connection_info']['data']['multipath_id']
+ connection_info['data']['multipath_id'] = multipath_id
+
disk_dev = vol['mount_device'].rpartition("/")[2]
self._disconnect_volume(connection_info, disk_dev)
@@ -6287,6 +6343,11 @@
dest = None
utils.execute('mkdir', '-p', inst_base)
+ on_execute = lambda process: \
+ self.job_tracker.add_job(instance, process.pid)
+ on_completion = lambda process: \
+ self.job_tracker.remove_job(instance, process.pid)
+
active_flavor = instance.get_flavor()
for info in disk_info:
# assume inst_base == dirname(info['path'])
@@ -6315,11 +6376,25 @@
if shared_storage:
utils.execute('mv', tmp_path, img_path)
else:
- libvirt_utils.copy_image(tmp_path, img_path, host=dest)
+ libvirt_utils.copy_image(tmp_path, img_path, host=dest,
+ on_execute=on_execute,
+ on_completion=on_completion)
utils.execute('rm', '-f', tmp_path)
else: # raw or qcow2 with no backing file
- libvirt_utils.copy_image(from_path, img_path, host=dest)
+ libvirt_utils.copy_image(from_path, img_path, host=dest,
+ on_execute=on_execute,
+ on_completion=on_completion)
+
+ # Ensure disk.info is written to the new path to avoid disks being
+ # reinspected and potentially changing format.
+ src_disk_info_path = os.path.join(inst_base_resize, 'disk.info')
+ if os.path.exists(src_disk_info_path):
+ dst_disk_info_path = os.path.join(inst_base, 'disk.info')
+ libvirt_utils.copy_image(src_disk_info_path,
+ dst_disk_info_path,
+ host=dest, on_execute=on_execute,
+ on_completion=on_completion)
except Exception:
with excutils.save_and_reraise_exception():
self._cleanup_remote_migration(dest, inst_base,
@@ -6688,6 +6763,8 @@
# invocation failed due to the absence of both target and
# target_resize.
if not remaining_path and os.path.exists(target_del):
+ self.job_tracker.terminate_jobs(instance)
+
LOG.info(_LI('Deleting instance files %s'), target_del,
instance=instance)
remaining_path = target_del
--
To view, visit https://gerrit.wikimedia.org/r/297389
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I4781300c6bd97aeb82c6e150868552f0354be562
Gerrit-PatchSet: 1
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Andrew Bogott <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits