fix cluster recover bug
the problem is caused by the change of cluster's runtime, the nodes were node_eng obj, then we could invoke node.do_check() directly. Change-Id: Ied01597d72319bea9637c160583c59e3414154f4
This commit is contained in:
parent
467da12a7b
commit
c3f26fa558
|
@ -681,11 +681,13 @@ class ClusterAction(base.Action):
|
|||
|
||||
children = []
|
||||
for node in self.entity.nodes:
|
||||
if check:
|
||||
node.do_check(self.context)
|
||||
if node.status == 'ACTIVE':
|
||||
continue
|
||||
node_id = node.id
|
||||
if check:
|
||||
node = node_mod.Node.load(self.context, node_id=node_id)
|
||||
node.do_check(self.context)
|
||||
|
||||
if node.status == consts.NS_ACTIVE:
|
||||
continue
|
||||
action_id = base.Action.create(
|
||||
self.context, node_id, consts.NODE_RECOVER,
|
||||
name='node_recover_%s' % node_id[:8],
|
||||
|
|
|
@ -333,6 +333,7 @@ class Node(object):
|
|||
"was WARNING. %s") % self.status_reason
|
||||
self.set_status(context, consts.NS_WARNING, msg)
|
||||
return True
|
||||
|
||||
self.set_status(context, consts.NS_ACTIVE,
|
||||
_("Check: Node is ACTIVE."))
|
||||
else:
|
||||
|
|
|
@ -250,7 +250,9 @@ class ClusterRecoverTest(base.SenlinTestCase):
|
|||
self.assertFalse(mock_check.called)
|
||||
|
||||
@mock.patch.object(ca.ClusterAction, '_check_capacity')
|
||||
def test_do_recover_with_check_active(self, mock_desired, mock_load):
|
||||
@mock.patch.object(nm.Node, 'load')
|
||||
def test_do_recover_with_check_active(self, mock_node, mock_desired,
|
||||
mock_load):
|
||||
cluster = mock.Mock(id='FAKE_ID', desired_capacity=2)
|
||||
cluster.do_recover.return_value = True
|
||||
mock_load.return_value = cluster
|
||||
|
@ -259,12 +261,18 @@ class ClusterRecoverTest(base.SenlinTestCase):
|
|||
node2 = mock.Mock(id='NODE_2', cluster_id='FAKE_ID', status='ERROR')
|
||||
cluster.nodes = [node1, node2]
|
||||
|
||||
eng_node1 = mock.Mock(id='NODE_1', cluster_id='FAKE_ID',
|
||||
status='ACTIVE')
|
||||
eng_node2 = mock.Mock(id='NODE_2', cluster_id='FAKE_ID',
|
||||
status='ERROR')
|
||||
mock_node.side_effect = [eng_node1, eng_node2]
|
||||
|
||||
def set_status(*args, **kwargs):
|
||||
node2.status = 'ACTIVE'
|
||||
eng_node2.status = 'ACTIVE'
|
||||
|
||||
mock_check = self.patchobject(nm.Node, 'do_check')
|
||||
mock_check.side_effect = set_status
|
||||
node2.do_check = mock_check
|
||||
eng_node2.do_check = mock_check
|
||||
|
||||
action = ca.ClusterAction(cluster.id, 'CLUSTER_RECOVER', self.ctx)
|
||||
action.inputs = {'check': True}
|
||||
|
@ -274,8 +282,13 @@ class ClusterRecoverTest(base.SenlinTestCase):
|
|||
|
||||
self.assertEqual(action.RES_OK, res_code)
|
||||
self.assertEqual('Cluster recovery succeeded.', res_msg)
|
||||
node1.do_check.assert_called_once_with(self.ctx)
|
||||
node2.do_check.assert_called_once_with(self.ctx)
|
||||
node_calls = [
|
||||
mock.call(self.ctx, node_id='NODE_1'),
|
||||
mock.call(self.ctx, node_id='NODE_2')
|
||||
]
|
||||
mock_node.assert_has_calls(node_calls)
|
||||
eng_node1.do_check.assert_called_once_with(self.ctx)
|
||||
eng_node2.do_check.assert_called_once_with(self.ctx)
|
||||
cluster.do_recover.assert_called_once_with(self.ctx)
|
||||
cluster.eval_status.assert_called_once_with(
|
||||
action.context, consts.CLUSTER_RECOVER)
|
||||
|
@ -287,9 +300,10 @@ class ClusterRecoverTest(base.SenlinTestCase):
|
|||
@mock.patch.object(dispatcher, 'start_action')
|
||||
@mock.patch.object(ca.ClusterAction, '_wait_for_dependents')
|
||||
@mock.patch.object(ca.ClusterAction, '_check_capacity')
|
||||
def test_do_recover_with_check_error(self, mock_desired, mock_wait,
|
||||
mock_start, mock_dep, mock_action,
|
||||
mock_update, mock_load):
|
||||
@mock.patch.object(nm.Node, 'load')
|
||||
def test_do_recover_with_check_error(self, mock_node, mock_desired,
|
||||
mock_wait, mock_start, mock_dep,
|
||||
mock_action, mock_update, mock_load):
|
||||
node1 = mock.Mock(id='NODE_1', cluster_id='FAKE_ID', status='ACTIVE')
|
||||
node2 = mock.Mock(id='NODE_2', cluster_id='FAKE_ID', status='ACTIVE')
|
||||
|
||||
|
@ -299,6 +313,12 @@ class ClusterRecoverTest(base.SenlinTestCase):
|
|||
mock_load.return_value = cluster
|
||||
cluster.nodes = [node1, node2]
|
||||
|
||||
eng_node1 = mock.Mock(id='NODE_1', cluster_id='FAKE_ID',
|
||||
status='ACTIVE')
|
||||
eng_node2 = mock.Mock(id='NODE_2', cluster_id='FAKE_ID',
|
||||
status='ACTIVE')
|
||||
mock_node.side_effect = [eng_node1, eng_node2]
|
||||
|
||||
action = ca.ClusterAction(cluster.id, 'CLUSTER_RECOVER', self.ctx)
|
||||
action.id = 'CLUSTER_ACTION_ID'
|
||||
action.inputs = {'check': True,
|
||||
|
@ -308,11 +328,11 @@ class ClusterRecoverTest(base.SenlinTestCase):
|
|||
mock_wait.return_value = (action.RES_OK, 'Everything is Okay')
|
||||
|
||||
def set_status(*args, **kwargs):
|
||||
node2.status = 'ERROR'
|
||||
eng_node2.status = 'ERROR'
|
||||
|
||||
mock_check = self.patchobject(nm.Node, 'do_check')
|
||||
mock_check.side_effect = set_status
|
||||
node2.do_check = mock_check
|
||||
eng_node2.do_check = mock_check
|
||||
|
||||
# do it
|
||||
res_code, res_msg = action.do_recover()
|
||||
|
@ -328,8 +348,13 @@ class ClusterRecoverTest(base.SenlinTestCase):
|
|||
cause=consts.CAUSE_DERIVED,
|
||||
inputs={}
|
||||
)
|
||||
node1.do_check.assert_called_once_with(self.ctx)
|
||||
node2.do_check.assert_called_once_with(self.ctx)
|
||||
node_calls = [
|
||||
mock.call(self.ctx, node_id='NODE_1'),
|
||||
mock.call(self.ctx, node_id='NODE_2')
|
||||
]
|
||||
mock_node.assert_has_calls(node_calls)
|
||||
eng_node1.do_check.assert_called_once_with(self.ctx)
|
||||
eng_node2.do_check.assert_called_once_with(self.ctx)
|
||||
mock_dep.assert_called_once_with(action.context, ['NODE_RECOVER_ID'],
|
||||
'CLUSTER_ACTION_ID')
|
||||
mock_update.assert_called_once_with(action.context, 'NODE_RECOVER_ID',
|
||||
|
|
Loading…
Reference in New Issue