Merge "[microversions] Add support for 2.10"
This commit is contained in:
commit
55351d0135
@ -25,4 +25,4 @@ API_MIN_VERSION = api_versions.APIVersion("2.1")
|
|||||||
# when client supported the max version, and bumped sequentially, otherwise
|
# when client supported the max version, and bumped sequentially, otherwise
|
||||||
# the client may break due to server side new version may include some
|
# the client may break due to server side new version may include some
|
||||||
# backward incompatible change.
|
# backward incompatible change.
|
||||||
API_MAX_VERSION = api_versions.APIVersion("2.9")
|
API_MAX_VERSION = api_versions.APIVersion("2.10")
|
||||||
|
@ -10,6 +10,9 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import tempest_lib.cli.base
|
||||||
|
|
||||||
|
from novaclient.tests.functional import base
|
||||||
from novaclient.tests.functional.v2 import fake_crypto
|
from novaclient.tests.functional.v2 import fake_crypto
|
||||||
from novaclient.tests.functional.v2.legacy import test_keypairs
|
from novaclient.tests.functional.v2.legacy import test_keypairs
|
||||||
|
|
||||||
@ -41,3 +44,77 @@ class TestKeypairsNovaClientV22(test_keypairs.TestKeypairsNovaClient):
|
|||||||
keypair = self._test_import_keypair(fingerprint, key_type='x509',
|
keypair = self._test_import_keypair(fingerprint, key_type='x509',
|
||||||
pub_key=pub_key_file)
|
pub_key=pub_key_file)
|
||||||
self.assertIn('x509', keypair)
|
self.assertIn('x509', keypair)
|
||||||
|
|
||||||
|
|
||||||
|
class TestKeypairsNovaClientV210(base.ClientTestBase):
|
||||||
|
"""Keypairs functional tests for v2.10 nova-api microversion.
|
||||||
|
"""
|
||||||
|
|
||||||
|
COMPUTE_API_VERSION = "2.10"
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestKeypairsNovaClientV210, self).setUp()
|
||||||
|
user_name = self.name_generate("v2.10")
|
||||||
|
password = "password"
|
||||||
|
user = self.cli_clients.keystone(
|
||||||
|
"user-create --name %(name)s --pass %(pass)s --tenant %(tenant)s" %
|
||||||
|
{"name": user_name, "pass": password,
|
||||||
|
"tenant": self.cli_clients.tenant_name})
|
||||||
|
self.user_id = self._get_value_from_the_table(user, "id")
|
||||||
|
self.addCleanup(self.cli_clients.keystone,
|
||||||
|
"user-delete %s" % self.user_id)
|
||||||
|
self.cli_clients_2 = tempest_lib.cli.base.CLIClient(
|
||||||
|
username=user_name,
|
||||||
|
password=password,
|
||||||
|
tenant_name=self.cli_clients.tenant_name,
|
||||||
|
uri=self.cli_clients.uri,
|
||||||
|
cli_dir=self.cli_clients.cli_dir)
|
||||||
|
|
||||||
|
def another_nova(self, action, flags='', params='', fail_ok=False,
|
||||||
|
endpoint_type='publicURL', merge_stderr=False):
|
||||||
|
flags += " --os-compute-api-version %s " % self.COMPUTE_API_VERSION
|
||||||
|
return self.cli_clients_2.nova(action, flags, params, fail_ok,
|
||||||
|
endpoint_type, merge_stderr)
|
||||||
|
|
||||||
|
def test_create_and_list_keypair(self):
|
||||||
|
name = self.name_generate("v2_10")
|
||||||
|
self.nova("keypair-add %s --user %s" % (name, self.user_id))
|
||||||
|
self.addCleanup(self.another_nova, "keypair-delete %s" % name)
|
||||||
|
output = self.nova("keypair-list")
|
||||||
|
self.assertRaises(ValueError, self._get_value_from_the_table,
|
||||||
|
output, name)
|
||||||
|
output_1 = self.another_nova("keypair-list")
|
||||||
|
output_2 = self.nova("keypair-list --user %s" % self.user_id)
|
||||||
|
self.assertEqual(output_1, output_2)
|
||||||
|
# it should be table with one key-pair
|
||||||
|
self.assertEqual(name, self._get_column_value_from_single_row_table(
|
||||||
|
output_1, "Name"))
|
||||||
|
|
||||||
|
output_1 = self.another_nova("keypair-show %s " % name)
|
||||||
|
output_2 = self.nova("keypair-show --user %s %s" % (self.user_id,
|
||||||
|
name))
|
||||||
|
self.assertEqual(output_1, output_2)
|
||||||
|
self.assertEqual(self.user_id,
|
||||||
|
self._get_value_from_the_table(output_1, "user_id"))
|
||||||
|
|
||||||
|
def test_create_and_delete(self):
|
||||||
|
name = self.name_generate("v2_10")
|
||||||
|
|
||||||
|
def cleanup():
|
||||||
|
# We should check keypair existence and remove it from correct user
|
||||||
|
# if keypair is presented
|
||||||
|
o = self.another_nova("keypair-list")
|
||||||
|
if name in o:
|
||||||
|
self.another_nova("keypair-delete %s" % name)
|
||||||
|
|
||||||
|
self.nova("keypair-add %s --user %s" % (name, self.user_id))
|
||||||
|
self.addCleanup(cleanup)
|
||||||
|
output = self.another_nova("keypair-list")
|
||||||
|
self.assertEqual(name, self._get_column_value_from_single_row_table(
|
||||||
|
output, "Name"))
|
||||||
|
|
||||||
|
self.nova("keypair-delete %s --user %s " % (name, self.user_id))
|
||||||
|
output = self.another_nova("keypair-list")
|
||||||
|
self.assertRaises(
|
||||||
|
ValueError,
|
||||||
|
self._get_column_value_from_single_row_table, output, "Name")
|
||||||
|
@ -2552,7 +2552,6 @@ class ShellTest(utils.TestCase):
|
|||||||
5, # Not implemented when test added, should not apply to adds.
|
5, # Not implemented when test added, should not apply to adds.
|
||||||
7, # doesn't require any changes in novaclient
|
7, # doesn't require any changes in novaclient
|
||||||
9, # doesn't require any changes in novaclient
|
9, # doesn't require any changes in novaclient
|
||||||
10, # Not implemented when test added, should not apply to adds.
|
|
||||||
])
|
])
|
||||||
versions_supported = set(range(0,
|
versions_supported = set(range(0,
|
||||||
novaclient.API_MAX_VERSION.ver_minor + 1))
|
novaclient.API_MAX_VERSION.ver_minor + 1))
|
||||||
|
@ -56,6 +56,7 @@ class KeypairManager(base.ManagerWithFind):
|
|||||||
keypair_prefix = "os-keypairs"
|
keypair_prefix = "os-keypairs"
|
||||||
is_alphanum_id_allowed = True
|
is_alphanum_id_allowed = True
|
||||||
|
|
||||||
|
@api_versions.wraps("2.0", "2.9")
|
||||||
def get(self, keypair):
|
def get(self, keypair):
|
||||||
"""
|
"""
|
||||||
Get a keypair.
|
Get a keypair.
|
||||||
@ -66,6 +67,20 @@ class KeypairManager(base.ManagerWithFind):
|
|||||||
return self._get("/%s/%s" % (self.keypair_prefix, base.getid(keypair)),
|
return self._get("/%s/%s" % (self.keypair_prefix, base.getid(keypair)),
|
||||||
"keypair")
|
"keypair")
|
||||||
|
|
||||||
|
@api_versions.wraps("2.10")
|
||||||
|
def get(self, keypair, user_id=None):
|
||||||
|
"""
|
||||||
|
Get a keypair.
|
||||||
|
|
||||||
|
:param keypair: The ID of the keypair to get.
|
||||||
|
:param user_id: Id of key-pair owner (Admin only).
|
||||||
|
:rtype: :class:`Keypair`
|
||||||
|
"""
|
||||||
|
query_string = "?user_id=%s" % user_id if user_id else ""
|
||||||
|
url = "/%s/%s%s" % (self.keypair_prefix, base.getid(keypair),
|
||||||
|
query_string)
|
||||||
|
return self._get(url, "keypair")
|
||||||
|
|
||||||
@api_versions.wraps("2.0", "2.1")
|
@api_versions.wraps("2.0", "2.1")
|
||||||
def create(self, name, public_key=None):
|
def create(self, name, public_key=None):
|
||||||
"""
|
"""
|
||||||
@ -79,7 +94,7 @@ class KeypairManager(base.ManagerWithFind):
|
|||||||
body['keypair']['public_key'] = public_key
|
body['keypair']['public_key'] = public_key
|
||||||
return self._create('/%s' % self.keypair_prefix, body, 'keypair')
|
return self._create('/%s' % self.keypair_prefix, body, 'keypair')
|
||||||
|
|
||||||
@api_versions.wraps("2.2")
|
@api_versions.wraps("2.2", "2.9")
|
||||||
def create(self, name, public_key=None, key_type="ssh"):
|
def create(self, name, public_key=None, key_type="ssh"):
|
||||||
"""
|
"""
|
||||||
Create a keypair
|
Create a keypair
|
||||||
@ -94,6 +109,25 @@ class KeypairManager(base.ManagerWithFind):
|
|||||||
body['keypair']['public_key'] = public_key
|
body['keypair']['public_key'] = public_key
|
||||||
return self._create('/%s' % self.keypair_prefix, body, 'keypair')
|
return self._create('/%s' % self.keypair_prefix, body, 'keypair')
|
||||||
|
|
||||||
|
@api_versions.wraps("2.10")
|
||||||
|
def create(self, name, public_key=None, key_type="ssh", user_id=None):
|
||||||
|
"""
|
||||||
|
Create a keypair
|
||||||
|
|
||||||
|
:param name: name for the keypair to create
|
||||||
|
:param public_key: existing public key to import
|
||||||
|
:param key_type: keypair type to create
|
||||||
|
:param user_id: user to add.
|
||||||
|
"""
|
||||||
|
body = {'keypair': {'name': name,
|
||||||
|
'type': key_type}}
|
||||||
|
if public_key:
|
||||||
|
body['keypair']['public_key'] = public_key
|
||||||
|
if user_id:
|
||||||
|
body['keypair']['user_id'] = user_id
|
||||||
|
return self._create('/%s' % self.keypair_prefix, body, 'keypair')
|
||||||
|
|
||||||
|
@api_versions.wraps("2.0", "2.9")
|
||||||
def delete(self, key):
|
def delete(self, key):
|
||||||
"""
|
"""
|
||||||
Delete a keypair
|
Delete a keypair
|
||||||
@ -102,8 +136,32 @@ class KeypairManager(base.ManagerWithFind):
|
|||||||
"""
|
"""
|
||||||
self._delete('/%s/%s' % (self.keypair_prefix, base.getid(key)))
|
self._delete('/%s/%s' % (self.keypair_prefix, base.getid(key)))
|
||||||
|
|
||||||
|
@api_versions.wraps("2.10")
|
||||||
|
def delete(self, key, user_id=None):
|
||||||
|
"""
|
||||||
|
Delete a keypair
|
||||||
|
|
||||||
|
:param key: The :class:`Keypair` (or its ID) to delete.
|
||||||
|
:param user_id: Id of key-pair owner (Admin only).
|
||||||
|
"""
|
||||||
|
query_string = "?user_id=%s" % user_id if user_id else ""
|
||||||
|
url = '/%s/%s%s' % (self.keypair_prefix, base.getid(key), query_string)
|
||||||
|
self._delete(url)
|
||||||
|
|
||||||
|
@api_versions.wraps("2.0", "2.9")
|
||||||
def list(self):
|
def list(self):
|
||||||
"""
|
"""
|
||||||
Get a list of keypairs.
|
Get a list of keypairs.
|
||||||
"""
|
"""
|
||||||
return self._list('/%s' % self.keypair_prefix, 'keypairs')
|
return self._list('/%s' % self.keypair_prefix, 'keypairs')
|
||||||
|
|
||||||
|
@api_versions.wraps("2.10")
|
||||||
|
def list(self, user_id=None):
|
||||||
|
"""
|
||||||
|
Get a list of keypairs.
|
||||||
|
|
||||||
|
:param user_id: Id of key-pairs owner (Admin only).
|
||||||
|
"""
|
||||||
|
query_string = "?user_id=%s" % user_id if user_id else ""
|
||||||
|
url = '/%s%s' % (self.keypair_prefix, query_string)
|
||||||
|
return self._list(url, 'keypairs')
|
||||||
|
@ -2993,11 +2993,17 @@ def _keypair_create(cs, args, name, pub_key):
|
|||||||
return cs.keypairs.create(name, pub_key)
|
return cs.keypairs.create(name, pub_key)
|
||||||
|
|
||||||
|
|
||||||
@api_versions.wraps("2.2")
|
@api_versions.wraps("2.2", "2.9")
|
||||||
def _keypair_create(cs, args, name, pub_key):
|
def _keypair_create(cs, args, name, pub_key):
|
||||||
return cs.keypairs.create(name, pub_key, key_type=args.key_type)
|
return cs.keypairs.create(name, pub_key, key_type=args.key_type)
|
||||||
|
|
||||||
|
|
||||||
|
@api_versions.wraps("2.10")
|
||||||
|
def _keypair_create(cs, args, name, pub_key):
|
||||||
|
return cs.keypairs.create(name, pub_key, key_type=args.key_type,
|
||||||
|
user_id=args.user)
|
||||||
|
|
||||||
|
|
||||||
@cliutils.arg('name', metavar='<name>', help=_('Name of key.'))
|
@cliutils.arg('name', metavar='<name>', help=_('Name of key.'))
|
||||||
@cliutils.arg(
|
@cliutils.arg(
|
||||||
'--pub-key',
|
'--pub-key',
|
||||||
@ -3013,6 +3019,12 @@ def _keypair_create(cs, args, name, pub_key):
|
|||||||
default='ssh',
|
default='ssh',
|
||||||
help=_('Keypair type. Can be ssh or x509.'),
|
help=_('Keypair type. Can be ssh or x509.'),
|
||||||
start_version="2.2")
|
start_version="2.2")
|
||||||
|
@cliutils.arg(
|
||||||
|
'--user',
|
||||||
|
metavar='<user-id>',
|
||||||
|
default=None,
|
||||||
|
help=_('ID of user to whom to add key-pair (Admin only).'),
|
||||||
|
start_version="2.10")
|
||||||
def do_keypair_add(cs, args):
|
def do_keypair_add(cs, args):
|
||||||
"""Create a new key pair for use with servers."""
|
"""Create a new key pair for use with servers."""
|
||||||
name = args.name
|
name = args.name
|
||||||
@ -3037,6 +3049,7 @@ def do_keypair_add(cs, args):
|
|||||||
print(private_key)
|
print(private_key)
|
||||||
|
|
||||||
|
|
||||||
|
@api_versions.wraps("2.0", "2.9")
|
||||||
@cliutils.arg('name', metavar='<name>', help=_('Keypair name to delete.'))
|
@cliutils.arg('name', metavar='<name>', help=_('Keypair name to delete.'))
|
||||||
def do_keypair_delete(cs, args):
|
def do_keypair_delete(cs, args):
|
||||||
"""Delete keypair given by its name."""
|
"""Delete keypair given by its name."""
|
||||||
@ -3044,6 +3057,18 @@ def do_keypair_delete(cs, args):
|
|||||||
cs.keypairs.delete(name)
|
cs.keypairs.delete(name)
|
||||||
|
|
||||||
|
|
||||||
|
@api_versions.wraps("2.10")
|
||||||
|
@cliutils.arg('name', metavar='<name>', help=_('Keypair name to delete.'))
|
||||||
|
@cliutils.arg(
|
||||||
|
'--user',
|
||||||
|
metavar='<user-id>',
|
||||||
|
default=None,
|
||||||
|
help=_('Id of key-pair owner (Admin only).'))
|
||||||
|
def do_keypair_delete(cs, args):
|
||||||
|
"""Delete keypair given by its name."""
|
||||||
|
cs.keypairs.delete(args.name, args.user)
|
||||||
|
|
||||||
|
|
||||||
@api_versions.wraps("2.0", "2.1")
|
@api_versions.wraps("2.0", "2.1")
|
||||||
def _get_keypairs_list_columns(cs, args):
|
def _get_keypairs_list_columns(cs, args):
|
||||||
return ['Name', 'Fingerprint']
|
return ['Name', 'Fingerprint']
|
||||||
@ -3054,6 +3079,7 @@ def _get_keypairs_list_columns(cs, args):
|
|||||||
return ['Name', 'Type', 'Fingerprint']
|
return ['Name', 'Type', 'Fingerprint']
|
||||||
|
|
||||||
|
|
||||||
|
@api_versions.wraps("2.0", "2.9")
|
||||||
def do_keypair_list(cs, args):
|
def do_keypair_list(cs, args):
|
||||||
"""Print a list of keypairs for a user"""
|
"""Print a list of keypairs for a user"""
|
||||||
keypairs = cs.keypairs.list()
|
keypairs = cs.keypairs.list()
|
||||||
@ -3061,6 +3087,19 @@ def do_keypair_list(cs, args):
|
|||||||
utils.print_list(keypairs, columns)
|
utils.print_list(keypairs, columns)
|
||||||
|
|
||||||
|
|
||||||
|
@api_versions.wraps("2.10")
|
||||||
|
@cliutils.arg(
|
||||||
|
'--user',
|
||||||
|
metavar='<user-id>',
|
||||||
|
default=None,
|
||||||
|
help=_('List key-pairs of specified user id (Admin only).'))
|
||||||
|
def do_keypair_list(cs, args):
|
||||||
|
"""Print a list of keypairs for a user"""
|
||||||
|
keypairs = cs.keypairs.list(args.user)
|
||||||
|
columns = _get_keypairs_list_columns(cs, args)
|
||||||
|
utils.print_list(keypairs, columns)
|
||||||
|
|
||||||
|
|
||||||
def _print_keypair(keypair):
|
def _print_keypair(keypair):
|
||||||
kp = keypair._info.copy()
|
kp = keypair._info.copy()
|
||||||
pk = kp.pop('public_key')
|
pk = kp.pop('public_key')
|
||||||
@ -3068,6 +3107,7 @@ def _print_keypair(keypair):
|
|||||||
print(_("Public key: %s") % pk)
|
print(_("Public key: %s") % pk)
|
||||||
|
|
||||||
|
|
||||||
|
@api_versions.wraps("2.0", "2.9")
|
||||||
@cliutils.arg(
|
@cliutils.arg(
|
||||||
'keypair',
|
'keypair',
|
||||||
metavar='<keypair>',
|
metavar='<keypair>',
|
||||||
@ -3078,6 +3118,22 @@ def do_keypair_show(cs, args):
|
|||||||
_print_keypair(keypair)
|
_print_keypair(keypair)
|
||||||
|
|
||||||
|
|
||||||
|
@api_versions.wraps("2.10")
|
||||||
|
@cliutils.arg(
|
||||||
|
'keypair',
|
||||||
|
metavar='<keypair>',
|
||||||
|
help=_("Name of keypair."))
|
||||||
|
@cliutils.arg(
|
||||||
|
'--user',
|
||||||
|
metavar='<user-id>',
|
||||||
|
default=None,
|
||||||
|
help=_('Id of key-pair owner (Admin only).'))
|
||||||
|
def do_keypair_show(cs, args):
|
||||||
|
"""Show details about the given keypair."""
|
||||||
|
keypair = cs.keypairs.get(args.keypair, args.user)
|
||||||
|
_print_keypair(keypair)
|
||||||
|
|
||||||
|
|
||||||
def _find_keypair(cs, keypair):
|
def _find_keypair(cs, keypair):
|
||||||
"""Get a keypair by name."""
|
"""Get a keypair by name."""
|
||||||
return utils.find_resource(cs.keypairs, keypair)
|
return utils.find_resource(cs.keypairs, keypair)
|
||||||
|
Loading…
Reference in New Issue
Block a user