diff --git a/charms_openstack/charm/core.py b/charms_openstack/charm/core.py index 74237e4..661d509 100644 --- a/charms_openstack/charm/core.py +++ b/charms_openstack/charm/core.py @@ -906,22 +906,34 @@ class BaseOpenStackCharmActions(object): apt.init() return apt.version_compare(avail_vers, cur_vers) == 1 + def run_upgrade(self, interfaces_list=None): + """Upgrade OpenStack. + + :param interfaces_list: List of instances of interface classes + :returns: None + """ + hookenv.status_set('maintenance', 'Running openstack upgrade') + new_src = self.config['openstack-origin'] + 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() + target_charm.do_openstack_upgrade_config_render(interfaces_list) + target_charm.do_openstack_upgrade_db_migration() + def upgrade_if_available(self, interfaces_list): - """Upgrade OpenStack if an upgrade is available + """Upgrade OpenStack if an upgrade is available and action-managed + upgrades is not enabled. :param interfaces_list: List of instances of interface classes :returns: None """ if self.openstack_upgrade_available(self.release_pkg): - hookenv.status_set('maintenance', 'Running openstack upgrade') - new_src = self.config['openstack-origin'] - 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() - target_charm.do_openstack_upgrade_config_render(interfaces_list) - target_charm.do_openstack_upgrade_db_migration() + if self.config['action-managed-upgrade']: + hookenv.log('Not performing OpenStack upgrade as ' + 'action-managed-upgrade is enabled') + else: + self.run_upgrade(interfaces_list=interfaces_list) def do_openstack_pkg_upgrade(self): """Upgrade OpenStack packages and snaps @@ -978,12 +990,15 @@ class BaseOpenStackCharmActions(object): return True return False - def do_openstack_upgrade_config_render(self, interfaces_list): + def do_openstack_upgrade_config_render(self, interfaces_list=None): """Render configs after upgrade :returns: None """ - self.render_with_interfaces(interfaces_list) + if interfaces_list is not None: + self.render_with_interfaces(interfaces_list) + else: + self.render_all_configs() def do_openstack_upgrade_db_migration(self): """Run database migration after upgrade diff --git a/unit_tests/charms_openstack/charm/test_core.py b/unit_tests/charms_openstack/charm/test_core.py index 43c22d3..23e4fe3 100644 --- a/unit_tests/charms_openstack/charm/test_core.py +++ b/unit_tests/charms_openstack/charm/test_core.py @@ -802,24 +802,38 @@ class TestMyOpenStackCharm(BaseOpenStackCharmTest): self.apt.version_compare.assert_called_once_with(3, 2) def test_upgrade_if_available(self): - self.patch_target('openstack_upgrade_available') + self.patch_target('run_upgrade') + self.patch_target('openstack_upgrade_available', return_value=True) + self.patch_target('config', + new={'action-managed-upgrade': False}) + self.target.upgrade_if_available('int_list') + self.run_upgrade.assert_called_once_with(interfaces_list='int_list') + + def test_upgrade_if_available_none_available(self): + self.patch_target('run_upgrade') + self.patch_target('openstack_upgrade_available', return_value=False) + self.target.upgrade_if_available('int_list') + self.assertFalse(self.run_upgrade.called) + + def test_upgrade_if_available_action_managed_on(self): + self.patch_target('run_upgrade') + self.patch_target('openstack_upgrade_available', return_value=True) + self.patch_target('config', + new={'action-managed-upgrade': True}) + self.assertFalse(self.run_upgrade.called) + + def test_run_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') - # Test no upgrade avaialble - self.openstack_upgrade_available.return_value = False - self.target.upgrade_if_available('int_list') - self.assertFalse(self.status_set.called) - self.assertFalse(self.do_openstack_pkg_upgrade.called) - self.assertFalse(self.do_openstack_upgrade_config_render.called) - self.assertFalse(self.do_openstack_upgrade_db_migration.called) - # Test upgrade avaialble target_charm = mock.MagicMock() self.get_charm_instance.return_value = target_charm - self.openstack_upgrade_available.return_value = True - self.target.upgrade_if_available('int_list') + 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()