diff --git a/mistralclient/api/v2/tasks.py b/mistralclient/api/v2/tasks.py index 7a9eae68..835a9a74 100644 --- a/mistralclient/api/v2/tasks.py +++ b/mistralclient/api/v2/tasks.py @@ -29,7 +29,7 @@ class TaskManager(base.ResourceManager): resource_class = Task def list(self, workflow_execution_id=None, marker='', limit=None, - sort_keys='', sort_dirs='', **filters): + sort_keys='', sort_dirs='', fields=[], **filters): url = '/tasks' if workflow_execution_id: @@ -51,6 +51,9 @@ class TaskManager(base.ResourceManager): if sort_dirs: qparams['sort_dirs'] = sort_dirs + if fields: + qparams['fields'] = ",".join(fields) + for name, val in filters.items(): qparams[name] = val diff --git a/mistralclient/commands/v2/tasks.py b/mistralclient/commands/v2/tasks.py index 3609e57b..b22d6ced 100644 --- a/mistralclient/commands/v2/tasks.py +++ b/mistralclient/commands/v2/tasks.py @@ -27,40 +27,45 @@ from mistralclient import utils LOG = logging.getLogger(__name__) -def format_list(task=None): - return format(task, lister=True) +class TaskFormatter(object): + COLUMNS = [ + ('id', 'ID'), + ('name', 'Name'), + ('workflow_name', 'Workflow name'), + ('workflow_execution_id', 'Execution ID'), + ('state', 'State'), + ('state_info', 'State info'), + ('created_at', 'Created at'), + ('updated_at', 'Updated at'), + ] + COLUMN_FIELD_NAMES = list(zip(*COLUMNS))[0] + COLUMN_HEADING_NAMES = list(zip(*COLUMNS))[1] -def format(task=None, lister=False): - columns = ( - 'ID', - 'Name', - 'Workflow name', - 'Execution ID', - 'State', - 'State info', - 'Created at', - 'Updated at' - ) + @staticmethod + def format_list(task=None): + return TaskFormatter.format(task, lister=True) - if task: - state_info = (task.state_info if not lister - else base.cut(task.state_info)) + @staticmethod + def format(task=None, lister=False): + if task: + state_info = (task.state_info if not lister + else base.cut(task.state_info)) - data = ( - task.id, - task.name, - task.workflow_name, - task.workflow_execution_id, - task.state, - state_info, - task.created_at, - task.updated_at or '<none>' - ) - else: - data = (tuple('' for _ in range(len(columns))),) + data = ( + task.id, + task.name, + task.workflow_name, + task.workflow_execution_id, + task.state, + state_info, + task.created_at, + task.updated_at or '<none>' + ) + else: + data = (tuple('' for _ in range(len(TaskFormatter.COLUMNS))),) - return columns, data + return TaskFormatter.COLUMN_HEADING_NAMES, data class List(base.MistralLister): @@ -92,7 +97,7 @@ class List(base.MistralLister): return parser def _get_format_function(self): - return format_list + return TaskFormatter.format_list def _get_resources(self, parsed_args): if parsed_args.limit is None: @@ -110,6 +115,7 @@ class List(base.MistralLister): return mistral_client.tasks.list( parsed_args.workflow_execution, limit=parsed_args.limit, + fields=TaskFormatter.COLUMN_FIELD_NAMES, **base.get_filters(parsed_args) ) @@ -128,7 +134,7 @@ class Get(command.ShowOne): mistral_client = self.app.client_manager.workflow_engine execution = mistral_client.tasks.get(parsed_args.task) - return format(execution) + return TaskFormatter.format(execution) class GetResult(command.Command): @@ -223,4 +229,4 @@ class Rerun(command.ShowOne): env=env ) - return format(execution) + return TaskFormatter.format(execution) diff --git a/mistralclient/tests/unit/v2/test_cli_tasks.py b/mistralclient/tests/unit/v2/test_cli_tasks.py index 09fedfff..bb707ae4 100644 --- a/mistralclient/tests/unit/v2/test_cli_tasks.py +++ b/mistralclient/tests/unit/v2/test_cli_tasks.py @@ -21,6 +21,7 @@ import mock from mistralclient.api.v2 import tasks from mistralclient.commands.v2 import tasks as task_cmd +from mistralclient.commands.v2.tasks import TaskFormatter from mistralclient.tests.unit import base TASK_DICT = { @@ -58,6 +59,10 @@ class TestCLITasksV2(base.BaseCommandTest): result = self.call(task_cmd.List) self.assertEqual([EXPECTED_TASK_RESULT], result[1]) + self.assertEqual( + self.client.tasks.list.call_args[1]["fields"], + TaskFormatter.COLUMN_FIELD_NAMES + ) def test_list_with_workflow_execution(self): self.client.tasks.list.return_value = [TASK] diff --git a/mistralclient/tests/unit/v2/test_tasks.py b/mistralclient/tests/unit/v2/test_tasks.py index 93d93702..d2b3e08a 100644 --- a/mistralclient/tests/unit/v2/test_tasks.py +++ b/mistralclient/tests/unit/v2/test_tasks.py @@ -50,6 +50,15 @@ class TestTasksV2(base.BaseClientV2Test): task.to_dict() ) + def test_list_with_fields(self): + field_params = "?fields=id,name" + + self.requests_mock.get(self.TEST_URL + URL_TEMPLATE + field_params, + json={'tasks': [TASK]}) + + self.tasks.list(fields=["id,name"]) + self.assertTrue(self.requests_mock.called_once) + def test_get(self): url = self.TEST_URL + URL_TEMPLATE_ID % TASK['id'] self.requests_mock.get(url, json=TASK)