From ec67396a2ba9e9bca14b26f1daf88ae55eabe05f Mon Sep 17 00:00:00 2001 From: David Hill Date: Tue, 3 Nov 2020 16:23:22 -0500 Subject: [PATCH] As of nova microversion 2.57, personality is deprecated This patch returns a stack validation error if the nova microversion is 2.57 or greater and the personality parameter is also specified in the templates. Change-Id: I0919150baa36112ccbd8bfd7ccebc7aab5735cf3 Task: 41229 (cherry picked from commit b068f45adda72fa12f50008a603c8f37fcabcdff) (cherry picked from commit 3f98fd9b1dfadf0390cc8bef9f42d08840b34840) --- .../engine/resources/openstack/nova/server.py | 11 ++++- heat/tests/openstack/nova/test_server.py | 40 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/heat/engine/resources/openstack/nova/server.py b/heat/engine/resources/openstack/nova/server.py index 405df9f55b..5d78d654c5 100644 --- a/heat/engine/resources/openstack/nova/server.py +++ b/heat/engine/resources/openstack/nova/server.py @@ -39,7 +39,8 @@ cfg.CONF.import_opt('default_user_data_format', 'heat.common.config') LOG = logging.getLogger(__name__) NOVA_MICROVERSIONS = (MICROVERSION_TAGS, MICROVERSION_STR_NETWORK, - MICROVERSION_NIC_TAGS) = ('2.26', '2.37', '2.42') + MICROVERSION_NIC_TAGS, MICROVERSION_PERSONALITY_REMOVED + ) = ('2.26', '2.37', '2.42', '2.57') class Server(server_base.BaseServer, sh.SchedulerHintsMixin, @@ -1593,6 +1594,14 @@ class Server(server_base.BaseServer, sh.SchedulerHintsMixin, # retrieve provider's absolute limits if it will be needed metadata = self.properties[self.METADATA] personality = self.properties[self.PERSONALITY] + + if personality: + if self.client_plugin().is_version_supported( + MICROVERSION_PERSONALITY_REMOVED): + msg = (_('Cannot use the personality parameter as nova no ' + 'longer supports it. Use user_data instead.')) + raise exception.StackValidationFailed(message=msg) + if metadata or personality: limits = self.client_plugin().absolute_limits() diff --git a/heat/tests/openstack/nova/test_server.py b/heat/tests/openstack/nova/test_server.py index 8744466d73..175c516359 100644 --- a/heat/tests/openstack/nova/test_server.py +++ b/heat/tests/openstack/nova/test_server.py @@ -3161,6 +3161,8 @@ class ServersTest(common.HeatTestCase): (tmpl, stack) = self._setup_test_stack(stack_name) self.patchobject(nova.NovaClientPlugin, 'client', return_value=self.fc) + self.patchobject(nova.NovaClientPlugin, 'is_version_supported', + return_value=False) tmpl.t['Resources']['WebServer']['Properties'][ 'personality'] = {"/fake/path1": "fake contents1", "/fake/path2": "fake_contents2", @@ -3180,11 +3182,39 @@ class ServersTest(common.HeatTestCase): self.assertEqual("The personality property may not contain " "greater than 5 entries.", six.text_type(exc)) + def test_server_validate_personality_unsupported(self): + stack_name = 'srv_val' + (tmpl, stack) = self._setup_test_stack(stack_name) + self.patchobject(nova.NovaClientPlugin, 'client', + return_value=self.fc) + self.patchobject(nova.NovaClientPlugin, 'is_version_supported', + return_value=True) + tmpl.t['Resources']['WebServer']['Properties'][ + 'personality'] = {"/fake/path1": "fake contents1", + "/fake/path2": "fake_contents2", + "/fake/path3": "fake_contents3", + "/fake/path4": "fake_contents4", + "/fake/path5": "fake_contents5"} + resource_defns = tmpl.resource_definitions(stack) + server = servers.Server('server_create_image_err', + resource_defns['WebServer'], stack) + + self.patchobject(self.fc.limits, 'get', return_value=self.limits) + self.patchobject(glance.GlanceClientPlugin, 'get_image', + return_value=self.mock_image) + exc = self.assertRaises(exception.StackValidationFailed, + server.validate) + self.assertEqual("Cannot use the personality parameter as nova " + "no longer supports it. Use user_data instead.", + str(exc)) + def test_server_validate_personality_okay(self): stack_name = 'srv_val' (tmpl, stack) = self._setup_test_stack(stack_name) self.patchobject(nova.NovaClientPlugin, 'client', return_value=self.fc) + self.patchobject(nova.NovaClientPlugin, 'is_version_supported', + return_value=False) tmpl.t['Resources']['WebServer']['Properties'][ 'personality'] = {"/fake/path1": "fake contents1", "/fake/path2": "fake_contents2", @@ -3205,6 +3235,8 @@ class ServersTest(common.HeatTestCase): (tmpl, stack) = self._setup_test_stack(stack_name) self.patchobject(nova.NovaClientPlugin, 'client', return_value=self.fc) + self.patchobject(nova.NovaClientPlugin, 'is_version_supported', + return_value=False) tmpl.t['Resources']['WebServer']['Properties'][ 'personality'] = {"/fake/path1": "a" * 10240} resource_defns = tmpl.resource_definitions(stack) @@ -3221,6 +3253,8 @@ class ServersTest(common.HeatTestCase): self.patchobject(nova.NovaClientPlugin, 'client', return_value=self.fc) + self.patchobject(nova.NovaClientPlugin, 'is_version_supported', + return_value=False) tmpl.t['Resources']['WebServer']['Properties'][ 'personality'] = {"/fake/path1": "a" * 10241} resource_defns = tmpl.resource_definitions(stack) @@ -3242,6 +3276,8 @@ class ServersTest(common.HeatTestCase): stack_name, server_with_sw_config_personality) self.patchobject(nova.NovaClientPlugin, 'client', return_value=self.fc) + self.patchobject(nova.NovaClientPlugin, 'is_version_supported', + return_value=False) resource_defns = tmpl.resource_definitions(stack) server = servers.Server('server_create_image_err', resource_defns['server'], stack) @@ -4268,6 +4304,8 @@ class ServersTest(common.HeatTestCase): 'personality'] = {"/fake/path1": "a" * 10} self.patchobject(nova.NovaClientPlugin, 'client', return_value=self.fc) + self.patchobject(nova.NovaClientPlugin, 'is_version_supported', + return_value=False) resource_defns = tmpl.resource_definitions(stack) server = servers.Server('server_create_image_err', resource_defns['WebServer'], stack) @@ -4285,6 +4323,8 @@ class ServersTest(common.HeatTestCase): 'personality'] = {"/fake/path1": "a" * 10} self.patchobject(nova.NovaClientPlugin, 'client', return_value=self.fc) + self.patchobject(nova.NovaClientPlugin, 'is_version_supported', + return_value=False) resource_defns = tmpl.resource_definitions(stack) server = servers.Server('server_create_image_err', resource_defns['WebServer'], stack)