diff --git a/releasenotes/notes/xenapi_apis-conf-fcca549283e53ed6.yaml b/releasenotes/notes/xenapi_apis-conf-fcca549283e53ed6.yaml new file mode 100644 index 0000000000..4d26210a8d --- /dev/null +++ b/releasenotes/notes/xenapi_apis-conf-fcca549283e53ed6.yaml @@ -0,0 +1,7 @@ +--- +upgrade: + - | + A number of Compute APIs that only worked with the XenAPI virt driver have + been removed in the Compute service. As a result, their corresponding tests + are now disabled by default. They can be re-enabled using the new + ``[compute_feature_enabled] xenapi_apis`` config option. diff --git a/tempest/api/compute/admin/test_agents.py b/tempest/api/compute/admin/test_agents.py index 0414b91b56..4cc5fdd343 100644 --- a/tempest/api/compute/admin/test_agents.py +++ b/tempest/api/compute/admin/test_agents.py @@ -13,13 +13,23 @@ # under the License. from tempest.api.compute import base +from tempest import config from tempest.lib.common.utils import data_utils from tempest.lib import decorators +CONF = config.CONF + +# TODO(stephenfin): Remove these tests once the nova Ussuri branch goes EOL class AgentsAdminTestJSON(base.BaseV2ComputeAdminTest): """Tests Compute Agents API""" + @classmethod + def skip_checks(cls): + super(AgentsAdminTestJSON, cls).skip_checks() + if not CONF.compute_feature_enabled.xenapi_apis: + raise cls.skipException('The os-agents API is not supported.') + @classmethod def setup_clients(cls): super(AgentsAdminTestJSON, cls).setup_clients() diff --git a/tempest/api/compute/admin/test_servers.py b/tempest/api/compute/admin/test_servers.py index 530c8fbe0f..ab1b49a77d 100644 --- a/tempest/api/compute/admin/test_servers.py +++ b/tempest/api/compute/admin/test_servers.py @@ -14,10 +14,13 @@ from tempest.api.compute import base from tempest.common import waiters +from tempest import config from tempest.lib.common.utils import data_utils from tempest.lib import decorators from tempest.lib import exceptions as lib_exc +CONF = config.CONF + class ServersAdminTestJSON(base.BaseV2ComputeAdminTest): """Tests Servers API using admin privileges""" @@ -201,6 +204,10 @@ class ServersAdminTestJSON(base.BaseV2ComputeAdminTest): @decorators.idempotent_id('7a1323b4-a6a2-497a-96cb-76c07b945c71') def test_reset_network_inject_network_info(self): """Test resetting and injecting network info of a server""" + if not CONF.compute_feature_enabled.xenapi_apis: + raise self.skipException( + 'The resetNetwork server action is not supported.') + # Reset Network of a Server server = self.create_test_server(wait_until='ACTIVE') self.client.reset_network(server['id']) diff --git a/tempest/api/compute/servers/test_server_metadata.py b/tempest/api/compute/servers/test_server_metadata.py index fc859a8ccc..9f93e768ef 100644 --- a/tempest/api/compute/servers/test_server_metadata.py +++ b/tempest/api/compute/servers/test_server_metadata.py @@ -14,14 +14,25 @@ # under the License. from tempest.api.compute import base +from tempest import config from tempest.lib import decorators +CONF = config.CONF + +# TODO(stephenfin): Remove these tests once the nova Ussuri branch goes EOL class ServerMetadataTestJSON(base.BaseV2ComputeTest): """Test server metadata""" create_default_network = True + @classmethod + def skip_checks(cls): + super(ServerMetadataTestJSON, cls).skip_checks() + if not CONF.compute_feature_enabled.xenapi_apis: + raise cls.skipException( + 'Metadata is read-only on non-Xen-based deployments.') + @classmethod def setup_clients(cls): super(ServerMetadataTestJSON, cls).setup_clients() diff --git a/tempest/api/compute/servers/test_server_metadata_negative.py b/tempest/api/compute/servers/test_server_metadata_negative.py index 6435ccc16e..a697b95ee6 100644 --- a/tempest/api/compute/servers/test_server_metadata_negative.py +++ b/tempest/api/compute/servers/test_server_metadata_negative.py @@ -14,10 +14,13 @@ # under the License. from tempest.api.compute import base +from tempest import config from tempest.lib.common.utils import data_utils from tempest.lib import decorators from tempest.lib import exceptions as lib_exc +CONF = config.CONF + class ServerMetadataNegativeTestJSON(base.BaseV2ComputeTest): """Negative tests of server metadata""" @@ -97,6 +100,10 @@ class ServerMetadataNegativeTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('0df38c2a-3d4e-4db5-98d8-d4d9fa843a12') def test_set_metadata_non_existent_server(self): """Test setting metadata for a non existent server should fail""" + if not CONF.compute_feature_enabled.xenapi_apis: + raise self.skipException( + 'Metadata is read-only on non-Xen-based deployments.') + non_existent_server_id = data_utils.rand_uuid() meta = {'meta1': 'data1'} self.assertRaises(lib_exc.NotFound, @@ -108,6 +115,10 @@ class ServerMetadataNegativeTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('904b13dc-0ef2-4e4c-91cd-3b4a0f2f49d8') def test_update_metadata_non_existent_server(self): """Test updating metadata for a non existent server should fail""" + if not CONF.compute_feature_enabled.xenapi_apis: + raise self.skipException( + 'Metadata is read-only on non-Xen-based deployments.') + non_existent_server_id = data_utils.rand_uuid() meta = {'key1': 'value1', 'key2': 'value2'} self.assertRaises(lib_exc.NotFound, @@ -119,6 +130,10 @@ class ServerMetadataNegativeTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('a452f38c-05c2-4b47-bd44-a4f0bf5a5e48') def test_update_metadata_with_blank_key(self): """Test updating server metadata to blank key should fail""" + if not CONF.compute_feature_enabled.xenapi_apis: + raise self.skipException( + 'Metadata is read-only on non-Xen-based deployments.') + meta = {'': 'data1'} self.assertRaises(lib_exc.BadRequest, self.client.update_server_metadata, @@ -131,6 +146,10 @@ class ServerMetadataNegativeTestJSON(base.BaseV2ComputeTest): Should not be able to delete metadata item from a non-existent server. """ + if not CONF.compute_feature_enabled.xenapi_apis: + raise self.skipException( + 'Metadata is read-only on non-Xen-based deployments.') + non_existent_server_id = data_utils.rand_uuid() self.assertRaises(lib_exc.NotFound, self.client.delete_server_metadata_item, @@ -145,6 +164,10 @@ class ServerMetadataNegativeTestJSON(base.BaseV2ComputeTest): A 403 Forbidden or 413 Overlimit (old behaviour) exception will be raised while exceeding metadata items limit for project. """ + if not CONF.compute_feature_enabled.xenapi_apis: + raise self.skipException( + 'Metadata is read-only on non-Xen-based deployments.') + quota_set = self.quotas_client.show_quota_set( self.tenant_id)['quota_set'] quota_metadata = quota_set['metadata_items'] @@ -169,6 +192,10 @@ class ServerMetadataNegativeTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('96100343-7fa9-40d8-80fa-d29ef588ce1c') def test_set_server_metadata_blank_key(self): """Test setting server metadata with blank key should fail""" + if not CONF.compute_feature_enabled.xenapi_apis: + raise self.skipException( + 'Metadata is read-only on non-Xen-based deployments.') + meta = {'': 'data1'} self.assertRaises(lib_exc.BadRequest, self.client.set_server_metadata, @@ -178,6 +205,10 @@ class ServerMetadataNegativeTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('64a91aee-9723-4863-be44-4c9d9f1e7d0e') def test_set_server_metadata_missing_metadata(self): """Test setting server metadata without metadata field should fail""" + if not CONF.compute_feature_enabled.xenapi_apis: + raise self.skipException( + 'Metadata is read-only on non-Xen-based deployments.') + meta = {'meta1': 'data1'} self.assertRaises(lib_exc.BadRequest, self.client.set_server_metadata, diff --git a/tempest/config.py b/tempest/config.py index 989b8ef4d1..a632dee4fd 100644 --- a/tempest/config.py +++ b/tempest/config.py @@ -598,6 +598,18 @@ ComputeFeaturesGroup = [ help='Does the test environment support attaching a volume to ' 'more than one instance? This depends on hypervisor and ' 'volume backend/type and compute API version 2.60.'), + cfg.BoolOpt('xenapi_apis', + default=False, + help='Does the test environment support the XenAPI-specific ' + 'APIs: os-agents, writeable server metadata and the ' + 'resetNetwork server action? ' + 'These were removed in Victoria alongside the XenAPI ' + 'virt driver.', + deprecated_for_removal=True, + deprecated_reason="On Nova side, XenAPI virt driver and the " + "APIs that only worked with that driver " + "have been removed and there's nothing to " + "test after Ussuri."), ]