Merge "Support check before do node-recover action"

This commit is contained in:
Jenkins
2017-03-13 08:43:14 +00:00
committed by Gerrit Code Review
4 changed files with 40 additions and 8 deletions

View File

@@ -440,12 +440,13 @@ class TestNodeRecover(TestNode):
self.mock_client.recover_node = mock.Mock(return_value=fake_res) self.mock_client.recover_node = mock.Mock(return_value=fake_res)
def test_node_recover(self): def test_node_recover(self):
arglist = ['node1', 'node2', 'node3'] arglist = ['node1', 'node2', 'node3', '--check', 'false']
kwargs = {'check': False}
parsed_args = self.check_parser(self.cmd, arglist, []) parsed_args = self.check_parser(self.cmd, arglist, [])
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.mock_client.recover_node.assert_has_calls( self.mock_client.recover_node.assert_has_calls(
[mock.call('node1'), mock.call('node2'), [mock.call('node1', **kwargs), mock.call('node2', **kwargs),
mock.call('node3')] mock.call('node3', **kwargs)]
) )
def test_node_recover_not_found(self): def test_node_recover_not_found(self):

View File

@@ -1534,19 +1534,30 @@ class ShellTest(testtools.TestCase):
def test_do_node_recover(self): def test_do_node_recover(self):
service = mock.Mock() service = mock.Mock()
args = self._make_args({'id': ['node1']}) args = {
'id': ['node1'],
'check': 'false'
}
args = self._make_args(args)
attrs = {
'check': False
}
service.check_node = mock.Mock() service.check_node = mock.Mock()
sh.do_node_recover(service, args) sh.do_node_recover(service, args)
service.recover_node.assert_called_once_with('node1') service.recover_node.assert_called_once_with('node1', **attrs)
def test_do_node_recover_not_found(self): def test_do_node_recover_not_found(self):
service = mock.Mock() service = mock.Mock()
ex = exc.HTTPNotFound ex = exc.HTTPNotFound
service.recover_node.side_effect = ex service.recover_node.side_effect = ex
args = {
'id': ['node1'],
'check': 'false'
}
args = self._make_args(args)
args = self._make_args({'id': ['node1']})
ex = self.assertRaises(exc.CommandError, ex = self.assertRaises(exc.CommandError,
sh.do_node_recover, service, args) sh.do_node_recover, service, args)
msg = _('Failed to recover some of the specified nodes.') msg = _('Failed to recover some of the specified nodes.')

View File

@@ -19,6 +19,7 @@ from openstack import exceptions as sdk_exc
from osc_lib.command import command from osc_lib.command import command
from osc_lib import exceptions as exc from osc_lib import exceptions as exc
from osc_lib import utils from osc_lib import utils
from oslo_utils import strutils
import six import six
from senlinclient.common.i18n import _ from senlinclient.common.i18n import _
@@ -365,6 +366,13 @@ class RecoverNode(command.Command):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(RecoverNode, self).get_parser(prog_name) parser = super(RecoverNode, self).get_parser(prog_name)
parser.add_argument(
'--check',
metavar='<boolean>',
default=False,
help=_('Whether the node(s) should check physical resource status '
'before doing node recover. Default is false')
)
parser.add_argument( parser.add_argument(
'node', 'node',
metavar='<node>', metavar='<node>',
@@ -376,9 +384,14 @@ class RecoverNode(command.Command):
def take_action(self, parsed_args): def take_action(self, parsed_args):
self.log.debug("take_action(%s)", parsed_args) self.log.debug("take_action(%s)", parsed_args)
senlin_client = self.app.client_manager.clustering senlin_client = self.app.client_manager.clustering
params = {
'check': strutils.bool_from_string(parsed_args.check, strict=True)
}
for nid in parsed_args.node: for nid in parsed_args.node:
try: try:
resp = senlin_client.recover_node(nid) resp = senlin_client.recover_node(nid, **params)
except sdk_exc.ResourceNotFound: except sdk_exc.ResourceNotFound:
raise exc.CommandError(_('Node not found: %s') % nid) raise exc.CommandError(_('Node not found: %s') % nid)
print('Node recover request on node %(nid)s is accepted by ' print('Node recover request on node %(nid)s is accepted by '

View File

@@ -1352,6 +1352,9 @@ def do_node_check(service, args):
print('Request accepted') print('Request accepted')
@utils.arg('-c', '--check', metavar='<BOOLEAN>', default=False,
help=_("Whether the node(s) should check physical resource status "
"before doing node recover.Default is false"))
@utils.arg('id', metavar='<NODE>', nargs='+', @utils.arg('id', metavar='<NODE>', nargs='+',
help=_('ID or name of node(s) to recover.')) help=_('ID or name of node(s) to recover.'))
def do_node_recover(service, args): def do_node_recover(service, args):
@@ -1359,9 +1362,13 @@ def do_node_recover(service, args):
show_deprecated('senlin node-recover', 'openstack cluster node recover') show_deprecated('senlin node-recover', 'openstack cluster node recover')
failure_count = 0 failure_count = 0
params = {
'check': strutils.bool_from_string(args.check, strict=True)
}
for nid in args.id: for nid in args.id:
try: try:
service.recover_node(nid) service.recover_node(nid, **params)
except exc.HTTPNotFound: except exc.HTTPNotFound:
failure_count += 1 failure_count += 1
print('Node id "%s" not found' % nid) print('Node id "%s" not found' % nid)