diff --git a/charms_openstack/charm/classes.py b/charms_openstack/charm/classes.py index fbed420..82bfb20 100644 --- a/charms_openstack/charm/classes.py +++ b/charms_openstack/charm/classes.py @@ -67,6 +67,12 @@ class OpenStackCharm(BaseOpenStackCharm, # List of packages to install packages = [] + # List of packages to purge + purge_packages = [] + + # Python version used to execute installed workload + python_version = 2 + # List of snaps to install snaps = [] @@ -232,7 +238,10 @@ class OpenStackAPICharm(OpenStackCharm): """ packages = [] if self.enable_memcache(release=release): - packages.extend(['memcached', 'python-memcache']) + if self.python_version == 2: + packages.extend(['memcached', 'python-memcache']) + else: + packages.extend(['memcached', 'python3-memcache']) return packages def get_amqp_credentials(self): diff --git a/charms_openstack/charm/core.py b/charms_openstack/charm/core.py index 4e1a5cb..a0191bd 100644 --- a/charms_openstack/charm/core.py +++ b/charms_openstack/charm/core.py @@ -949,6 +949,17 @@ class BaseOpenStackCharmActions(object): packages=self.all_packages, options=dpkg_opts, fatal=True) + if self.purge_packages: + # NOTE(jamespage): + # Ensure packages that should be purged are actually installed + installed_packages = list( + set(self.purge_packages) - + set(fetch.filter_installed_packages(self.purge_packages)) + ) + if installed_packages: + fetch.apt_purge(packages=installed_packages, + fatal=True) + fetch.apt_autoremove(purge=True, fatal=True) self.release = new_os_rel def do_openstack_upgrade_config_render(self, interfaces_list): diff --git a/unit_tests/charms_openstack/charm/common.py b/unit_tests/charms_openstack/charm/common.py index a39bdbb..7348a88 100644 --- a/unit_tests/charms_openstack/charm/common.py +++ b/unit_tests/charms_openstack/charm/common.py @@ -24,6 +24,7 @@ class MyOpenStackCharm(chm_classes.OpenStackCharm): release = 'icehouse' name = 'my-charm' packages = ['p1', 'p2', 'p3', 'package-to-filter'] + purge_packages = ['python-obsolete', 'python-notinstalled'] snaps = ['mysnap'] version_package = 'p2' version_snap = 'mysnap' diff --git a/unit_tests/charms_openstack/charm/test_core.py b/unit_tests/charms_openstack/charm/test_core.py index 7ab1ab4..c8dabeb 100644 --- a/unit_tests/charms_openstack/charm/test_core.py +++ b/unit_tests/charms_openstack/charm/test_core.py @@ -789,6 +789,11 @@ class TestMyOpenStackCharm(BaseOpenStackCharmTest): self.patch_object(chm_core.charmhelpers.fetch, 'apt_update') self.patch_object(chm_core.charmhelpers.fetch, 'apt_upgrade') self.patch_object(chm_core.charmhelpers.fetch, 'apt_install') + self.patch_object(chm_core.charmhelpers.fetch, 'apt_purge') + self.patch_object(chm_core.charmhelpers.fetch, 'apt_autoremove') + self.patch_object(chm_core.charmhelpers.fetch, + 'filter_installed_packages', + return_value=['python-notinstalled']) self.patch_object(chm_core.os_utils, 'snap_install_requested', return_value=False) self.target.do_openstack_pkg_upgrade() @@ -806,6 +811,12 @@ class TestMyOpenStackCharm(BaseOpenStackCharmTest): '--option', 'Dpkg::Options::=--force-confnew', '--option', 'Dpkg::Options::=--force-confdef'], fatal=True) + self.apt_purge.assert_called_once_with( + packages=['python-obsolete'], + fatal=True) + self.apt_autoremove.assert_called_once_with( + purge=True, + fatal=True) def test_do_openstack_pkg_upgrade_snap(self): self.patch_target('config',