summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorguohliu <guohliu@cn.ibm.com>2013-04-17 18:22:57 +0800
committerguohliu <guohliu@cn.ibm.com>2013-04-24 16:03:02 +0800
commit5643bd5d9bf17335e109d4b2d93e161f4d12c6f9 (patch)
tree69b814182f4d5352eaa15f5e489192b029a918d3
parent5a604b5924dae368da4b6561550bb430e3239ca3 (diff)
downloadnova-5643bd5d9bf17335e109d4b2d93e161f4d12c6f9.tar.gz
nova-5643bd5d9bf17335e109d4b2d93e161f4d12c6f9.tar.xz
nova-5643bd5d9bf17335e109d4b2d93e161f4d12c6f9.zip
Fix powervm driver resize instance error
During a resize operation in powervm, the logical volume of the instance will be copied and compressed to a file. Current logic decompresses it twice before copying this file to a new volume which will cause the new instance to not boot properly. Fixes bug #1169848 Change-Id: I91f536919511aafbf7dbe14abbee48dbceb189b2
-rw-r--r--nova/tests/test_powervm.py57
-rw-r--r--nova/virt/powervm/operator.py24
2 files changed, 63 insertions, 18 deletions
diff --git a/nova/tests/test_powervm.py b/nova/tests/test_powervm.py
index a8278f085..cada3dd85 100644
--- a/nova/tests/test_powervm.py
+++ b/nova/tests/test_powervm.py
@@ -36,7 +36,7 @@ from nova.virt.powervm import common
from nova.virt.powervm import driver as powervm_driver
from nova.virt.powervm import exception
from nova.virt.powervm import lpar
-from nova.virt.powervm import operator
+from nova.virt.powervm import operator as powervm_operator
def fake_lpar(instance_name):
@@ -46,7 +46,16 @@ def fake_lpar(instance_name):
uptime=939395, state='Running')
-class FakeIVMOperator(object):
+class FakePowerVMOperator(powervm_operator.PowerVMOperator):
+
+ def get_lpar(self, instance_name, resource_type='lpar'):
+ return fake_lpar(instance_name)
+
+ def run_vios_command(self, cmd):
+ pass
+
+
+class FakeIVMOperator(powervm_operator.IVMOperator):
def get_lpar(self, instance_name, resource_type='lpar'):
return fake_lpar(instance_name)
@@ -101,6 +110,9 @@ class FakeIVMOperator(object):
def rename_lpar(self, old, new):
pass
+ def _remove_file(self, file_path):
+ pass
+
def set_lpar_mac_base_value(self, instance_name, mac):
pass
@@ -148,7 +160,7 @@ class FakeBlockAdapter(powervm_blockdev.PowerVMLocalVolumeAdapter):
def fake_get_powervm_operator():
- return FakeIVMOperator()
+ return FakeIVMOperator(None)
class PowerVMDriverTestCase(test.TestCase):
@@ -156,9 +168,9 @@ class PowerVMDriverTestCase(test.TestCase):
def setUp(self):
super(PowerVMDriverTestCase, self).setUp()
- self.stubs.Set(operator, 'get_powervm_operator',
+ self.stubs.Set(powervm_operator, 'get_powervm_operator',
fake_get_powervm_operator)
- self.stubs.Set(operator, 'get_powervm_disk_adapter',
+ self.stubs.Set(powervm_operator, 'get_powervm_disk_adapter',
lambda: FakeBlockAdapter())
self.powervm_connection = powervm_driver.PowerVMDriver(None)
self.instance = self._create_instance()
@@ -365,6 +377,37 @@ class PowerVMDriverTestCase(test.TestCase):
expected_path = 'some/image/path/logical-vol-name_rsz.gz'
self.assertEqual(file_path, expected_path)
+ def test_deploy_from_migrated_file(self):
+ instance = self.instance
+ context = 'fake_context'
+ network_info = []
+ network_info.append({'address': 'fa:89:f0:8b:9b:39'})
+ dest = '10.8.46.20'
+ disk_info = {}
+ disk_info['root_disk_file'] = 'some/file/path.gz'
+ disk_info['old_lv_size'] = 30
+ self.flags(powervm_mgr=dest)
+ fake_op = self.powervm_connection._powervm
+ self.deploy_from_vios_file_called = False
+
+ def fake_deploy_from_vios_file(lpar, file_path, size,
+ decompress):
+ exp_file_path = 'some/file/path.gz'
+ exp_size = 40 * 1024 ** 3
+ exp_decompress = True
+ self.deploy_from_vios_file_called = True
+ self.assertEqual(exp_file_path, file_path)
+ self.assertEqual(exp_size, size)
+ self.assertEqual(exp_decompress, decompress)
+
+ self.stubs.Set(fake_op, '_deploy_from_vios_file',
+ fake_deploy_from_vios_file)
+ self.powervm_connection.finish_migration(context, None,
+ instance, disk_info, network_info,
+ None, resize_instance=True,
+ block_device_info=None)
+ self.assertEqual(self.deploy_from_vios_file_called, True)
+
def test_set_lpar_mac_base_value(self):
instance = self.instance
context = 'fake_context'
@@ -392,7 +435,7 @@ class PowerVMDriverTestCase(test.TestCase):
def fake_set_lpar_mac_base_value(inst_name, mac, *args, **kwargs):
# get expected mac address from FakeIVM set
- fake_ivm = FakeIVMOperator()
+ fake_ivm = FakeIVMOperator(None)
exp_mac = fake_ivm.macs_for_instance(inst_name).pop()
self.assertEqual(exp_mac, mac)
@@ -478,7 +521,7 @@ class PowerVMDriverLparTestCase(test.TestCase):
def setUp(self):
super(PowerVMDriverLparTestCase, self).setUp()
- self.stubs.Set(operator.PowerVMOperator, '_update_host_stats',
+ self.stubs.Set(powervm_operator.PowerVMOperator, '_update_host_stats',
lambda self: None)
self.powervm_connection = powervm_driver.PowerVMDriver(None)
diff --git a/nova/virt/powervm/operator.py b/nova/virt/powervm/operator.py
index 0656f3972..518341910 100644
--- a/nova/virt/powervm/operator.py
+++ b/nova/virt/powervm/operator.py
@@ -415,23 +415,24 @@ class PowerVMOperator(object):
return disk_info
def deploy_from_migrated_file(self, lpar, file_path, size):
- # decompress file
- gzip_ending = '.gz'
- if file_path.endswith(gzip_ending):
- raw_file_path = file_path[:-len(gzip_ending)]
- else:
- raw_file_path = file_path
+ """Deploy the logical volume and attach to new lpar.
- self._operator._decompress_image_file(file_path, raw_file_path)
+ :param lpar: lar instance
+ :param file_path: logical volume path
+ :param size: new size of the logical volume
+ """
+ need_decompress = file_path.endswith('.gz')
try:
# deploy lpar from file
- self._deploy_from_vios_file(lpar, raw_file_path, size)
+ self._deploy_from_vios_file(lpar, file_path, size,
+ decompress=need_decompress)
finally:
# cleanup migrated file
- self._operator._remove_file(raw_file_path)
+ self._operator._remove_file(file_path)
- def _deploy_from_vios_file(self, lpar, file_path, size):
+ def _deploy_from_vios_file(self, lpar, file_path, size,
+ decompress=True):
self._operator.create_lpar(lpar)
lpar = self._operator.get_lpar(lpar['name'])
instance_id = lpar['lpar_id']
@@ -443,7 +444,8 @@ class PowerVMOperator(object):
self._operator.attach_disk_to_vhost(diskName, vhost)
# Copy file to device
- self._disk_adapter._copy_file_to_device(file_path, diskName)
+ self._disk_adapter._copy_file_to_device(file_path, diskName,
+ decompress)
self._operator.start_lpar(lpar['name'])