diff --git a/heatclient/osc/v1/software_deployment.py b/heatclient/osc/v1/software_deployment.py index a0259bae..67d1c401 100644 --- a/heatclient/osc/v1/software_deployment.py +++ b/heatclient/osc/v1/software_deployment.py @@ -17,6 +17,7 @@ import logging from cliff import command from cliff import lister +from cliff import show from openstackclient.common import exceptions as exc from openstackclient.common import utils @@ -112,3 +113,48 @@ def _list_deployment(heat_client, args=None): columns, (utils.get_item_properties(s, columns) for s in deployments) ) + + +class ShowDeployment(show.ShowOne): + """Show SoftwareDeployment Details.""" + + log = logging.getLogger(__name__ + ".ShowSoftwareDeployment") + + def get_parser(self, prog_name): + parser = super(ShowDeployment, self).get_parser(prog_name) + parser.add_argument( + 'id', + metavar='', + help=_('ID of the deployment') + ) + parser.add_argument( + '--long', + action='store_true', + help=_('Show more fields in output') + ) + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)", parsed_args) + + heat_client = self.app.client_manager.orchestration + try: + data = heat_client.software_deployments.get( + deployment_id=parsed_args.id) + except heat_exc.HTTPNotFound: + raise exc.CommandError(_('Software Deployment not found: %s') % id) + else: + columns = [ + 'id', + 'server_id', + 'config_id', + 'creation_time', + 'updated_time', + 'status', + 'status_reason', + 'input_values', + 'action', + ] + if parsed_args.long: + columns.append('output_values') + return columns, utils.get_item_properties(data, columns) diff --git a/heatclient/tests/unit/osc/v1/test_software_deployment.py b/heatclient/tests/unit/osc/v1/test_software_deployment.py index 36408b40..7157cf06 100644 --- a/heatclient/tests/unit/osc/v1/test_software_deployment.py +++ b/heatclient/tests/unit/osc/v1/test_software_deployment.py @@ -18,6 +18,7 @@ from openstackclient.common import exceptions as exc from heatclient import exc as heat_exc from heatclient.osc.v1 import software_deployment from heatclient.tests.unit.osc.v1 import fakes as orchestration_fakes +from heatclient.v1 import software_deployments class TestDeployment(orchestration_fakes.TestOrchestrationv1): @@ -136,3 +137,62 @@ class TestDeploymentList(TestDeployment): self.mock_client.list.assert_called_with(**kwargs) self.assertEqual(cols, columns) + + +class TestDeploymentShow(TestDeployment): + get_response = {"software_deployment": { + "status": "IN_PROGRESS", + "server_id": "ec14c864-096e-4e27-bb8a-2c2b4dc6f3f5", + "config_id": "3d5ec2a8-7004-43b6-a7f6-542bdbe9d434", + "output_values": 'null', + "input_values": 'null', + "action": "CREATE", + "status_reason": "Deploy data available", + "id": "06e87bcc-33a2-4bce-aebd-533e698282d3", + "creation_time": "2015-01-31T15:12:36Z", + "updated_time": "2015-01-31T15:18:21Z" + }} + + def setUp(self): + super(TestDeploymentShow, self).setUp() + self.cmd = software_deployment.ShowDeployment(self.app, None) + + def test_deployment_show(self): + arglist = ['my_deployment'] + cols = ['id', 'server_id', 'config_id', 'creation_time', + 'updated_time', 'status', 'status_reason', + 'input_values', 'action'] + parsed_args = self.check_parser(self.cmd, arglist, []) + self.mock_client.get = mock.Mock( + return_value=software_deployments.SoftwareDeployment( + None, self.get_response)) + columns, data = self.cmd.take_action(parsed_args) + self.mock_client.get.assert_called_with(**{ + 'deployment_id': 'my_deployment', + }) + self.assertEqual(cols, columns) + + def test_deployment_show_long(self): + arglist = ['my_deployment', '--long'] + cols = ['id', 'server_id', 'config_id', 'creation_time', + 'updated_time', 'status', 'status_reason', + 'input_values', 'action', 'output_values'] + parsed_args = self.check_parser(self.cmd, arglist, []) + self.mock_client.get = mock.Mock( + return_value=software_deployments.SoftwareDeployment( + None, self.get_response)) + columns, data = self.cmd.take_action(parsed_args) + self.mock_client.get.assert_called_once_with(**{ + 'deployment_id': 'my_deployment', + }) + self.assertEqual(cols, columns) + + def test_deployment_not_found(self): + arglist = ['my_deployment'] + parsed_args = self.check_parser(self.cmd, arglist, []) + self.mock_client.get = mock.Mock() + self.mock_client.get.side_effect = heat_exc.HTTPNotFound() + self.assertRaises( + exc.CommandError, + self.cmd.take_action, + parsed_args) diff --git a/setup.cfg b/setup.cfg index 9d866677..9d7dd2ad 100644 --- a/setup.cfg +++ b/setup.cfg @@ -40,6 +40,7 @@ openstack.orchestration.v1 = software_config_show = heatclient.osc.v1.software_config:ShowConfig software_deployment_delete = heatclient.osc.v1.software_deployment:DeleteDeployment software_deployment_list = heatclient.osc.v1.software_deployment:ListDeployment + software_deployment_show = heatclient.osc.v1.software_deployment:ShowDeployment stack_abandon = heatclient.osc.v1.stack:AbandonStack stack_adopt = heatclient.osc.v1.stack:AdoptStack stack_check = heatclient.osc.v1.stack:CheckStack