From ad34f1e889d9bf91ae6ee92f597534857e6e98b7 Mon Sep 17 00:00:00 2001 From: Tytus Kurek Date: Mon, 29 Jan 2018 09:30:58 +0100 Subject: [PATCH] Change pool manager cache driver This patchset changes the default pool manager cache driver used by the designate charm from "memcached" to "sqlalchemy". Change-Id: If61a28f572137b0e3041d17bd9296929074faf7d Closes-Bug: #1739012 --- src/lib/charm/openstack/designate.py | 10 ++++++++++ src/reactive/designate_handlers.py | 12 ++++++++++++ src/templates/mitaka/designate.conf | 2 +- unit_tests/test_designate_handlers.py | 19 ++++++++++++++++++- 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/lib/charm/openstack/designate.py b/src/lib/charm/openstack/designate.py index dd72275..c34001f 100644 --- a/src/lib/charm/openstack/designate.py +++ b/src/lib/charm/openstack/designate.py @@ -548,3 +548,13 @@ class DesignateCharm(openstack_charm.HAOpenStackCharm): return 'blocked', ('Need either a dns-backend relation or ' 'config(dns-slaves) or both.') return None, None + + def pool_manager_cache_sync_done(self): + return hookenv.leader_get(attribute='pool-manager-cache-sync-done') + + def pool_manager_cache_sync(self): + if not self.pool_manager_cache_sync_done() and hookenv.is_leader(): + sync_cmd = "designate-manage pool-manager-cache sync" + subprocess.check_call(sync_cmd.split(), timeout=60) + hookenv.leader_set({'pool-manager-cache-sync-done': True}) + self.restart_all() diff --git a/src/reactive/designate_handlers.py b/src/reactive/designate_handlers.py index 3dbbfba..28cd295 100644 --- a/src/reactive/designate_handlers.py +++ b/src/reactive/designate_handlers.py @@ -73,6 +73,7 @@ def install_packages(): reactive.remove_state('shared-db.setup') reactive.remove_state('base-config.rendered') reactive.remove_state('db.synched') + reactive.remove_state('pool-manager-cache.synched') @reactive.when('amqp.connected') @@ -146,6 +147,16 @@ def run_db_migration(*args): reactive.set_state('db.synched') +@reactive.when_not('pool-manager-cache.synched') +@reactive.when('base-config.rendered') +@reactive.when(*COMPLETE_INTERFACE_STATES) +def sync_pool_manager_cache(*args): + with provide_charm_instance() as instance: + instance.pool_manager_cache_sync() + if instance.pool_manager_cache_sync_done(): + reactive.set_state('pool-manager-cache.synched') + + @reactive.when('cluster.available') def update_peers(cluster): """Inform designate peers about this unit""" @@ -156,6 +167,7 @@ def update_peers(cluster): @reactive.when('db.synched') +@reactive.when('pool-manager-cache.synched') @reactive.when(*COMPLETE_INTERFACE_STATES) def configure_designate_full(*args): """Write out all designate config include bootstrap domain info""" diff --git a/src/templates/mitaka/designate.conf b/src/templates/mitaka/designate.conf index 006d518..450ca80 100644 --- a/src/templates/mitaka/designate.conf +++ b/src/templates/mitaka/designate.conf @@ -274,7 +274,7 @@ pool_id = 794ccc2c-d751-44fe-b57f-8894c9f5c842 #periodic_sync_seconds = None # The cache driver to use -#cache_driver = memcache +cache_driver = sqlalchemy ################################### ## Pool Manager Cache Configuration diff --git a/unit_tests/test_designate_handlers.py b/unit_tests/test_designate_handlers.py index 8247f4e..09eb639 100644 --- a/unit_tests/test_designate_handlers.py +++ b/unit_tests/test_designate_handlers.py @@ -30,9 +30,12 @@ class TestRegisteredHooks(test_utils.TestRegisteredHooks): 'create_servers_and_domains': ( all_interfaces + ('base-config.rendered', 'db.synched')), 'configure_designate_full': ( - all_interfaces + ('db.synched', )), + all_interfaces + ( + 'db.synched', 'pool-manager-cache.synched')), 'run_db_migration': ( all_interfaces + ('base-config.rendered', )), + 'sync_pool_manager_cache': ( + all_interfaces + ('base-config.rendered', )), 'configure_designate_basic': all_interfaces, 'expose_endpoint': ('dnsaas.connected', ), }, @@ -41,6 +44,7 @@ class TestRegisteredHooks(test_utils.TestRegisteredHooks): 'setup_database': ('shared-db.setup', ), 'install_packages': ('installed', ), 'run_db_migration': ('db.synched', ), + 'sync_pool_manager_cache': ('pool-manager-cache.synched', ), 'configure_designate_basic': ('base-config.rendered', ), 'create_servers_and_domains': ('domains.created', ), 'run_assess_status_on_every_hook': ( @@ -150,6 +154,19 @@ class TestHandlers(test_utils.PatchHelper): the_charm.db_sync.assert_called_once_with() self.set_state.assert_called_once_with('db.synched') + def test_sync_pool_manager_cache(self): + the_charm = self._patch_provide_charm_instance() + self.patch_object(handlers.reactive, 'set_state') + the_charm.pool_manager_cache_sync_done.return_value = False + handlers.sync_pool_manager_cache('arg1', 'arg2') + the_charm.pool_manager_cache_sync.assert_called_once_with() + self.assertFalse(self.set_state.called) + the_charm.pool_manager_cache_sync.reset_mock() + the_charm.pool_manager_cache_sync_done.return_value = True + handlers.sync_pool_manager_cache('arg1', 'arg2') + the_charm.pool_manager_cache_sync.assert_called_once_with() + self.set_state.assert_called_once_with('pool-manager-cache.synched') + def test_update_peers(self): the_charm = self._patch_provide_charm_instance() handlers.update_peers('cluster')