From 93490b2c9e66eaf7b68bc3bc9a25f415a5cd0b85 Mon Sep 17 00:00:00 2001 From: Vipin Balachandran Date: Wed, 4 May 2016 00:29:36 +0530 Subject: [PATCH] VMware: Support for paraVirtual image adapter type Currently the VMDK driver does not support creating volumes with paraVirtual adapter type. It fails the copy image to volume operation if the image's 'vmware_adaptertype' property is set to 'paraVirtual'. This patch adds the paraVirtual adapter type to the list of valid adapter types to fix this. Closes-bug: #1578399 Change-Id: I981b1737974ae1fbb3eb3fef3811bcb50030d670 --- cinder/tests/unit/test_vmware_volumeops.py | 11 ++++++++ cinder/volume/drivers/vmware/volumeops.py | 28 ++++++++++++------- ...are_vmdk_paravirtual-3d5eeef96dcbcfb7.yaml | 4 +++ 3 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 releasenotes/notes/vmware_vmdk_paravirtual-3d5eeef96dcbcfb7.yaml diff --git a/cinder/tests/unit/test_vmware_volumeops.py b/cinder/tests/unit/test_vmware_volumeops.py index 743f13c0c04..93f0819b3e8 100644 --- a/cinder/tests/unit/test_vmware_volumeops.py +++ b/cinder/tests/unit/test_vmware_volumeops.py @@ -1958,6 +1958,8 @@ class VirtualDiskAdapterTypeTest(test.TestCase): self.assertTrue(volumeops.VirtualDiskAdapterType.is_valid("busLogic")) self.assertTrue(volumeops.VirtualDiskAdapterType.is_valid( "lsiLogicsas")) + self.assertTrue( + volumeops.VirtualDiskAdapterType.is_valid("paraVirtual")) self.assertTrue(volumeops.VirtualDiskAdapterType.is_valid("ide")) self.assertFalse(volumeops.VirtualDiskAdapterType.is_valid("pvscsi")) @@ -1965,6 +1967,7 @@ class VirtualDiskAdapterTypeTest(test.TestCase): volumeops.VirtualDiskAdapterType.validate("lsiLogic") volumeops.VirtualDiskAdapterType.validate("busLogic") volumeops.VirtualDiskAdapterType.validate("lsiLogicsas") + volumeops.VirtualDiskAdapterType.validate("paraVirtual") volumeops.VirtualDiskAdapterType.validate("ide") self.assertRaises(vmdk_exceptions.InvalidAdapterTypeException, volumeops.VirtualDiskAdapterType.validate, @@ -1980,6 +1983,9 @@ class VirtualDiskAdapterTypeTest(test.TestCase): self.assertEqual("lsiLogic", volumeops.VirtualDiskAdapterType.get_adapter_type( "lsiLogicsas")) + self.assertEqual("lsiLogic", + volumeops.VirtualDiskAdapterType.get_adapter_type( + "paraVirtual")) self.assertEqual("ide", volumeops.VirtualDiskAdapterType.get_adapter_type( "ide")) @@ -2001,6 +2007,9 @@ class ControllerTypeTest(test.TestCase): self.assertEqual(volumeops.ControllerType.LSI_LOGIC_SAS, volumeops.ControllerType.get_controller_type( 'lsiLogicsas')) + self.assertEqual(volumeops.ControllerType.PARA_VIRTUAL, + volumeops.ControllerType.get_controller_type( + 'paraVirtual')) self.assertEqual(volumeops.ControllerType.IDE, volumeops.ControllerType.get_controller_type( 'ide')) @@ -2015,5 +2024,7 @@ class ControllerTypeTest(test.TestCase): volumeops.ControllerType.BUS_LOGIC)) self.assertTrue(volumeops.ControllerType.is_scsi_controller( volumeops.ControllerType.LSI_LOGIC_SAS)) + self.assertTrue(volumeops.ControllerType.is_scsi_controller( + volumeops.ControllerType.PARA_VIRTUAL)) self.assertFalse(volumeops.ControllerType.is_scsi_controller( volumeops.ControllerType.IDE)) diff --git a/cinder/volume/drivers/vmware/volumeops.py b/cinder/volume/drivers/vmware/volumeops.py index f5405c95f8a..e19daa57fbd 100644 --- a/cinder/volume/drivers/vmware/volumeops.py +++ b/cinder/volume/drivers/vmware/volumeops.py @@ -183,6 +183,7 @@ class VirtualDiskAdapterType(object): LSI_LOGIC = "lsiLogic" BUS_LOGIC = "busLogic" LSI_LOGIC_SAS = "lsiLogicsas" + PARA_VIRTUAL = "paraVirtual" IDE = "ide" @staticmethod @@ -195,6 +196,7 @@ class VirtualDiskAdapterType(object): return adapter_type in [VirtualDiskAdapterType.LSI_LOGIC, VirtualDiskAdapterType.BUS_LOGIC, VirtualDiskAdapterType.LSI_LOGIC_SAS, + VirtualDiskAdapterType.PARA_VIRTUAL, VirtualDiskAdapterType.IDE] @staticmethod @@ -212,20 +214,23 @@ class VirtualDiskAdapterType(object): invalid_type=extra_spec_adapter_type) @staticmethod - def get_adapter_type(extra_spec_adapter_type): + def get_adapter_type(extra_spec_adapter): """Get the adapter type to be used in VirtualDiskSpec. - :param extra_spec_adapter_type: adapter type in the extra_spec + :param extra_spec_adapter: adapter type in the extra_spec :return: adapter type to be used in VirtualDiskSpec """ - VirtualDiskAdapterType.validate(extra_spec_adapter_type) - # We set the adapter type as lsiLogic for lsiLogicsas since it is not - # supported by VirtualDiskManager APIs. This won't be a problem because - # we attach the virtual disk to the correct controller type and the - # disk adapter type is always resolved using its controller key. - if extra_spec_adapter_type == VirtualDiskAdapterType.LSI_LOGIC_SAS: + VirtualDiskAdapterType.validate(extra_spec_adapter) + # We set the adapter type as lsiLogic for lsiLogicsas/paraVirtual + # since it is not supported by VirtualDiskManager APIs. This won't + # be a problem because we attach the virtual disk to the correct + # controller type and the disk adapter type is always resolved using + # its controller key. + if (extra_spec_adapter == VirtualDiskAdapterType.LSI_LOGIC_SAS or + extra_spec_adapter == VirtualDiskAdapterType.PARA_VIRTUAL): return VirtualDiskAdapterType.LSI_LOGIC - return extra_spec_adapter_type + else: + return extra_spec_adapter class ControllerType(object): @@ -234,12 +239,14 @@ class ControllerType(object): LSI_LOGIC = 'VirtualLsiLogicController' BUS_LOGIC = 'VirtualBusLogicController' LSI_LOGIC_SAS = 'VirtualLsiLogicSASController' + PARA_VIRTUAL = 'ParaVirtualSCSIController' IDE = 'VirtualIDEController' CONTROLLER_TYPE_DICT = { VirtualDiskAdapterType.LSI_LOGIC: LSI_LOGIC, VirtualDiskAdapterType.BUS_LOGIC: BUS_LOGIC, VirtualDiskAdapterType.LSI_LOGIC_SAS: LSI_LOGIC_SAS, + VirtualDiskAdapterType.PARA_VIRTUAL: PARA_VIRTUAL, VirtualDiskAdapterType.IDE: IDE} @staticmethod @@ -264,7 +271,8 @@ class ControllerType(object): """ return controller_type in [ControllerType.LSI_LOGIC, ControllerType.BUS_LOGIC, - ControllerType.LSI_LOGIC_SAS] + ControllerType.LSI_LOGIC_SAS, + ControllerType.PARA_VIRTUAL] class VMwareVolumeOps(object): diff --git a/releasenotes/notes/vmware_vmdk_paravirtual-3d5eeef96dcbcfb7.yaml b/releasenotes/notes/vmware_vmdk_paravirtual-3d5eeef96dcbcfb7.yaml new file mode 100644 index 00000000000..c07eeff96b1 --- /dev/null +++ b/releasenotes/notes/vmware_vmdk_paravirtual-3d5eeef96dcbcfb7.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - Added support for images with vmware_adaptertype set to + paraVirtual in the VMDK driver.