def test_app_config_ceph(self): expected = { 'origin': 'source', 'pause_non_leader_subordinate': False, 'pause_non_leader_primary': False, 'post_upgrade_functions': [], 'pre_upgrade_functions': [], 'post_application_upgrade_functions': [], 'follower_first': False, } config = upgrade_utils.app_config('ceph-mon') self.assertEqual(expected, config)
def test_app_config_mongo(self): expected = { 'origin': None, 'pause_non_leader_subordinate': True, 'pause_non_leader_primary': True, 'post_upgrade_functions': [], 'pre_upgrade_functions': [], 'post_application_upgrade_functions': [], 'follower_first': True, } config = upgrade_utils.app_config('mongodb') self.assertEqual(expected, config)
def test_app_config_openstack_charm(self): expected = { 'origin': 'openstack-origin', 'pause_non_leader_subordinate': True, 'pause_non_leader_primary': True, 'post_upgrade_functions': [], 'pre_upgrade_functions': [], 'post_application_upgrade_functions': [], 'follower_first': False, } config = upgrade_utils.app_config('keystone') self.assertEqual(expected, config)
def test_200_run_series_upgrade(self): """Run series upgrade.""" # Set Feature Flag os.environ["JUJU_DEV_FEATURE_FLAGS"] = "upgrade-series" upgrade_groups = upgrade_utils.get_series_upgrade_groups( extra_filters=[_filter_etcd, _filter_easyrsa], target_series=self.to_series) from_series = self.from_series to_series = self.to_series completed_machines = [] workaround_script = None files = [] applications = model.get_status().applications for group_name, apps in upgrade_groups: logging.info("About to upgrade {} from {} to {}".format( group_name, from_series, to_series)) upgrade_functions = [] if group_name in [ "Database Services", "Stateful Services", "Data Plane", "sweep_up" ]: logging.info("Going to upgrade {} unit by unit".format(apps)) upgrade_function = \ parallel_series_upgrade.serial_series_upgrade else: logging.info("Going to upgrade {} all at once".format(apps)) upgrade_function = \ parallel_series_upgrade.parallel_series_upgrade # allow up to 4 parallel upgrades at a time. This is to limit the # amount of data/calls that asyncio is handling as it's gets # unstable if all the applications are done at the same time. sem = asyncio.Semaphore(4) for charm_name in apps: charm = applications[charm_name]['charm'] name = upgrade_utils.extract_charm_name_from_url(charm) upgrade_config = parallel_series_upgrade.app_config(name) upgrade_functions.append( wrap_coroutine_with_sem( sem, upgrade_function(charm_name, **upgrade_config, from_series=from_series, to_series=to_series, completed_machines=completed_machines, workaround_script=workaround_script, files=files))) asyncio.get_event_loop().run_until_complete( asyncio.gather(*upgrade_functions)) model.block_until_all_units_idle() logging.info("Finished {}".format(group_name)) logging.info("Done!")
async def test_parallel_series_upgrade_mongo( self, mock_series_upgrade_machine, mock_maybe_pause_things, mock_async_set_series, mock_async_prepare_series_upgrade, mock_post_application_upgrade_functions, ): self.juju_status.return_value.applications.__getitem__.return_value = \ FAKE_STATUS_MONGO upgrade_config = upgrade_utils.app_config('mongodb') await upgrade_utils.parallel_series_upgrade('mongodb', from_series='trusty', to_series='xenial', **upgrade_config) mock_async_set_series.assert_called_once_with('mongodb', 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=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_post_application_upgrade_functions.assert_called_once_with([])
async def test_serial_series_upgrade_mongo( self, mock_series_upgrade_machine, mock_maybe_pause_things, mock_async_set_series, mock_async_prepare_series_upgrade, mock_post_application_upgrade_functions, ): self.juju_status.return_value.applications.__getitem__.return_value = \ FAKE_STATUS_MONGO upgrade_config = upgrade_utils.app_config('mongodb') await upgrade_utils.serial_series_upgrade('mongodb', from_series='trusty', to_series='xenial', **upgrade_config) mock_async_set_series.assert_called_once_with('mongodb', to_series='xenial') self.juju_status.assert_called() 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'), ]) mock_maybe_pause_things.assert_called() 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_post_application_upgrade_functions.assert_called_once_with([])
def test_app_config_percona(self): expected = { 'origin': 'source', 'pause_non_leader_subordinate': True, 'pause_non_leader_primary': True, 'post_upgrade_functions': [], 'pre_upgrade_functions': [], 'post_application_upgrade_functions': [('zaza.openstack.charm_tests.mysql.utils.' 'complete_cluster_series_upgrade')], 'follower_first': False, } config = upgrade_utils.app_config('percona-cluster') self.assertEqual(expected, config)
def test_200_run_series_upgrade(self): """Run series upgrade.""" # Set Feature Flag os.environ["JUJU_DEV_FEATURE_FLAGS"] = "upgrade-series" upgrade_groups = upgrade_utils.get_series_upgrade_groups( extra_filters=[_filter_etcd, _filter_easyrsa]) from_series = self.from_series to_series = self.to_series completed_machines = [] workaround_script = None files = [] applications = model.get_status().applications for group_name, apps in upgrade_groups.items(): logging.info("About to upgrade {} from {} to {}".format( group_name, from_series, to_series)) upgrade_functions = [] if group_name in ["Stateful Services", "Data Plane", "sweep_up"]: logging.info("Going to upgrade {} unit by unit".format(apps)) upgrade_function = \ parallel_series_upgrade.serial_series_upgrade else: logging.info("Going to upgrade {} all at once".format(apps)) upgrade_function = \ parallel_series_upgrade.parallel_series_upgrade for charm_name in apps: charm = applications[charm_name]['charm'] name = upgrade_utils.extract_charm_name_from_url(charm) upgrade_config = parallel_series_upgrade.app_config(name) upgrade_functions.append( upgrade_function(charm_name, **upgrade_config, from_series=from_series, to_series=to_series, completed_machines=completed_machines, workaround_script=workaround_script, files=files)) asyncio.get_event_loop().run_until_complete( asyncio.gather(*upgrade_functions)) model.block_until_all_units_idle() logging.info("Finished {}".format(group_name)) logging.info("Done!")