Merge "node_recover support lb policy(3)"

This commit is contained in:
Jenkins 2017-03-06 04:37:08 +00:00 committed by Gerrit Code Review
commit 02b584ca91
4 changed files with 104 additions and 13 deletions

View File

@ -200,7 +200,7 @@ class NodeAction(base.Action):
:returns: A tuple containing the result and the corresponding reason.
"""
res = self.entity.do_recover(self.context, **self.inputs)
res = self.entity.do_recover(self.context, self, **self.inputs)
if res:
return self.RES_OK, _('Node recovered successfully.')
else:

View File

@ -334,7 +334,7 @@ class Node(object):
return True
def do_recover(self, context, **options):
def do_recover(self, context, action, **options):
"""recover a node.
This function is supposed to be invoked from a NODE_RECOVER action.
@ -377,6 +377,16 @@ class Node(object):
self.set_status(context, consts.NS_ACTIVE,
reason=_('Recover succeeded'), **params)
# Check action type
recovery = {}
operation = options.get('operation', None)
if operation and not isinstance(operation, six.string_types):
operation = operation[0]
if operation is not None and 'name' in operation:
recovery['action'] = operation['name'].upper()
recovery['node'] = [self.id]
action.outputs['recovery'] = recovery
return True
def do_operation(self, context, **inputs):

View File

@ -498,7 +498,7 @@ class NodeActionTest(base.SenlinTestCase):
self.assertEqual(action.RES_OK, res_code)
self.assertEqual('Node recovered successfully.', res_msg)
node.do_recover.assert_called_once_with(action.context,
node.do_recover.assert_called_once_with(action.context, action,
operation=['SWIM', 'DANCE'])
def test_do_recover_failed(self, mock_load):
@ -512,7 +512,7 @@ class NodeActionTest(base.SenlinTestCase):
res_code, res_msg = action.do_recover()
self.assertEqual(action.RES_ERROR, res_code)
self.assertEqual('Node recover failed.', res_msg)
node.do_recover.assert_called_once_with(action.context,
node.do_recover.assert_called_once_with(action.context, action,
operation=['SWIM', 'DANCE'])
def test_do_operation_success(self, mock_load):

View File

@ -567,8 +567,9 @@ class TestNode(base.SenlinTestCase):
new_id = '166db83b-b4a4-49ef-96a8-6c0fdd882d1a'
mock_recover.return_value = new_id
mock_status.side_effect = set_status
action = mock.Mock()
res = node.do_recover(self.context, foo='bar', koo='zar')
res = node.do_recover(self.context, action, foo='bar', koo='zar')
self.assertTrue(res)
mock_recover.assert_called_once_with(self.context, node, foo='bar',
@ -589,8 +590,9 @@ class TestNode(base.SenlinTestCase):
node = nodem.Node('node1', PROFILE_ID, None)
node.physical_id = 'd94d6333-82e6-4f87-b7ab-b786776df9d1'
mock_recover.return_value = node.physical_id
action = mock.Mock()
res = node.do_recover(self.context)
res = node.do_recover(self.context, action)
self.assertTrue(res)
mock_recover.assert_called_once_with(self.context, node)
@ -608,8 +610,9 @@ class TestNode(base.SenlinTestCase):
node.physical_id = 'd94d6333-82e6-4f87-b7ab-b786776df9d1'
mock_check = self.patchobject(pb.Profile, 'check_object')
mock_check.return_value = True
action = mock.Mock()
res = node.do_recover(self.context, check=True)
res = node.do_recover(self.context, action, check=True)
self.assertTrue(res)
mock_check.assert_called_once_with(self.context, node)
@ -630,8 +633,9 @@ class TestNode(base.SenlinTestCase):
mock_status.side_effect = set_status
mock_check = self.patchobject(pb.Profile, 'check_object')
mock_check.return_value = False
action = mock.Mock()
res = node.do_recover(self.context, check=True)
res = node.do_recover(self.context, action, check=True)
self.assertTrue(res)
mock_check.assert_called_once_with(self.context, node)
@ -646,6 +650,79 @@ class TestNode(base.SenlinTestCase):
reason='Recover succeeded',
physical_id=new_id)])
@mock.patch.object(nodem.Node, 'set_status')
@mock.patch.object(pb.Profile, 'recover_object')
def test_node_recover_recreate(self, mock_recover, mock_status):
def set_status(*args, **kwargs):
if args[1] == 'ACTIVE':
node.physical_id = new_id
node = nodem.Node('node1', PROFILE_ID, '', id='fake')
node.physical_id = 'd94d6333-82e6-4f87-b7ab-b786776df9d1'
new_id = '166db83b-b4a4-49ef-96a8-6c0fdd882d1a'
mock_recover.return_value = new_id
mock_status.side_effect = set_status
mock_check = self.patchobject(pb.Profile, 'check_object')
mock_check.return_value = False
action = mock.Mock(outputs={})
res = node.do_recover(self.context, action, check=True,
operation=[{'name': 'RECREATE'}])
self.assertTrue(res)
mock_check.assert_called_once_with(self.context, node)
mock_recover.assert_called_once_with(
self.context, node, check=True, operation=[{'name': 'RECREATE'}])
self.assertEqual('node1', node.name)
self.assertEqual(new_id, node.physical_id)
self.assertEqual(PROFILE_ID, node.profile_id)
mock_status.assert_has_calls([
mock.call(self.context, 'RECOVERING',
reason='Recover in progress'),
mock.call(self.context, consts.NS_ACTIVE,
reason='Recover succeeded',
physical_id=new_id)])
self.assertEqual(
{'recovery': {'action': 'RECREATE', 'node': ['fake']}},
action.outputs)
@mock.patch.object(nodem.Node, 'set_status')
@mock.patch.object(pb.Profile, 'recover_object')
def test_node_recover_mult_rebuild(self, mock_recover, mock_status):
def set_status(*args, **kwargs):
if args[1] == 'ACTIVE':
node.physical_id = new_id
node = nodem.Node('node1', PROFILE_ID, '', id='fake')
node.physical_id = 'd94d6333-82e6-4f87-b7ab-b786776df9d1'
new_id = '166db83b-b4a4-49ef-96a8-6c0fdd882d1a'
mock_recover.return_value = new_id
mock_status.side_effect = set_status
mock_check = self.patchobject(pb.Profile, 'check_object')
mock_check.return_value = False
action = mock.Mock(outputs={})
res = node.do_recover(self.context, action, check=True,
operation=[{'name': 'REBOOT'},
{'name': 'REBUILD'}])
self.assertTrue(res)
mock_check.assert_called_once_with(self.context, node)
mock_recover.assert_called_once_with(
self.context, node, check=True, operation=[{'name': 'REBOOT'},
{'name': 'REBUILD'}])
self.assertEqual('node1', node.name)
self.assertEqual(new_id, node.physical_id)
self.assertEqual(PROFILE_ID, node.profile_id)
mock_status.assert_has_calls([
mock.call(self.context, 'RECOVERING',
reason='Recover in progress'),
mock.call(self.context, consts.NS_ACTIVE,
reason='Recover succeeded',
physical_id=new_id)])
self.assertEqual({'recovery': {'action': 'REBOOT', 'node': ['fake']}},
action.outputs)
@mock.patch.object(nodem.Node, 'set_status')
@mock.patch.object(pb.Profile, 'recover_object')
def test_node_recover_check_exception(self, mock_recover, mock_status):
@ -665,8 +742,9 @@ class TestNode(base.SenlinTestCase):
id=node.physical_id,
reason='Boom!'
)
action = mock.Mock()
res = node.do_recover(self.context, check=True)
res = node.do_recover(self.context, action, check=True)
self.assertTrue(res)
mock_check.assert_called_once_with(self.context, node)
@ -687,8 +765,9 @@ class TestNode(base.SenlinTestCase):
node = nodem.Node('node1', PROFILE_ID, None)
node.physical_id = 'd94d6333-82e6-4f87-b7ab-b786776df9d1'
mock_recover.return_value = None
action = mock.Mock()
res = node.do_recover(self.context)
res = node.do_recover(self.context, action)
self.assertFalse(res)
mock_status.assert_has_calls([
@ -699,8 +778,9 @@ class TestNode(base.SenlinTestCase):
def test_node_recover_no_physical_id(self):
node = nodem.Node('node1', PROFILE_ID, None)
action = mock.Mock()
res = node.do_recover(self.context)
res = node.do_recover(self.context, action)
self.assertFalse(res)
@ -708,10 +788,11 @@ class TestNode(base.SenlinTestCase):
def test_node_recover_operation_not_support(self, mock_set_status):
node = nodem.Node('node1', PROFILE_ID, None)
node.physical_id = 'd94d6333-82e6-4f87-b7ab-b786776df9d1'
action = mock.Mock(outputs={})
params = {'operation': [{'name': 'foo'}]}
res = node.do_recover(self.context, **params)
res = node.do_recover(self.context, action, **params)
self.assertEqual({}, action.outputs)
self.assertFalse(res)
@mock.patch.object(nodem.Node, 'set_status')