diff options
author | Jenkins <jenkins@review.openstack.org> | 2016-04-06 05:48:21 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2016-04-06 05:48:21 +0000 |
commit | 00a95ad4f6941e72d0f596810f74599561aef6d6 (patch) | |
tree | 95d6d93472ba0705ec7f5e8ef44ea83a99f2a8dd /heatclient/tests/functional | |
parent | cc4a611b7bf4b94121976b602095d36ee3d75fec (diff) | |
parent | 9bbdc4f7159934bb9e8a27c1d2be23d475fcb85c (diff) | |
download | python-heatclient-00a95ad4f6941e72d0f596810f74599561aef6d6.tar.gz |
Merge "Basic set of stack functional tests for openstack client"
Diffstat (limited to 'heatclient/tests/functional')
-rw-r--r-- | heatclient/tests/functional/base.py | 3 | ||||
-rw-r--r-- | heatclient/tests/functional/osc/v1/base.py | 116 | ||||
-rw-r--r-- | heatclient/tests/functional/osc/v1/test_readonly.py | 9 | ||||
-rw-r--r-- | heatclient/tests/functional/osc/v1/test_stack.py | 56 |
4 files changed, 175 insertions, 9 deletions
diff --git a/heatclient/tests/functional/base.py b/heatclient/tests/functional/base.py index b0d8a8e..44718ca 100644 --- a/heatclient/tests/functional/base.py +++ b/heatclient/tests/functional/base.py @@ -40,6 +40,3 @@ class ClientTestBase(base.ClientTestBase): def heat(self, *args, **kwargs): return self.clients.heat(*args, **kwargs) - - def openstack(self, *args, **kwargs): - return self.clients.openstack(*args, **kwargs) diff --git a/heatclient/tests/functional/osc/v1/base.py b/heatclient/tests/functional/osc/v1/base.py new file mode 100644 index 0000000..a2948a8 --- /dev/null +++ b/heatclient/tests/functional/osc/v1/base.py @@ -0,0 +1,116 @@ +# 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 os +import six + +from tempest_lib.cli import base +from tempest_lib.cli import output_parser + + +class OpenStackClientTestBase(base.ClientTestBase): + """Command line client base functions.""" + + def setUp(self): + super(OpenStackClientTestBase, self).setUp() + self.parser = output_parser + + def _get_clients(self): + cli_dir = os.environ.get( + 'OS_HEATCLIENT_EXEC_DIR', + os.path.join(os.path.abspath('.'), '.tox/functional/bin')) + + return base.CLIClient( + username=os.environ.get('OS_USERNAME'), + password=os.environ.get('OS_PASSWORD'), + tenant_name=os.environ.get('OS_TENANT_NAME'), + uri=os.environ.get('OS_AUTH_URL'), + cli_dir=cli_dir) + + def openstack(self, *args, **kwargs): + return self.clients.openstack(*args, **kwargs) + + def get_template_path(self, templ_name): + return os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../../templates/%s' % templ_name) + + def show_to_dict(self, output): + obj = {} + items = self.parser.listing(output) + for item in items: + obj[item['Field']] = six.text_type(item['Value']) + return dict((self._key_name(k), v) for k, v in obj.iteritems()) + + def _key_name(self, key): + return key.lower().replace(' ', '_') + + def list_to_dict(self, output, id): + obj = {} + items = self.parser.listing(output) + for item in items: + if item['ID'] == id: + obj = item + break + return dict((self._key_name(k), v) for k, v in obj.iteritems()) + + def _stack_create(self, name, template, parameters=[], wait=True): + cmd = 'stack create ' + name + if template: + cmd += ' -t ' + template + if wait: + cmd += ' --wait' + + for parameter in parameters: + cmd += ' --parameter ' + parameter + stack_raw = self.openstack(cmd) + stack = self.show_to_dict(stack_raw) + self.addCleanup(self._stack_delete, stack['id']) + return stack + + def _stack_delete(self, id, wait=False): + cmd = 'stack delete ' + id + ' --yes' + if wait: + cmd += ' --wait' + if id in self.openstack('stack list --short'): + self.openstack(cmd) + + def _stack_suspend(self, id, wait=True): + cmd = 'stack suspend ' + id + if wait: + cmd += ' --wait' + stack_raw = self.openstack(cmd) + stack = self.list_to_dict(stack_raw, id) + return stack + + def _stack_resume(self, id, wait=True): + cmd = 'stack resume ' + id + if wait: + cmd += ' --wait' + stack_raw = self.openstack(cmd) + stack = self.list_to_dict(stack_raw, id) + return stack + + def _stack_snapshot_create(self, id, name): + cmd = 'stack snapshot create ' + id + ' --name ' + name + snapshot_raw = self.openstack(cmd) + snapshot = self.show_to_dict(snapshot_raw) + self.addCleanup(self._stack_snapshot_delete, id, snapshot['id']) + return snapshot + + def _stack_snapshot_delete(self, id, snapshot_id): + cmd = 'stack snapshot delete ' + id + ' ' + snapshot_id + if snapshot_id in self.openstack('stack snapshot list ' + id): + self.openstack(cmd) + + def _stack_snapshot_restore(self, id, snapshot_id): + cmd = 'stack snapshot restore ' + id + ' ' + snapshot_id + self.openstack(cmd) diff --git a/heatclient/tests/functional/osc/v1/test_readonly.py b/heatclient/tests/functional/osc/v1/test_readonly.py index d8ed784..cd8e023 100644 --- a/heatclient/tests/functional/osc/v1/test_readonly.py +++ b/heatclient/tests/functional/osc/v1/test_readonly.py @@ -10,15 +10,14 @@ # License for the specific language governing permissions and limitations # under the License. -import os import yaml from tempest_lib import exceptions -from heatclient.tests.functional import base +from heatclient.tests.functional.osc.v1 import base -class SimpleReadOnlyOpenStackClientTest(base.ClientTestBase): +class SimpleReadOnlyOpenStackClientTest(base.OpenStackClientTestBase): """Basic, read-only tests for Openstack CLI client heat plugin. Basic smoke test for the openstack CLI commands which do not require @@ -92,9 +91,7 @@ class SimpleReadOnlyOpenStackClientTest(base.ClientTestBase): self.assertIsInstance(yaml.load(rsrc_schema), dict) def _template_validate(self, templ_name, parms): - heat_template_path = os.path.join( - os.path.dirname(os.path.realpath(__file__)), - '../../templates/%s' % templ_name) + heat_template_path = self.get_template_path(templ_name) cmd = 'stack create test-stack --dry-run --template %s'\ % heat_template_path for parm in parms: diff --git a/heatclient/tests/functional/osc/v1/test_stack.py b/heatclient/tests/functional/osc/v1/test_stack.py new file mode 100644 index 0000000..7ea4668 --- /dev/null +++ b/heatclient/tests/functional/osc/v1/test_stack.py @@ -0,0 +1,56 @@ +# 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 logging + +from heatclient.tests.functional.osc.v1 import base +from tempest_lib.common.utils import data_utils as utils + +LOG = logging.getLogger(__name__) + + +class OpenStackClientStackTest(base.OpenStackClientTestBase): + """Basic stack operation tests for Openstack CLI client heat plugin. + + Basic smoke test for the openstack CLI stack commands. + """ + + def setUp(self): + super(OpenStackClientStackTest, self).setUp() + self.stack_name = utils.rand_name(name='test-stack') + + def _stack_create_minimal(self): + template = self.get_template_path('heat_minimal_hot.yaml') + parameters = ['test_client_name=test_client_name'] + return self._stack_create(self.stack_name, template, parameters) + + def test_stack_create_minimal(self): + stack = self._stack_create_minimal() + self.assertEqual(self.stack_name, stack['stack_name']) + self.assertEqual("CREATE_COMPLETE", stack['stack_status']) + + def test_stack_suspend_resume(self): + stack = self._stack_create_minimal() + stack = self._stack_suspend(stack['id']) + self.assertEqual(self.stack_name, stack['stack_name']) + self.assertEqual("SUSPEND_COMPLETE", stack['stack_status']) + stack = self._stack_resume(stack['id']) + self.assertEqual(self.stack_name, stack['stack_name']) + self.assertEqual("RESUME_COMPLETE", stack['stack_status']) + + def test_stack_snapshot_create_restore(self): + snapshot_name = utils.rand_name(name='test-stack-snapshot') + stack = self._stack_create_minimal() + snapshot = self._stack_snapshot_create(stack['id'], snapshot_name) + self.assertEqual(snapshot_name, snapshot['name']) + self._stack_snapshot_restore(stack['id'], snapshot['id']) |