From fa4587f3668aa1adcd7e4dfadff01c8d5768f848 Mon Sep 17 00:00:00 2001 From: Chris MacNaughton Date: Wed, 15 Apr 2020 16:34:21 +0200 Subject: [PATCH] Ensure that origin is set only after the first machine is rebooting --- ..._zaza_utilities_parallel_series_upgrade.py | 71 +++++++++++++++---- .../utilities/parallel_series_upgrade.py | 18 +++-- 2 files changed, 69 insertions(+), 20 deletions(-) diff --git a/unit_tests/utilities/test_zaza_utilities_parallel_series_upgrade.py b/unit_tests/utilities/test_zaza_utilities_parallel_series_upgrade.py index 36638b1..616c590 100644 --- a/unit_tests/utilities/test_zaza_utilities_parallel_series_upgrade.py +++ b/unit_tests/utilities/test_zaza_utilities_parallel_series_upgrade.py @@ -200,7 +200,6 @@ class TestParallelSeriesUpgrade(AioTestCase): mock_get_class.assert_called_once_with('my.thing') called.assert_called_once_with('1') - @mock.patch.object(upgrade_utils.os_utils, 'async_set_origin') @mock.patch.object(upgrade_utils, 'run_post_application_upgrade_functions') @mock.patch.object( upgrade_utils.series_upgrade_utils, 'async_prepare_series_upgrade') @@ -214,7 +213,6 @@ class TestParallelSeriesUpgrade(AioTestCase): mock_async_set_series, mock_async_prepare_series_upgrade, mock_post_application_upgrade_functions, - mock_async_set_origin, ): self.juju_status.return_value.applications.__getitem__.return_value = \ FAKE_STATUS_MONGO @@ -240,24 +238,28 @@ class TestParallelSeriesUpgrade(AioTestCase): mock_series_upgrade_machine.assert_has_calls([ mock.call( '1', + origin=None, + application='mongodb', files=None, workaround_script=None, post_upgrade_functions=[]), mock.call( '2', + origin=None, + application='mongodb', files=None, workaround_script=None, post_upgrade_functions=[]), mock.call( '0', + origin=None, + application='mongodb', files=None, workaround_script=None, post_upgrade_functions=[]), ]) - mock_async_set_origin.assert_not_called() mock_post_application_upgrade_functions.assert_called_once_with([]) - @mock.patch.object(upgrade_utils.os_utils, 'async_set_origin') @mock.patch.object(upgrade_utils, 'run_post_application_upgrade_functions') @mock.patch.object( upgrade_utils.series_upgrade_utils, 'async_prepare_series_upgrade') @@ -271,7 +273,6 @@ class TestParallelSeriesUpgrade(AioTestCase): mock_async_set_series, mock_async_prepare_series_upgrade, mock_post_application_upgrade_functions, - mock_async_set_origin, ): self.juju_status.return_value.applications.__getitem__.return_value = \ FAKE_STATUS_MONGO @@ -294,24 +295,28 @@ class TestParallelSeriesUpgrade(AioTestCase): mock_series_upgrade_machine.assert_has_calls([ mock.call( '1', + origin=None, + application='mongodb', files=None, workaround_script=None, post_upgrade_functions=[]), mock.call( '2', + origin=None, + application='mongodb', files=None, workaround_script=None, post_upgrade_functions=[]), mock.call( '0', + origin=None, + application='mongodb', files=None, workaround_script=None, post_upgrade_functions=[]), ]) - mock_async_set_origin.assert_not_called() mock_post_application_upgrade_functions.assert_called_once_with([]) - @mock.patch.object(upgrade_utils.os_utils, 'async_set_origin') @mock.patch.object(upgrade_utils, 'run_post_application_upgrade_functions') @mock.patch.object( upgrade_utils.series_upgrade_utils, 'async_prepare_series_upgrade') @@ -325,7 +330,6 @@ class TestParallelSeriesUpgrade(AioTestCase): mock_async_set_series, mock_async_prepare_series_upgrade, mock_post_application_upgrade_functions, - mock_async_set_origin, ): await upgrade_utils.parallel_series_upgrade( 'app', @@ -335,34 +339,39 @@ class TestParallelSeriesUpgrade(AioTestCase): mock_async_set_series.assert_called_once_with( 'app', to_series='xenial') self.juju_status.assert_called() + # The below is using `any_order=True` because the ordering is + # undetermined and differs between python versions mock_async_prepare_series_upgrade.assert_has_calls([ mock.call('1', to_series='xenial'), mock.call('2', to_series='xenial'), mock.call('0', to_series='xenial'), - ]) + ], any_order=True) mock_maybe_pause_things.assert_called() mock_series_upgrade_machine.assert_has_calls([ mock.call( '1', + origin='openstack-origin', + application='app', files=None, workaround_script=None, post_upgrade_functions=None), mock.call( '2', + origin='openstack-origin', + application='app', files=None, workaround_script=None, post_upgrade_functions=None), mock.call( '0', + origin='openstack-origin', + application='app', files=None, workaround_script=None, post_upgrade_functions=None), ]) - mock_async_set_origin.assert_called_once_with( - 'app', 'openstack-origin') mock_post_application_upgrade_functions.assert_called_once_with(None) - @mock.patch.object(upgrade_utils.os_utils, 'async_set_origin') @mock.patch.object(upgrade_utils, 'run_post_application_upgrade_functions') @mock.patch.object( upgrade_utils.series_upgrade_utils, 'async_prepare_series_upgrade') @@ -376,7 +385,6 @@ class TestParallelSeriesUpgrade(AioTestCase): mock_async_set_series, mock_async_prepare_series_upgrade, mock_post_application_upgrade_functions, - mock_async_set_origin, ): await upgrade_utils.serial_series_upgrade( 'app', @@ -395,22 +403,26 @@ class TestParallelSeriesUpgrade(AioTestCase): mock_series_upgrade_machine.assert_has_calls([ mock.call( '0', + origin='openstack-origin', + application='app', files=None, workaround_script=None, post_upgrade_functions=None), mock.call( '1', + origin='openstack-origin', + application='app', files=None, workaround_script=None, post_upgrade_functions=None), mock.call( '2', + origin='openstack-origin', + application='app', files=None, workaround_script=None, post_upgrade_functions=None), ]) - mock_async_set_origin.assert_called_once_with( - 'app', 'openstack-origin') mock_post_application_upgrade_functions.assert_called_once_with(None) @mock.patch.object( @@ -436,6 +448,35 @@ class TestParallelSeriesUpgrade(AioTestCase): mock_reboot.assert_called_once_with('1') mock_async_complete_series_upgrade.assert_called_once_with('1') + @mock.patch.object(upgrade_utils.os_utils, 'async_set_origin') + @mock.patch.object( + upgrade_utils.series_upgrade_utils, 'async_complete_series_upgrade') + @mock.patch.object(upgrade_utils, 'reboot') + @mock.patch.object(upgrade_utils, 'async_do_release_upgrade') + @mock.patch.object(upgrade_utils, 'async_dist_upgrade') + async def test_series_upgrade_machine_with_source( + self, + mock_async_dist_upgrade, + mock_async_do_release_upgrade, + mock_reboot, + mock_async_complete_series_upgrade, + mock_async_set_origin + ): + await upgrade_utils.series_upgrade_machine( + '1', + origin='openstack-origin', + application='app', + post_upgrade_functions=None, + pre_upgrade_functions=None, + files=None, + workaround_script=None) + mock_async_dist_upgrade.assert_called_once_with('1') + mock_async_do_release_upgrade.assert_called_once_with('1') + mock_reboot.assert_called_once_with('1') + mock_async_complete_series_upgrade.assert_called_once_with('1') + mock_async_set_origin.assert_called_once_with( + 'app', 'openstack-origin') + async def test_maybe_pause_things_primary(self): await upgrade_utils.maybe_pause_things( FAKE_STATUS, diff --git a/zaza/openstack/utilities/parallel_series_upgrade.py b/zaza/openstack/utilities/parallel_series_upgrade.py index dfbd36e..980f556 100755 --- a/zaza/openstack/utilities/parallel_series_upgrade.py +++ b/zaza/openstack/utilities/parallel_series_upgrade.py @@ -207,8 +207,6 @@ async def parallel_series_upgrade( pause_non_leader_primary) await series_upgrade_utils.async_set_series( application, to_series=to_series) - if origin: - await os_utils.async_set_origin(application, origin) app_idle = [ wait_for_unit_idle(unit) for unit in status["units"] ] @@ -223,6 +221,8 @@ async def parallel_series_upgrade( upgrade_group = [ series_upgrade_machine( machine, + origin=origin, + application=application, files=files, workaround_script=workaround_script, post_upgrade_functions=post_upgrade_functions) for machine in machines @@ -308,8 +308,6 @@ async def serial_series_upgrade( pause_non_leader_primary) await series_upgrade_utils.async_set_series( application, to_series=to_series) - if origin: - await os_utils.async_set_origin(application, origin) if not follower_first and leader_machine not in completed_machines: await wait_for_unit_idle(leader) await prepare_series_upgrade(leader_machine, to_series=to_series) @@ -317,6 +315,8 @@ async def serial_series_upgrade( .format(application, leader_machine)) await series_upgrade_machine( leader_machine, + origin=origin, + application=application, files=files, workaround_script=workaround_script, post_upgrade_functions=post_upgrade_functions) completed_machines.append(leader_machine) @@ -332,6 +332,8 @@ async def serial_series_upgrade( .format(application, machine)) await series_upgrade_machine( machine, + origin=origin, + application=application, files=files, workaround_script=workaround_script, post_upgrade_functions=post_upgrade_functions) completed_machines.append(machine) @@ -343,6 +345,8 @@ async def serial_series_upgrade( .format(application, leader_machine)) await series_upgrade_machine( leader_machine, + origin=origin, + application=application, files=files, workaround_script=workaround_script, post_upgrade_functions=post_upgrade_functions) completed_machines.append(leader_machine) @@ -352,6 +356,8 @@ async def serial_series_upgrade( async def series_upgrade_machine( machine, + origin=None, + application=None, post_upgrade_functions=None, pre_upgrade_functions=None, files=None, @@ -379,6 +385,8 @@ async def series_upgrade_machine( await async_dist_upgrade(machine) await async_do_release_upgrade(machine) await reboot(machine) + if origin: + await os_utils.async_set_origin(application, origin) await series_upgrade_utils.async_complete_series_upgrade(machine) await run_post_upgrade_functions(post_upgrade_functions) @@ -462,8 +470,8 @@ async def maybe_pause_things( logging.info("Pausing {}".format(unit)) leader_pauses.append( model.async_run_action(unit, "pause", action_params={})) - await asyncio.gather(*subordinate_pauses) await asyncio.gather(*leader_pauses) + await asyncio.gather(*subordinate_pauses) def get_leader_and_non_leaders(status):