From 097ffec548cea59f725920593f07f205c938a8e7 Mon Sep 17 00:00:00 2001 From: Erik Olof Gunnar Andersson Date: Thu, 13 Jun 2019 23:31:20 -0700 Subject: [PATCH] Finalized centralization of configuration This patch removes get_cfg_opts from the plugin class, and moves all configuration directly into designate.conf. There are no changes in the generated configuration due to this patch. Finally, this complets the blueprint to centralize all configuration, and is a follow up to this patch I3be68bf294157631a9bac128df0841220020de96 blueprint centralize-config-designate Change-Id: I007fc004fc533950c5eda3974f41f05c6db5b43f --- designate/backend/agent_backend/impl_bind9.py | 6 - .../backend/agent_backend/impl_denominator.py | 6 - .../backend/agent_backend/impl_djbdns.py | 6 - designate/backend/agent_backend/impl_gdnsd.py | 6 - designate/backend/agent_backend/impl_knot2.py | 6 - designate/backend/agent_backend/impl_msdns.py | 6 - designate/backend/impl_akamai.py | 6 - designate/backend/impl_dynect.py | 6 - designate/backend/impl_powerdns/__init__.py | 13 -- designate/conf/producer.py | 130 ++++++++++++------ designate/manage/powerdns.py | 2 - designate/plugin.py | 45 ------ designate/producer/tasks.py | 97 ++----------- designate/tests/__init__.py | 1 - designate/tests/unit/producer/test_tasks.py | 58 +++----- designate/utils.py | 19 --- 16 files changed, 120 insertions(+), 293 deletions(-) diff --git a/designate/backend/agent_backend/impl_bind9.py b/designate/backend/agent_backend/impl_bind9.py index d8cd5c261..eece61237 100644 --- a/designate/backend/agent_backend/impl_bind9.py +++ b/designate/backend/agent_backend/impl_bind9.py @@ -22,7 +22,6 @@ from oslo_concurrency import lockutils from oslo_config import cfg from oslo_log import log as logging -import designate.conf from designate.backend.agent_backend import base from designate import exceptions from designate import utils @@ -35,11 +34,6 @@ class Bind9Backend(base.AgentBackend): __plugin_name__ = 'bind9' __backend_status__ = 'untested' - @classmethod - def get_cfg_opts(cls): - return [(designate.conf.bind9.BIND9_GROUP, - designate.conf.bind9.BINS9_OPTS)] - def start(self): LOG.info("Started bind9 backend") diff --git a/designate/backend/agent_backend/impl_denominator.py b/designate/backend/agent_backend/impl_denominator.py index 2acc72fbc..5b3500796 100644 --- a/designate/backend/agent_backend/impl_denominator.py +++ b/designate/backend/agent_backend/impl_denominator.py @@ -23,7 +23,6 @@ from oslo_config import cfg from oslo_concurrency import lockutils from oslo_log import log as logging -import designate.conf from designate.backend.agent_backend import base from designate import exceptions from designate import utils @@ -97,11 +96,6 @@ class DenominatorBackend(base.AgentBackend): self.denominator = Denominator( cfg.CONF[CFG_GROUP_NAME]) - @classmethod - def get_cfg_opts(cls): - return [(designate.conf.denominator.DENOMINATOR_GROUP, - designate.conf.denominator.DENOMINATOR_OPTS)] - def start(self): LOG.info("Started Denominator backend") diff --git a/designate/backend/agent_backend/impl_djbdns.py b/designate/backend/agent_backend/impl_djbdns.py index 7c95fd214..dd8ba2dfd 100755 --- a/designate/backend/agent_backend/impl_djbdns.py +++ b/designate/backend/agent_backend/impl_djbdns.py @@ -52,7 +52,6 @@ from oslo_concurrency.processutils import ProcessExecutionError from oslo_config import cfg from oslo_log import log as logging -import designate.conf from designate import exceptions from designate import utils from designate.backend.agent_backend import base @@ -93,11 +92,6 @@ class DjbdnsBackend(base.AgentBackend): __plugin_name__ = 'djbdns' __backend_status__ = 'experimental' - @classmethod - def get_cfg_opts(cls): - return [(designate.conf.djbdns.DJBDNS_GROUP, - designate.conf.djbdns.DJDNS_OPTS)] - def __init__(self, *a, **kw): """Configure the backend""" super(DjbdnsBackend, self).__init__(*a, **kw) diff --git a/designate/backend/agent_backend/impl_gdnsd.py b/designate/backend/agent_backend/impl_gdnsd.py index b817668a1..e87dba0ce 100644 --- a/designate/backend/agent_backend/impl_gdnsd.py +++ b/designate/backend/agent_backend/impl_gdnsd.py @@ -50,7 +50,6 @@ from oslo_concurrency.processutils import ProcessExecutionError from oslo_config import cfg from oslo_log import log as logging -import designate.conf from designate import utils from designate import exceptions from designate.backend.agent_backend import base @@ -83,11 +82,6 @@ class GdnsdBackend(base.AgentBackend): __plugin_name__ = 'gdnsd' __backend_status__ = 'experimental' - @classmethod - def get_cfg_opts(cls): - return [(designate.conf.gdnsd.GDNSD_GROUP, - designate.conf.gdnsd.GDNSD_OPTS)] - def __init__(self, *a, **kw): """Configure the backend""" super(GdnsdBackend, self).__init__(*a, **kw) diff --git a/designate/backend/agent_backend/impl_knot2.py b/designate/backend/agent_backend/impl_knot2.py index d1c494b9a..09f11c605 100755 --- a/designate/backend/agent_backend/impl_knot2.py +++ b/designate/backend/agent_backend/impl_knot2.py @@ -44,7 +44,6 @@ from oslo_concurrency.processutils import ProcessExecutionError from oslo_config import cfg from oslo_log import log as logging -import designate.conf from designate import exceptions from designate.backend.agent_backend import base from designate.utils import execute @@ -64,11 +63,6 @@ class Knot2Backend(base.AgentBackend): __backend_status__ = 'untested' _lock_name = 'knot2.lock' - @classmethod - def get_cfg_opts(cls): - return [(designate.conf.knot2.KNOT2_GROUP, - designate.conf.knot2.KNOT2_OPTS)] - def __init__(self, *a, **kw): """Configure the backend""" super(Knot2Backend, self).__init__(*a, **kw) diff --git a/designate/backend/agent_backend/impl_msdns.py b/designate/backend/agent_backend/impl_msdns.py index cd25c3bd1..b3ef9e6d6 100644 --- a/designate/backend/agent_backend/impl_msdns.py +++ b/designate/backend/agent_backend/impl_msdns.py @@ -22,7 +22,6 @@ from os_win import utilsfactory from os_win import constants from os_win import exceptions as os_win_exc -import designate.conf from designate.backend.agent_backend import base from designate import exceptions @@ -48,11 +47,6 @@ class MSDNSBackend(base.AgentBackend): LOG.info("AXFR masters: %r", self._masters) - @classmethod - def get_cfg_opts(cls): - return [(designate.conf.msdns.MSDNS_GROUP, - designate.conf.msdns.MSDNS_OPTS)] - def start(self): """Start the backend""" LOG.info("Started msdns backend") diff --git a/designate/backend/impl_akamai.py b/designate/backend/impl_akamai.py index 56673e837..2c9172467 100644 --- a/designate/backend/impl_akamai.py +++ b/designate/backend/impl_akamai.py @@ -17,7 +17,6 @@ from oslo_log import log as logging from oslo_config import cfg from oslo_utils import importutils -import designate.conf from designate import exceptions from designate import utils from designate.backend import base @@ -236,11 +235,6 @@ class AkamaiBackend(base.Backend): __backend_status__ = 'untested' - @classmethod - def get_cfg_opts(cls): - return [(designate.conf.akamai.AKAMAI_GROUP, - designate.conf.akamai.AKAMAI_OPTS)] - def __init__(self, target): super(AkamaiBackend, self).__init__(target) diff --git a/designate/backend/impl_dynect.py b/designate/backend/impl_dynect.py index b405bab99..b31f15f61 100755 --- a/designate/backend/impl_dynect.py +++ b/designate/backend/impl_dynect.py @@ -22,7 +22,6 @@ from oslo_serialization import jsonutils import requests from requests.adapters import HTTPAdapter -import designate.conf from designate import exceptions from designate import utils from designate.backend import base @@ -303,11 +302,6 @@ class DynECTBackend(base.Backend): __backend_status__ = 'untested' - @classmethod - def get_cfg_opts(cls): - return [(designate.conf.dynect.DYNECT_GROUP, - designate.conf.dynect.DYNECT_OPTS)] - def __init__(self, target): super(DynECTBackend, self).__init__(target) diff --git a/designate/backend/impl_powerdns/__init__.py b/designate/backend/impl_powerdns/__init__.py index 98ccaa4b8..1308680b6 100644 --- a/designate/backend/impl_powerdns/__init__.py +++ b/designate/backend/impl_powerdns/__init__.py @@ -13,12 +13,10 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. -import copy import threading import six from oslo_config import cfg -from oslo_db import options from oslo_db.exception import DBDuplicateEntry from oslo_log import log as logging from oslo_utils import excutils @@ -42,17 +40,6 @@ class PowerDNSBackend(base.Backend): __backend_status__ = 'deprecated' - @classmethod - def get_cfg_opts(cls): - group = cfg.OptGroup(CFG_GROUP_NAME) - opts = copy.deepcopy(options.database_opts) - - # Strip connection options - discard_opts = ('sqlite_db', 'connection', 'slave_connection') - opts = [opt for opt in opts if opt.name not in discard_opts] - - return [(group, opts,)] - def __init__(self, target): super(PowerDNSBackend, self).__init__(target) diff --git a/designate/conf/producer.py b/designate/conf/producer.py index cf85c5250..ae2902cc3 100644 --- a/designate/conf/producer.py +++ b/designate/conf/producer.py @@ -15,15 +15,39 @@ # under the License. from oslo_config import cfg -from designate.producer import tasks - PRODUCER_GROUP = cfg.OptGroup( name='service:producer', - title="Configuration for Producer Service" + title='Configuration for Producer Service' ) ZONE_MANAGER_GROUP = cfg.OptGroup( - name='service:zone_manager', title="Configuration for Zone Manager Service" + name='service:zone_manager', + title='Configuration for Zone Manager Service' +) + +PRODUCER_TASK_DELAYED_NOTIFY_GROUP = cfg.OptGroup( + name='producer_task:delayed_notify', + title='Configuration for Producer Task: Delayed Notify' +) + +PRODUCER_TASK_PERIODIC_EXISTS_GROUP = cfg.OptGroup( + name='producer_task:periodic_exists', + title='Configuration for Producer Task: Periodic Exists' +) + +PRODUCER_TASK_PERIODIC_SECONDARY_REFRESH_GROUP = cfg.OptGroup( + name='producer_task:periodic_secondary_refresh', + title='Configuration for Producer Task: Periodic Secondary Refresh' +) + +PRODUCER_TASK_WORKER_PERIODIC_RECOVERY_GROUP = cfg.OptGroup( + name='producer_task:worker_periodic_recovery', + title='Configuration for Producer Task: Worker Periodic Recovery' +) + +PRODUCER_TASK_ZONE_PURGE_GROUP = cfg.OptGroup( + name='producer_task:zone_purge', + title='Configuration for Producer Task: Zone Purge' ) PRODUCER_OPTS = [ @@ -66,32 +90,47 @@ ZONE_MANAGER_OPTS = [ deprecated_reason='Migrated to designate-worker'), ] -# NOTE(trungnv): Get [producer_task:zone_purge] config -zone_purge_opts = tasks.DeletedZonePurgeTask.get_cfg_opts()[0][1] -zone_purge_old_group = tasks.DeletedZonePurgeTask.get_cfg_opts()[0][0].name -zone_purge_group = cfg.OptGroup(zone_purge_old_group) +PRODUCER_TASK_DELAYED_NOTIFY_OPTS = [ + cfg.IntOpt('interval', default=5, + help='Run interval in seconds'), + cfg.IntOpt('per_page', default=100, + help='Default amount of results returned per page'), + cfg.IntOpt('batch_size', default=100, + help='How many zones to receive NOTIFY on each run'), +] -# NOTE(trungnv): Get [producer_task:periodic_exists] config -periodic_exists_opts = tasks.PeriodicExistsTask.get_cfg_opts()[0][1] -periodic_exists_old_group = tasks.PeriodicExistsTask.get_cfg_opts()[0][0].name -periodic_exists_group = cfg.OptGroup(periodic_exists_old_group) +PRODUCER_TASK_PERIODIC_EXISTS_OPTS = [ + cfg.IntOpt('interval', default=3600, + help='Run interval in seconds'), + cfg.IntOpt('per_page', default=100, + help='Default amount of results returned per page'), +] -# NOTE(trungnv): Get [producer_task:periodic_secondary_refresh] config -psr_opts = tasks.PeriodicSecondaryRefreshTask.get_cfg_opts()[0][1] -psr_old_group = tasks.PeriodicSecondaryRefreshTask.get_cfg_opts()[0][0].name -psr_group = cfg.OptGroup(psr_old_group) +PRODUCER_TASK_PERIODIC_SECONDARY_REFRESH_OPTS = [ + cfg.IntOpt('interval', default=3600, + help='Run interval in seconds'), + cfg.IntOpt('per_page', default=100, + help='Default amount of results returned per page'), +] -# NOTE(trungnv): Get [producer_task:delayed_notify] config -delayed_notify_opts = \ - tasks.PeriodicGenerateDelayedNotifyTask.get_cfg_opts()[0][1] -delayed_notify_old_group = \ - tasks.PeriodicGenerateDelayedNotifyTask.get_cfg_opts()[0][0].name -delayed_notify_group = cfg.OptGroup(delayed_notify_old_group) +PRODUCER_TASK_WORKER_PERIODIC_RECOVERY_OPTS = [ + cfg.IntOpt('interval', default=120, + help='Run interval in seconds'), + cfg.IntOpt('per_page', default=100, + help='Default amount of results returned per page'), +] -# NOTE(trungnv): Get [producer_task:worker_periodic_recovery] config -wpr_opts = tasks.WorkerPeriodicRecovery.get_cfg_opts()[0][1] -wpr_old_group = tasks.WorkerPeriodicRecovery.get_cfg_opts()[0][0].name -wpr_group = cfg.OptGroup(wpr_old_group) +PRODUCER_TASK_ZONE_PURGE_OPTS = [ + cfg.IntOpt('interval', default=3600, + help='Run interval in seconds'), + cfg.IntOpt('per_page', default=100, + help='Default amount of results returned per page'), + cfg.IntOpt('time_threshold', default=604800, + help='How old deleted zones should be (deleted_at) to be ' + 'purged, in seconds'), + cfg.IntOpt('batch_size', default=100, + help='How many zones to be purged on each run'), +] def register_opts(conf): @@ -99,25 +138,34 @@ def register_opts(conf): conf.register_opts(PRODUCER_OPTS, group=PRODUCER_GROUP) conf.register_group(ZONE_MANAGER_GROUP) conf.register_opts(ZONE_MANAGER_OPTS, group=ZONE_MANAGER_GROUP) - conf.register_group(zone_purge_group) - conf.register_opts(zone_purge_opts, group=zone_purge_group) - conf.register_group(periodic_exists_group) - conf.register_opts(periodic_exists_opts, group=periodic_exists_group) - conf.register_group(psr_group) - conf.register_opts(psr_opts, group=psr_group) - conf.register_group(delayed_notify_group) - conf.register_opts(delayed_notify_opts, group=delayed_notify_group) - conf.register_group(wpr_group) - conf.register_opts(wpr_opts, group=wpr_group) + conf.register_group(PRODUCER_TASK_DELAYED_NOTIFY_GROUP) + conf.register_opts(PRODUCER_TASK_DELAYED_NOTIFY_OPTS, + group=PRODUCER_TASK_DELAYED_NOTIFY_GROUP) + conf.register_group(PRODUCER_TASK_PERIODIC_EXISTS_GROUP) + conf.register_opts(PRODUCER_TASK_PERIODIC_EXISTS_OPTS, + group=PRODUCER_TASK_PERIODIC_EXISTS_GROUP) + conf.register_group(PRODUCER_TASK_PERIODIC_SECONDARY_REFRESH_GROUP) + conf.register_opts(PRODUCER_TASK_PERIODIC_SECONDARY_REFRESH_OPTS, + group=PRODUCER_TASK_PERIODIC_SECONDARY_REFRESH_GROUP) + conf.register_group(PRODUCER_TASK_WORKER_PERIODIC_RECOVERY_GROUP) + conf.register_opts(PRODUCER_TASK_WORKER_PERIODIC_RECOVERY_OPTS, + group=PRODUCER_TASK_WORKER_PERIODIC_RECOVERY_GROUP) + conf.register_group(PRODUCER_TASK_ZONE_PURGE_GROUP) + conf.register_opts(PRODUCER_TASK_ZONE_PURGE_OPTS, + group=PRODUCER_TASK_ZONE_PURGE_GROUP) def list_opts(): return { PRODUCER_GROUP: PRODUCER_OPTS, ZONE_MANAGER_GROUP: ZONE_MANAGER_OPTS, - zone_purge_group: zone_purge_opts, - periodic_exists_group: periodic_exists_opts, - psr_group: psr_opts, - delayed_notify_group: delayed_notify_opts, - wpr_group: wpr_opts, + PRODUCER_TASK_DELAYED_NOTIFY_GROUP: + PRODUCER_TASK_DELAYED_NOTIFY_OPTS, + PRODUCER_TASK_PERIODIC_EXISTS_GROUP: + PRODUCER_TASK_PERIODIC_EXISTS_OPTS, + PRODUCER_TASK_PERIODIC_SECONDARY_REFRESH_GROUP: + PRODUCER_TASK_PERIODIC_SECONDARY_REFRESH_OPTS, + PRODUCER_TASK_WORKER_PERIODIC_RECOVERY_GROUP: + PRODUCER_TASK_WORKER_PERIODIC_RECOVERY_OPTS, + PRODUCER_TASK_ZONE_PURGE_GROUP: PRODUCER_TASK_ZONE_PURGE_OPTS, } diff --git a/designate/manage/powerdns.py b/designate/manage/powerdns.py index 03bc2dcc2..ecdec33b5 100644 --- a/designate/manage/powerdns.py +++ b/designate/manage/powerdns.py @@ -21,7 +21,6 @@ from oslo_db.sqlalchemy.migration_cli import manager as migration_manager from designate.manage import base from designate import rpc -from designate import utils from designate.central import rpcapi as central_rpcapi @@ -29,7 +28,6 @@ REPOSITORY = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'backend', 'impl_powerdns', 'migrate_repo')) CONF = cfg.CONF -utils.register_plugin_opts() def get_manager(pool_target): diff --git a/designate/plugin.py b/designate/plugin.py index b2108db1b..204462f34 100644 --- a/designate/plugin.py +++ b/designate/plugin.py @@ -18,7 +18,6 @@ import abc import six from stevedore import driver from stevedore import enabled -from stevedore import extension from oslo_config import cfg from oslo_log import log as logging @@ -55,50 +54,6 @@ class Plugin(object): def get_plugin_type(cls): return cls.__plugin_type__ - @classmethod - def get_cfg_opts(cls): - """Get any static configuration options - - Returns an array of tuples in the form: - - [(group1, [Option1, Option2]), (group2, [Option1, Option2])] - """ - return [] - - @classmethod - def get_extra_cfg_opts(cls): - """Get any dynamically built configuration options - - Returns an array of tuples in the form: - - [(group1, [Option1, Option2]), (group2, [Option1, Option2])] - """ - return [] - - @classmethod - def register_cfg_opts(cls, namespace): - mgr = extension.ExtensionManager(namespace) - - for e in mgr: - for group, opts in e.plugin.get_cfg_opts(): - if isinstance(group, six.string_types): - group = cfg.OptGroup(name=group) - - CONF.register_group(group) - CONF.register_opts(opts, group=group) - - @classmethod - def register_extra_cfg_opts(cls, namespace): - mgr = extension.ExtensionManager(namespace) - - for e in mgr: - for group, opts in e.plugin.get_extra_cfg_opts(): - if isinstance(group, six.string_types): - group = cfg.OptGroup(name=group) - - CONF.register_group(group) - CONF.register_opts(opts, group=group) - class DriverPlugin(Plugin): """ diff --git a/designate/producer/tasks.py b/designate/producer/tasks.py index 62643e88b..87d56edf9 100644 --- a/designate/producer/tasks.py +++ b/designate/producer/tasks.py @@ -27,6 +27,7 @@ from oslo_log import log as logging from oslo_utils import timeutils LOG = logging.getLogger(__name__) +CONF = cfg.CONF class PeriodicTask(plugin.ExtensionPlugin): @@ -34,24 +35,10 @@ class PeriodicTask(plugin.ExtensionPlugin): """ __plugin_ns__ = 'designate.producer_tasks' __plugin_type__ = 'producer_task' - __interval__ = None def __init__(self): + super(PeriodicTask, self).__init__() self.my_partitions = None - self.options = cfg.CONF[self.get_canonical_name()] - - @classmethod - def get_base_opts(cls): - options = [ - cfg.IntOpt( - 'interval', - default=cls.__interval__, - help='Run interval in seconds' - ), - cfg.IntOpt('per_page', default=100, - help='Default amount of results returned per page'), - ] - return options @property def central_api(self): @@ -69,7 +56,7 @@ class PeriodicTask(plugin.ExtensionPlugin): def zone_api(self): # TODO(timsim): Remove this when pool_manager_api is gone if cfg.CONF['service:worker'].enabled: - return self.worker_api + return self.worker_api return self.pool_manager_api def on_partition_change(self, my_partitions, members, event): @@ -88,7 +75,7 @@ class PeriodicTask(plugin.ExtensionPlugin): return {col: "BETWEEN %s,%s" % self._my_range()} def _iter(self, method, *args, **kwargs): - kwargs.setdefault("limit", self.options.per_page) + kwargs.setdefault("limit", CONF[self.name].per_page) while True: items = method(*args, **kwargs) @@ -112,31 +99,11 @@ class DeletedZonePurgeTask(PeriodicTask): Deleted zones have values in the deleted_at column. Purging means removing them from the database entirely. """ - __plugin_name__ = 'zone_purge' - __interval__ = 3600 def __init__(self): super(DeletedZonePurgeTask, self).__init__() - @classmethod - def get_cfg_opts(cls): - group = cfg.OptGroup(cls.get_canonical_name()) - options = cls.get_base_opts() + [ - cfg.IntOpt( - 'time_threshold', - default=604800, - help="How old deleted zones should be (deleted_at) to be " - "purged, in seconds" - ), - cfg.IntOpt( - 'batch_size', - default=100, - help='How many zones to be purged on each run' - ), - ] - return [(group, options)] - def __call__(self): """Call the Central API to perform a purge of deleted zones based on expiration time and sharding range. @@ -149,7 +116,7 @@ class DeletedZonePurgeTask(PeriodicTask): "end": pend }) - delta = datetime.timedelta(seconds=self.options.time_threshold) + delta = datetime.timedelta(seconds=CONF[self.name].time_threshold) time_threshold = timeutils.utcnow() - delta LOG.debug("Filtering deleted zones before %s", time_threshold) @@ -163,24 +130,17 @@ class DeletedZonePurgeTask(PeriodicTask): self.central_api.purge_zones( ctxt, criterion, - limit=self.options.batch_size, + limit=CONF[self.name].batch_size, ) class PeriodicExistsTask(PeriodicTask): __plugin_name__ = 'periodic_exists' - __interval__ = 3600 def __init__(self): super(PeriodicExistsTask, self).__init__() self.notifier = rpc.get_notifier('producer') - @classmethod - def get_cfg_opts(cls): - group = cfg.OptGroup(cls.get_canonical_name()) - options = cls.get_base_opts() - return [(group, options)] - @staticmethod def _get_period(seconds): interval = datetime.timedelta(seconds=seconds) @@ -200,7 +160,7 @@ class PeriodicExistsTask(PeriodicTask): ctxt = context.DesignateContext.get_admin_context() ctxt.all_tenants = True - start, end = self._get_period(self.options.interval) + start, end = self._get_period(CONF[self.name].interval) extra_data = { "audit_period_beginning": start, @@ -230,13 +190,6 @@ class PeriodicExistsTask(PeriodicTask): class PeriodicSecondaryRefreshTask(PeriodicTask): __plugin_name__ = 'periodic_secondary_refresh' - __interval__ = 3600 - - @classmethod - def get_cfg_opts(cls): - group = cfg.OptGroup(cls.get_canonical_name()) - options = cls.get_base_opts() - return [(group, options)] def __call__(self): pstart, pend = self._my_range() @@ -275,30 +228,11 @@ class PeriodicGenerateDelayedNotifyTask(PeriodicTask): """Generate delayed NOTIFY transactions Scan the database for zones with the delayed_notify flag set. """ - __plugin_name__ = 'delayed_notify' - __interval__ = 5 def __init__(self): super(PeriodicGenerateDelayedNotifyTask, self).__init__() - @classmethod - def get_cfg_opts(cls): - group = cfg.OptGroup(cls.get_canonical_name()) - options = cls.get_base_opts() + [ - cfg.IntOpt( - 'interval', - default=cls.__interval__, - help='Run interval in seconds' - ), - cfg.IntOpt( - 'batch_size', - default=100, - help='How many zones to receive NOTIFY on each run' - ), - ] - return [(group, options)] - def __call__(self): """Fetch a list of zones with the delayed_notify flag set up to "batch_size" @@ -318,7 +252,7 @@ class PeriodicGenerateDelayedNotifyTask(PeriodicTask): zones = self.central_api.find_zones( ctxt, criterion, - limit=self.options.batch_size, + limit=CONF[self.name].batch_size, sort_key='updated_at', sort_dir='asc', ) @@ -339,24 +273,11 @@ class PeriodicGenerateDelayedNotifyTask(PeriodicTask): class WorkerPeriodicRecovery(PeriodicTask): __plugin_name__ = 'worker_periodic_recovery' - __interval__ = 120 - - @classmethod - def get_cfg_opts(cls): - group = cfg.OptGroup(cls.get_canonical_name()) - options = cls.get_base_opts() + [ - cfg.IntOpt( - 'interval', - default=cls.__interval__, - help='Run interval in seconds' - ), - ] - return [(group, options)] def __call__(self): # TODO(timsim): Remove this when worker is always on if not cfg.CONF['service:worker'].enabled: - return + return pstart, pend = self._my_range() LOG.info( diff --git a/designate/tests/__init__.py b/designate/tests/__init__.py index 38a6aae40..53e64dbb5 100644 --- a/designate/tests/__init__.py +++ b/designate/tests/__init__.py @@ -384,7 +384,6 @@ class TestCase(base.BaseTestCase): # "Read" Configuration self.CONF([], project='designate') - utils.register_plugin_opts() self.useFixture(fixtures.PolicyFixture()) self.network_api = fixtures.NetworkAPIFixture() diff --git a/designate/tests/unit/producer/test_tasks.py b/designate/tests/unit/producer/test_tasks.py index 0cc3ada39..23c17ce56 100644 --- a/designate/tests/unit/producer/test_tasks.py +++ b/designate/tests/unit/producer/test_tasks.py @@ -22,6 +22,8 @@ import datetime import fixtures import mock import oslotest.base +from oslo_config import cfg +from oslo_config import fixture as cfg_fixture from oslo_utils import timeutils from designate import context @@ -31,34 +33,29 @@ from designate.producer import tasks from designate.tests.unit import RoObject from designate.utils import generate_uuid +DUMMY_TASK_GROUP = cfg.OptGroup( + name='producer_task:dummy', + title='Configuration for Producer Task: Dummy Task' +) +DUMMY_TASK_OPTS = [ + cfg.IntOpt('per_page', default=100, + help='Default amount of results returned per page'), +] + +CONF = cfg.CONF +CONF.register_group(DUMMY_TASK_GROUP) +CONF.register_opts(DUMMY_TASK_OPTS, group=DUMMY_TASK_GROUP) + class DummyTask(tasks.PeriodicTask): """Dummy task used to test helper functions""" __plugin_name__ = 'dummy' -class TaskTest(oslotest.base.BaseTestCase): - def setup_opts(self, config): - opts = RoObject(**config) - - self.opts = opts - self.opts_patcher = mock.patch('oslo_config.cfg.CONF') - self.addCleanup(self.opts_patcher.stop) - - self.opts_mock = self.opts_patcher.start() - self.opts_mock.__getitem__.side_effect = lambda n: opts[n] - - -class PeriodicTest(TaskTest): +class PeriodicTest(oslotest.base.BaseTestCase): def setUp(self): super(PeriodicTest, self).setUp() - - opts = { - "producer_task:dummy": RoObject({ - "per_page": 100, - }) - } - self.setup_opts(opts) + self.useFixture(cfg_fixture.Config(CONF)) self.task = DummyTask() self.task.my_partitions = range(0, 10) @@ -111,17 +108,12 @@ class PeriodicTest(TaskTest): self.assertEqual((0, 9), self.task._my_range()) -class PeriodicExistsTest(TaskTest): +class PeriodicExistsTest(oslotest.base.BaseTestCase): def setUp(self): super(PeriodicExistsTest, self).setUp() + self.useFixture(cfg_fixture.Config(CONF)) - opts = { - "producer_task:periodic_exists": RoObject({ - "per_page": 100, - "interval": 5 - }) - } - self.setup_opts(opts) + CONF.set_override('interval', 5, 'producer_task:periodic_exists') # Mock a ctxt... self.ctxt = mock.Mock() @@ -196,16 +188,10 @@ class PeriodicExistsTest(TaskTest): self.ctxt, "dns.zone.exists", data) -class PeriodicSecondaryRefreshTest(TaskTest): +class PeriodicSecondaryRefreshTest(oslotest.base.BaseTestCase): def setUp(self): super(PeriodicSecondaryRefreshTest, self).setUp() - - opts = { - "producer_task:periodic_secondary_refresh": RoObject({ - "per_page": 100 - }) - } - self.setup_opts(opts) + self.useFixture(cfg_fixture.Config(CONF)) # Mock a ctxt... self.ctxt = mock.Mock() diff --git a/designate/utils.py b/designate/utils.py index 487b88b6a..98cad2268 100644 --- a/designate/utils.py +++ b/designate/utils.py @@ -82,30 +82,11 @@ def read_config(prog, argv): default_config_files=config_files) config.set_defaults() - register_plugin_opts() - # Avoid circular dependency imports from designate import pool_manager pool_manager.register_dynamic_pool_options() -def register_plugin_opts(): - # Avoid circular dependency imports - from designate import plugin - - # Register Producer Tasks - plugin.Plugin.register_cfg_opts('designate.producer_tasks') - plugin.Plugin.register_extra_cfg_opts('designate.producer_tasks') - - # Register Backend Plugin Config Options - plugin.Plugin.register_cfg_opts('designate.backend') - plugin.Plugin.register_extra_cfg_opts('designate.backend') - - # Register Agent Backend Plugin Config Options - plugin.Plugin.register_cfg_opts('designate.backend.agent_backend') - plugin.Plugin.register_extra_cfg_opts('designate.backend.agent_backend') - - def resource_string(*args): if len(args) == 0: raise ValueError()