summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--heatclient/osc/v1/stack.py33
-rw-r--r--heatclient/tests/unit/osc/v1/test_stack.py29
-rw-r--r--setup.cfg1
3 files changed, 63 insertions, 0 deletions
diff --git a/heatclient/osc/v1/stack.py b/heatclient/osc/v1/stack.py
index 918cd71..dc1c9d3 100644
--- a/heatclient/osc/v1/stack.py
+++ b/heatclient/osc/v1/stack.py
@@ -774,3 +774,36 @@ class OutputShowStack(show.ShowOne):
output['output_value'])
return self.dict2columns(output)
+
+
+class OutputListStack(lister.Lister):
+ """List stack outputs."""
+
+ log = logging.getLogger(__name__ + '.OutputListStack')
+
+ def get_parser(self, prog_name):
+ parser = super(OutputListStack, self).get_parser(prog_name)
+ parser.add_argument(
+ 'stack',
+ metavar='<NAME or ID>',
+ help=_('Name or ID of stack to query')
+ )
+ return parser
+
+ def take_action(self, parsed_args):
+ self.log.debug('take_action(%s)', parsed_args)
+
+ client = self.app.client_manager.orchestration
+
+ try:
+ outputs = client.stacks.output_list(parsed_args.stack)['outputs']
+ except heat_exc.HTTPNotFound:
+ msg = _('Stack not found: %s') % parsed_args.stack
+ raise exc.CommandError(msg)
+
+ columns = ['output_key', 'description']
+
+ return (
+ columns,
+ (utils.get_dict_properties(s, columns) for s in outputs)
+ )
diff --git a/heatclient/tests/unit/osc/v1/test_stack.py b/heatclient/tests/unit/osc/v1/test_stack.py
index cb33977..8dd30cb 100644
--- a/heatclient/tests/unit/osc/v1/test_stack.py
+++ b/heatclient/tests/unit/osc/v1/test_stack.py
@@ -728,3 +728,32 @@ class TestStackOutputShow(TestStack):
self.assertEqual('Stack my_stack or output output3 not found.',
str(error))
self.stack_client.output_show.assert_called_with('my_stack', 'output3')
+
+
+class TestStackOutputList(TestStack):
+
+ response = {'outputs': [{'output_key': 'key1', 'description': 'desc1'},
+ {'output_key': 'key2', 'description': 'desc2'}]}
+
+ def setUp(self):
+ super(TestStackOutputList, self).setUp()
+ self.cmd = stack.OutputListStack(self.app, None)
+
+ def test_stack_output_list(self):
+ arglist = ['my_stack']
+ self.stack_client.output_list.return_value = self.response
+ parsed_args = self.check_parser(self.cmd, arglist, [])
+
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.assertEqual(['output_key', 'description'], columns)
+ self.stack_client.output_list.assert_called_with('my_stack')
+
+ def test_stack_output_list_not_found(self):
+ arglist = ['my_stack']
+ self.stack_client.output_list.side_effect = heat_exc.HTTPNotFound
+ parsed_args = self.check_parser(self.cmd, arglist, [])
+
+ error = self.assertRaises(exc.CommandError,
+ self.cmd.take_action, parsed_args)
+ self.assertEqual('Stack not found: my_stack', str(error))
diff --git a/setup.cfg b/setup.cfg
index 5f77f1a..1f6fbb0 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -40,6 +40,7 @@ openstack.orchestration.v1 =
stack_adopt = heatclient.osc.v1.stack:AdoptStack
stack_create = heatclient.osc.v1.stack:CreateStack
stack_list = heatclient.osc.v1.stack:ListStack
+ stack_output_list = heatclient.osc.v1.stack:OutputListStack
stack_output_show = heatclient.osc.v1.stack:OutputShowStack
stack_resource_metadata = heatclient.osc.v1.resources:ResourceMetadata
stack_show = heatclient.osc.v1.stack:ShowStack