Use deploy_changes for sets of nodes

The deploy_changes method involves additional nodes into deployment to
perform necessary tasks to keep clustered software in a consistent
state. A direct execution of tasks on a specific set of nodes does not
involve other necessary nodes and it leads to some failures during
deployments.

Change-Id: Ibbdeb40e4287a3170b57c11d88f5aea0afa2b5c7
Closes-Bug: #1619821
This commit is contained in:
Ilya Kharin 2016-09-07 16:16:41 +03:00
parent 15b1dcfa4a
commit 27531efb95
2 changed files with 33 additions and 20 deletions

View File

@ -83,11 +83,14 @@ def upgrade_node(env_id, node_ids, isolated=False, provision=True, roles=None,
# [1]: https://bugs.launchpad.net/fuel/+bug/1549254
env_util.copy_vips(env)
call_handlers('predeploy')
tasks_to_skip = set(
itertools.chain.from_iterable(call_handlers('skip_tasks'))
)
LOG.info("Tasks to skip: {0}".format(', '.join(tasks_to_skip)))
env_util.deploy_nodes_without_tasks(env, nodes, tasks_to_skip)
if isolated:
tasks_to_skip = set(
itertools.chain.from_iterable(call_handlers('skip_tasks'))
)
LOG.info("Tasks to skip: {0}".format(', '.join(tasks_to_skip)))
env_util.deploy_nodes_without_tasks(env, nodes, tasks_to_skip)
else:
env_util.deploy_changes(env, nodes)
call_handlers('postdeploy')

View File

@ -39,14 +39,12 @@ def test_parser(mocker, octane_app, cmd, env, nodes, provision, roles,
live_migration=live_migration)
@pytest.mark.parametrize(
"node_ids,isolated,provision,roles",
[(['test-node-1', 'test-node-2', 'test-node-3'],
False, True, None), ])
@pytest.mark.parametrize("skip_task_return_value,set_skip_tasks",
[([['test'], ['test', 'test_1'], []],
set(['test', 'test_1']))]
)
@pytest.mark.parametrize(("node_ids", "isolated", "provision", "roles"), [
(['test-node-1', 'test-node-2', 'test-node-3'], False, True, None),
])
@pytest.mark.parametrize(("skip_task_return_value", "set_skip_tasks"), [
([['test'], ['test', 'test_1'], []], set(['test', 'test_1'])),
])
def test_upgrade_node(mocker, node_ids, isolated, provision, roles,
skip_task_return_value, set_skip_tasks):
@ -67,7 +65,6 @@ def test_upgrade_node(mocker, node_ids, isolated, provision, roles,
mock_env.id = test_env_id
mock_env.data = {}
mock_env.data['id'] = mock_env.id
mocker.patch("octane.util.patch.applied_patch")
mock_node = mocker.patch("fuelclient.objects.node.Node")
mock_node.side_effect = _create_node
mock_get_handlers = mocker.patch(
@ -79,6 +76,7 @@ def test_upgrade_node(mocker, node_ids, isolated, provision, roles,
mock_deploy_nodes = mocker.patch(
"octane.util.env.deploy_nodes_without_tasks"
)
mock_deploy_changes = mocker.patch("octane.util.env.deploy_changes")
mock_check_isolation = mocker.patch(
"octane.commands.upgrade_node.check_isolation")
upgrade_node.upgrade_node(test_env_id, node_ids)
@ -86,12 +84,24 @@ def test_upgrade_node(mocker, node_ids, isolated, provision, roles,
mock_env, mock_nodes_list, isolated)
mock_copy_vips.assert_called_once_with(mock_env)
mock_move_nodes.assert_called_once_with(mock_env, mock_nodes_list,
True, None)
assert mock_handlers.call_args_list == [
mock.call('preupgrade'), mock.call('prepare'), mock.call('predeploy'),
mock.call('skip_tasks'), mock.call('postdeploy')]
mock_deploy_nodes.assert_called_once_with(mock_env, mock_nodes_list,
set_skip_tasks)
provision, roles)
possible_steps = [
('preupgrade', True),
('prepare', True),
('predeploy', True),
('skip_tasks', isolated),
('postdeploy', True),
]
expected_steps = [
mock.call(name) for name, is_expected in possible_steps if is_expected]
assert mock_handlers.call_args_list == expected_steps
if isolated:
mock_deploy_nodes.assert_called_once_with(
mock_env, mock_nodes_list, set_skip_tasks)
not mock_deploy_changes.called
else:
mock_deploy_changes.assert_called_once_with(mock_env, mock_nodes_list)
not mock_deploy_nodes.called
@pytest.mark.parametrize('node_data,expected_error', [