Microversion Test Generator

Adds a generator to make testing microversion enforcement significantly easier.

Generated-By: ChatGPT-4o
Change-Id: I1b88c2cb934bce4bb7ead88bc9ceceb90263e293
This commit is contained in:
Sharpz7 2024-12-09 00:09:05 +00:00
parent b6c0572a8a
commit e8b6e91d2c
2 changed files with 82 additions and 37 deletions

View File

@ -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"}
)

View File

@ -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)