From ed810946df3a818d1b50aea2c6f625f578da1cf8 Mon Sep 17 00:00:00 2001 From: Cindia-blue Date: Thu, 28 Jan 2016 21:13:27 +0800 Subject: [PATCH] Add node check and recover into CLI Expose check and recover for manual health management scenario Implements: blueprint support-health-management-customization Change-Id: Ib5f3c6710459d31831f842534acaae547336d23f --- senlinclient/tests/unit/v1/test_client.py | 17 ++++++++++ senlinclient/tests/unit/v1/test_shell.py | 40 +++++++++++++++++++++++ senlinclient/v1/client.py | 6 ++++ senlinclient/v1/shell.py | 36 ++++++++++++++++++++ 4 files changed, 99 insertions(+) diff --git a/senlinclient/tests/unit/v1/test_client.py b/senlinclient/tests/unit/v1/test_client.py index 9b3b8450..56240e39 100644 --- a/senlinclient/tests/unit/v1/test_client.py +++ b/senlinclient/tests/unit/v1/test_client.py @@ -356,6 +356,23 @@ class ClientTest(testtools.TestCase): self.service.delete_node.assert_called_once_with( 'FAKE_ID', True) + def test_check_node(self, mock_conn): + mock_conn.return_value = self.conn + sc = client.Client() + + res = sc.check_node('FAKE_ID') + self.assertEqual(self.service.check_node.return_value, res) + self.service.check_node.assert_called_once_with('FAKE_ID') + + def test_recover_node(self, mock_conn): + mock_conn.return_value = self.conn + sc = client.Client() + + res = sc.recover_node('FAKE_ID') + self.assertEqual(self.service.recover_node.return_value, res) + self.service.recover_node.assert_called_once_with( + 'FAKE_ID') + def test_delete_node_ignore_missing(self, mock_conn): mock_conn.return_value = self.conn sc = client.Client() diff --git a/senlinclient/tests/unit/v1/test_shell.py b/senlinclient/tests/unit/v1/test_shell.py index 5ad0fa73..84c571cf 100644 --- a/senlinclient/tests/unit/v1/test_shell.py +++ b/senlinclient/tests/unit/v1/test_shell.py @@ -1142,6 +1142,46 @@ class ShellTest(testtools.TestCase): msg = _('Failed to delete some of the specified nodes.') self.assertEqual(msg, six.text_type(ex)) + def test_do_node_check(self): + service = mock.Mock() + args = self._make_args({'id': ['node1']}) + service.check_node = mock.Mock() + + sh.do_node_check(service, args) + + service.check_node.assert_called_once_with('node1') + + def test_do_node_check_not_found(self): + service = mock.Mock() + ex = exc.HTTPNotFound + service.check_node.side_effect = ex + + args = self._make_args({'id': ['node1']}) + ex = self.assertRaises(exc.CommandError, + sh.do_node_check, service, args) + msg = _('Failed to check some of the specified nodes.') + self.assertEqual(msg, six.text_type(ex)) + + def test_do_node_recover(self): + service = mock.Mock() + args = self._make_args({'id': ['node1']}) + service.check_node = mock.Mock() + + sh.do_node_recover(service, args) + + service.recover_node.assert_called_once_with('node1') + + def test_do_node_recover_not_found(self): + service = mock.Mock() + ex = exc.HTTPNotFound + service.recover_node.side_effect = ex + + args = self._make_args({'id': ['node1']}) + ex = self.assertRaises(exc.CommandError, + sh.do_node_recover, service, args) + msg = _('Failed to recover some of the specified nodes.') + self.assertEqual(msg, six.text_type(ex)) + @mock.patch.object(sh, '_show_node') def test_do_node_update(self, mock_show): service = mock.Mock() diff --git a/senlinclient/v1/client.py b/senlinclient/v1/client.py index 7573918c..c6c6bf65 100644 --- a/senlinclient/v1/client.py +++ b/senlinclient/v1/client.py @@ -128,6 +128,12 @@ class Client(object): def delete_node(self, node, ignore_missing=True): return self.service.delete_node(node, ignore_missing) + def check_node(self, node, **params): + return self.service.check_node(node, **params) + + def recover_node(self, node, **params): + return self.service.recover_node(node, **params) + def receivers(self, **queries): return self.service.receivers(**queries) diff --git a/senlinclient/v1/shell.py b/senlinclient/v1/shell.py index 75e78124..5e1bef9a 100644 --- a/senlinclient/v1/shell.py +++ b/senlinclient/v1/shell.py @@ -948,6 +948,42 @@ def do_node_update(service, args): _show_node(service, node.id) +@utils.arg('id', metavar='', nargs='+', + help=_('ID of node(s) to check.')) +def do_node_check(service, args): + """Check the node(s).""" + failure_count = 0 + + for nid in args.id: + try: + service.check_node(nid) + except exc.HTTPNotFound: + failure_count += 1 + print('Node id "%s" not found' % nid) + if failure_count > 0: + msg = _('Failed to check some of the specified nodes.') + raise exc.CommandError(msg) + print('Request accepted') + + +@utils.arg('id', metavar='', nargs='+', + help=_('ID of node(s) to recover.')) +def do_node_recover(service, args): + """Recover the node(s).""" + failure_count = 0 + + for nid in args.id: + try: + service.recover_node(nid) + except exc.HTTPNotFound: + failure_count += 1 + print('Node id "%s" not found' % nid) + if failure_count > 0: + msg = _('Failed to recover some of the specified nodes.') + raise exc.CommandError(msg) + print('Request accepted') + + # RECEIVERS