diff --git a/lower-constraints.txt b/lower-constraints.txt index e8841e7ec6a7..6e9d9f85cb28 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -68,7 +68,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 e1083d2a5a10..684548328fc4 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -1010,6 +1010,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') @@ -1039,6 +1043,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 75aca89e9bd7..30c5132eb8b7 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 3cca56d5c2de..5c1e6d6dbf4c 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 1bc368217d83..9bb3b99e6e9e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -56,7 +56,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