python-openstackclient/openstackclient/tests/functional/compute/v2/test_keypair.py
Rui Chen dee22d8faa Add "--private-key" option for "keypair create"
Aim to specify the private key file to save when keypair
is created. That is a convenient way to save private key
in OSC interactive mode, avoid to copy CLI output, then
paste it into file.

Change-Id: I119d2f2a3323d17ecbe3de4e27f35e1ceef6e0a5
Closes-Bug: #1549410
2017-03-06 08:34:28 +00:00

190 lines
6.8 KiB
Python

# 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.
import json
import tempfile
from openstackclient.tests.functional import base
from tempest.lib.common.utils import data_utils
from tempest.lib import exceptions
class KeypairBase(base.TestCase):
"""Methods for functional tests."""
def keypair_create(self, name=data_utils.rand_uuid()):
"""Create keypair and add cleanup."""
raw_output = self.openstack('keypair create ' + name)
self.addCleanup(self.keypair_delete, name, True)
if not raw_output:
self.fail('Keypair has not been created!')
def keypair_list(self, params=''):
"""Return dictionary with list of keypairs."""
raw_output = self.openstack('keypair list')
keypairs = self.parse_show_as_object(raw_output)
return keypairs
def keypair_delete(self, name, ignore_exceptions=False):
"""Try to delete keypair by name."""
try:
self.openstack('keypair delete ' + name)
except exceptions.CommandFailed:
if not ignore_exceptions:
raise
class KeypairTests(KeypairBase):
"""Functional tests for compute keypairs."""
PUBLIC_KEY = (
'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDWNGczJxNaFUrJJVhta4dWsZY6bU'
'5HUMPbyfSMu713ca3mYtG848W4dfDCB98KmSQx2Bl0D6Q2nrOszOXEQWAXNdfMadnW'
'c4mNwhZcPBVohIFoC1KZJC8kcBTvFZcoz3mdIijxJtywZNpGNh34VRJlZeHyYjg8/D'
'esHzdoBVd5c/4R36emQSIV9ukY6PHeZ3scAH4B3K9PxItJBwiFtouSRphQG0bJgOv/'
'gjAjMElAvg5oku98cb4QiHZ8T8WY68id804raHR6pJxpVVJN4TYJmlUs+NOVM+pPKb'
'KJttqrIBTkawGK9pLHNfn7z6v1syvUo/4enc1l0Q/Qn2kWiz67 fake@openstack'
)
def setUp(self):
"""Create keypair with randomized name for tests."""
super(KeypairTests, self).setUp()
self.KPName = data_utils.rand_name('TestKeyPair')
self.keypair = self.keypair_create(self.KPName)
def test_keypair_create_duplicate(self):
"""Try to create duplicate name keypair.
Test steps:
1) Create keypair in setUp
2) Try to create duplicate keypair with the same name
"""
self.assertRaises(exceptions.CommandFailed,
self.openstack, 'keypair create ' + self.KPName)
def test_keypair_create_noname(self):
"""Try to create keypair without name.
Test steps:
1) Try to create keypair without a name
"""
self.assertRaises(exceptions.CommandFailed,
self.openstack, 'keypair create')
def test_keypair_create_public_key(self):
"""Test for create keypair with --public-key option.
Test steps:
1) Create keypair with given public key
2) Delete keypair
"""
with tempfile.NamedTemporaryFile() as f:
f.write(self.PUBLIC_KEY)
f.flush()
raw_output = self.openstack(
'keypair create --public-key %s tmpkey' % f.name,
)
self.addCleanup(
self.openstack,
'keypair delete tmpkey',
)
self.assertIn('tmpkey', raw_output)
def test_keypair_create_private_key(self):
"""Test for create keypair with --private-key option.
Test steps:
1) Create keypair with private key file
2) Delete keypair
"""
with tempfile.NamedTemporaryFile() as f:
cmd_output = json.loads(self.openstack(
'keypair create -f json --private-key %s tmpkey' % f.name,
))
self.addCleanup(self.openstack, 'keypair delete tmpkey')
self.assertEqual('tmpkey', cmd_output.get('name'))
self.assertIsNotNone(cmd_output.get('user_id'))
self.assertIsNotNone(cmd_output.get('fingerprint'))
pk_content = f.read()
self.assertInOutput('-----BEGIN RSA PRIVATE KEY-----', pk_content)
self.assertRegex(pk_content, "[0-9A-Za-z+/]+[=]{0,3}\n")
self.assertInOutput('-----END RSA PRIVATE KEY-----', pk_content)
def test_keypair_create(self):
"""Test keypair create command.
Test steps:
1) Create keypair in setUp
2) Check RSA private key in output
3) Check for new keypair in keypairs list
"""
NewName = data_utils.rand_name('TestKeyPairCreated')
raw_output = self.openstack('keypair create ' + NewName)
self.addCleanup(self.openstack, 'keypair delete ' + NewName)
self.assertInOutput('-----BEGIN RSA PRIVATE KEY-----', raw_output)
self.assertRegex(raw_output, "[0-9A-Za-z+/]+[=]{0,3}\n")
self.assertInOutput('-----END RSA PRIVATE KEY-----', raw_output)
self.assertIn(NewName, self.keypair_list())
def test_keypair_delete_not_existing(self):
"""Try to delete keypair with not existing name.
Test steps:
1) Create keypair in setUp
2) Try to delete not existing keypair
"""
self.assertRaises(exceptions.CommandFailed,
self.openstack, 'keypair delete not_existing')
def test_keypair_delete(self):
"""Test keypair delete command.
Test steps:
1) Create keypair in setUp
2) Delete keypair
3) Check that keypair not in keypairs list
"""
self.openstack('keypair delete ' + self.KPName)
self.assertNotIn(self.KPName, self.keypair_list())
def test_keypair_list(self):
"""Test keypair list command.
Test steps:
1) Create keypair in setUp
2) List keypairs
3) Check output table structure
4) Check keypair name in output
"""
HEADERS = ['Name', 'Fingerprint']
raw_output = self.openstack('keypair list')
items = self.parse_listing(raw_output)
self.assert_table_structure(items, HEADERS)
self.assertIn(self.KPName, raw_output)
def test_keypair_show(self):
"""Test keypair show command.
Test steps:
1) Create keypair in setUp
2) Show keypair
3) Check output table structure
4) Check keypair name in output
"""
HEADERS = ['Field', 'Value']
raw_output = self.openstack('keypair show ' + self.KPName)
items = self.parse_listing(raw_output)
self.assert_table_structure(items, HEADERS)
self.assertInOutput(self.KPName, raw_output)