Exemple #1
0
 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)
Exemple #2
0
 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)
Exemple #3
0
 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!")
Exemple #5
0
    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([])
Exemple #6
0
 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([])
Exemple #7
0
 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!")