Deal with py2-py3 migration during charm upgrade
On charm upgrade the charm may switch to py3 packages. If so, ensure the old py2 packages are purged after any new packages have been installed. If packages where removed during the upgrade, then restart all services to pickup any py2->py3 switches. Change-Id: I9acd536c437ff9d8c6a7056ac255aa4b6de62673 Closes-Bug: 1803451
This commit is contained in:
parent
c66cf4f32e
commit
ade222568d
|
@ -42,6 +42,7 @@ from charmhelpers.core.host import (
|
|||
restart_on_change,
|
||||
service_reload,
|
||||
pwgen,
|
||||
service_restart,
|
||||
)
|
||||
|
||||
from charmhelpers.fetch import (
|
||||
|
@ -92,6 +93,8 @@ from heat_utils import (
|
|||
pause_unit_helper,
|
||||
resume_unit_helper,
|
||||
assess_status,
|
||||
remove_old_packages,
|
||||
services,
|
||||
)
|
||||
|
||||
from heat_context import (
|
||||
|
@ -161,6 +164,11 @@ def config_changed():
|
|||
@hooks.hook('upgrade-charm')
|
||||
@harden()
|
||||
def upgrade_charm():
|
||||
apt_install(determine_packages(), fatal=True)
|
||||
if remove_old_packages():
|
||||
log("Package purge detected, restarting services", "INFO")
|
||||
for s in services():
|
||||
service_restart(s)
|
||||
if is_leader():
|
||||
# if we are upgrading, then the old version might have used the
|
||||
# HEAT_PATH/encryption-key. So we grab the key from that, and put it in
|
||||
|
|
|
@ -232,6 +232,18 @@ def determine_purge_packages():
|
|||
return []
|
||||
|
||||
|
||||
def remove_old_packages():
|
||||
'''Purge any packages that need ot be removed.
|
||||
|
||||
:returns: bool Whether packages were removed.
|
||||
'''
|
||||
installed_packages = filter_missing_packages(determine_purge_packages())
|
||||
if installed_packages:
|
||||
apt_purge(installed_packages, fatal=True)
|
||||
apt_autoremove(purge=True, fatal=True)
|
||||
return bool(installed_packages)
|
||||
|
||||
|
||||
def do_openstack_upgrade(configs):
|
||||
"""Perform an uprade of heat.
|
||||
|
||||
|
@ -256,10 +268,7 @@ def do_openstack_upgrade(configs):
|
|||
apt_upgrade(options=dpkg_opts, fatal=True, dist=True)
|
||||
apt_install(packages=determine_packages(), options=dpkg_opts, fatal=True)
|
||||
|
||||
installed_packages = filter_missing_packages(determine_purge_packages())
|
||||
if installed_packages:
|
||||
apt_purge(installed_packages, fatal=True)
|
||||
apt_autoremove(purge=True, fatal=True)
|
||||
remove_old_packages()
|
||||
|
||||
# set CONFIGS to load templates from new release and regenerate config
|
||||
configs.set_release(openstack_release=new_os_rel)
|
||||
|
|
|
@ -55,6 +55,7 @@ TO_PATCH = [
|
|||
'apt_install',
|
||||
'apt_update',
|
||||
'restart_on_change',
|
||||
'service_restart',
|
||||
# charmhelpers.contrib.openstack.utils
|
||||
'configure_installation_source',
|
||||
'openstack_upgrade_available',
|
||||
|
@ -68,6 +69,8 @@ TO_PATCH = [
|
|||
'restart_map',
|
||||
'register_configs',
|
||||
'do_openstack_upgrade',
|
||||
'remove_old_packages',
|
||||
'services',
|
||||
# other
|
||||
'execd_preinstall',
|
||||
'log',
|
||||
|
@ -133,12 +136,16 @@ class HeatRelationTests(CharmTestCase):
|
|||
def test_upgrade_charm(self, leader_elected, os_remove, os_path_isfile):
|
||||
os_path_isfile.return_value = False
|
||||
self.is_leader.return_value = False
|
||||
self.remove_old_packages.return_value = True
|
||||
self.services.return_value = ['heat-api']
|
||||
|
||||
relations.upgrade_charm()
|
||||
leader_elected.assert_called_once_with()
|
||||
os_path_isfile.assert_not_called()
|
||||
# now say we are the leader
|
||||
self.is_leader.return_value = True
|
||||
os_path_isfile.return_value = False
|
||||
|
||||
relations.upgrade_charm()
|
||||
self.leader_set.assert_not_called()
|
||||
os_path_isfile.return_value = True
|
||||
|
@ -150,6 +157,8 @@ class HeatRelationTests(CharmTestCase):
|
|||
self.leader_set.assert_called_once_with(
|
||||
{'heat-auth-encryption-key': 'abc'})
|
||||
os_remove.assert_called_once_with(filename)
|
||||
self.remove_old_packages.assert_called_with()
|
||||
self.service_restart.assert_called_with('heat-api')
|
||||
|
||||
def test_db_joined(self):
|
||||
self.get_relation_ip.return_value = '192.168.20.1'
|
||||
|
|
Loading…
Reference in New Issue