diff --git a/fuelclient/cli/actions/node.py b/fuelclient/cli/actions/node.py index 06e91b7..7f91998 100644 --- a/fuelclient/cli/actions/node.py +++ b/fuelclient/cli/actions/node.py @@ -69,7 +69,8 @@ class NodeAction(Action): Args.get_skip_tasks(), Args.get_tasks() ), - Args.get_graph_endpoint() + Args.get_graph_endpoint(), + Args.get_graph_startpoint(), ] self.flag_func_map = ( @@ -83,6 +84,7 @@ class NodeAction(Action): ("tasks", self.execute_tasks), ("skip", self.execute_tasks), ("end", self.execute_tasks), + ("start", self.execute_tasks), (None, self.list) ) @@ -246,6 +248,8 @@ class NodeAction(Action): fuel node --node 2 --skip hiera netconfig fuel node --node 2 --skip rsync --end pre_deployment fuel node --node 2 --end netconfig + fuel node --node 2 --start hiera --end neutron + fuel node --node 2 --start post_deployment """ node_collection = NodeCollection.init_with_ids(params.node) env_id_to_start = self.get_env_id(node_collection) @@ -255,7 +259,8 @@ class NodeAction(Action): if params.tasks: tasks = params.tasks else: - tasks = env.get_tasks(skip=params.skip, end=params.end) + tasks = env.get_tasks( + skip=params.skip, end=params.end, start=params.start) task = env.execute_tasks(node_collection.collection, tasks=tasks) diff --git a/fuelclient/cli/arguments.py b/fuelclient/cli/arguments.py index b14fd02..f0fee75 100644 --- a/fuelclient/cli/arguments.py +++ b/fuelclient/cli/arguments.py @@ -305,7 +305,16 @@ def get_graph_endpoint(): flags=('--end',), action="store", default=None, - help="Specify endpoint for the graph of tasks.") + help="Specify endpoint for the graph traversal.") + + +def get_graph_startpoint(): + return get_arg( + 'start', + flags=('--start',), + action="store", + default=None, + help="Specify start point for the graph traversal.") def get_skip_tasks(): diff --git a/fuelclient/objects/environment.py b/fuelclient/objects/environment.py index 938af7b..dd6c4fe 100644 --- a/fuelclient/objects/environment.py +++ b/fuelclient/objects/environment.py @@ -378,21 +378,24 @@ class Environment(BaseObject): ) ) - def get_tasks(self, skip=None, end=None): + def get_tasks(self, skip=None, end=None, start=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 """ - tasks = [t['id'] for t in self.get_deployment_tasks(end=end)] + tasks = [t['id'] for t + in self.get_deployment_tasks(end=end, start=start)] if skip: tasks_to_execute = set(tasks) - set(skip) return list(tasks_to_execute) return tasks - def get_deployment_tasks(self, end=None): + def get_deployment_tasks(self, end=None, start=None): url = self.deployment_tasks_path.format(self.id) - return self.connection.get_request(url, params={'end': end}) + return self.connection.get_request( + url, params={'end': end, 'start': start}) def update_deployment_tasks(self, data): url = self.deployment_tasks_path.format(self.id) diff --git a/fuelclient/tests/test_environment.py b/fuelclient/tests/test_environment.py index d627dd5..bf9611f 100644 --- a/fuelclient/tests/test_environment.py +++ b/fuelclient/tests/test_environment.py @@ -60,4 +60,4 @@ class TestEnvironmentOstf(base.UnitTestCase): end = 'task1' self.env.get_deployment_tasks(end=end) kwargs = mrequests.get.call_args[1] - self.assertEqual(kwargs['params'], {'end': end}) + self.assertEqual(kwargs['params'], {'start': None, 'end': 'task1'}) diff --git a/fuelclient/tests/test_nodes_execute_tasks.py b/fuelclient/tests/test_nodes_execute_tasks.py index b07b218..4c04248 100644 --- a/fuelclient/tests/test_nodes_execute_tasks.py +++ b/fuelclient/tests/test_nodes_execute_tasks.py @@ -50,7 +50,7 @@ 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]) + get_tasks.assert_called_once_with(end=self.tasks[-2], start=None) @patch('fuelclient.objects.environment.Environment.get_deployment_tasks') def test_skip_with_end_param(self, get_tasks, mrequests): @@ -61,4 +61,29 @@ 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]) + get_tasks.assert_called_once_with(end=self.tasks[-1], start=None) + + @patch('fuelclient.objects.environment.Environment.get_deployment_tasks') + def test_start_with_end_param(self, get_tasks, mrequests): + """end will be included.""" + start = 1 + end = 2 + get_tasks.return_value = [{'id': t} for t in self.tasks[start:end + 1]] + self.execute( + ['fuel', 'node', '--node', '1,2', '--start', self.tasks[start], + '--end', self.tasks[end]]) + + 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]) + + @patch('fuelclient.objects.environment.Environment.get_deployment_tasks') + def test_start_param(self, get_tasks, mrequests): + get_tasks.return_value = [{'id': t} for t in self.tasks[1:]] + self.execute( + ['fuel', 'node', '--node', '1,2', '--start', self.tasks[1]]) + + 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)