From a3012ca424747ae815ed0b72184fa465765ccb9a Mon Sep 17 00:00:00 2001 From: Adriano Petrich Date: Wed, 16 Nov 2016 10:56:36 +0000 Subject: [PATCH] Use stack name or id for backwards compatibility Heat used to accept either stack name or id Scale nodes in the documentation and in the argparse usage states that stacks can be identified by name or id but mistral only accepts stack names. This makes the client accept names or ids and pass names for the mistral workflow Change-Id: If7527e36c1e5d2214dc155392a2e3750b38ec365 Closes-Bug: #1640933 --- .../v1/overcloud_node/test_overcloud_node.py | 26 +++++++++++++++++++ tripleoclient/v1/overcloud_node.py | 12 +++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py b/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py index 196d52b5b..35d03eaed 100644 --- a/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py +++ b/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py @@ -44,6 +44,8 @@ class TestDeleteNode(fakes.TestDeleteNode): self.app.client_manager.tripleoclient = self.tripleoclient self.workflow = self.app.client_manager.workflow_engine + self.stack_name = self.app.client_manager.orchestration.stacks.get + self.stack_name.return_value = mock.Mock(stack_name="overcloud") # Mock UUID4 generation for every test uuid4_patcher = mock.patch('uuid.uuid4', return_value="UUID4") @@ -65,6 +67,8 @@ class TestDeleteNode(fakes.TestDeleteNode): "status": "SUCCESS" } + self.stack_name.return_value = mock.Mock(stack_name="overcast") + self.cmd.take_action(parsed_args) # Verify @@ -76,6 +80,28 @@ class TestDeleteNode(fakes.TestDeleteNode): 'nodes': ['instance1', 'instance2'] }) + def test_node_wrong_stack(self): + argslist = ['instance1', '--templates', + '--stack', 'overcast'] + verifylist = [ + ('stack', 'overcast'), + ('nodes', ['instance1', ]) + ] + parsed_args = self.check_parser(self.cmd, argslist, verifylist) + + self.websocket.wait_for_message.return_value = { + "status": "SUCCESS" + } + + self.stack_name.return_value = None + + self.assertRaises(exceptions.InvalidConfiguration, + self.cmd.take_action, + parsed_args) + + # Verify + self.workflow.executions.create.assert_not_called() + def test_node_delete_without_stack(self): arglist = ['instance1', ] diff --git a/tripleoclient/v1/overcloud_node.py b/tripleoclient/v1/overcloud_node.py index 3bd84d598..263d7e0a3 100644 --- a/tripleoclient/v1/overcloud_node.py +++ b/tripleoclient/v1/overcloud_node.py @@ -22,6 +22,7 @@ from osc_lib.i18n import _ from osc_lib import utils from tripleoclient import constants +from tripleoclient.exceptions import InvalidConfiguration from tripleoclient import utils as oooutils from tripleoclient.workflows import baremetal from tripleoclient.workflows import scale @@ -65,12 +66,19 @@ class DeleteNode(command.Command): def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) clients = self.app.client_manager + orchestration_client = clients.orchestration + + stack = oooutils.get_stack(orchestration_client, parsed_args.stack) + + if not stack: + raise InvalidConfiguration("stack {} not found".format( + parsed_args.stack)) nodes = '\n'.join('- %s' % node for node in parsed_args.nodes) print("Deleting the following nodes from stack {stack}:\n{nodes}" - .format(stack=parsed_args.stack, nodes=nodes)) + .format(stack=stack.stack_name, nodes=nodes)) - scale.scale_down(clients, parsed_args.stack, parsed_args.nodes) + scale.scale_down(clients, stack.stack_name, parsed_args.nodes) class ProvideNode(command.Command):