diff --git a/hooks/neutron_ovs_hooks.py b/hooks/neutron_ovs_hooks.py index 064c711b..6f656368 100755 --- a/hooks/neutron_ovs_hooks.py +++ b/hooks/neutron_ovs_hooks.py @@ -20,15 +20,12 @@ from charmhelpers.core.host import ( restart_on_change ) -from charmhelpers.fetch import ( - apt_purge, -) - from charmhelpers.contrib.openstack.utils import ( os_requires_version, ) from neutron_ovs_utils import ( + DHCP_PACKAGES, DVR_PACKAGES, configure_ovs, git_install, @@ -40,6 +37,7 @@ from neutron_ovs_utils import ( enable_nova_metadata, enable_local_dhcp, install_packages, + purge_packages, ) hooks = Hooks() @@ -75,7 +73,7 @@ def neutron_plugin_api_changed(): if use_dvr(): install_packages() else: - apt_purge(DVR_PACKAGES, fatal=True) + purge_packages(DVR_PACKAGES) configure_ovs() CONFIGS.write_all() # If dvr setting has changed, need to pass that on @@ -87,6 +85,8 @@ def neutron_plugin_api_changed(): def neutron_plugin_joined(relation_id=None): if enable_local_dhcp(): install_packages() + else: + purge_packages(DHCP_PACKAGES) secret = get_shared_secret() if enable_nova_metadata() else None rel_data = { 'metadata-shared-secret': secret, diff --git a/hooks/neutron_ovs_utils.py b/hooks/neutron_ovs_utils.py index 41255044..b53f8df1 100644 --- a/hooks/neutron_ovs_utils.py +++ b/hooks/neutron_ovs_utils.py @@ -45,6 +45,7 @@ from charmhelpers.core.templating import render from charmhelpers.fetch import ( apt_install, + apt_purge, apt_update, filter_installed_packages, ) @@ -82,6 +83,7 @@ ML2_CONF = '%s/plugins/ml2/ml2_conf.ini' % NEUTRON_CONF_DIR EXT_PORT_CONF = '/etc/init/ext-port.conf' NEUTRON_METADATA_AGENT_CONF = "/etc/neutron/metadata_agent.ini" DVR_PACKAGES = ['neutron-l3-agent'] +DHCP_PACKAGES = ['neutron-metadata-agent', 'neutron-dhcp-agent'] PHY_NIC_MTU_CONF = '/etc/init/os-charm-phy-nic-mtu.conf' TEMPLATES = 'templates/' @@ -140,6 +142,16 @@ def install_packages(): apt_install(filter_installed_packages(determine_packages())) +def purge_packages(pkg_list): + purge_pkgs = [] + required_packages = determine_packages() + for pkg in pkg_list: + if pkg not in required_packages: + purge_pkgs.append(pkg) + if purge_pkgs: + apt_purge(purge_pkgs, fatal=True) + + def determine_packages(): pkgs = [] plugin_pkgs = neutron_plugin_attribute('ovs', 'packages', 'neutron') @@ -148,7 +160,7 @@ def determine_packages(): if use_dvr(): pkgs.extend(DVR_PACKAGES) if enable_local_dhcp(): - pkgs.extend(['neutron-metadata-agent', 'neutron-dhcp-agent']) + pkgs.extend(DHCP_PACKAGES) if git_install_requested(): pkgs.extend(BASE_GIT_PACKAGES) diff --git a/unit_tests/test_neutron_ovs_hooks.py b/unit_tests/test_neutron_ovs_hooks.py index 3df985ca..06cb4450 100644 --- a/unit_tests/test_neutron_ovs_hooks.py +++ b/unit_tests/test_neutron_ovs_hooks.py @@ -19,7 +19,6 @@ utils.register_configs = _reg utils.restart_map = _map TO_PATCH = [ - 'apt_purge', 'config', 'CONFIGS', 'get_shared_secret', @@ -30,6 +29,7 @@ TO_PATCH = [ 'configure_ovs', 'use_dvr', 'install_packages', + 'purge_packages', 'enable_nova_metadata', 'enable_local_dhcp', ] @@ -137,7 +137,7 @@ class NeutronOVSHooksTests(CharmTestCase): self.configure_ovs.assert_called_with() self.assertTrue(self.CONFIGS.write_all.called) _plugin_joined.assert_called_with(relation_id='rid') - self.apt_purge.assert_called_with(['neutron-l3-agent'], fatal=True) + self.purge_packages.assert_called_with(['neutron-l3-agent']) @patch.object(hooks, 'git_install_requested') def test_neutron_plugin_joined(self, git_requested):