summaryrefslogtreecommitdiffstats
path: root/nova/virt
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-06-27 23:58:36 +0000
committerGerrit Code Review <review@openstack.org>2013-06-27 23:58:36 +0000
commit368efa77959cf7c5167045a491887f68d28f2d4e (patch)
treebed5c942f2a16552f285645b7e733387d3d4af8b /nova/virt
parent8dc7ff69f24c643167c9e961dd301d7b08291be8 (diff)
parente71081b856b06513cc1e56a9adb2a619967f0eae (diff)
downloadnova-368efa77959cf7c5167045a491887f68d28f2d4e.tar.gz
nova-368efa77959cf7c5167045a491887f68d28f2d4e.tar.xz
nova-368efa77959cf7c5167045a491887f68d28f2d4e.zip
Merge "Fix resizes with attached file-based volumes"
Diffstat (limited to 'nova/virt')
-rwxr-xr-xnova/virt/libvirt/driver.py26
1 files changed, 23 insertions, 3 deletions
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
index ca673579b..f20a27900 100755
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -1434,7 +1434,8 @@ class LibvirtDriver(driver.ComputeDriver):
write_to_disk=True)
# NOTE (rmk): Re-populate any missing backing files.
- disk_info_json = self.get_instance_disk_info(instance['name'], xml)
+ disk_info_json = self.get_instance_disk_info(instance['name'], xml,
+ block_device_info)
self._create_images_and_backing(context, instance, disk_info_json)
# Initialize all the necessary networking, block devices and
@@ -3539,7 +3540,8 @@ class LibvirtDriver(driver.ComputeDriver):
dom = self._lookup_by_name(instance["name"])
self._conn.defineXML(dom.XMLDesc(0))
- def get_instance_disk_info(self, instance_name, xml=None):
+ def get_instance_disk_info(self, instance_name, xml=None,
+ block_device_info=None):
"""Preparation block migration.
:params instance:
@@ -3572,15 +3574,27 @@ class LibvirtDriver(driver.ComputeDriver):
LOG.warn(msg)
raise exception.InstanceNotFound(instance_id=instance_name)
+ # NOTE (rmk): When block_device_info is provided, we will use it to
+ # filter out devices which are actually volumes.
+ block_device_mapping = driver.block_device_info_get_mapping(
+ block_device_info)
+
+ volume_devices = set()
+ for vol in block_device_mapping:
+ disk_dev = vol['mount_device'].rpartition("/")[2]
+ volume_devices.add(disk_dev)
+
disk_info = []
doc = etree.fromstring(xml)
disk_nodes = doc.findall('.//devices/disk')
path_nodes = doc.findall('.//devices/disk/source')
driver_nodes = doc.findall('.//devices/disk/driver')
+ target_nodes = doc.findall('.//devices/disk/target')
for cnt, path_node in enumerate(path_nodes):
disk_type = disk_nodes[cnt].get('type')
path = path_node.get('file')
+ target = target_nodes[cnt].attrib['dev']
if disk_type != 'file':
LOG.debug(_('skipping %s since it looks like volume'), path)
@@ -3591,6 +3605,11 @@ class LibvirtDriver(driver.ComputeDriver):
instance_name)
continue
+ if target in volume_devices:
+ LOG.debug(_('skipping disk %(path)s (%(target)s) as it is a '
+ 'volume'), {'path': path, 'target': target})
+ continue
+
# get the real disk size or
# raise a localized error if image is unavailable
dk_size = int(os.path.getsize(path))
@@ -3699,7 +3718,8 @@ class LibvirtDriver(driver.ComputeDriver):
block_device_info=None):
LOG.debug(_("Starting migrate_disk_and_power_off"),
instance=instance)
- disk_info_text = self.get_instance_disk_info(instance['name'])
+ disk_info_text = self.get_instance_disk_info(instance['name'],
+ block_device_info=block_device_info)
disk_info = jsonutils.loads(disk_info_text)
# copy disks to destination