Stop running register_configs at load time

Stop running register_configs so it is not run unnecessarily and
simplifies unit tests. As part of this make sure that CONFIGS is
refreshed after an upgrade as config files and contexts may
have changed.

Change-Id: I08a847abe7db22a11860f359442e1e8945585466
Closes-Bug: #1844325
This commit is contained in:
Liam Young
2019-09-25 10:01:50 +00:00
parent fec0eeb2b7
commit 56e4d3c322
2 changed files with 52 additions and 12 deletions
+31 -1
View File
@@ -105,7 +105,25 @@ from hooks.horizon_utils import (
)
hooks = Hooks()
CONFIGS = register_configs()
# Note that CONFIGS is now set up via resolve_CONFIGS so that it is not a
# module load time constraint.
CONFIGS = None
def resolve_CONFIGS(force_update=False):
"""lazy function to resolve the CONFIGS so that it doesn't have to evaluate
at module load time. Note that it also returns the CONFIGS so that it can
be used in other, module loadtime, functions.
:param force_update: Force a refresh of CONFIGS
:type force_update: bool
:returns: CONFIGS variable
:rtype: `:class:templating.OSConfigRenderer`
"""
global CONFIGS
if CONFIGS is None or not force_update:
CONFIGS = register_configs()
return CONFIGS
@hooks.hook('install.real')
@@ -132,6 +150,7 @@ def install():
@restart_on_change(restart_map(), stopstart=True, sleep=3)
@harden()
def upgrade_charm():
resolve_CONFIGS()
execd_preinstall()
apt_install(filter_installed_packages(determine_packages()), fatal=True)
packages_removed = remove_old_packages()
@@ -148,6 +167,7 @@ def upgrade_charm():
@restart_on_change(restart_map(), stopstart=True, sleep=3)
@harden()
def config_changed():
resolve_CONFIGS()
if config('prefer-ipv6'):
setup_ipv6()
localhost = 'ip6-localhost'
@@ -168,6 +188,7 @@ def config_changed():
if openstack_upgrade_available('openstack-dashboard'):
status_set('maintenance', 'Upgrading to new OpenStack release')
do_openstack_upgrade(configs=CONFIGS)
resolve_CONFIGS(force_update=True)
env_vars = {
'OPENSTACK_URL_HORIZON':
@@ -208,6 +229,7 @@ def keystone_joined(rel_id=None):
@hooks.hook('identity-service-relation-changed')
@restart_on_change(restart_map(), stopstart=True, sleep=3)
def keystone_changed():
resolve_CONFIGS()
CONFIGS.write_all()
if relation_get('ca_cert'):
install_ca_cert(b64decode(relation_get('ca_cert')))
@@ -224,6 +246,7 @@ def cluster_joined(relation_id=None):
'cluster-relation-changed')
@restart_on_change(restart_map(), stopstart=True, sleep=3)
def cluster_relation():
resolve_CONFIGS()
CONFIGS.write(HAPROXY_CONF)
@@ -273,6 +296,7 @@ def plugin_relation_joined(rel_id=None):
@hooks.hook('dashboard-plugin-relation-changed')
@restart_on_change(restart_map(), stopstart=True, sleep=3)
def update_plugin_config():
resolve_CONFIGS()
CONFIGS.write(LOCAL_SETTINGS)
@@ -305,6 +329,7 @@ def db_joined():
@hooks.hook('shared-db-relation-changed')
@restart_on_change(restart_map(), stopstart=True, sleep=3)
def db_changed():
resolve_CONFIGS()
if 'shared-db' not in CONFIGS.complete_contexts():
log('shared-db relation incomplete. Peer not ready?')
return
@@ -326,6 +351,7 @@ def db_changed():
'websso-fid-service-provider-relation-departed')
@restart_on_change(restart_map(), stopstart=True, sleep=3)
def websso_sp_changed():
resolve_CONFIGS()
CONFIGS.write_all()
@@ -367,6 +393,7 @@ def main():
hooks.execute(sys.argv)
except UnregisteredHookError as e:
log('Unknown hook {} - skipping.'.format(e))
resolve_CONFIGS()
assess_status(CONFIGS)
@@ -379,6 +406,7 @@ def certs_joined(relation_id=None):
@hooks.hook('certificates-relation-changed')
def certs_changed(relation_id=None, unit=None):
resolve_CONFIGS()
process_certificates('horizon', relation_id, unit)
CONFIGS.write_all()
service_reload('apache2')
@@ -388,6 +416,7 @@ def certs_changed(relation_id=None, unit=None):
@hooks.hook('pre-series-upgrade')
def pre_series_upgrade():
log("Running prepare series upgrade hook", "INFO")
resolve_CONFIGS()
series_upgrade_prepare(
pause_unit_helper, CONFIGS)
@@ -395,6 +424,7 @@ def pre_series_upgrade():
@hooks.hook('post-series-upgrade')
def post_series_upgrade():
log("Running complete series upgrade hook", "INFO")
resolve_CONFIGS()
series_upgrade_complete(
resume_unit_helper, CONFIGS)
+21 -11
View File
@@ -22,8 +22,6 @@ from unit_tests.test_utils import CharmTestCase
sys.modules['apt'] = MagicMock()
import hooks.horizon_utils as utils
_register_configs = utils.register_configs
utils.register_configs = MagicMock()
with patch('charmhelpers.contrib.hardening.harden.harden') as mock_dec:
mock_dec.side_effect = (lambda *dargs, **dkwargs: lambda f:
@@ -32,7 +30,6 @@ with patch('charmhelpers.contrib.hardening.harden.harden') as mock_dec:
import hooks.horizon_hooks as hooks
RESTART_MAP = utils.restart_map()
utils.register_configs = _register_configs
TO_PATCH = [
'config',
@@ -63,6 +60,7 @@ TO_PATCH = [
'remove_old_packages',
'generate_ha_relation_data',
'resolve_address',
'register_configs',
]
@@ -149,7 +147,7 @@ class TestHorizonHooks(CharmTestCase):
self.filter_installed_packages.return_value = ['foo']
self._call_hook('upgrade-charm')
self.apt_install.assert_called_with(['foo'], fatal=True)
self.assertTrue(self.CONFIGS.write_all.called)
self.assertTrue(self.register_configs().write_all.called)
ex = [
call('stop', 'apache2'),
call('stop', 'memcached'),
@@ -229,18 +227,28 @@ class TestHorizonHooks(CharmTestCase):
self.assertTrue(self.enable_ssl.called)
self.do_openstack_upgrade.assert_not_called()
self.assertTrue(self.save_script_rc.called)
self.assertTrue(self.CONFIGS.write_all.called)
self.assertTrue(self.register_configs().write_all.called)
self.open_port.assert_has_calls([call(80), call(443)])
self.assertTrue(_custom_theme.called)
@patch('hooks.horizon_hooks.check_custom_theme')
def test_config_changed_do_upgrade(self, _custom_theme):
config_mock1 = MagicMock()
config_mock2 = MagicMock()
config_mocks = [config_mock1, config_mock2]
def _register_configs():
return config_mocks.pop()
self.register_configs.side_effect = _register_configs
self.relation_ids.return_value = []
self.test_config.set('openstack-origin', 'cloud:precise-grizzly')
self.openstack_upgrade_available.return_value = True
self._call_hook('config-changed')
self.assertTrue(self.do_openstack_upgrade.called)
self.assertTrue(_custom_theme.called)
# Assert that the second mock is used for writing config as
# that shows that CONFIGS was refreshed post-upgrade.
config_mock2.write_all.assert_called_once_with()
def test_keystone_joined_in_relation(self):
self._call_hook('identity-service-relation-joined')
@@ -261,22 +269,24 @@ class TestHorizonHooks(CharmTestCase):
def test_keystone_changed_no_cert(self):
self.relation_get.return_value = None
self._call_hook('identity-service-relation-changed')
self.CONFIGS.write_all.assert_called_with()
self.register_configs().write_all.assert_called_with()
self.install_ca_cert.assert_not_called()
def test_keystone_changed_cert(self):
self.relation_get.return_value = 'certificate'
self._call_hook('identity-service-relation-changed')
self.CONFIGS.write_all.assert_called_with()
self.register_configs().write_all.assert_called_with()
self.install_ca_cert.assert_called_with('certificate')
def test_cluster_departed(self):
self._call_hook('cluster-relation-departed')
self.CONFIGS.write.assert_called_with('/etc/haproxy/haproxy.cfg')
self.register_configs().write.assert_called_with(
'/etc/haproxy/haproxy.cfg')
def test_cluster_changed(self):
self._call_hook('cluster-relation-changed')
self.CONFIGS.write.assert_called_with('/etc/haproxy/haproxy.cfg')
self.register_configs().write.assert_called_with(
'/etc/haproxy/haproxy.cfg')
def test_website_joined(self):
self.unit_get.return_value = '192.168.1.1'
@@ -296,7 +306,7 @@ class TestHorizonHooks(CharmTestCase):
def test_websso_fid_service_provider_changed(self):
self._call_hook('websso-fid-service-provider-relation-changed')
self.CONFIGS.write_all.assert_called_with()
self.register_configs().write_all.assert_called_with()
def test_websso_trusted_dashboard_changed_no_tls(self):
def relation_ids_side_effect(rname):
@@ -418,6 +428,6 @@ class TestHorizonHooks(CharmTestCase):
self._call_hook('certificates-relation-changed')
_process_certificates.assert_called_with(
'horizon', None, None)
self.CONFIGS.write_all.assert_called_with()
self.register_configs().write_all.assert_called_with()
_service_reload.assert_called_with('apache2')
self.enable_ssl.assert_called_with()