OS::Nova::KeyPair: Require public_key when api version >= 2.92

... because Nova requires the public_key property when creating
a keypair since api microversion 2.92.

Story: 2010201
Task: 45920
Change-Id: Iec6f1c570ec3bb19ca58b336e6e3401cc11c4c33
This commit is contained in:
Takashi Kajinami 2022-07-31 11:37:07 +09:00
parent d361aec71b
commit f8426b0f0b
2 changed files with 36 additions and 4 deletions

View File

@ -22,7 +22,8 @@ from heat.engine import translation
NOVA_MICROVERSIONS = (MICROVERSION_KEY_TYPE,
MICROVERSION_USER) = ('2.2', '2.10')
MICROVERSION_USER,
MICROVERSION_PUBLIC_KEY) = ('2.2', '2.10', '2.92')
class KeyPair(resource.Resource):
@ -71,9 +72,10 @@ class KeyPair(resource.Resource):
),
PUBLIC_KEY: properties.Schema(
properties.Schema.STRING,
_('The optional public key. This allows users to supply the '
'public key from a pre-existing key pair. If not supplied, a '
'new key pair will be generated.')
_('The public key. This allows users to supply the public key '
'from a pre-existing key pair. In Nova api version < 2.92, '
'if not supplied, a new key pair will be generated. '
'This property is required since Nova api version 2.92.')
),
KEY_TYPE: properties.Schema(
properties.Schema.STRING,
@ -148,6 +150,7 @@ class KeyPair(resource.Resource):
# Check if key_type is allowed to use
key_type = self.properties[self.KEY_TYPE]
user = self.properties[self.USER]
public_key = self.properties[self.PUBLIC_KEY]
validate_props = []
c_plugin = self.client_plugin()
@ -161,6 +164,12 @@ class KeyPair(resource.Resource):
'support required api microversion.') % validate_props)
raise exception.StackValidationFailed(message=msg)
if not public_key and c_plugin.is_version_supported(
MICROVERSION_PUBLIC_KEY):
msg = _('The public_key property is required by the nova API '
'version currently used.')
raise exception.StackValidationFailed(message=msg)
def handle_create(self):
pub_key = self.properties[self.PUBLIC_KEY] or None
user_id = self.properties[self.USER]

View File

@ -201,6 +201,29 @@ class NovaKeyPairTest(common.HeatTestCase):
return_value='2.1')
self._test_validate(user='user_A')
def test_validate_public_key(self):
self.patchobject(nova.NovaClientPlugin, 'get_max_microversion',
return_value='2.92')
template = copy.deepcopy(self.kp_template)
template['resources']['kp']['properties']['public_key'] = 'dummy'
stack = utils.parse_stack(template)
definition = stack.t.resource_definitions(stack)['kp']
kp_res = keypair.KeyPair('kp', definition, stack)
kp_res.validate()
def test_validate_public_key_fail(self):
self.patchobject(nova.NovaClientPlugin, 'get_max_microversion',
return_value='2.92')
template = copy.deepcopy(self.kp_template)
stack = utils.parse_stack(template)
definition = stack.t.resource_definitions(stack)['kp']
kp_res = keypair.KeyPair('kp', definition, stack)
error = self.assertRaises(exception.StackValidationFailed,
kp_res.validate)
msg = ('The public_key property is required by the nova API version '
'currently used.')
self.assertIn(msg, str(error))
def test_check_key(self):
res = self._get_test_resource(self.kp_template)
res.state_set(res.CREATE, res.COMPLETE, 'for test')