From 2c4766575866057eb191f2fe8e79e6005312c844 Mon Sep 17 00:00:00 2001 From: Corey Bryant Date: Thu, 7 Sep 2017 15:46:11 +0000 Subject: [PATCH] Reset os_release cached value after upgrade In enable_memcache, ensure that the os_release cache is reset after upgrade. Additionally, call apt_install(get_packages()) for upgrades to ensure that release-specific packages (such as memcached) are installed. Change-Id: Ia3689d2d0c549fc55f1bd533654f80c98ce5462a Partial-Bug: 1715624 --- hooks/ceilometer_hooks.py | 11 +++++++++++ hooks/ceilometer_utils.py | 8 ++++++++ unit_tests/test_ceilometer_hooks.py | 16 ++++++++++++++++ unit_tests/test_ceilometer_utils.py | 12 +++++++----- 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/hooks/ceilometer_hooks.py b/hooks/ceilometer_hooks.py index 59014da..b07229c 100755 --- a/hooks/ceilometer_hooks.py +++ b/hooks/ceilometer_hooks.py @@ -33,6 +33,8 @@ from charmhelpers.contrib.openstack.utils import ( configure_installation_source, openstack_upgrade_available, pausable_restart_on_change as restart_on_change, + os_release, + CompareOpenStackReleases, ) from ceilometer_utils import ( restart_map, @@ -101,6 +103,15 @@ def config_changed(): if openstack_upgrade_available('ceilometer-common'): status_set('maintenance', 'Running openstack upgrade') do_openstack_upgrade(CONFIGS) + else: + # It's possible that a partial upgrade has occurred if nova-compute + # was upgraded first. If > mitaka call apt_install to allow + # packages which are enabled for specific OpenStack version to be + # installed if they haven't been already. + os_rel = os_release('ceilometer-common', reset_cache=True) + if (CompareOpenStackReleases(os_rel) >= 'mitaka'): + apt_install(filter_installed_packages(get_packages()), + fatal=True) if is_relation_made('nrpe-external-master'): update_nrpe_config() CONFIGS.write_all() diff --git a/hooks/ceilometer_utils.py b/hooks/ceilometer_utils.py index db778e5..540d567 100644 --- a/hooks/ceilometer_utils.py +++ b/hooks/ceilometer_utils.py @@ -30,6 +30,7 @@ from charmhelpers.contrib.openstack.utils import ( os_application_version_set, token_cache_pkgs, enable_memcache, + reset_os_release, ) from charmhelpers.core.hookenv import ( config, @@ -163,9 +164,16 @@ def do_openstack_upgrade(configs): ] apt_update(fatal=True) apt_upgrade(options=dpkg_opts, fatal=True, dist=True) + reset_os_release() apt_install(packages=CEILOMETER_AGENT_PACKAGES, options=dpkg_opts, fatal=True) + # Call apt_install a 2nd time to allow packages which are enabled + # for specific OpenStack version to be installed . This is because + # Openstack version for a subordinate should be derived from the + # version of an installed package rather than relying on + # openstack-origin which would not be present in a subordinate. + apt_install(get_packages(), fatal=True) # set CONFIGS to load templates from new release configs.set_release(openstack_release=new_os_rel) diff --git a/unit_tests/test_ceilometer_hooks.py b/unit_tests/test_ceilometer_hooks.py index a5d4085..1b0bc6d 100644 --- a/unit_tests/test_ceilometer_hooks.py +++ b/unit_tests/test_ceilometer_hooks.py @@ -40,6 +40,7 @@ TO_PATCH = [ 'update_nrpe_config', 'is_relation_made', 'get_packages', + 'os_release', ] @@ -90,12 +91,26 @@ class CeilometerHooksTest(CharmTestCase): @patch('charmhelpers.core.hookenv.config') def test_config_changed_no_upgrade(self, mock_config): self.openstack_upgrade_available.return_value = False + self.os_release.return_value = 'liberty' hooks.hooks.execute(['hooks/config-changed']) self.openstack_upgrade_available.\ assert_called_with('ceilometer-common') self.assertFalse(self.do_openstack_upgrade.called) self.assertTrue(self.CONFIGS.write_all.called) self.assertTrue(self.update_nrpe_config.called) + self.assertFalse(self.apt_install.called) + + @patch('charmhelpers.core.hookenv.config') + def test_config_changed_partial_upgrade(self, mock_config): + self.openstack_upgrade_available.return_value = False + self.os_release.return_value = 'mitaka' + hooks.hooks.execute(['hooks/config-changed']) + self.openstack_upgrade_available.\ + assert_called_with('ceilometer-common') + self.assertFalse(self.do_openstack_upgrade.called) + self.assertTrue(self.CONFIGS.write_all.called) + self.assertTrue(self.update_nrpe_config.called) + self.assertTrue(self.apt_install.called) @patch('charmhelpers.core.hookenv.config') def test_config_changed_upgrade(self, mock_config): @@ -118,6 +133,7 @@ class CeilometerHooksTest(CharmTestCase): @patch('charmhelpers.core.hookenv.config') def test_config_changed_no_nrpe(self, mock_config): self.openstack_upgrade_available.return_value = False + self.os_release.return_value = 'mitaka' self.is_relation_made.return_value = False hooks.hooks.execute(['hooks/config-changed']) diff --git a/unit_tests/test_ceilometer_utils.py b/unit_tests/test_ceilometer_utils.py index ec560ef..3d99628 100644 --- a/unit_tests/test_ceilometer_utils.py +++ b/unit_tests/test_ceilometer_utils.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from mock import MagicMock, patch +from mock import MagicMock, patch, call import ceilometer_utils as utils @@ -85,10 +85,12 @@ class CeilometerUtilsTest(CharmTestCase): '--option', 'Dpkg::Options::=--force-confnew', '--option', 'Dpkg::Options::=--force-confdef', ] - self.apt_install.assert_called_with( - packages=utils.CEILOMETER_AGENT_PACKAGES, - options=dpkg_opts, fatal=True - ) + self.apt_install.assert_has_calls([ + call(packages=utils.CEILOMETER_AGENT_PACKAGES, + options=dpkg_opts, fatal=True), + call(['python-ceilometer', 'ceilometer-common', + 'ceilometer-agent-compute'], fatal=True), + ]) self.configure_installation_source.assert_called_with( 'cloud:precise-havana' )