From a4c39edc24c3557f9da93223d04c5a4e1ff58e66 Mon Sep 17 00:00:00 2001 From: Frode Nordahl Date: Thu, 26 Jul 2018 14:34:10 +0200 Subject: [PATCH] Use leader storage for `db-initialised` flag There are no relation-level concerns for this flag. Any pre-existing deployments with recent charms (as in released 2015 or later) will have already migrated the peer storage to leader storage, so this change can build on that work directly. Ref: https://github.com/juju/charm-helpers/blame/master/charmhelpers/contrib/peerstorage/__init__.py Change-Id: Ia7362d257428b102c452d0e91bcf9b3378a1e6e9 Closes-bug: #1783747 --- hooks/keystone_hooks.py | 2 +- hooks/keystone_utils.py | 14 ++++---------- unit_tests/test_keystone_hooks.py | 2 +- unit_tests/test_keystone_utils.py | 19 ++++++++++++++++++- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/hooks/keystone_hooks.py b/hooks/keystone_hooks.py index cfd938e2..9bf66dce 100755 --- a/hooks/keystone_hooks.py +++ b/hooks/keystone_hooks.py @@ -467,7 +467,7 @@ def cluster_joined(rid=None): @restart_on_change(restart_map(), stopstart=True) def cluster_changed(): # NOTE(jamespage) re-echo passwords for peer storage - echo_whitelist = ['_passwd', 'identity-service:', 'db-initialised'] + echo_whitelist = ['_passwd', 'identity-service:'] log("Peer echo whitelist: %s" % (echo_whitelist), level=DEBUG) peer_echo(includes=echo_whitelist, force=True) diff --git a/hooks/keystone_utils.py b/hooks/keystone_utils.py index d41650ed..9ffe9d25 100644 --- a/hooks/keystone_utils.py +++ b/hooks/keystone_utils.py @@ -66,10 +66,6 @@ from charmhelpers.contrib.openstack.utils import ( is_unit_paused_set, ) -from charmhelpers.core.strutils import ( - bool_from_string, -) - from charmhelpers.core.decorators import ( retry_on_exception, ) @@ -651,11 +647,9 @@ def do_openstack_upgrade(configs): def is_db_initialised(): - if relation_ids('cluster'): - inited = peer_retrieve('db-initialised') - if inited and bool_from_string(inited): - log("Database is initialised", level=DEBUG) - return True + if leader_get('db-initialised'): + log("Database is initialised", level=DEBUG) + return True log("Database is NOT initialised", level=DEBUG) return False @@ -692,7 +686,7 @@ def migrate_database(): else: service_start(keystone_service()) time.sleep(10) - peer_store('db-initialised', 'True') + leader_set({'db-initialised': True}) # OLD diff --git a/unit_tests/test_keystone_hooks.py b/unit_tests/test_keystone_hooks.py index 975475c5..4c518675 100644 --- a/unit_tests/test_keystone_hooks.py +++ b/unit_tests/test_keystone_hooks.py @@ -446,7 +446,7 @@ class KeystoneRelationTests(CharmTestCase): mock_config.return_value = None hooks.cluster_changed() - whitelist = ['_passwd', 'identity-service:', 'db-initialised'] + whitelist = ['_passwd', 'identity-service:'] self.peer_echo.assert_called_with(force=True, includes=whitelist) self.assertTrue(configs.write_all.called) diff --git a/unit_tests/test_keystone_utils.py b/unit_tests/test_keystone_utils.py index 48075f78..bd210c59 100644 --- a/unit_tests/test_keystone_utils.py +++ b/unit_tests/test_keystone_utils.py @@ -223,7 +223,23 @@ class TestKeystoneUtils(CharmTestCase): disable_unused_apache_sites.assert_called_with() self.reset_os_release.assert_called() - def test_migrate_database(self): + @patch.object(utils, 'leader_get') + def test_is_db_initialised_true_string(self, _leader_get): + _leader_get.return_value = "True" + self.assertTrue(utils.is_db_initialised()) + + @patch.object(utils, 'leader_get') + def test_is_db_initialised_true_bool(self, _leader_get): + _leader_get.return_value = True + self.assertTrue(utils.is_db_initialised()) + + @patch.object(utils, 'leader_get') + def test_is_db_initialised_not_set(self, _leader_get): + _leader_get.return_value = None + self.assertFalse(utils.is_db_initialised()) + + @patch.object(utils, 'leader_set') + def test_migrate_database(self, _leader_set): self.os_release.return_value = 'havana' utils.migrate_database() @@ -231,6 +247,7 @@ class TestKeystoneUtils(CharmTestCase): cmd = ['sudo', '-u', 'keystone', 'keystone-manage', 'db_sync'] self.subprocess.check_output.assert_called_with(cmd) self.service_start.assert_called_with('keystone') + _leader_set.assert_called_with({'db-initialised': True}) @patch.object(utils, 'leader_get') @patch.object(utils, 'get_api_version')