diff --git a/fuelclient/commands/environment.py b/fuelclient/commands/environment.py index 0fcc41a8..918892d3 100644 --- a/fuelclient/commands/environment.py +++ b/fuelclient/commands/environment.py @@ -544,11 +544,16 @@ class EnvDeployNodes(EnvMixIn, base.BaseCommand): type=int, nargs='+', help='Ids of nodes to deploy.') + parser.add_argument('-f', + '--force', + action='store_true', + help='Force deploy nodes.') return parser def take_action(self, parsed_args): node_ids = parsed_args.nodes - task = self.client.deploy_nodes(parsed_args.env, node_ids) + task = self.client.deploy_nodes(parsed_args.env, node_ids, + force=parsed_args.force) msg = ('Deployment task with id {t} for the nodes {n} within ' 'the environment {e} has been ' diff --git a/fuelclient/tests/unit/v2/cli/test_env.py b/fuelclient/tests/unit/v2/cli/test_env.py index b4edc3bf..5bfe16f0 100644 --- a/fuelclient/tests/unit/v2/cli/test_env.py +++ b/fuelclient/tests/unit/v2/cli/test_env.py @@ -266,7 +266,20 @@ class TestEnvCommand(test_engine.BaseCLITest): self.exec_command(args) self.m_client.deploy_nodes.return_value = fake_task.get_fake_task() - self.m_client.deploy_nodes.assert_called_once_with(env_id, node_ids) + self.m_client.deploy_nodes.assert_called_once_with(env_id, node_ids, + force=False) + + def test_env_nodes_deploy_force(self): + env_id = 42 + node_ids = [43, 44] + args = ('env nodes deploy --force ' + '--nodes {n[0]} {n[1]} --env {e}').format(e=env_id, n=node_ids) + + self.exec_command(args) + + self.m_client.deploy_nodes.return_value = fake_task.get_fake_task() + self.m_client.deploy_nodes.assert_called_once_with(env_id, node_ids, + force=True) def test_env_nodes_provision(self): env_id = 42 diff --git a/fuelclient/tests/unit/v2/lib/test_environment.py b/fuelclient/tests/unit/v2/lib/test_environment.py index 6ad234e2..ed704d8d 100644 --- a/fuelclient/tests/unit/v2/lib/test_environment.py +++ b/fuelclient/tests/unit/v2/lib/test_environment.py @@ -334,6 +334,21 @@ class TestEnvFacade(test_api.BaseLibTest): self.assertEqual([','.join(str(i) for i in node_ids)], matcher.last_request.qs['nodes']) + def test_env_deploy_nodes_force(self): + env_id = 42 + node_ids = [43, 44] + force = True + + expected_url = self.get_object_uri(self.res_uri, env_id, '/deploy/') + matcher = self.m_request.put(expected_url, json=utils.get_fake_task()) + + self.client.deploy_nodes(env_id, node_ids, force=force) + + self.assertTrue(matcher.called) + self.assertEqual([','.join(str(i) for i in node_ids)], + matcher.last_request.qs['nodes']) + self.assertEqual(matcher.last_request.qs['force'][0], str(int(force))) + def test_env_provision_nodes(self): env_id = 42 node_ids = [43, 44] diff --git a/fuelclient/v1/environment.py b/fuelclient/v1/environment.py index 8bc12d95..77f0cc0d 100644 --- a/fuelclient/v1/environment.py +++ b/fuelclient/v1/environment.py @@ -23,7 +23,7 @@ class EnvironmentClient(base_v1.BaseV1Client): _updatable_attributes = ('name',) provision_nodes_url = 'clusters/{env_id}/provision/?nodes={nodes}' - deploy_nodes_url = 'clusters/{env_id}/deploy/?nodes={nodes}' + deploy_nodes_url = 'clusters/{env_id}/deploy/?nodes={nodes}&force={force}' def create(self, name, release_id, net_segment_type): @@ -96,12 +96,12 @@ class EnvironmentClient(base_v1.BaseV1Client): nodes=nodes) return self.connection.put_request(uri, {}) - def deploy_nodes(self, environment_id, node_ids): + def deploy_nodes(self, environment_id, node_ids, force=False): """Deploy specified nodes for the specified environment.""" nodes = ','.join(str(i) for i in node_ids) uri = self.deploy_nodes_url.format(env_id=environment_id, - nodes=nodes) + nodes=nodes, force=int(force)) return self.connection.put_request(uri, {}) def redeploy_changes(self, environment_id, dry_run=False, noop_run=False):