summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--heatclient/tests/unit/test_shell.py3
-rw-r--r--heatclient/tests/unit/test_stacks.py42
-rw-r--r--heatclient/v1/shell.py7
-rw-r--r--heatclient/v1/stacks.py6
4 files changed, 55 insertions, 3 deletions
diff --git a/heatclient/tests/unit/test_shell.py b/heatclient/tests/unit/test_shell.py
index 133b0e9..0e4bf03 100644
--- a/heatclient/tests/unit/test_shell.py
+++ b/heatclient/tests/unit/test_shell.py
@@ -3883,7 +3883,8 @@ class ShellTestConfig(ShellBase):
six.StringIO('the config script'))
http.SessionClient.request(
- '/validate', 'POST', data=validate_template).AndReturn(http_resp)
+ '/validate', 'POST',
+ data=validate_template).AndReturn(http_resp)
http.SessionClient.request(
'/software_configs', 'POST', data=create_dict).AndReturn(http_resp)
diff --git a/heatclient/tests/unit/test_stacks.py b/heatclient/tests/unit/test_stacks.py
index 12ebdc0..9bb89e5 100644
--- a/heatclient/tests/unit/test_stacks.py
+++ b/heatclient/tests/unit/test_stacks.py
@@ -314,3 +314,45 @@ class StackManagerPaginationTest(testtools.TestCase):
results[0].stack_name)
self.assertEqual('stack_%s' % (self.offset + last_result),
results[-1].stack_name)
+
+
+class StackManagerValidateTest(testtools.TestCase):
+
+ def setUp(self):
+ super(StackManagerValidateTest, self).setUp()
+
+ self.mock_response = mock.MagicMock()
+ self.mock_response.json.return_value = {'result': 'fake_response'}
+ self.mock_response.headers = {'content-type': 'application/json'}
+
+ self.mock_client = mock.MagicMock()
+ self.mock_client.post.return_value = self.mock_response
+
+ self.manager = stacks.StackManager(self.mock_client)
+
+ def test_validate_show_nested(self):
+ # Test
+ result = self.manager.validate(**{'show_nested': True})
+
+ # Verify
+ self.assertEqual(self.mock_response.json.return_value, result)
+ self.mock_client.post.assert_called_once_with(
+ '/validate?show_nested=True', data={})
+
+ def test_validate_show_nested_false(self):
+ # Test
+ result = self.manager.validate(**{'show_nested': False})
+
+ # Verify
+ self.assertEqual(self.mock_response.json.return_value, result)
+ self.mock_client.post.assert_called_once_with(
+ '/validate', data={})
+
+ def test_validate_show_nested_default(self):
+ # Test
+ result = self.manager.validate()
+
+ # Verify
+ self.assertEqual(self.mock_response.json.return_value, result)
+ self.mock_client.post.assert_called_once_with(
+ '/validate', data={})
diff --git a/heatclient/v1/shell.py b/heatclient/v1/shell.py
index 59c3607..312c8b0 100644
--- a/heatclient/v1/shell.py
+++ b/heatclient/v1/shell.py
@@ -782,6 +782,8 @@ def do_template_show(hc, args):
action='append')
@utils.arg('-o', '--template-object', metavar='<URL>',
help=_('URL to retrieve template object (e.g. from swift).'))
+@utils.arg('-n', '--show-nested', default=False, action="store_true",
+ help=_('Resolve parameters from nested templates as well.'))
def do_template_validate(hc, args):
'''Validate a template with parameters.'''
@@ -796,9 +798,12 @@ def do_template_validate(hc, args):
fields = {
'template': template,
'files': dict(list(tpl_files.items()) + list(env_files.items())),
- 'environment': env
+ 'environment': env,
}
+ if args.show_nested:
+ fields['show_nested'] = args.show_nested
+
validation = hc.stacks.validate(**fields)
print(jsonutils.dumps(validation, indent=2, ensure_ascii=False))
diff --git a/heatclient/v1/stacks.py b/heatclient/v1/stacks.py
index a728fdf..7ce25e0 100644
--- a/heatclient/v1/stacks.py
+++ b/heatclient/v1/stacks.py
@@ -227,7 +227,11 @@ class StackManager(base.BaseManager):
def validate(self, **kwargs):
"""Validate a stack template."""
- resp = self.client.post('/validate', data=kwargs)
+ url = '/validate'
+ if kwargs.pop('show_nested', False):
+ url += '?show_nested=True'
+
+ resp = self.client.post(url, data=kwargs)
body = utils.get_response_body(resp)
return body