Support action managed upgrades

Update code to ensure that openstack upgrade does not run via a
hook if action-managed-upgrades is set. If the openstack upgrade
is being triggered via an action then no interfaces will have
been passed so call render_all_configs which will indirectly
construct the adapter classes.

Depends-On: I1958226576c73d0ce0e9fd4c1423f86addadb454
Change-Id: I33947c474b70c5cd4722688567ba55370b805f65
This commit is contained in:
Liam Young 2018-11-04 09:57:24 +00:00
parent 48bac1b871
commit 785cdb8d61
2 changed files with 52 additions and 23 deletions

View File

@ -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

View File

@ -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()