From 86bd7da4dbce707912b4057af1c9d8aca5b2bd15 Mon Sep 17 00:00:00 2001 From: James Page Date: Thu, 28 Sep 2017 11:58:14 +0100 Subject: [PATCH] Fix upgrades from Liberty to Mitaka Ensure that any new configuration files are written to disk prior to performing the package upgrade between OpenStack releases; this ensures that the new versions of the daemons start with the correct configuration from initial start on package post installation configuration. Change-Id: Ie5f3757e6c3d11fbb2d201b1f7a28e274a5f03e4 Closes-Bug: 1634923 --- .gitignore | 1 + hooks/neutron_utils.py | 26 +++++++++++++++++++------- unit_tests/test_neutron_utils.py | 10 +++++++--- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index fc491864..b00b9105 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ bin tags .tox .testrepository +.stestr *.pyc *.sw[nop] *.pyc diff --git a/hooks/neutron_utils.py b/hooks/neutron_utils.py index 273ee020..e227f554 100644 --- a/hooks/neutron_utils.py +++ b/hooks/neutron_utils.py @@ -660,9 +660,14 @@ def resolve_config_files(plugin, release): return config_files -def register_configs(): - ''' Register config files with their respective contexts. ''' - release = os_release('neutron-common') +def register_configs(release=None): + ''' + Register config files with their respective contexts. + + :param release: string containing the openstack release to use + over automatic detection based on installed pkgs. + ''' + release = release or os_release('neutron-common') plugin = config('plugin') config_files = resolve_config_files(plugin, release) configs = templating.OSConfigRenderer(templates_dir=TEMPLATES, @@ -685,15 +690,17 @@ def stop_services(): service_stop(svc) -def restart_map(): +def restart_map(release=None): ''' Determine the correct resource map to be passed to charmhelpers.core.restart_on_change() based on the services configured. + :param release: string containing the openstack release to use + over automatic detection based on installed pkgs. :returns: dict: A dictionary mapping config file to lists of services that should be restarted when file changes. ''' - release = os_release('neutron-common') + release = release or os_release('neutron-common') plugin = config('plugin') config_files = resolve_config_files(plugin, release) _map = {} @@ -822,6 +829,13 @@ def do_openstack_upgrade(configs): log('Performing OpenStack upgrade to %s.' % (new_os_rel)) configure_installation_source(new_src) + + # NOTE(jamespage): + # Write-out new openstack release configuration files prior to upgrading + # to avoid having to restart services immediately after upgrade. + configs = register_configs(new_os_rel) + configs.write_all() + dpkg_opts = [ '--option', 'Dpkg::Options::=--force-confnew', '--option', 'Dpkg::Options::=--force-confdef', @@ -834,8 +848,6 @@ def do_openstack_upgrade(configs): reset_os_release() apt_install(get_early_packages(), fatal=True) apt_install(get_packages(), fatal=True) - configs.set_release(openstack_release=new_os_rel) - configs.write_all() def configure_ovs(): diff --git a/unit_tests/test_neutron_utils.py b/unit_tests/test_neutron_utils.py index 48217dd2..eb6d02bf 100644 --- a/unit_tests/test_neutron_utils.py +++ b/unit_tests/test_neutron_utils.py @@ -288,9 +288,13 @@ class TestNeutronUtils(CharmTestCase): call('br1', 'eth0.200', promisc=True)] self.add_bridge_port.assert_has_calls(calls) + @patch.object(neutron_utils, 'register_configs') @patch('charmhelpers.contrib.openstack.templating.OSConfigRenderer') @patch.object(neutron_utils, 'git_install_requested') - def test_do_openstack_upgrade(self, git_requested, mock_renderer): + def test_do_openstack_upgrade(self, git_requested, mock_renderer, + mock_register_configs): + mock_configs = MagicMock() + mock_register_configs.return_value = mock_configs git_requested.return_value = False self.config.side_effect = self.test_config.get self.is_relation_made.return_value = False @@ -298,8 +302,8 @@ class TestNeutronUtils(CharmTestCase): self.test_config.set('plugin', 'ovs') self.get_os_codename_install_source.return_value = 'havana' self.os_release.return_value = 'havana' - configs = neutron_utils.register_configs() - neutron_utils.do_openstack_upgrade(configs) + neutron_utils.do_openstack_upgrade(mock_configs) + mock_register_configs.assert_called_with('havana') self.assertTrue(self.log.called) self.apt_update.assert_called_with(fatal=True) dpkg_opts = [