diff --git a/lower-constraints.txt b/lower-constraints.txt index 18652f76e83c..b59125dd95c2 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -67,7 +67,7 @@ os-brick==2.6.2 os-client-config==1.29.0 os-resource-classes==0.4.0 os-service-types==1.7.0 -os-traits==1.1.0 +os-traits==2.0.0 os-vif==1.14.0 os-win==3.0.0 os-xenapi==0.3.3 diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index 046d0215c49e..78c143bbae4c 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -1011,6 +1011,10 @@ class LibvirtConnTestCase(test.NoDBTestCase, 'Driver capabilities for ' '\'supports_image_type_qcow2\' ' 'is invalid') + self.assertFalse(drvr.capabilities['supports_image_type_ploop'], + 'Driver capabilities for ' + '\'supports_image_type_ploop\' ' + 'is invalid') def test_driver_capabilities_qcow2_with_rbd(self): self.flags(images_type='rbd', group='libvirt') @@ -1040,6 +1044,18 @@ class LibvirtConnTestCase(test.NoDBTestCase, drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) self.assertTrue(drvr.capabilities['supports_image_type_qcow2']) + def test_driver_capabilities_ploop_with_virtuozzo(self): + self.flags(virt_type='kvm', group='libvirt') + drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) + self.assertFalse(drvr.capabilities['supports_image_type_ploop'], + 'Driver capabilities for ' + '\'supports_image_type_ploop\' ' + 'is invalid when virt_type=kvm') + + self.flags(virt_type='parallels', group='libvirt') + drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) + self.assertTrue(drvr.capabilities['supports_image_type_ploop']) + def create_fake_libvirt_mock(self, **kwargs): """Defining mocks for LibvirtDriver(libvirt is not used).""" diff --git a/nova/virt/driver.py b/nova/virt/driver.py index 722ae9a0f58c..a8740cae086e 100644 --- a/nova/virt/driver.py +++ b/nova/virt/driver.py @@ -122,6 +122,8 @@ CAPABILITY_TRAITS_MAP = { "supports_image_type_vhd": os_traits.COMPUTE_IMAGE_TYPE_VHD, "supports_image_type_vhdx": os_traits.COMPUTE_IMAGE_TYPE_VHDX, "supports_image_type_vmdk": os_traits.COMPUTE_IMAGE_TYPE_VMDK, + # Added in os-traits 2.0.0 + "supports_image_type_ploop": os_traits.COMPUTE_IMAGE_TYPE_PLOOP, } @@ -183,6 +185,7 @@ class ComputeDriver(object): "supports_image_type_vhd": False, "supports_image_type_vhdx": False, "supports_image_type_vmdk": False, + "supports_image_type_ploop": False, } # Indicates if this driver will rebalance nodes among compute service diff --git a/nova/virt/ironic/driver.py b/nova/virt/ironic/driver.py index 36e6fb49379d..ae7d925c0f81 100644 --- a/nova/virt/ironic/driver.py +++ b/nova/virt/ironic/driver.py @@ -176,6 +176,7 @@ class IronicDriver(virt_driver.ComputeDriver): "supports_image_type_vhd": False, "supports_image_type_vhdx": False, "supports_image_type_vmdk": False, + "supports_image_type_ploop": False, } # This driver is capable of rebalancing nodes between computes. diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index ad69f030a1a2..bd52286c6f5c 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -310,6 +310,7 @@ class LibvirtDriver(driver.ComputeDriver): raw_only = ('rbd', 'lvm') requires_raw_image = (CONF.libvirt.images_type in raw_only and not CONF.force_raw_images) + requires_ploop_image = CONF.libvirt.virt_type == 'parallels' self.capabilities = { "has_imagecache": True, @@ -339,6 +340,7 @@ class LibvirtDriver(driver.ComputeDriver): # formats. If we are configured for those backends, then we # should not expose the corresponding support traits. "supports_image_type_qcow2": not requires_raw_image, + "supports_image_type_ploop": requires_ploop_image, "supports_pcpus": True, } super(LibvirtDriver, self).__init__(virtapi) diff --git a/nova/virt/powervm/driver.py b/nova/virt/powervm/driver.py index dfa59f6d8b08..9f35cf1af050 100644 --- a/nova/virt/powervm/driver.py +++ b/nova/virt/powervm/driver.py @@ -90,6 +90,7 @@ class PowerVMDriver(driver.ComputeDriver): "supports_image_type_vhd": False, "supports_image_type_vhdx": False, "supports_image_type_vmdk": False, + "supports_image_type_ploop": False, } super(PowerVMDriver, self).__init__(virtapi) diff --git a/nova/virt/vmwareapi/driver.py b/nova/virt/vmwareapi/driver.py index e53abf703755..9676167dfbe8 100644 --- a/nova/virt/vmwareapi/driver.py +++ b/nova/virt/vmwareapi/driver.py @@ -82,6 +82,7 @@ class VMwareVCDriver(driver.ComputeDriver): "supports_image_type_vhd": False, "supports_image_type_vhdx": False, "supports_image_type_vmdk": True, + "supports_image_type_ploop": False, } # Legacy nodename is of the form: () diff --git a/nova/virt/xenapi/driver.py b/nova/virt/xenapi/driver.py index 5b23ef3869f8..fc08c3043263 100644 --- a/nova/virt/xenapi/driver.py +++ b/nova/virt/xenapi/driver.py @@ -82,6 +82,7 @@ class XenAPIDriver(driver.ComputeDriver): "supports_image_type_vhd": True, "supports_image_type_vhdx": False, "supports_image_type_vmdk": False, + "supports_image_type_ploop": False, } def __init__(self, virtapi, read_only=False): diff --git a/nova/virt/zvm/driver.py b/nova/virt/zvm/driver.py index 16cafb01961b..02d83f8a6be6 100644 --- a/nova/virt/zvm/driver.py +++ b/nova/virt/zvm/driver.py @@ -59,6 +59,7 @@ class ZVMDriver(driver.ComputeDriver): "supports_image_type_vhd": False, "supports_image_type_vhdx": False, "supports_image_type_vmdk": False, + "supports_image_type_ploop": False, } def __init__(self, virtapi): diff --git a/requirements.txt b/requirements.txt index 282220fc4f01..5fd2e8b4e6b9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -55,7 +55,7 @@ psutil>=3.2.2 # BSD oslo.versionedobjects>=1.35.0 # Apache-2.0 os-brick>=2.6.2 # Apache-2.0 os-resource-classes>=0.4.0 # Apache-2.0 -os-traits>=1.1.0 # Apache-2.0 +os-traits>=2.0.0 # Apache-2.0 os-vif>=1.14.0 # Apache-2.0 os-win>=3.0.0 # Apache-2.0 castellan>=0.16.0 # Apache-2.0