From decbc7cef712f6d4db6b666a9dee297f23c41ab0 Mon Sep 17 00:00:00 2001 From: xiaolihope Date: Mon, 21 Mar 2016 15:21:05 +0800 Subject: [PATCH] Add OSC command for senlin node-check/recover This change added two commands as OSC plugin: - openstack node check - openstack node recover Based on the existing senlin command: - senlin node-check - senlin node-recover Change-Id: I63261b8fa120c4f5a4c7b54178faec42ed967975 --- senlinclient/osc/v1/node.py | 54 +++++++++++++++++++++ senlinclient/tests/unit/osc/v1/test_node.py | 54 +++++++++++++++++++++ setup.cfg | 2 + 3 files changed, 110 insertions(+) diff --git a/senlinclient/osc/v1/node.py b/senlinclient/osc/v1/node.py index 387af286..9e2ac63e 100644 --- a/senlinclient/osc/v1/node.py +++ b/senlinclient/osc/v1/node.py @@ -332,3 +332,57 @@ class DeleteNode(command.Command): {'count': failure_count, 'total': len(parsed_args.node)}) print('Request accepted') + + +class CheckNode(command.Command): + """Check the node(s).""" + log = logging.getLogger(__name__ + ".CheckNode") + + def get_parser(self, prog_name): + parser = super(CheckNode, self).get_parser(prog_name) + parser.add_argument( + 'node', + metavar='', + nargs='+', + help=_('ID or name of node(s) to check.') + ) + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)", parsed_args) + senlin_client = self.app.client_manager.clustering + for nid in parsed_args.node: + try: + resp = senlin_client.check_node(nid) + except sdk_exc.ResourceNotFound: + raise exc.CommandError(_('Node not found: %s') % nid) + print('Node check request on node %(nid)s is accepted by ' + 'action %(action)s.' + % {'nid': nid, 'action': resp['action']}) + + +class RecoverNode(command.Command): + """Recover the node(s).""" + log = logging.getLogger(__name__ + ".RecoverNode") + + def get_parser(self, prog_name): + parser = super(RecoverNode, self).get_parser(prog_name) + parser.add_argument( + 'node', + metavar='', + nargs='+', + help=_('ID or name of node(s) to recover.') + ) + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)", parsed_args) + senlin_client = self.app.client_manager.clustering + for nid in parsed_args.node: + try: + resp = senlin_client.recover_node(nid) + except sdk_exc.ResourceNotFound: + raise exc.CommandError(_('Node not found: %s') % nid) + print('Node recover request on node %(nid)s is accepted by ' + 'action %(action)s.' + % {'nid': nid, 'action': resp['action']}) diff --git a/senlinclient/tests/unit/osc/v1/test_node.py b/senlinclient/tests/unit/osc/v1/test_node.py index b7c84c0a..afdd2389 100644 --- a/senlinclient/tests/unit/osc/v1/test_node.py +++ b/senlinclient/tests/unit/osc/v1/test_node.py @@ -402,3 +402,57 @@ class TestNodeDelete(TestNode): mock_stdin.readline.assert_called_with() self.mock_client.delete_node.assert_not_called() + + +class TestNodeCheck(TestNode): + response = {"action": "8bb476c3-0f4c-44ee-9f64-c7b0260814de"} + + def setUp(self): + super(TestNodeCheck, self).setUp() + self.cmd = osc_node.CheckNode(self.app, None) + self.mock_client.check_node = mock.Mock( + return_value=self.response) + + def test_node_check(self): + arglist = ['node1', 'node2', 'node3'] + parsed_args = self.check_parser(self.cmd, arglist, []) + self.cmd.take_action(parsed_args) + self.mock_client.check_node.assert_has_calls( + [mock.call('node1'), mock.call('node2'), + mock.call('node3')] + ) + + def test_node_check_not_found(self): + arglist = ['node1'] + self.mock_client.check_node.side_effect = sdk_exc.ResourceNotFound + parsed_args = self.check_parser(self.cmd, arglist, []) + error = self.assertRaises(exc.CommandError, self.cmd.take_action, + parsed_args) + self.assertIn('Node not found: node1', str(error)) + + +class TestNodeRecover(TestNode): + response = {"action": "8bb476c3-0f4c-44ee-9f64-c7b0260814de"} + + def setUp(self): + super(TestNodeRecover, self).setUp() + self.cmd = osc_node.RecoverNode(self.app, None) + self.mock_client.recover_node = mock.Mock( + return_value=self.response) + + def test_node_recover(self): + arglist = ['node1', 'node2', 'node3'] + parsed_args = self.check_parser(self.cmd, arglist, []) + self.cmd.take_action(parsed_args) + self.mock_client.recover_node.assert_has_calls( + [mock.call('node1'), mock.call('node2'), + mock.call('node3')] + ) + + def test_node_recover_not_found(self): + arglist = ['node1'] + self.mock_client.recover_node.side_effect = sdk_exc.ResourceNotFound + parsed_args = self.check_parser(self.cmd, arglist, []) + error = self.assertRaises(exc.CommandError, self.cmd.take_action, + parsed_args) + self.assertIn('Node not found: node1', str(error)) diff --git a/setup.cfg b/setup.cfg index 68361687..0789a39a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -42,9 +42,11 @@ openstack.clustering.v1 = cluster_members_list = senlinclient.osc.v1.cluster:ClusterNodeList cluster_members_add = senlinclient.osc.v1.cluster:ClusterNodeAdd cluster_members_del = senlinclient.osc.v1.cluster:ClusterNodeDel + cluster_node_check = senlinclient.osc.v1.node:CheckNode cluster_node_create = senlinclient.osc.v1.node:CreateNode cluster_node_delete = senlinclient.osc.v1.node:DeleteNode cluster_node_list = senlinclient.osc.v1.node:ListNode + cluster_node_recover = senlinclient.osc.v1.node:RecoverNode cluster_node_show = senlinclient.osc.v1.node:ShowNode cluster_node_update = senlinclient.osc.v1.node:UpdateNode cluster_policy_attach = senlinclient.osc.v1.cluster:ClusterPolicyAttach