Skip to content

Commit

Permalink
Refactor notify logic into backends
Browse files Browse the repository at this point in the history
The idea here is, like many things, the time and frequency of sending
NOTIFYs is not the same for every backend. So we let the backends decide
when to send their NOTIFYs. Ideally this makes the Pool Manager code simpler
and the backend code easier to understand, and avoids sending some
unnecessary NOTIFYs.

This requires a change to MiniDNS' rpcapi to make notify_zone_changed and
get_serial_number take a host and port, instead of a nameserver object.

Change-Id: I8d67cebeecc8261e715849aefeafd20f0d60d304
  • Loading branch information
TimSimmons committed Aug 12, 2015
1 parent bf84317 commit 520c32e
Show file tree
Hide file tree
Showing 16 changed files with 147 additions and 120 deletions.
2 changes: 1 addition & 1 deletion contrib/devstack/lib/designate_plugins/backend-bind9
Expand Up @@ -77,7 +77,7 @@ EOF
function configure_designate_backend {
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID type bind9
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID masters $DESIGNATE_SERVICE_HOST:$DESIGNATE_SERVICE_PORT_MDNS
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID options "rndc_host: $DESIGNATE_SERVICE_HOST, rndc_port: $DESIGNATE_SERVICE_PORT_RNDC, rndc_config_file: $BIND_CFG_DIR/rndc.conf, rndc_key_file: $BIND_CFG_DIR/rndc.key"
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID options "rndc_host: $DESIGNATE_SERVICE_HOST, rndc_port: $DESIGNATE_SERVICE_PORT_RNDC, rndc_config_file: $BIND_CFG_DIR/rndc.conf, rndc_key_file: $BIND_CFG_DIR/rndc.key, host: $DESIGNATE_SERVICE_HOST, port: $DESIGNATE_SERVICE_PORT_DNS"

# DevStack Managed BIND NameServer
local nameserver_id=`uuidgen`
Expand Down
1 change: 1 addition & 0 deletions contrib/devstack/lib/designate_plugins/backend-infoblox
Expand Up @@ -56,6 +56,7 @@ function install_designate_backend {
function configure_designate_backend {
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID type infoblox
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID masters $DESIGNATE_SERVICE_HOST:$DESIGNATE_SERVICE_PORT_MDNS
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID options "host: $DESIGNATE_INFOBLOX_NAMESERVER_IP, port: $DESIGNATE_SERVICE_PORT_DNS"

local nameserver_id=`uuidgen`
iniset $DESIGNATE_CONF pool:$DESIGNATE_POOL_ID nameservers $nameserver_id
Expand Down
2 changes: 1 addition & 1 deletion contrib/devstack/lib/designate_plugins/backend-powerdns
Expand Up @@ -56,7 +56,7 @@ function install_designate_backend {
function configure_designate_backend {
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID type powerdns
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID masters $DESIGNATE_SERVICE_HOST:$DESIGNATE_SERVICE_PORT_MDNS
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID options "connection: `database_connection_url designate_pdns`"
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID options "connection: `database_connection_url designate_pdns`, host: $DESIGNATE_SERVICE_HOST, port: $DESIGNATE_SERVICE_PORT_DNS"

# DevStack Managed PDNS NameServer
local nameserver_id=`uuidgen`
Expand Down
57 changes: 41 additions & 16 deletions designate/backend/agent.py
Expand Up @@ -30,14 +30,25 @@
from designate.backend import base
from designate import exceptions
from designate.mdns import rpcapi as mdns_api
from designate import objects


dns_query = eventlet.import_patched('dns.query')

LOG = logging.getLogger(__name__)
CONF = cfg.CONF

# Command and Control OPCODE
CC = 14

# Private DNS CLASS Uses
CLASSCC = 65280

# Private RR Code Uses
SUCCESS = 65280
FAILURE = 65281
CREATE = 65282
DELETE = 65283


class AgentPoolBackend(base.Backend):
__plugin_name__ = 'agent'
Expand All @@ -46,8 +57,8 @@ class AgentPoolBackend(base.Backend):

def __init__(self, target):
super(AgentPoolBackend, self).__init__(target)
self.host = self.options.get('host')
self.port = int(self.options.get('port'))
self.host = self.options.get('host', '127.0.0.1')
self.port = int(self.options.get('port', 53))
self.timeout = CONF['service:pool_manager'].poll_timeout
self.retry_interval = CONF['service:pool_manager'].poll_retry_interval
self.max_retries = CONF['service:pool_manager'].poll_max_retries
Expand All @@ -58,29 +69,43 @@ def mdns_api(self):

def create_domain(self, context, domain):
LOG.debug('Create Domain')
response, retry = self._make_and_send_dns_message(domain.name, 15, 14,
65282, 65280, self.host, self.port)
response, retry = self._make_and_send_dns_message(
domain.name,
self.timeout,
CC,
CREATE,
CLASSCC,
self.host,
self.port
)
if response is None:
raise exceptions.Backend()

def update_domain(self, context, domain):
LOG.debug('Update Domain')

values = {
'host': self.host,
'port': self.port,
'pool_id': CONF['service:central'].default_pool_id
}
nameserver = objects.PoolNameserver(**values)

self.mdns_api.notify_zone_changed(
context, domain, nameserver, self.timeout,
self.retry_interval, self.max_retries, 0)
context,
domain,
self.host,
self.port,
self.timeout,
self.retry_interval,
self.max_retries,
self.delay
)

def delete_domain(self, context, domain):
LOG.debug('Delete Domain')
response, retry = self._make_and_send_dns_message(domain.name, 15, 14,
65283, 65280, self.host, self.port)
response, retry = self._make_and_send_dns_message(
domain.name,
self.timeout,
CC,
DELETE,
CLASSCC,
self.host,
self.port
)
if response is None:
raise exceptions.Backend()

Expand Down
18 changes: 18 additions & 0 deletions designate/backend/base.py
Expand Up @@ -21,6 +21,7 @@
from designate.i18n import _LI
from designate.context import DesignateContext
from designate.plugin import DriverPlugin
from designate.mdns import rpcapi as mdns_api


LOG = logging.getLogger(__name__)
Expand All @@ -41,17 +42,29 @@ def __init__(self, target):
self.target = target
self.options = target.options
self.masters = target.masters
self.host = self.options.get('host', '127.0.0.1')
self.port = int(self.options.get('port', 53))

# TODO(kiall): Context's should never be shared accross requests.
self.admin_context = DesignateContext.get_admin_context()
self.admin_context.all_tenants = True

# Options for sending NOTIFYs
self.timeout = CONF['service:pool_manager'].poll_timeout
self.retry_interval = CONF['service:pool_manager'].poll_retry_interval
self.max_retries = CONF['service:pool_manager'].poll_max_retries
self.delay = CONF['service:pool_manager'].poll_delay

def start(self):
LOG.info(_LI('Starting %s backend'), self.get_canonical_name())

def stop(self):
LOG.info(_LI('Stopped %s backend'), self.get_canonical_name())

@property
def mdns_api(self):
return mdns_api.MdnsAPI.get_instance()

# Core Backend Interface
@abc.abstractmethod
def create_domain(self, context, domain):
Expand All @@ -69,6 +82,11 @@ def update_domain(self, context, domain):
:param context: Security context information.
:param domain: the DNS domain.
"""
LOG.debug('Update Domain')

self.mdns_api.notify_zone_changed(
context, domain, self.host, self.port, self.timeout,
self.retry_interval, self.max_retries, self.delay)

@abc.abstractmethod
def delete_domain(self, context, domain):
Expand Down
6 changes: 6 additions & 0 deletions designate/backend/impl_bind9.py
Expand Up @@ -35,6 +35,8 @@ class Bind9Backend(base.Backend):
def __init__(self, target):
super(Bind9Backend, self).__init__(target)

self.host = self.options.get('host', '127.0.0.1')
self.port = int(self.options.get('port', 53))
self.rndc_host = self.options.get('rndc_host', '127.0.0.1')
self.rndc_port = int(self.options.get('rndc_port', 953))
self.rndc_config_file = self.options.get('rndc_config_file')
Expand Down Expand Up @@ -65,6 +67,10 @@ def create_domain(self, context, domain):
if "already exists" not in six.text_type(e):
raise

self.mdns_api.notify_zone_changed(
context, domain, self.host, self.port, self.timeout,
self.retry_interval, self.max_retries, self.delay)

def delete_domain(self, context, domain):
LOG.debug('Delete Domain')
rndc_op = [
Expand Down
3 changes: 0 additions & 3 deletions designate/backend/impl_dynect.py
Expand Up @@ -377,9 +377,6 @@ def create_domain(self, context, domain):
client.put(url, data={'activate': True})
client.logout()

def update_domain(self, context, domain):
LOG.debug('Discarding update_domain call, not-applicable')

def delete_domain(self, context, domain):
LOG.info(_LI('Deleting domain %(d_id)s / %(d_name)s') %
{'d_id': domain['id'], 'd_name': domain['name']})
Expand Down
4 changes: 0 additions & 4 deletions designate/backend/impl_infoblox/__init__.py
Expand Up @@ -51,10 +51,6 @@ def create_domain(self, context, domain):
dns_view=dns_net_view
)

def update_domain(self, context, domain):
# Since all updates are done via zone transfer, there is nothing to do
LOG.info(_LI('Update Domain %r') % domain)

def delete_domain(self, context, domain):
LOG.info(_LI('Delete Domain %r') % domain)
self.infoblox.delete_zone_auth(domain['name'][0:-1])
Expand Down
6 changes: 6 additions & 0 deletions designate/backend/impl_powerdns/__init__.py
Expand Up @@ -55,6 +55,8 @@ def get_cfg_opts(cls):
def __init__(self, target):
super(PowerDNSBackend, self).__init__(target)

self.host = self.options.get('host', '127.0.0.1')
self.port = int(self.options.get('port', 53))
self.local_store = threading.local()

default_connection = 'sqlite:///%(state_path)s/powerdns.sqlite' % {
Expand Down Expand Up @@ -140,6 +142,10 @@ def _parse_master(master):
else:
self.session.commit()

self.mdns_api.notify_zone_changed(
context, domain, self.host, self.port, self.timeout,
self.retry_interval, self.max_retries, self.delay)

def delete_domain(self, context, domain):
# TODO(kiall): We should make this match create_domain with regard to
# transactions.
Expand Down

0 comments on commit 520c32e

Please sign in to comment.