diff --git a/ironic_tempest_plugin/tests/api/admin/test_microversion_enforcement.py b/ironic_tempest_plugin/tests/api/admin/test_microversion_enforcement.py new file mode 100644 index 00000000..4fd8c991 --- /dev/null +++ b/ironic_tempest_plugin/tests/api/admin/test_microversion_enforcement.py @@ -0,0 +1,82 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +from tempest.lib import decorators +from tempest.lib import exceptions as lib_exc + +from ironic_tempest_plugin.services.baremetal.v1.json.baremetal_client import \ + BaremetalClient +from ironic_tempest_plugin.tests.api.admin import api_microversion_fixture +from ironic_tempest_plugin.tests.api import base + + +class TestMicroversionEnforcement(base.BaseBaremetalTest): + """Tests for API microversion enforcement.""" + + def setUp(self): + super(TestMicroversionEnforcement, self).setUp() + + def _microversion_test( + self, method_name, min_version, expected_error, required_args): + """Test methods with invalid API versions""" + + major, minor = map(int, min_version.split('.')) + # Set limits, as lowest microversion is 1.1 + if minor <= 10: + minor = 11 + if minor <= 1: + minor = 2 + invalid_versions = [ + f"{major}.{minor - 1}", + f"{major}.{minor - 10}", + ] + + # Get method name from method object + # This way, users can pass the method object, + # and we can still get the instantiated method + method_name = method_name.__name__ + + for microversion in invalid_versions: + for arg_name, arg_value in required_args.items(): + msg = ( + f"Testing {method_name} with version {microversion} " + f"and argument {arg_name}={arg_value}" + ) + with self.subTest( + msg=msg, method=method_name, version=microversion + ): + self.useFixture( + api_microversion_fixture.APIMicroversionFixture( + microversion + ) + ) + method = getattr(self.client, method_name) + + self.assertRaises( + expected_error, + method, + **{arg_name: arg_value}, + ) + + @decorators.idempotent_id("e5403a31-e12b-4f97-a776-dcb819e5e9a0") + def test_shard(self): + self._microversion_test( + BaremetalClient.get_shards, "1.82", lib_exc.NotFound, {} + ) + + @decorators.idempotent_id("5df533c6-7a9c-4639-a47f-1377a2a87e6a") + def test_list_node_filter_shard(self): + self._microversion_test( + BaremetalClient.list_nodes, "1.82", + lib_exc.NotAcceptable, {"shard": "testshard"} + ) diff --git a/ironic_tempest_plugin/tests/api/admin/test_shards.py b/ironic_tempest_plugin/tests/api/admin/test_shards.py index 8ad76c0b..06387028 100644 --- a/ironic_tempest_plugin/tests/api/admin/test_shards.py +++ b/ironic_tempest_plugin/tests/api/admin/test_shards.py @@ -12,9 +12,7 @@ from tempest import config from tempest.lib import decorators -from tempest.lib import exceptions -from ironic_tempest_plugin.tests.api.admin import api_microversion_fixture from ironic_tempest_plugin.tests.api import base @@ -130,27 +128,6 @@ class TestNodeShardQueries(base.BaseBaremetalTest): self.assertIn(self.none_node_id, fetched_node_ids) self.assertNotIn(self.bad_node_id, fetched_node_ids) - @decorators.idempotent_id('77e36b09-308a-4fdf-bdac-d31d3b4c7c23') - def test_only_show_requested_shard_wrong_microversions(self): - """Test get node on shard filter fails on bad microversions. - - Test that we get the correct error when using microversions - below the minimum supported. - """ - shard = "oneshardtest" - self._setup_nodes(shard) - - for microversion in ["1.37", "1.81"]: - self.useFixture( - api_microversion_fixture.APIMicroversionFixture(microversion) - ) - - self.assertRaises( - exceptions.NotAcceptable, - self.client.list_nodes, - shard=shard, - ) - class TestGetAllShards(base.BaseBaremetalTest): """Tests for baremetal shards.""" @@ -172,17 +149,3 @@ class TestGetAllShards(base.BaseBaremetalTest): fetched_shards = [shard['name'] for shard in fetched_shards['shards']] self.assertItemsEqual(self.shards, fetched_shards) - - @decorators.idempotent_id('e9d5fd51-1419-4af2-9d6c-c317556c2096') - def test_get_shards_wrong_microversions(self): - """Test get shards fails on bad microversions. - - Test that we get the correct error when using microversions - below the minimum supported. - """ - for microversion in ["1.37", "1.81"]: - self.useFixture( - api_microversion_fixture.APIMicroversionFixture(microversion) - ) - # Test microversion below minimum supported - self.assertRaises(exceptions.NotFound, self.client.get_shards)