From d3c7396d87681b82327c59c27fe14cf5e20c3ba5 Mon Sep 17 00:00:00 2001 From: Sivasathurappan Radhakrishnan Date: Tue, 23 Aug 2016 20:47:06 +0000 Subject: [PATCH] Using get() method to prevent KeyError Using get() to access keys like "summary.guest.toolsStatus" and "summary.guest.toolrunningStatus" to avoid exception during hard reboot. This change would use a default values even if they don't exist in dict as we can have VMs where VM tools wouldn't be installed/running which leads to hard reboot Change-Id: I332867fe783d6d47b81d8a53153af140d4158217 Closes-bug: #1563325 --- nova/tests/unit/virt/vmwareapi/test_vmops.py | 19 +++++++++++-------- nova/virt/vmwareapi/vmops.py | 6 +++--- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/nova/tests/unit/virt/vmwareapi/test_vmops.py b/nova/tests/unit/virt/vmwareapi/test_vmops.py index bcaf65a776..3cb94c9733 100644 --- a/nova/tests/unit/virt/vmwareapi/test_vmops.py +++ b/nova/tests/unit/virt/vmwareapi/test_vmops.py @@ -2439,7 +2439,7 @@ class VMwareVMOpsTestCase(test.NoDBTestCase): base_folder = self._vmops._get_base_folder() self.assertEqual('my_prefix_base', base_folder) - def _test_reboot_vm(self, reboot_type="SOFT"): + def _test_reboot_vm(self, reboot_type="SOFT", tool_status=True): expected_methods = ['get_object_properties_dict'] if reboot_type == "SOFT": @@ -2447,16 +2447,16 @@ class VMwareVMOpsTestCase(test.NoDBTestCase): else: expected_methods.append('ResetVM_Task') - query = {} - query['runtime.powerState'] = "poweredOn" - query['summary.guest.toolsStatus'] = "toolsOk" - query['summary.guest.toolsRunningStatus'] = "guestToolsRunning" - def fake_call_method(module, method, *args, **kwargs): expected_method = expected_methods.pop(0) self.assertEqual(expected_method, method) - if expected_method == 'get_object_properties_dict': - return query + if expected_method == 'get_object_properties_dict' and tool_status: + return { + "runtime.powerState": "poweredOn", + "summary.guest.toolsStatus": "toolsOk", + "summary.guest.toolsRunningStatus": "guestToolsRunning"} + elif expected_method == 'get_object_properties_dict': + return {"runtime.powerState": "poweredOn"} elif expected_method == 'ResetVM_Task': return 'fake-task' @@ -2477,6 +2477,9 @@ class VMwareVMOpsTestCase(test.NoDBTestCase): def test_reboot_vm_soft(self): self._test_reboot_vm() + def test_reboot_vm_hard_toolstatus(self): + self._test_reboot_vm(reboot_type="HARD", tool_status=False) + def test_reboot_vm_hard(self): self._test_reboot_vm(reboot_type="HARD") diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py index e67b7dcba6..9a7cc9ae14 100644 --- a/nova/virt/vmwareapi/vmops.py +++ b/nova/virt/vmwareapi/vmops.py @@ -1027,9 +1027,9 @@ class VMwareVMOps(object): "get_object_properties_dict", vm_ref, lst_properties) - pwr_state = props['runtime.powerState'] - tools_status = props['summary.guest.toolsStatus'] - tools_running_status = props['summary.guest.toolsRunningStatus'] + pwr_state = props.get('runtime.powerState') + tools_status = props.get('summary.guest.toolsStatus') + tools_running_status = props.get('summary.guest.toolsRunningStatus') # Raise an exception if the VM is not powered On. if pwr_state not in ["poweredOn"]: