diff --git a/heatclient/tests/functional/osc/v1/test_readonly.py b/heatclient/tests/functional/osc/v1/test_readonly.py index 3c70a47d..988823e6 100644 --- a/heatclient/tests/functional/osc/v1/test_readonly.py +++ b/heatclient/tests/functional/osc/v1/test_readonly.py @@ -10,6 +10,9 @@ # 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 @@ -27,14 +30,86 @@ class SimpleReadOnlyOpenStackClientTest(base.ClientTestBase): self.openstack, 'this-does-not-exist') - def test_openstack_stack_list(self): - self.openstack('stack list') + # Empty list commands + def test_openstack_empty_lists(self): + cmds = [ + 'software config', + 'software deployment', + 'stack', + ] + for cmd in cmds: + self.openstack(cmd + ' list') + + # Stack not found commands + def test_openstack_stack_not_found(self): + cmds = [ + 'stack abandon', + 'stack check', + 'stack output list', + 'stack resume', + 'stack show', + 'stack snapshot list', + 'stack suspend', + 'stack template show', + 'stack cancel' + ] + for cmd in cmds: + err = self.assertRaises(exceptions.CommandFailed, + self.openstack, + cmd + ' I-AM-NOT-FOUND') + self.assertIn('Stack not found: I-AM-NOT-FOUND', str(err)) def test_openstack_stack_list_debug(self): self.openstack('stack list', flags='--debug') def test_openstack_help_cmd(self): - self.openstack('help stack') + help_text = self.openstack('help stack list') + lines = help_text.split('\n') + self.assertFirstLineStartsWith(lines, 'usage: openstack stack list') def test_openstack_version(self): self.openstack('', flags='--version') + + def test_openstack_template_version_list(self): + ret = self.openstack('orchestration template version list') + tmpl_types = self.parser.listing(ret) + self.assertTableStruct(tmpl_types, ['version', 'type']) + + def test_openstack_template_function_list(self): + ret = self.openstack('orchestration template function list ' + 'heat_template_version.2015-10-15') + tmpl_functions = self.parser.listing(ret) + self.assertTableStruct(tmpl_functions, ['functions', 'description']) + + def test_openstack_resource_type_list(self): + ret = self.openstack('orchestration resource type list') + rsrc_types = self.parser.listing(ret) + self.assertTableStruct(rsrc_types, ['Resource Type']) + + def test_openstack_resource_type_show(self): + rsrc_schema = self.openstack('orchestration resource type show ' + 'OS::Heat::RandomString') + 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) + cmd = 'stack create test-stack --dry-run --template %s'\ + % heat_template_path + for parm in parms: + cmd += ' --parameter ' + parm + ret = self.openstack(cmd) + self.assertRegexpMatches(ret, r'stack_name.*|.*test_stack') + + def test_heat_template_validate_yaml(self): + self._template_validate( + 'heat_minimal.yaml', + ['ClientName=ClientName', 'WaitSecs=123'] + ) + + def test_heat_template_validate_hot(self): + self._template_validate( + 'heat_minimal_hot.yaml', + ['test_client_name=test_client_name', 'test_wait_secs=123'] + )