diff --git a/heatclient/osc/v1/stack.py b/heatclient/osc/v1/stack.py index 37366e1d..75978e6f 100644 --- a/heatclient/osc/v1/stack.py +++ b/heatclient/osc/v1/stack.py @@ -106,6 +106,12 @@ class CreateStack(show.ShowOne): metavar='', help=_('A list of tags to associate with the stack') ) + parser.add_argument( + '--dry-run', + action='store_true', + help=_('Do not actually perform the stack create, but show what ' + 'would be created') + ) parser.add_argument( 'name', metavar='', @@ -150,6 +156,30 @@ class CreateStack(show.ShowOne): if parsed_args.timeout: fields['timeout_mins'] = parsed_args.timeout + if parsed_args.dry_run: + stack = client.stacks.preview(**fields) + + formatters = { + 'description': heat_utils.text_wrap_formatter, + 'template_description': heat_utils.text_wrap_formatter, + 'stack_status_reason': heat_utils.text_wrap_formatter, + 'parameters': heat_utils.json_formatter, + 'outputs': heat_utils.json_formatter, + 'resources': heat_utils.json_formatter, + 'links': heat_utils.link_formatter, + } + + columns = [] + for key in stack.to_dict(): + columns.append(key) + columns.sort() + + return ( + columns, + utils.get_item_properties(stack, columns, + formatters=formatters) + ) + stack = client.stacks.create(**fields)['stack'] if parsed_args.wait: if not utils.wait_for_status(client.stacks.get, parsed_args.name, diff --git a/heatclient/tests/unit/osc/v1/test_stack.py b/heatclient/tests/unit/osc/v1/test_stack.py index cdec6cd6..b6fd99c4 100644 --- a/heatclient/tests/unit/osc/v1/test_stack.py +++ b/heatclient/tests/unit/osc/v1/test_stack.py @@ -53,6 +53,8 @@ class TestStackCreate(TestStack): return_value={'stack': {'id': '1234'}}) self.stack_client.get = mock.MagicMock( return_value={'stack_status': 'create_complete'}) + self.stack_client.preview = mock.MagicMock( + return_value=stacks.Stack(None, {'stack': {'id', '1234'}})) stack._authenticated_fetcher = mock.MagicMock() def test_stack_create_defaults(self): @@ -137,6 +139,15 @@ class TestStackCreate(TestStack): self.assertRaises(exc.CommandError, self.cmd.take_action, parsed_args) + def test_stack_create_dry_run(self): + arglist = ['my_stack', '-t', self.template_path, '--dry-run'] + parsed_args = self.check_parser(self.cmd, arglist, []) + + self.cmd.take_action(parsed_args) + + self.stack_client.preview.assert_called_with(**self.defaults) + self.stack_client.create.assert_not_called() + class TestStackUpdate(TestStack):