summaryrefslogtreecommitdiff
path: root/nova/virt/vmwareapi
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2020-03-18 12:08:59 +0000
committerGerrit Code Review <review@openstack.org>2020-03-18 12:09:00 +0000
commit6c27f4e9cfdd855fc6e2bb57d495c63e23959609 (patch)
tree30355b2716c6f0c1ba2c2bb9456e5d2514d19c87 /nova/virt/vmwareapi
parent25e6b3259b0b63088fc56e9fdc2d46bf41a75a01 (diff)
parentec93474a84aff1c184a58fe436ea4a0842bd9825 (diff)
downloadnova-6c27f4e9cfdd855fc6e2bb57d495c63e23959609.tar.gz
Merge "VMware VMDK detach: get adapter type from instance VM"
Diffstat (limited to 'nova/virt/vmwareapi')
-rw-r--r--nova/virt/vmwareapi/vim_util.py10
-rw-r--r--nova/virt/vmwareapi/vm_util.py32
-rw-r--r--nova/virt/vmwareapi/volumeops.py20
3 files changed, 41 insertions, 21 deletions
diff --git a/nova/virt/vmwareapi/vim_util.py b/nova/virt/vmwareapi/vim_util.py
index 30340eee92..699660de40 100644
--- a/nova/virt/vmwareapi/vim_util.py
+++ b/nova/virt/vmwareapi/vim_util.py
@@ -158,3 +158,13 @@ def get_about_info(vim):
def get_entity_name(session, entity):
return session._call_method(vutil, 'get_object_property',
entity, 'name')
+
+
+def get_array_items(array_obj):
+ """Get contained items if the object is a vSphere API array."""
+ array_prefix = 'ArrayOf'
+ if array_obj.__class__.__name__.startswith(array_prefix):
+ attr_name = array_obj.__class__.__name__.replace(array_prefix, '', 1)
+ if hasattr(array_obj, attr_name):
+ return getattr(array_obj, attr_name)
+ return array_obj
diff --git a/nova/virt/vmwareapi/vm_util.py b/nova/virt/vmwareapi/vm_util.py
index eecede0b8d..a87d47d9cd 100644
--- a/nova/virt/vmwareapi/vm_util.py
+++ b/nova/virt/vmwareapi/vm_util.py
@@ -46,6 +46,14 @@ ALL_SUPPORTED_NETWORK_DEVICES = ['VirtualE1000', 'VirtualE1000e',
'VirtualPCNet32', 'VirtualSriovEthernetCard',
'VirtualVmxnet', 'VirtualVmxnet3']
+CONTROLLER_TO_ADAPTER_TYPE = {
+ "VirtualLsiLogicController": constants.DEFAULT_ADAPTER_TYPE,
+ "VirtualBusLogicController": constants.ADAPTER_TYPE_BUSLOGIC,
+ "VirtualIDEController": constants.ADAPTER_TYPE_IDE,
+ "VirtualLsiLogicSASController": constants.ADAPTER_TYPE_LSILOGICSAS,
+ "ParaVirtualSCSIController": constants.ADAPTER_TYPE_PARAVIRTUAL
+}
+
# A simple cache for storing inventory folder references.
# Format: {inventory_path: folder_ref}
_FOLDER_PATH_REF_MAPPING = {}
@@ -674,14 +682,17 @@ def _get_device_disk_type(device):
return constants.DEFAULT_DISK_TYPE
-def get_vmdk_info(session, vm_ref, uuid=None):
- """Returns information for the primary VMDK attached to the given VM."""
+def get_hardware_devices(session, vm_ref):
hardware_devices = session._call_method(vutil,
"get_object_property",
vm_ref,
"config.hardware.device")
- if hardware_devices.__class__.__name__ == "ArrayOfVirtualDevice":
- hardware_devices = hardware_devices.VirtualDevice
+ return vim_util.get_array_items(hardware_devices)
+
+
+def get_vmdk_info(session, vm_ref, uuid=None):
+ """Returns information for the primary VMDK attached to the given VM."""
+ hardware_devices = get_hardware_devices(session, vm_ref)
vmdk_file_path = None
vmdk_controller_key = None
disk_type = None
@@ -703,16 +714,9 @@ def get_vmdk_info(session, vm_ref, uuid=None):
if root_disk and path.basename == root_disk:
root_device = device
vmdk_device = device
- elif device.__class__.__name__ == "VirtualLsiLogicController":
- adapter_type_dict[device.key] = constants.DEFAULT_ADAPTER_TYPE
- elif device.__class__.__name__ == "VirtualBusLogicController":
- adapter_type_dict[device.key] = constants.ADAPTER_TYPE_BUSLOGIC
- elif device.__class__.__name__ == "VirtualIDEController":
- adapter_type_dict[device.key] = constants.ADAPTER_TYPE_IDE
- elif device.__class__.__name__ == "VirtualLsiLogicSASController":
- adapter_type_dict[device.key] = constants.ADAPTER_TYPE_LSILOGICSAS
- elif device.__class__.__name__ == "ParaVirtualSCSIController":
- adapter_type_dict[device.key] = constants.ADAPTER_TYPE_PARAVIRTUAL
+ elif device.__class__.__name__ in CONTROLLER_TO_ADAPTER_TYPE:
+ adapter_type_dict[device.key] = CONTROLLER_TO_ADAPTER_TYPE[
+ device.__class__.__name__]
if root_disk:
vmdk_device = root_device
diff --git a/nova/virt/vmwareapi/volumeops.py b/nova/virt/vmwareapi/volumeops.py
index 28aac62f24..eddb7b8705 100644
--- a/nova/virt/vmwareapi/volumeops.py
+++ b/nova/virt/vmwareapi/volumeops.py
@@ -516,20 +516,26 @@ class VMwareVolumeOps(object):
device = self._get_vmdk_backed_disk_device(vm_ref, data)
- # Get details required for adding disk device such as
- # adapter_type, disk_type
- vmdk = vm_util.get_vmdk_info(self._session, volume_ref)
+ hardware_devices = vm_util.get_hardware_devices(self._session, vm_ref)
+ adapter_type = None
+ for hw_device in hardware_devices:
+ if hw_device.key == device.controllerKey:
+ adapter_type = vm_util.CONTROLLER_TO_ADAPTER_TYPE.get(
+ hw_device.__class__.__name__)
+ break
# IDE does not support disk hotplug
- if vmdk.adapter_type == constants.ADAPTER_TYPE_IDE:
+ if adapter_type == constants.ADAPTER_TYPE_IDE:
state = vm_util.get_vm_state(self._session, instance)
if state != power_state.SHUTDOWN:
raise exception.Invalid(_('%s does not support disk '
- 'hotplug.') % vmdk.adapter_type)
+ 'hotplug.') % adapter_type)
+
+ disk_type = vm_util._get_device_disk_type(device)
self._consolidate_vmdk_volume(instance, vm_ref, device, volume_ref,
- adapter_type=vmdk.adapter_type,
- disk_type=vmdk.disk_type)
+ adapter_type=adapter_type,
+ disk_type=disk_type)
self.detach_disk_from_vm(vm_ref, instance, device)