summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/compute/manager.py20
-rw-r--r--nova/tests/test_xenapi.py36
-rw-r--r--nova/virt/xenapi/vmops.py9
-rw-r--r--nova/virt/xenapi_conn.py6
4 files changed, 54 insertions, 17 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index eb3996d29..01a7d195f 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -820,20 +820,24 @@ class ComputeManager(manager.SchedulerDependentManager):
migration_ref['instance_id'])
# TODO(mdietz): apply the rest of the instance_type attributes going
# after they're supported
- instance_type = self.db.instance_type_get_by_flavor_id(context,
- migration_ref['new_flavor_id'])
- self.db.instance_update(context, instance_id,
- dict(instance_type_id=instance_type['id'],
- memory_mb=instance_type['memory_mb'],
- vcpus=instance_type['vcpus'],
- local_gb=instance_type['local_gb']))
+ resize_instance = False
+ if migration_ref['old_flavor_id'] != migration_ref['new_flavor_id']:
+ instance_type = self.db.instance_type_get_by_flavor_id(context,
+ migration_ref['new_flavor_id'])
+ self.db.instance_update(context, instance_id,
+ dict(instance_type_id=instance_type['id'],
+ memory_mb=instance_type['memory_mb'],
+ vcpus=instance_type['vcpus'],
+ local_gb=instance_type['local_gb']))
+ resize_instance = True
# reload the updated instance ref
# FIXME(mdietz): is there reload functionality?
instance = self.db.instance_get(context, instance_id)
network_info = self.network_api.get_instance_nw_info(context,
instance)
- self.driver.finish_resize(instance, disk_info, network_info)
+ self.driver.finish_resize(instance, disk_info, network_info,
+ resize_instance)
self.db.migration_update(context, migration_id,
{'status': 'finished', })
diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py
index 9b512b73b..be263d17c 100644
--- a/nova/tests/test_xenapi.py
+++ b/nova/tests/test_xenapi.py
@@ -810,10 +810,10 @@ class XenAPIMigrateInstance(test.TestCase):
'mac': 'DE:AD:BE:EF:00:00',
'rxtx_cap': 3})]
conn.finish_resize(instance, dict(base_copy='hurr', cow='durr'),
- network_info)
+ network_info, resize_instance=True)
self.assertEqual(self.called, True)
- def test_finish_migrate_no_resize_vdi(self):
+ def test_finish_migrate_no_local_storage(self):
tiny_type_id = \
instance_types.get_instance_type_by_name('m1.tiny')['id']
self.values.update({'instance_type_id': tiny_type_id, 'local_gb': 0})
@@ -842,7 +842,37 @@ class XenAPIMigrateInstance(test.TestCase):
'mac': 'DE:AD:BE:EF:00:00',
'rxtx_cap': 3})]
conn.finish_resize(instance, dict(base_copy='hurr', cow='durr'),
- network_info)
+ network_info, resize_instance=True)
+
+ def test_finish_migrate_no_resize_vdi(self):
+ instance = db.instance_create(self.context, self.values)
+
+ def fake_vdi_resize(*args, **kwargs):
+ raise Exception("This shouldn't be called")
+
+ self.stubs.Set(stubs.FakeSessionForMigrationTests,
+ "VDI_resize_online", fake_vdi_resize)
+ stubs.stubout_session(self.stubs, stubs.FakeSessionForMigrationTests)
+ stubs.stubout_loopingcall_start(self.stubs)
+ conn = xenapi_conn.get_connection(False)
+ network_info = [({'bridge': 'fa0', 'id': 0, 'injected': False},
+ {'broadcast': '192.168.0.255',
+ 'dns': ['192.168.0.1'],
+ 'gateway': '192.168.0.1',
+ 'gateway6': 'dead:beef::1',
+ 'ip6s': [{'enabled': '1',
+ 'ip': 'dead:beef::dcad:beff:feef:0',
+ 'netmask': '64'}],
+ 'ips': [{'enabled': '1',
+ 'ip': '192.168.0.100',
+ 'netmask': '255.255.255.0'}],
+ 'label': 'fake',
+ 'mac': 'DE:AD:BE:EF:00:00',
+ 'rxtx_cap': 3})]
+
+ # Resize instance would be determined by the compute call
+ conn.finish_resize(instance, dict(base_copy='hurr', cow='durr'),
+ network_info, resize_instance=False)
class XenAPIDetermineDiskImageTestCase(test.TestCase):
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index 8bce6bb89..aec14f880 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -110,13 +110,14 @@ class VMOps(object):
vm_ref = VMHelper.lookup(self._session, instance.name)
self._start(instance, vm_ref)
- def finish_resize(self, instance, disk_info, network_info):
+ def finish_resize(self, instance, disk_info, network_info,
+ resize_instance):
vdi_uuid = self.link_disks(instance, disk_info['base_copy'],
disk_info['cow'])
vm_ref = self._create_vm(instance,
[dict(vdi_type='os', vdi_uuid=vdi_uuid)],
network_info)
- self.resize_instance(instance, vdi_uuid)
+ self.resize_instance(instance, vdi_uuid, resize_instance)
self._spawn(instance, vm_ref)
def _start(self, instance, vm_ref=None):
@@ -565,7 +566,7 @@ class VMOps(object):
return new_cow_uuid
- def resize_instance(self, instance, vdi_uuid):
+ def resize_instance(self, instance, vdi_uuid, resize_instance):
"""Resize a running instance by changing its RAM and disk size."""
#TODO(mdietz): this will need to be adjusted for swap later
#The new disk size must be in bytes
@@ -577,7 +578,7 @@ class VMOps(object):
" Expanding to %(instance_local_gb)d GB") % locals())
vdi_ref = self._session.call_xenapi('VDI.get_by_uuid', vdi_uuid)
# for an instance with no local storage
- if new_disk_size > 0:
+ if resize_instance and new_disk_size > 0:
self._session.call_xenapi('VDI.resize_online', vdi_ref,
str(new_disk_size))
LOG.debug(_("Resize instance %s complete") % (instance.name))
diff --git a/nova/virt/xenapi_conn.py b/nova/virt/xenapi_conn.py
index ec8c44c1c..18654d7e5 100644
--- a/nova/virt/xenapi_conn.py
+++ b/nova/virt/xenapi_conn.py
@@ -202,9 +202,11 @@ class XenAPIConnection(driver.ComputeDriver):
"""Reverts a resize, powering back on the instance"""
self._vmops.revert_resize(instance)
- def finish_resize(self, instance, disk_info, network_info):
+ def finish_resize(self, instance, disk_info, network_info,
+ resize_instance=False):
"""Completes a resize, turning on the migrated instance"""
- self._vmops.finish_resize(instance, disk_info, network_info)
+ self._vmops.finish_resize(instance, disk_info, network_info,
+ resize_instance)
def snapshot(self, instance, image_id):
""" Create snapshot from a running VM instance """