From 294208500e9d77105fd2e03bd7451bccef7bbd36 Mon Sep 17 00:00:00 2001 From: Anastasiia Guzikova Date: Mon, 29 Aug 2016 17:31:14 +0300 Subject: [PATCH] Deployment history --include-summary Depends-on: I9683e733901cc22d6ef69b09d51a00726c803c40 Change-Id: I8b9496a7ebb898ea8ef73ff3696a8057d747826d --- fuelclient/cli/actions/deployment_tasks.py | 11 ++++++-- fuelclient/cli/arguments.py | 8 ++++++ fuelclient/commands/task.py | 9 +++++++ .../unit/v1/test_deployment_history_action.py | 22 ++++++++++++++++ fuelclient/tests/unit/v2/cli/test_task.py | 21 +++++++++++++++ .../unit/v2/lib/test_deployment_history.py | 26 +++++++++++++++++++ .../tests/utils/fake_deployment_history.py | 14 ++++++---- fuelclient/v1/deployment_history.py | 10 ++++--- 8 files changed, 111 insertions(+), 10 deletions(-) diff --git a/fuelclient/cli/actions/deployment_tasks.py b/fuelclient/cli/actions/deployment_tasks.py index 1eb5ac60..9dabb66d 100644 --- a/fuelclient/cli/actions/deployment_tasks.py +++ b/fuelclient/cli/actions/deployment_tasks.py @@ -44,7 +44,10 @@ class DeploymentTasksAction(Action): ), Args.get_show_parameters_arg( "Show deployment tasks parameters" - ) + ), + Args.get_include_summary_arg( + "Show deployment tasks summary" + ), ] self.flag_func_map = ( (None, self.list), @@ -79,19 +82,23 @@ class DeploymentTasksAction(Action): statuses = params.status.split(',') if params.status else [] nodes = params.node.split(',') if params.node else [] tasks_names = tasks_names.split(',') if tasks_names else [] + include_summary = getattr(params, 'include-summary') data = client.get_all( transaction_id=params.task, nodes=nodes, statuses=statuses, tasks_names=tasks_names, - show_parameters=show_parameters + show_parameters=show_parameters, + include_summary=include_summary ) if show_parameters: table_keys = client.tasks_records_keys else: table_keys = client.history_records_keys + if include_summary: + table_keys += ('summary',) self.serializer.print_to_output( data, format_table( diff --git a/fuelclient/cli/arguments.py b/fuelclient/cli/arguments.py index d0caa513..4ee46635 100644 --- a/fuelclient/cli/arguments.py +++ b/fuelclient/cli/arguments.py @@ -767,3 +767,11 @@ def get_show_parameters_arg(help_msg): "help": help_msg } return get_boolean_arg("show-parameters", **default_kwargs) + + +def get_include_summary_arg(help_msg): + default_kwargs = { + "flags": ("--include-summary",), + "help": help_msg + } + return get_boolean_arg("include-summary", **default_kwargs) diff --git a/fuelclient/commands/task.py b/fuelclient/commands/task.py index 4d49d75e..dee120a6 100644 --- a/fuelclient/commands/task.py +++ b/fuelclient/commands/task.py @@ -205,22 +205,31 @@ class TaskHistoryShow(TaskMixIn, base.BaseListCommand): action='store_true', default=False, help='Show deployment tasks parameters') + parser.add_argument( + '--include-summary', + action='store_true', + default=False, + help='Show deployment tasks summary') return parser def take_action(self, parsed_args): # print parser show_parameters = parsed_args.show_parameters + include_summary = parsed_args.include_summary data = self.client.get_all( transaction_id=parsed_args.id, nodes=parsed_args.nodes, statuses=parsed_args.statuses, tasks_names=parsed_args.tasks_names, + include_summary=include_summary, show_parameters=show_parameters ) if show_parameters: self.columns = self.client.tasks_records_keys else: self.columns = self.client.history_records_keys + if include_summary: + self.columns += ('summary',) data = data_utils.get_display_data_multi(self.columns, data) return self.columns, data diff --git a/fuelclient/tests/unit/v1/test_deployment_history_action.py b/fuelclient/tests/unit/v1/test_deployment_history_action.py index 8651de8a..7e30ee1c 100644 --- a/fuelclient/tests/unit/v1/test_deployment_history_action.py +++ b/fuelclient/tests/unit/v1/test_deployment_history_action.py @@ -43,6 +43,28 @@ class TestDeploymentTasksAction(base.UnitTestCase): utils.get_fake_deployment_history(convert_legacy_fields=True), acceptable_keys=DeploymentHistoryClient.history_records_keys)) + @patch.object(Serializer, 'print_to_output') + def test_show_full_history_include_summary(self, print_mock): + self.m_history_api = self.m_request.get( + '/api/v1/transactions/1/deployment_history/?' + 'nodes=&' + 'statuses=&' + 'include_summary=1&' + 'tasks_names=', + json=utils.get_fake_deployment_history(include_summary=True)) + + self.execute( + ['fuel', 'deployment-tasks', '--tid', '1', '--include-summary'] + ) + print_mock.assert_called_once_with( + utils.get_fake_deployment_history(convert_legacy_fields=True, + include_summary=True), + format_table( + utils.get_fake_deployment_history(convert_legacy_fields=True, + include_summary=True), + acceptable_keys=(DeploymentHistoryClient.history_records_keys + + ('summary',)))) + @patch.object(Serializer, 'print_to_output') def test_show_tasks_history_with_parameters(self, print_mock): tasks_after_facade = [ diff --git a/fuelclient/tests/unit/v2/cli/test_task.py b/fuelclient/tests/unit/v2/cli/test_task.py index 16077906..c5e0b866 100644 --- a/fuelclient/tests/unit/v2/cli/test_task.py +++ b/fuelclient/tests/unit/v2/cli/test_task.py @@ -81,6 +81,25 @@ class TestTaskCommand(test_engine.BaseCLITest): nodes=None, statuses=None, tasks_names=None, + include_summary=False, + show_parameters=False) + + def test_task_history_show_include_summary(self): + task_id = 42 + args = 'task history show {task_id} '.format(task_id=task_id) + args += '--include-summary ' + + self.m_client.get_all.return_value = \ + utils.get_fake_deployment_history(include_summary=True) + self.exec_command(args) + + self.m_get_client.assert_called_once_with('deployment_history', + mock.ANY) + self.m_client.get_all.assert_called_once_with(transaction_id=task_id, + nodes=None, + statuses=None, + tasks_names=None, + include_summary=True, show_parameters=False) def test_task_history_parameters(self): @@ -99,6 +118,7 @@ class TestTaskCommand(test_engine.BaseCLITest): self.m_client.get_all.assert_called_once_with( transaction_id=task_id, nodes=['1', '2'], statuses=['ready', 'error'], tasks_names=['task1', 'task2'], + include_summary=False, show_parameters=True) def _test_cmd(self, cmd, method, cmd_line, client, @@ -208,6 +228,7 @@ class TestDeploymentTasksAction(test_engine.BaseCLITest): statuses=['ready'], tasks_names=['taskname1', 'taskname2'], transaction_id=1, + include_summary=False, show_parameters=True) m_formatter.assert_called_once_with(expected_fields, diff --git a/fuelclient/tests/unit/v2/lib/test_deployment_history.py b/fuelclient/tests/unit/v2/lib/test_deployment_history.py index eb18522c..a79f5aa9 100644 --- a/fuelclient/tests/unit/v2/lib/test_deployment_history.py +++ b/fuelclient/tests/unit/v2/lib/test_deployment_history.py @@ -73,6 +73,32 @@ class TestDeploymentHistoryFacade(test_api.BaseLibTest): utils.get_fake_deployment_history(convert_legacy_fields=True), tasks_after_facade) + def test_deployment_history_include_summary(self): + fake_history = utils.get_fake_deployment_history(include_summary=True) + matcher = self.m_request.get( + self.get_url( + nodes='1,2', + statuses='ready,error,pending', + tasks_names='controller-remaining-tasks,' + 'ironic-compute,pending-task' + ) + '&include_summary=1', json=fake_history) + + tasks_after_facade = self.client.get_all( + transaction_id=self.transaction_id, + nodes=['1', '2'], + statuses=['ready', 'error', 'pending'], + tasks_names=['controller-remaining-tasks', + 'ironic-compute', 'pending-task'], + include_summary=True, + show_parameters=False + ) + + self.assertTrue(matcher.called) + self.assertItemsEqual( + utils.get_fake_deployment_history(convert_legacy_fields=True, + include_summary=True), + tasks_after_facade) + def test_deployment_history_parameters(self): matcher = self.m_request.get( diff --git a/fuelclient/tests/utils/fake_deployment_history.py b/fuelclient/tests/utils/fake_deployment_history.py index ebcd543d..a8d538dc 100644 --- a/fuelclient/tests/utils/fake_deployment_history.py +++ b/fuelclient/tests/utils/fake_deployment_history.py @@ -17,7 +17,8 @@ import itertools def get_fake_deployment_history( - add_task_data=False, convert_legacy_fields=False): + add_task_data=False, convert_legacy_fields=False, + include_summary=False): """Create a fake deployment history. Returns the serialized and parametrized representation of a dumped Fuel @@ -33,7 +34,7 @@ def get_fake_deployment_history( :rtype: list[dict] """ if add_task_data: - return list(itertools.chain(*[[ + result = list(itertools.chain(*[[ { 'status': 'ready', 'time_start': '2016-03-25T17:22:10.687135', @@ -48,7 +49,7 @@ def get_fake_deployment_history( '/modular/globals/globals.pp', 'puppet_modules': '/etc/puppet/modules', 'timeout': 3600 - } + }, }, { 'status': 'skipped', @@ -89,7 +90,7 @@ def get_fake_deployment_history( 'time_start': '2016-03-25T17:22:10.687135', 'time_end': '2016-03-25T17:22:30.830701', 'node_id': node_id, - 'deployment_graph_task_name': 'controller-remaining-tasks' + 'deployment_graph_task_name': 'controller-remaining-tasks', }, { 'status': 'skipped', @@ -110,7 +111,10 @@ def get_fake_deployment_history( for record in result: record['task_name'] = record['deployment_graph_task_name'] record.pop('deployment_graph_task_name', None) - return result + if include_summary: + for record in result: + record['summary'] = '{}' + return result def get_fake_deployment_history_w_params(): diff --git a/fuelclient/v1/deployment_history.py b/fuelclient/v1/deployment_history.py index 41b27be1..dad4312b 100644 --- a/fuelclient/v1/deployment_history.py +++ b/fuelclient/v1/deployment_history.py @@ -31,11 +31,13 @@ class DeploymentHistoryClient(base_v1.BaseV1Client): _entity_wrapper = objects.Environment def get_all(self, transaction_id, nodes=None, statuses=None, - tasks_names=None, show_parameters=False): + tasks_names=None, show_parameters=False, + include_summary=False): parameters = { 'statuses': statuses, 'nodes': nodes, - 'tasks_names': tasks_names + 'tasks_names': tasks_names, + 'include_summary': (str(int(include_summary)),), } # remove unused parameters or parameters with empty list as value parameters = {k: v for k, v in six.iteritems(parameters) @@ -70,10 +72,12 @@ class DeploymentHistoryClient(base_v1.BaseV1Client): continue history_record = {} for key in record: - if key in self.history_records_keys: + if key in self.history_records_keys or key == 'summary': history_record[key] = record[key] else: tasks_parameters[task_name][key] = record[key] + if include_summary: + history_record['summary'] = history_record.get('summary', None) history_records.append(history_record) history_records_by_task[task_name].append(history_record)