summaryrefslogtreecommitdiff
path: root/heatclient/tests/functional
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2016-04-06 05:48:21 +0000
committerGerrit Code Review <review@openstack.org>2016-04-06 05:48:21 +0000
commit00a95ad4f6941e72d0f596810f74599561aef6d6 (patch)
tree95d6d93472ba0705ec7f5e8ef44ea83a99f2a8dd /heatclient/tests/functional
parentcc4a611b7bf4b94121976b602095d36ee3d75fec (diff)
parent9bbdc4f7159934bb9e8a27c1d2be23d475fcb85c (diff)
downloadpython-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.py3
-rw-r--r--heatclient/tests/functional/osc/v1/base.py116
-rw-r--r--heatclient/tests/functional/osc/v1/test_readonly.py9
-rw-r--r--heatclient/tests/functional/osc/v1/test_stack.py56
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'])