Fix flakey validation tests.

These tests were causing side effects to class variables of
K8sValidator, and this was intermittently failing subsequent tests
if they ran in the same stestr executor.

This change uses mock.patch to change the class variables for the
duration of the test only.

Change-Id: I81095221fa45f7070bde22e2a4415345080ed1f1
This commit is contained in:
Dale Smith 2024-01-24 11:51:26 +13:00
parent f6baa6d1ff
commit ab88ef3a5c

View File

@ -83,87 +83,92 @@ class TestValidation(base.BaseTestCase):
def _test_enforce_network_driver_types_create( def _test_enforce_network_driver_types_create(
self, self,
network_driver_type, network_driver_type,
network_driver_config_dict, validator_allowed_network_drivers=None,
coe='kubernetes', validator_default_network_driver=None,
assert_raised=False): coe="kubernetes",
assert_raised=False,
):
@v.enforce_network_driver_types_create() @v.enforce_network_driver_types_create()
def test(self, cluster_template): def test(self, cluster_template):
pass pass
for key, val in network_driver_config_dict.items():
CONF.set_override(key, val, 'cluster_template')
cluster_template = mock.MagicMock() cluster_template = mock.MagicMock()
cluster_template.name = 'test_cluster_template' cluster_template.name = 'test_cluster_template'
cluster_template.network_driver = network_driver_type cluster_template.network_driver = network_driver_type
cluster_template.coe = coe cluster_template.coe = coe
# Reload the validator module so that ClusterTemplate configs are # NOTE(dalees): Patch the validator class variables directly, so the
# re-evaluated. # changes are removed after the test.
reload_module(v) with mock.patch.multiple(
validator = v.K8sValidator v.K8sValidator,
validator.supported_network_drivers = ['flannel', 'type1', 'type2'] supported_network_drivers=["flannel", "type1", "type2"],
allowed_network_drivers=validator_allowed_network_drivers
or v.K8sValidator.allowed_network_drivers,
default_network_driver=validator_default_network_driver
or v.K8sValidator.default_network_driver,
):
if assert_raised: if assert_raised:
self.assertRaises(exception.InvalidParameterValue, self.assertRaises(
test, self, cluster_template) exception.InvalidParameterValue,
test,
self,
cluster_template,
)
else: else:
test(self, cluster_template) test(self, cluster_template)
return cluster_template return cluster_template
def test_enforce_network_driver_types_one_allowed_create(self): def test_enforce_network_driver_types_one_allowed_create(self):
self._test_enforce_network_driver_types_create( self._test_enforce_network_driver_types_create(
network_driver_type='type1', network_driver_type="type1",
network_driver_config_dict={ validator_allowed_network_drivers=["type1"],
'kubernetes_allowed_network_drivers': ['type1']}) )
def test_enforce_network_driver_types_two_allowed_create(self): def test_enforce_network_driver_types_two_allowed_create(self):
self._test_enforce_network_driver_types_create( self._test_enforce_network_driver_types_create(
network_driver_type='type1', network_driver_type="type1",
network_driver_config_dict={ validator_allowed_network_drivers=["type1", "type2"],
'kubernetes_allowed_network_drivers': ['type1', 'type2']}) )
def test_enforce_network_driver_types_not_allowed_create(self): def test_enforce_network_driver_types_not_allowed_create(self):
self._test_enforce_network_driver_types_create( self._test_enforce_network_driver_types_create(
network_driver_type='type1', network_driver_type="type1",
network_driver_config_dict={ validator_allowed_network_drivers=["type2"],
'kubernetes_allowed_network_drivers': ['type2']}, assert_raised=True,
assert_raised=True) )
def test_enforce_network_driver_types_all_allowed_create(self): def test_enforce_network_driver_types_all_allowed_create(self):
for driver in ['flannel', 'type1', 'type2']: for driver in ['flannel', 'type1', 'type2']:
self._test_enforce_network_driver_types_create( self._test_enforce_network_driver_types_create(
network_driver_type=driver, network_driver_type=driver,
network_driver_config_dict={ validator_allowed_network_drivers=["all"],
'kubernetes_allowed_network_drivers': ['all']}) )
def test_enforce_network_driver_types_invalid_coe_create(self): def test_enforce_network_driver_types_invalid_coe_create(self):
self._test_enforce_network_driver_types_create( self._test_enforce_network_driver_types_create(
network_driver_type='flannel', network_driver_type="flannel",
network_driver_config_dict={}, coe="invalid_coe_type",
coe='invalid_coe_type', assert_raised=True,
assert_raised=True) )
def test_enforce_network_driver_types_default_create(self): def test_enforce_network_driver_types_default_create(self):
cluster_template = self._test_enforce_network_driver_types_create( cluster_template = self._test_enforce_network_driver_types_create(
network_driver_type=None, network_driver_type=None
network_driver_config_dict={}) )
self.assertEqual('flannel', cluster_template.network_driver) self.assertEqual("flannel", cluster_template.network_driver)
def test_enforce_network_driver_types_default_config_create(self): def test_enforce_network_driver_types_default_config_create(self):
cluster_template = self._test_enforce_network_driver_types_create( cluster_template = self._test_enforce_network_driver_types_create(
network_driver_type=None, network_driver_type=None, validator_default_network_driver="type1"
network_driver_config_dict={ )
'kubernetes_default_network_driver': 'type1'}) self.assertEqual("type1", cluster_template.network_driver)
self.assertEqual('type1', cluster_template.network_driver)
def test_enforce_network_driver_types_default_invalid_create(self): def test_enforce_network_driver_types_default_invalid_create(self):
self._test_enforce_network_driver_types_create( self._test_enforce_network_driver_types_create(
network_driver_type=None, network_driver_type=None,
network_driver_config_dict={ validator_default_network_driver="invalid_driver",
'kubernetes_default_network_driver': 'invalid_driver'}, assert_raised=True,
assert_raised=True) )
@mock.patch('pecan.request') @mock.patch('pecan.request')
@mock.patch('magnum.api.utils.get_resource') @mock.patch('magnum.api.utils.get_resource')
@ -172,17 +177,14 @@ class TestValidation(base.BaseTestCase):
mock_get_resource, mock_get_resource,
mock_pecan_request, mock_pecan_request,
network_driver_type, network_driver_type,
network_driver_config_dict, validator_allowed_network_drivers=None,
assert_raised=False): assert_raised=False,
):
@v.enforce_network_driver_types_update() @v.enforce_network_driver_types_update()
def test(self, cluster_template_ident, patch): def test(self, cluster_template_ident, patch):
pass pass
for key, val in network_driver_config_dict.items(): cluster_template_ident = "test_uuid_or_name"
CONF.set_override(key, val, 'cluster_template')
cluster_template_ident = 'test_uuid_or_name'
patch = [{'path': '/network_driver', 'value': network_driver_type, patch = [{'path': '/network_driver', 'value': network_driver_type,
'op': 'replace'}] 'op': 'replace'}]
@ -192,45 +194,53 @@ class TestValidation(base.BaseTestCase):
cluster_template.network_driver = network_driver_type cluster_template.network_driver = network_driver_type
mock_get_resource.return_value = cluster_template mock_get_resource.return_value = cluster_template
# Reload the validator module so that ClusterTemplate configs are # NOTE(dalees): Patch the validator class variables directly, so the
# re-evaluated. # changes are removed after the test.
reload_module(v) with mock.patch.multiple(
validator = v.K8sValidator v.K8sValidator,
validator.supported_network_drivers = ['flannel', 'type1', 'type2'] supported_network_drivers=["flannel", "type1", "type2"],
allowed_network_drivers=validator_allowed_network_drivers
or v.K8sValidator.allowed_network_drivers,
):
if assert_raised: if assert_raised:
self.assertRaises(exception.InvalidParameterValue, self.assertRaises(
test, self, cluster_template_ident, patch) exception.InvalidParameterValue,
test,
self,
cluster_template_ident,
patch,
)
else: else:
test(self, cluster_template_ident, patch) test(self, cluster_template_ident, patch)
mock_get_resource.assert_called_once_with( mock_get_resource.assert_called_once_with(
'ClusterTemplate', cluster_template_ident) "ClusterTemplate", cluster_template_ident
)
def test_enforce_network_driver_types_one_allowed_update(self): def test_enforce_network_driver_types_one_allowed_update(self):
self._test_enforce_network_driver_types_update( self._test_enforce_network_driver_types_update(
network_driver_type='type1', network_driver_type="type1",
network_driver_config_dict={ validator_allowed_network_drivers=["type1"],
'kubernetes_allowed_network_drivers': ['type1']}) )
def test_enforce_network_driver_types_two_allowed_update(self): def test_enforce_network_driver_types_two_allowed_update(self):
self._test_enforce_network_driver_types_update( self._test_enforce_network_driver_types_update(
network_driver_type='type1', network_driver_type="type1",
network_driver_config_dict={ validator_allowed_network_drivers=["type1", "type2"],
'kubernetes_allowed_network_drivers': ['type1', 'type2']}) )
def test_enforce_network_driver_types_not_allowed_update(self): def test_enforce_network_driver_types_not_allowed_update(self):
self._test_enforce_network_driver_types_update( self._test_enforce_network_driver_types_update(
network_driver_type='type1', network_driver_type="type1",
network_driver_config_dict={ validator_allowed_network_drivers=["type2"],
'kubernetes_allowed_network_drivers': ['type2']}, assert_raised=True,
assert_raised=True) )
def test_enforce_network_driver_types_all_allowed_update(self): def test_enforce_network_driver_types_all_allowed_update(self):
for driver in ['flannel', 'type1', 'type2']: for driver in ['flannel', 'type1', 'type2']:
self._test_enforce_network_driver_types_update( self._test_enforce_network_driver_types_update(
network_driver_type=driver, network_driver_type=driver,
network_driver_config_dict={ validator_allowed_network_drivers=["all"],
'kubernetes_allowed_network_drivers': ['all']}) )
def _test_enforce_volume_driver_types_create( def _test_enforce_volume_driver_types_create(
self, self,
@ -320,15 +330,23 @@ class TestValidation(base.BaseTestCase):
# re-evaluated. # re-evaluated.
reload_module(v) reload_module(v)
validator = v.K8sValidator validator = v.K8sValidator
validator.supported_volume_driver = ['cinder']
with mock.patch.multiple(
validator, supported_volume_driver=["cinder"]
):
if assert_raised: if assert_raised:
self.assertRaises(exception.InvalidParameterValue, self.assertRaises(
test, self, cluster_template_ident, patch) exception.InvalidParameterValue,
test,
self,
cluster_template_ident,
patch,
)
else: else:
test(self, cluster_template_ident, patch) test(self, cluster_template_ident, patch)
mock_get_resource.assert_called_once_with( mock_get_resource.assert_called_once_with(
'ClusterTemplate', cluster_template_ident) "ClusterTemplate", cluster_template_ident
)
def test_enforce_volume_driver_types_supported_replace_update(self): def test_enforce_volume_driver_types_supported_replace_update(self):
self._test_enforce_volume_driver_types_update( self._test_enforce_volume_driver_types_update(