From fd6581ecab70955b99cf0d0ad68cdf06a56fff12 Mon Sep 17 00:00:00 2001 From: Corey Bryant Date: Mon, 10 Jan 2022 17:34:53 +0000 Subject: [PATCH] Add support for package-upgrade action The package-upgrade action is similar to the openstack-upgrade action except that it performs package upgrades within the current openstack release. If a new openstack release is available, the package-upgrade action will not perform any upgrades. Change-Id: Ie783f8da67494f31abe574d99b1f2433dc622be9 --- charms_openstack/charm/core.py | 59 ++++++++++++------- .../charms_openstack/charm/test_core.py | 27 ++++++++- 2 files changed, 63 insertions(+), 23 deletions(-) diff --git a/charms_openstack/charm/core.py b/charms_openstack/charm/core.py index 14208c7..77a9733 100644 --- a/charms_openstack/charm/core.py +++ b/charms_openstack/charm/core.py @@ -1130,18 +1130,25 @@ class BaseOpenStackCharmActions(object): fetch.apt_pkg.init() return fetch.apt_pkg.version_compare(avail_vers, cur_vers) == 1 - def run_upgrade(self, interfaces_list=None): + def run_upgrade(self, interfaces_list=None, upgrade_openstack=True): """Upgrade OpenStack. :param interfaces_list: List of instances of interface classes + :param upgrade_openstack: True for upgrade to new openstack release, + False for package upgrade within current openstack release. :returns: None """ - hookenv.status_set('maintenance', 'Running openstack upgrade') new_src = self.config[self.source_config_key] new_os_rel = os_utils.get_os_codename_install_source(new_src) - unitdata.kv().set(OPENSTACK_RELEASE_KEY, new_os_rel) - target_charm = get_charm_instance(new_os_rel) - target_charm.do_openstack_pkg_upgrade() + if upgrade_openstack: + hookenv.status_set('maintenance', 'Running openstack upgrade') + unitdata.kv().set(OPENSTACK_RELEASE_KEY, new_os_rel) + target_charm = get_charm_instance(new_os_rel) + target_charm.do_openstack_pkg_upgrade(upgrade_openstack=True) + else: + hookenv.status_set('maintenance', 'Running package upgrade') + target_charm = get_charm_instance(new_os_rel) + target_charm.do_openstack_pkg_upgrade(upgrade_openstack=False) target_charm.do_openstack_upgrade_config_render(interfaces_list) target_charm.do_openstack_upgrade_db_migration() @@ -1159,27 +1166,35 @@ class BaseOpenStackCharmActions(object): else: self.run_upgrade(interfaces_list=interfaces_list) - def do_openstack_pkg_upgrade(self): + def do_openstack_pkg_upgrade(self, upgrade_openstack=True): """Upgrade OpenStack packages and snaps + :param upgrade_openstack: True for upgrade to new openstack release, + False for package upgrade within current openstack release. :returns: None """ - new_src = self.config[self.source_config_key] - new_os_rel = os_utils.get_os_codename_install_source(new_src) - hookenv.log('Performing OpenStack upgrade to %s.' % (new_os_rel)) + new_os_rel = None - # TODO(jamespage): Deal with deb->snap->deb migrations - if os_utils.snap_install_requested() and self.all_snaps: - os_utils.install_os_snaps( - snaps=os_utils.get_snaps_install_info_from_origin( - self.all_snaps, - self.config[self.source_config_key], - mode=self.snap_mode), - refresh=True) + if upgrade_openstack: + new_src = self.config[self.source_config_key] + new_os_rel = os_utils.get_os_codename_install_source(new_src) + hookenv.log('Performing OpenStack upgrade to %s.' % (new_os_rel)) + + # TODO(jamespage): Deal with deb->snap->deb migrations + if os_utils.snap_install_requested() and self.all_snaps: + os_utils.install_os_snaps( + snaps=os_utils.get_snaps_install_info_from_origin( + self.all_snaps, + self.config[self.source_config_key], + mode=self.snap_mode), + refresh=True) + + source, key = os_utils.get_source_and_pgp_key( + self.config[self.source_config_key]) + fetch.add_source(source, key) + else: + hookenv.log('Performing package upgrade.') - source, key = os_utils.get_source_and_pgp_key( - self.config[self.source_config_key]) - fetch.add_source(source, key) fetch.apt_update() dpkg_opts = [ @@ -1195,7 +1210,9 @@ class BaseOpenStackCharmActions(object): options=dpkg_opts, fatal=True) self.remove_obsolete_packages() - self.release = new_os_rel + + if upgrade_openstack: + self.release = new_os_rel def remove_obsolete_packages(self): """Remove any packages that are no longer needed for operation diff --git a/unit_tests/charms_openstack/charm/test_core.py b/unit_tests/charms_openstack/charm/test_core.py index 03c6f65..fc6b447 100644 --- a/unit_tests/charms_openstack/charm/test_core.py +++ b/unit_tests/charms_openstack/charm/test_core.py @@ -997,7 +997,7 @@ class TestMyOpenStackCharm(BaseOpenStackCharmTest): new={'action-managed-upgrade': True}) self.assertFalse(self.run_upgrade.called) - def test_run_upgrade(self): + def test_run_openstack_upgrade(self): self.patch_object(chm_core.hookenv, 'status_set') self.patch_target('do_openstack_upgrade_db_migration') self.patch_target('do_openstack_pkg_upgrade') @@ -1008,10 +1008,33 @@ class TestMyOpenStackCharm(BaseOpenStackCharmTest): self.patch_object(chm_core, 'get_charm_instance') target_charm = mock.MagicMock() self.get_charm_instance.return_value = target_charm + self.target.run_upgrade('int_list') self.status_set.assert_called_once_with('maintenance', 'Running openstack upgrade') - target_charm.do_openstack_pkg_upgrade.assert_called_once_with() + target_charm.do_openstack_pkg_upgrade.assert_called_once_with( + upgrade_openstack=True) + (target_charm.do_openstack_upgrade_config_render. + assert_called_once_with('int_list')) + (target_charm.do_openstack_upgrade_db_migration. + assert_called_once_with()) + + def test_run_pkg_upgrade(self): + self.patch_object(chm_core.hookenv, 'status_set') + self.patch_target('do_openstack_upgrade_db_migration') + self.patch_target('do_openstack_pkg_upgrade') + self.patch_target('do_openstack_upgrade_config_render') + self.patch_target('do_openstack_upgrade_db_migration') + self.patch_target('config', + new={'openstack-origin': 'snap:ocata/stable'}) + self.patch_object(chm_core, 'get_charm_instance') + target_charm = mock.MagicMock() + self.get_charm_instance.return_value = target_charm + self.target.run_upgrade('int_list', upgrade_openstack=False) + self.status_set.assert_called_once_with('maintenance', + 'Running package upgrade') + target_charm.do_openstack_pkg_upgrade.assert_called_once_with( + upgrade_openstack=False) (target_charm.do_openstack_upgrade_config_render. assert_called_once_with('int_list')) (target_charm.do_openstack_upgrade_db_migration.