diff --git a/fuelclient/cli/actions/graph.py b/fuelclient/cli/actions/graph.py index 85e540f..5fe83bf 100644 --- a/fuelclient/cli/actions/graph.py +++ b/fuelclient/cli/actions/graph.py @@ -85,11 +85,12 @@ class GraphAction(base.Action): used_params += "# - {0}: {1}\n".format(param, getattr(params, param)) - if params.tasks: - tasks = params.tasks - else: + tasks = params.tasks + + if not tasks or (params.skip or params.end or params.start): tasks = env.get_tasks( - skip=params.skip, end=params.end, start=params.start) + skip=params.skip, end=params.end, + start=params.start, include=params.tasks) dotraph = env.get_deployment_tasks_graph(tasks, parents_for=parents_for, diff --git a/fuelclient/cli/actions/node.py b/fuelclient/cli/actions/node.py index fe6ba70..235950f 100644 --- a/fuelclient/cli/actions/node.py +++ b/fuelclient/cli/actions/node.py @@ -261,11 +261,18 @@ class NodeAction(Action): env = Environment(env_id_to_start) - if params.tasks: - tasks = params.tasks - else: + tasks = params.tasks or None + + if params.skip or params.end or params.start: tasks = env.get_tasks( - skip=params.skip, end=params.end, start=params.start) + skip=params.skip, + end=params.end, + start=params.start, + include=tasks) + + if not tasks: + self.serializer.print_to_output({}, "Nothing to run.") + return task = env.execute_tasks(node_collection.collection, tasks=tasks) diff --git a/fuelclient/objects/environment.py b/fuelclient/objects/environment.py index 82575cc..5ffbbff 100644 --- a/fuelclient/objects/environment.py +++ b/fuelclient/objects/environment.py @@ -459,24 +459,28 @@ class Environment(BaseObject): ) ) - def get_tasks(self, skip=None, end=None, start=None): + def get_tasks(self, skip=None, end=None, start=None, include=None): """Stores logic to filter tasks by known parameters. :param skip: list of tasks or None :param end: string or None :param start: string or None + :param include: list or None """ - tasks = [t['id'] for t - in self.get_deployment_tasks(end=end, start=start)] + tasks = [t['id'] for t in self.get_deployment_tasks( + end=end, start=start, include=include)] if skip: tasks_to_execute = set(tasks) - set(skip) return list(tasks_to_execute) return tasks - def get_deployment_tasks(self, end=None, start=None): + def get_deployment_tasks(self, end=None, start=None, include=None): url = self.deployment_tasks_path.format(self.id) return self.connection.get_request( - url, params={'end': end, 'start': start}) + url, params={ + 'end': end, + 'start': start, + 'include': include}) def update_deployment_tasks(self, data): url = self.deployment_tasks_path.format(self.id) diff --git a/fuelclient/tests/v1/unit/test_environment.py b/fuelclient/tests/v1/unit/test_environment.py index 7ca2a51..4bf475d 100644 --- a/fuelclient/tests/v1/unit/test_environment.py +++ b/fuelclient/tests/v1/unit/test_environment.py @@ -162,4 +162,6 @@ class TestEnvironmentOstf(base.UnitTestCase): end = 'task1' self.env.get_deployment_tasks(end=end) kwargs = mrequests.get.call_args[1] - self.assertEqual(kwargs['params'], {'start': None, 'end': 'task1'}) + self.assertEqual( + kwargs['params'], + {'start': None, 'end': 'task1', 'include': None}) diff --git a/fuelclient/tests/v1/unit/test_nodes_execute_tasks.py b/fuelclient/tests/v1/unit/test_nodes_execute_tasks.py index 4c04248..d715010 100644 --- a/fuelclient/tests/v1/unit/test_nodes_execute_tasks.py +++ b/fuelclient/tests/v1/unit/test_nodes_execute_tasks.py @@ -43,6 +43,23 @@ class TestNodeExecuteTasksAction(base.UnitTestCase): kwargs = mrequests.put.call_args_list[0][1] self.assertEqual(json.loads(kwargs['data']), self.tasks[2:]) + @patch('fuelclient.objects.environment.Environment.get_deployment_tasks') + def test_included_tasks(self, get_tasks, mrequests): + get_tasks.return_value = [{'id': t} for t in self.tasks] + self.execute( + ['fuel', 'node', '--node', '1', '--start', 'netconfig', + '--tasks', 'hiera']) + kwargs = mrequests.put.call_args_list[0][1] + self.assertEqual(json.loads(kwargs['data']), self.tasks) + get_tasks.assert_called_once_with( + start='netconfig', end=None, include=['hiera']) + + @patch('fuelclient.objects.environment.Environment.get_deployment_tasks') + def test_dont_fail_on_empty_tasks(self, get_tasks, mrequests): + get_tasks.return_value = [] + self.execute( + ['fuel', 'node', '--node', '1', '--start', 'netconfig']) + @patch('fuelclient.objects.environment.Environment.get_deployment_tasks') def test_end_param(self, get_tasks, mrequests): get_tasks.return_value = [{'id': t} for t in self.tasks[:2]] @@ -50,7 +67,8 @@ class TestNodeExecuteTasksAction(base.UnitTestCase): ['fuel', 'node', '--node', '1,2', '--end', self.tasks[-2]]) kwargs = mrequests.put.call_args_list[0][1] self.assertEqual(json.loads(kwargs['data']), self.tasks[:2]) - get_tasks.assert_called_once_with(end=self.tasks[-2], start=None) + get_tasks.assert_called_once_with( + end=self.tasks[-2], start=None, include=None) @patch('fuelclient.objects.environment.Environment.get_deployment_tasks') def test_skip_with_end_param(self, get_tasks, mrequests): @@ -61,7 +79,8 @@ class TestNodeExecuteTasksAction(base.UnitTestCase): kwargs = mrequests.put.call_args_list[0][1] self.assertEqual(json.loads(kwargs['data']), self.tasks[2:]) - get_tasks.assert_called_once_with(end=self.tasks[-1], start=None) + get_tasks.assert_called_once_with( + end=self.tasks[-1], start=None, include=None) @patch('fuelclient.objects.environment.Environment.get_deployment_tasks') def test_start_with_end_param(self, get_tasks, mrequests): @@ -76,7 +95,7 @@ class TestNodeExecuteTasksAction(base.UnitTestCase): kwargs = mrequests.put.call_args_list[0][1] self.assertEqual(json.loads(kwargs['data']), self.tasks[start:end + 1]) get_tasks.assert_called_once_with( - end=self.tasks[2], start=self.tasks[1]) + end=self.tasks[2], start=self.tasks[1], include=None) @patch('fuelclient.objects.environment.Environment.get_deployment_tasks') def test_start_param(self, get_tasks, mrequests): @@ -86,4 +105,5 @@ class TestNodeExecuteTasksAction(base.UnitTestCase): kwargs = mrequests.put.call_args_list[0][1] self.assertEqual(json.loads(kwargs['data']), self.tasks[1:]) - get_tasks.assert_called_once_with(start=self.tasks[1], end=None) + get_tasks.assert_called_once_with( + start=self.tasks[1], end=None, include=None)