diff options
| author | guohliu <guohliu@cn.ibm.com> | 2013-04-17 18:22:57 +0800 |
|---|---|---|
| committer | guohliu <guohliu@cn.ibm.com> | 2013-04-24 16:03:02 +0800 |
| commit | 5643bd5d9bf17335e109d4b2d93e161f4d12c6f9 (patch) | |
| tree | 69b814182f4d5352eaa15f5e489192b029a918d3 /nova | |
| parent | 5a604b5924dae368da4b6561550bb430e3239ca3 (diff) | |
| download | nova-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
Diffstat (limited to 'nova')
| -rw-r--r-- | nova/tests/test_powervm.py | 57 | ||||
| -rw-r--r-- | nova/virt/powervm/operator.py | 24 |
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']) |
