Remove the non-pools bind9 backend
Change-Id: Id04a0d6b76244d5f3b22b637e79bf05209287ad3
This commit is contained in:
@@ -4,20 +4,13 @@ set -ex
|
|||||||
|
|
||||||
pushd $BASE/new/devstack
|
pushd $BASE/new/devstack
|
||||||
|
|
||||||
|
DEVSTACK_GATE_DESIGNATE_DRIVER=${DEVSTACK_GATE_DESIGNATE_DRIVER:-powerdns}
|
||||||
|
|
||||||
export KEEP_LOCALRC=1
|
export KEEP_LOCALRC=1
|
||||||
export ENABLED_SERVICES=designate,designate-api,designate-central,designate-sink,designate-mdns,designate-pool-manager
|
export ENABLED_SERVICES=designate,designate-api,designate-central,designate-sink,designate-mdns,designate-pool-manager
|
||||||
|
|
||||||
echo "DESIGNATE_SERVICE_PORT_DNS=5322" >> $BASE/new/devstack/localrc
|
echo "DESIGNATE_SERVICE_PORT_DNS=5322" >> $BASE/new/devstack/localrc
|
||||||
|
echo "DESIGNATE_BACKEND_DRIVER=$DEVSTACK_GATE_DESIGNATE_DRIVER" >> $BASE/new/devstack/localrc
|
||||||
DEVSTACK_GATE_DESIGNATE_DRIVER=${DEVSTACK_GATE_DESIGNATE_DRIVER:-powerdns}
|
|
||||||
|
|
||||||
if [ "$DEVSTACK_GATE_DESIGNATE_DRIVER" == "powerdns" ]; then
|
|
||||||
echo "DESIGNATE_BACKEND_DRIVER=powerdns" >> $BASE/new/devstack/localrc
|
|
||||||
|
|
||||||
elif [ "$DEVSTACK_GATE_DESIGNATE_DRIVER" == "bind9" ]; then
|
|
||||||
echo "DESIGNATE_BACKEND_DRIVER=bind9_pool" >> $BASE/new/devstack/localrc
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
popd
|
popd
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
# lib/designate_plugins/backend-bind9
|
# lib/designate_plugins/backend-bind9
|
||||||
# Configure the bind9 backend
|
# Configure the bind9 pool backend
|
||||||
|
|
||||||
# Enable with:
|
# Enable with:
|
||||||
# DESIGNATE_BACKEND_DRIVER=bind9
|
# DESIGNATE_BACKEND_DRIVER=bind9
|
||||||
@@ -75,11 +75,18 @@ EOF
|
|||||||
|
|
||||||
# configure_designate_backend - make configuration changes, including those to other services
|
# configure_designate_backend - make configuration changes, including those to other services
|
||||||
function configure_designate_backend {
|
function configure_designate_backend {
|
||||||
|
iniset $DESIGNATE_CONF service:pool_manager backends bind9
|
||||||
|
iniset $DESIGNATE_CONF service:mdns slave_nameserver_ips_and_ports "$DESIGNATE_SERVICE_HOST:$DESIGNATE_SERVICE_PORT_DNS"
|
||||||
|
|
||||||
|
iniset $DESIGNATE_CONF backend:bind9 masters $DESIGNATE_SERVICE_HOST:$DESIGNATE_SERVICE_PORT_MDNS
|
||||||
|
iniset $DESIGNATE_CONF backend:bind9 server_ids $DESIGNATE_SERVER_ID
|
||||||
iniset $DESIGNATE_CONF backend:bind9 rndc_port $DESIGNATE_SERVICE_PORT_RNDC
|
iniset $DESIGNATE_CONF backend:bind9 rndc_port $DESIGNATE_SERVICE_PORT_RNDC
|
||||||
iniset $DESIGNATE_CONF backend:bind9 rndc_host $DESIGNATE_SERVICE_HOST
|
iniset $DESIGNATE_CONF backend:bind9 rndc_host $DESIGNATE_SERVICE_HOST
|
||||||
iniset $DESIGNATE_CONF backend:bind9 rndc_config_file "$BIND_CFG_DIR/rndc.conf"
|
iniset $DESIGNATE_CONF backend:bind9 rndc_config_file "$BIND_CFG_DIR/rndc.conf"
|
||||||
iniset $DESIGNATE_CONF backend:bind9 rndc_key_file "$BIND_CFG_DIR/rndc.key"
|
iniset $DESIGNATE_CONF backend:bind9 rndc_key_file "$BIND_CFG_DIR/rndc.key"
|
||||||
iniset $DESIGNATE_CONF backend:bind9 nzf_path "$BIND_VAR_DIR"
|
|
||||||
|
iniset $DESIGNATE_CONF backend:bind9:$DESIGNATE_SERVER_ID host $DESIGNATE_SERVICE_HOST
|
||||||
|
iniset $DESIGNATE_CONF backend:bind9:$DESIGNATE_SERVER_ID port $DESIGNATE_SERVICE_PORT_DNS
|
||||||
|
|
||||||
sudo chown $STACK_USER $BIND_CFG_DIR
|
sudo chown $STACK_USER $BIND_CFG_DIR
|
||||||
|
|
||||||
@@ -140,7 +147,7 @@ function stop_designate_backend {
|
|||||||
# cleanup_designate_backend - remove transient data and cache
|
# cleanup_designate_backend - remove transient data and cache
|
||||||
function cleanup_designate_backend {
|
function cleanup_designate_backend {
|
||||||
sudo sh -c "rm -rf $BIND_VAR_DIR/*.nzf"
|
sudo sh -c "rm -rf $BIND_VAR_DIR/*.nzf"
|
||||||
sudo sh -c "rm -rf $DESIGNATE_STATE_PATH/*.zone"
|
sudo sh -c "rm -rf $BIND_VAR_DIR/slave.*"
|
||||||
sudo rm -f $BIND_CFG_DIR/rndc.key
|
sudo rm -f $BIND_CFG_DIR/rndc.key
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,155 +0,0 @@
|
|||||||
# lib/designate_plugins/backend-bind9_pool
|
|
||||||
# Configure the bind9 pool backend
|
|
||||||
|
|
||||||
# Enable with:
|
|
||||||
# DESIGNATE_BACKEND_DRIVER=bind9_pool
|
|
||||||
|
|
||||||
# Dependencies:
|
|
||||||
# ``functions`` file
|
|
||||||
# ``designate`` configuration
|
|
||||||
|
|
||||||
# install_designate_backend - install any external requirements
|
|
||||||
# configure_designate_backend - make configuration changes, including those to other services
|
|
||||||
# init_designate_backend - initialize databases, etc.
|
|
||||||
# start_designate_backend - start any external services
|
|
||||||
# stop_designate_backend - stop any external services
|
|
||||||
# cleanup_designate_backend - remove transient data and cache
|
|
||||||
|
|
||||||
# Save trace setting
|
|
||||||
DP_BIND9_XTRACE=$(set +o | grep xtrace)
|
|
||||||
set +o xtrace
|
|
||||||
|
|
||||||
# Defaults
|
|
||||||
# --------
|
|
||||||
BIND_SERVICE_NAME=bind9
|
|
||||||
BIND_CFG_DIR=/etc/bind
|
|
||||||
BIND_VAR_DIR=/var/cache/bind
|
|
||||||
BIND_CFG_FILE=$BIND_CFG_DIR/named.conf.options
|
|
||||||
BIND_USER=bind
|
|
||||||
BIND_GROUP=bind
|
|
||||||
DESIGNATE_SERVICE_PORT_RNDC=${DESIGNATE_SERVICE_PORT_RNDC:-953}
|
|
||||||
|
|
||||||
if is_fedora; then
|
|
||||||
BIND_SERVICE_NAME=named
|
|
||||||
BIND_CFG_DIR=/etc/named
|
|
||||||
BIND_CFG_FILE=/etc/named.conf
|
|
||||||
BIND_VAR_DIR=/var/named
|
|
||||||
BIND_USER=named
|
|
||||||
BIND_GROUP=named
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Entry Points
|
|
||||||
# ------------
|
|
||||||
|
|
||||||
# install_designate_backend - install any external requirements
|
|
||||||
function install_designate_backend {
|
|
||||||
if is_ubuntu; then
|
|
||||||
install_package bind9
|
|
||||||
elif is_fedora; then
|
|
||||||
install_package named
|
|
||||||
fi
|
|
||||||
|
|
||||||
# The user that designate runs as needs to be member of **$BIND_GROUP** group.
|
|
||||||
# The designate bind9 backend needs read/write access to $BIND_VAR_DIR
|
|
||||||
if ! getent group $BIND_GROUP >/dev/null; then
|
|
||||||
sudo groupadd $BIND_GROUP
|
|
||||||
fi
|
|
||||||
add_user_to_group $STACK_USER $BIND_GROUP
|
|
||||||
if [[ ! -d $BIND_CFG_DIR ]]; then
|
|
||||||
sudo mkdir -p $BIND_CFG_DIR
|
|
||||||
sudo chown $BIND_USER:$BIND_GROUP $BIND_CFG_DIR
|
|
||||||
fi
|
|
||||||
|
|
||||||
sudo chown -R $BIND_USER:$BIND_GROUP $BIND_CFG_DIR $BIND_VAR_DIR
|
|
||||||
sudo chmod -R g+r $BIND_CFG_DIR
|
|
||||||
sudo chmod -R g+rw $BIND_VAR_DIR
|
|
||||||
|
|
||||||
# Customize Bind9 apparmor profile if installed
|
|
||||||
if [[ -d /etc/apparmor.d ]]; then
|
|
||||||
sudo tee /etc/apparmor.d/local/usr.sbin.named > /dev/null << EOF
|
|
||||||
$DESIGNATE_STATE_PATH/bind9/** rw,
|
|
||||||
EOF
|
|
||||||
restart_service apparmor
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# configure_designate_backend - make configuration changes, including those to other services
|
|
||||||
function configure_designate_backend {
|
|
||||||
iniset $DESIGNATE_CONF service:pool_manager backends bind9_pool
|
|
||||||
iniset $DESIGNATE_CONF service:mdns slave_nameserver_ips_and_ports "$DESIGNATE_SERVICE_HOST:$DESIGNATE_SERVICE_PORT_DNS"
|
|
||||||
|
|
||||||
iniset $DESIGNATE_CONF backend:bind9_pool masters $DESIGNATE_SERVICE_HOST:$DESIGNATE_SERVICE_PORT_MDNS
|
|
||||||
iniset $DESIGNATE_CONF backend:bind9_pool server_ids $DESIGNATE_SERVER_ID
|
|
||||||
iniset $DESIGNATE_CONF backend:bind9_pool rndc_port $DESIGNATE_SERVICE_PORT_RNDC
|
|
||||||
iniset $DESIGNATE_CONF backend:bind9_pool rndc_host $DESIGNATE_SERVICE_HOST
|
|
||||||
iniset $DESIGNATE_CONF backend:bind9_pool rndc_config_file "$BIND_CFG_DIR/rndc.conf"
|
|
||||||
iniset $DESIGNATE_CONF backend:bind9_pool rndc_key_file "$BIND_CFG_DIR/rndc.key"
|
|
||||||
|
|
||||||
iniset $DESIGNATE_CONF backend:bind9_pool:$DESIGNATE_SERVER_ID host $DESIGNATE_SERVICE_HOST
|
|
||||||
iniset $DESIGNATE_CONF backend:bind9_pool:$DESIGNATE_SERVER_ID port $DESIGNATE_SERVICE_PORT_DNS
|
|
||||||
|
|
||||||
sudo chown $STACK_USER $BIND_CFG_DIR
|
|
||||||
|
|
||||||
# create rndc key and config
|
|
||||||
sudo rndc-confgen -a -c $BIND_CFG_DIR/rndc.key
|
|
||||||
sudo chown $BIND_USER:$BIND_GROUP $BIND_CFG_DIR/rndc.key
|
|
||||||
sudo chmod g+r $BIND_CFG_DIR/rndc.key
|
|
||||||
|
|
||||||
# Configure Bind
|
|
||||||
sudo tee $BIND_CFG_FILE > /dev/null <<EOF
|
|
||||||
include "$BIND_CFG_DIR/rndc.key";
|
|
||||||
|
|
||||||
options {
|
|
||||||
directory "$BIND_VAR_DIR";
|
|
||||||
allow-new-zones yes;
|
|
||||||
dnssec-validation auto;
|
|
||||||
auth-nxdomain no; # conform to RFC1035
|
|
||||||
listen-on port $DESIGNATE_SERVICE_PORT_DNS { $DESIGNATE_SERVICE_HOST; };
|
|
||||||
};
|
|
||||||
|
|
||||||
controls {
|
|
||||||
inet $DESIGNATE_SERVICE_HOST port $DESIGNATE_SERVICE_PORT_RNDC allow { $DESIGNATE_SERVICE_HOST; } keys { "rndc-key"; };
|
|
||||||
};
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Configure RNDC
|
|
||||||
sudo tee $BIND_CFG_DIR/rndc.conf > /dev/null << EOF
|
|
||||||
include "$BIND_CFG_DIR/rndc.key";
|
|
||||||
|
|
||||||
options {
|
|
||||||
default-key "rndc-key";
|
|
||||||
default-server $DESIGNATE_SERVICE_HOST;
|
|
||||||
default-port $DESIGNATE_SERVICE_PORT_RNDC;
|
|
||||||
};
|
|
||||||
EOF
|
|
||||||
|
|
||||||
sudo chown $BIND_USER:$BIND_GROUP $BIND_CFG_FILE $BIND_CFG_DIR/rndc.conf
|
|
||||||
sudo chmod g+r $BIND_CFG_FILE $BIND_CFG_DIR/rndc.conf
|
|
||||||
|
|
||||||
restart_service $BIND_SERVICE_NAME
|
|
||||||
}
|
|
||||||
|
|
||||||
# init_designate_backend - initialize databases, etc.
|
|
||||||
function init_designate_backend {
|
|
||||||
:
|
|
||||||
}
|
|
||||||
|
|
||||||
# start_designate_backend - start any external services
|
|
||||||
function start_designate_backend {
|
|
||||||
start_service bind9
|
|
||||||
}
|
|
||||||
|
|
||||||
# stop_designate_backend - stop any external services
|
|
||||||
function stop_designate_backend {
|
|
||||||
stop_service bind9
|
|
||||||
}
|
|
||||||
|
|
||||||
# cleanup_designate_backend - remove transient data and cache
|
|
||||||
function cleanup_designate_backend {
|
|
||||||
sudo sh -c "rm -rf $BIND_VAR_DIR/*.nzf"
|
|
||||||
sudo sh -c "rm -rf $BIND_VAR_DIR/slave.*"
|
|
||||||
sudo rm -f $BIND_CFG_DIR/rndc.key
|
|
||||||
}
|
|
||||||
|
|
||||||
# Restore xtrace
|
|
||||||
$DP_BIND9_XTRACE
|
|
@@ -1,6 +1,6 @@
|
|||||||
# Copyright 2012 Managed I.T.
|
# Copyright 2014 eBay Inc.
|
||||||
#
|
#
|
||||||
# Author: Kiall Mac Innes <kiall@managedit.ie>
|
# Author: Ron Rickard <rrickard@ebay.com>
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
# not use this file except in compliance with the License. You may obtain
|
# not use this file except in compliance with the License. You may obtain
|
||||||
@@ -13,214 +13,113 @@
|
|||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
import os
|
import socket
|
||||||
import glob
|
|
||||||
import shutil
|
|
||||||
import time
|
|
||||||
|
|
||||||
from oslo.config import cfg
|
from oslo.config import cfg
|
||||||
from oslo_concurrency import lockutils
|
|
||||||
|
|
||||||
from designate.openstack.common import log as logging
|
from designate.openstack.common import log as logging
|
||||||
from designate.i18n import _LW
|
from designate import exceptions
|
||||||
from designate import utils
|
from designate import utils
|
||||||
from designate.backend import base
|
from designate.backend import base
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
CONF = cfg.CONF
|
||||||
|
CFG_GROUP = 'backend:bind9_pool'
|
||||||
|
DEFAULT_PORT = 5354
|
||||||
|
|
||||||
|
|
||||||
class Bind9Backend(base.Backend):
|
class Bind9Backend(base.PoolBackend):
|
||||||
__plugin_name__ = 'bind9'
|
__plugin_name__ = 'bind9'
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_cfg_opts(cls):
|
def _get_common_cfg_opts(cls):
|
||||||
group = cfg.OptGroup(
|
return [
|
||||||
name='backend:bind9', title="Configuration for BIND9 Backend"
|
|
||||||
)
|
|
||||||
|
|
||||||
opts = [
|
|
||||||
cfg.StrOpt('rndc-host', default='127.0.0.1', help='RNDC Host'),
|
cfg.StrOpt('rndc-host', default='127.0.0.1', help='RNDC Host'),
|
||||||
cfg.IntOpt('rndc-port', default=953, help='RNDC Port'),
|
cfg.IntOpt('rndc-port', default=953, help='RNDC Port'),
|
||||||
cfg.StrOpt('rndc-config-file', default=None,
|
cfg.StrOpt('rndc-config-file', default=None,
|
||||||
help='RNDC Config File'),
|
help='RNDC Config File'),
|
||||||
cfg.StrOpt('rndc-key-file', default=None, help='RNDC Key File'),
|
cfg.StrOpt('rndc-key-file', default=None, help='RNDC Key File'),
|
||||||
cfg.StrOpt('nzf-path', default='/var/cache/bind',
|
|
||||||
help='Path where Bind9 stores the nzf files'),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
return [(group, opts)]
|
def __init__(self, backend_options):
|
||||||
|
super(Bind9Backend, self).__init__(backend_options)
|
||||||
def start(self):
|
self.masters = [self._parse_master(master)
|
||||||
super(Bind9Backend, self).start()
|
for master in self.get_backend_option('masters')]
|
||||||
|
self.rndc_host = self.get_backend_option('rndc_host')
|
||||||
domains = self.central_service.find_domains(self.admin_context)
|
self.rndc_port = self.get_backend_option('rndc_port')
|
||||||
|
self.rndc_config_file = self.get_backend_option('rndc_config_file')
|
||||||
for domain in domains:
|
self.rndc_key_file = self.get_backend_option('rndc_key_file')
|
||||||
rndc_op = 'reload'
|
|
||||||
rndc_call = self._rndc_base() + [rndc_op]
|
|
||||||
rndc_call.extend([domain['name']])
|
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _parse_master(master):
|
||||||
try:
|
try:
|
||||||
LOG.debug('Calling RNDC with: %s' % " ".join(rndc_call))
|
(ip_address, port) = master.split(':', 1)
|
||||||
utils.execute(*rndc_call)
|
except ValueError:
|
||||||
except utils.processutils.ProcessExecutionError as proc_exec_err:
|
ip_address = str(master)
|
||||||
stderr = proc_exec_err.stderr
|
port = DEFAULT_PORT
|
||||||
if stderr.count("rndc: 'reload' failed: not found") is not 0:
|
try:
|
||||||
LOG.warn(_LW("Domain %(d_name)s (%(d_id)s) "
|
port = int(port)
|
||||||
"missing from backend, recreating") %
|
except ValueError:
|
||||||
{'d_name': domain['name'], 'd_id': domain['id']})
|
raise exceptions.ConfigurationError(
|
||||||
self._sync_domain(domain, new_domain_flag=True)
|
'Invalid port "%s" in masters option.' % port)
|
||||||
else:
|
if port < 0 or port > 65535:
|
||||||
raise proc_exec_err
|
raise exceptions.ConfigurationError(
|
||||||
|
'Port "%s" is not between 0 and 65535 in masters option.' %
|
||||||
|
port)
|
||||||
|
try:
|
||||||
|
socket.inet_pton(socket.AF_INET, ip_address)
|
||||||
|
except socket.error:
|
||||||
|
raise exceptions.ConfigurationError(
|
||||||
|
'Invalid IP address "%s" in masters option.' % ip_address)
|
||||||
|
return {'ip-address': ip_address, 'port': port}
|
||||||
|
|
||||||
def create_domain(self, context, domain):
|
def create_domain(self, context, domain):
|
||||||
LOG.debug('Create Domain')
|
LOG.debug('Create Domain')
|
||||||
self._sync_domain(domain, new_domain_flag=True)
|
masters = []
|
||||||
|
for master in self.masters:
|
||||||
def update_domain(self, context, domain):
|
ip_address = master['ip-address']
|
||||||
LOG.debug('Update Domain')
|
port = master['port']
|
||||||
self._sync_domain(domain)
|
masters.append('%s port %s' % (ip_address, port))
|
||||||
|
rndc_op = [
|
||||||
|
'addzone',
|
||||||
|
'%s { type slave; masters { %s;}; file "slave.%s%s"; };' %
|
||||||
|
(domain['name'].rstrip('.'), '; '.join(masters), domain['name'],
|
||||||
|
domain['id']),
|
||||||
|
]
|
||||||
|
self._execute_rndc(rndc_op)
|
||||||
|
|
||||||
def delete_domain(self, context, domain):
|
def delete_domain(self, context, domain):
|
||||||
LOG.debug('Delete Domain')
|
LOG.debug('Delete Domain')
|
||||||
self._sync_delete_domain(domain)
|
rndc_op = [
|
||||||
|
'delzone',
|
||||||
def create_recordset(self, context, domain, recordset):
|
'%s' % domain['name'].rstrip('.'),
|
||||||
LOG.debug('Create RecordSet')
|
]
|
||||||
self._sync_domain(domain)
|
self._execute_rndc(rndc_op)
|
||||||
|
|
||||||
def update_recordset(self, context, domain, recordset):
|
|
||||||
LOG.debug('Update RecordSet')
|
|
||||||
self._sync_domain(domain)
|
|
||||||
|
|
||||||
def delete_recordset(self, context, domain, recordset):
|
|
||||||
LOG.debug('Delete RecordSet')
|
|
||||||
self._sync_domain(domain)
|
|
||||||
|
|
||||||
def create_record(self, context, domain, recordset, record):
|
|
||||||
LOG.debug('Create Record')
|
|
||||||
self._sync_domain(domain)
|
|
||||||
|
|
||||||
def update_record(self, context, domain, recordset, record):
|
|
||||||
LOG.debug('Update Record')
|
|
||||||
self._sync_domain(domain)
|
|
||||||
|
|
||||||
def delete_record(self, context, domain, recordset, record):
|
|
||||||
LOG.debug('Delete Record')
|
|
||||||
self._sync_domain(domain)
|
|
||||||
|
|
||||||
def _rndc_base(self):
|
def _rndc_base(self):
|
||||||
rndc_call = [
|
rndc_call = [
|
||||||
'rndc',
|
'rndc',
|
||||||
'-s', cfg.CONF[self.name].rndc_host,
|
'-s', self.rndc_host,
|
||||||
'-p', str(cfg.CONF[self.name].rndc_port),
|
'-p', str(self.rndc_port),
|
||||||
]
|
]
|
||||||
|
|
||||||
if cfg.CONF[self.name].rndc_config_file:
|
if self.rndc_config_file:
|
||||||
rndc_call.extend(['-c', cfg.CONF[self.name].rndc_config_file])
|
rndc_call.extend(
|
||||||
|
['-c', self.rndc_config_file])
|
||||||
|
|
||||||
if cfg.CONF[self.name].rndc_key_file:
|
if self.rndc_key_file:
|
||||||
rndc_call.extend(['-k', cfg.CONF[self.name].rndc_key_file])
|
rndc_call.extend(
|
||||||
|
['-k', self.rndc_key_file])
|
||||||
|
|
||||||
return rndc_call
|
return rndc_call
|
||||||
|
|
||||||
def _sync_delete_domain(self, domain, new_domain_flag=False):
|
def _execute_rndc(self, rndc_op):
|
||||||
"""Remove domain zone files and reload bind config"""
|
try:
|
||||||
LOG.debug('Delete Domain: %s' % domain['id'])
|
|
||||||
|
|
||||||
output_folder = os.path.join(os.path.abspath(cfg.CONF.state_path),
|
|
||||||
'bind9')
|
|
||||||
|
|
||||||
output_path = os.path.join(output_folder, '%s.zone' %
|
|
||||||
"_".join([domain['name'], domain['id']]))
|
|
||||||
|
|
||||||
os.remove(output_path)
|
|
||||||
|
|
||||||
rndc_op = 'delzone'
|
|
||||||
|
|
||||||
rndc_call = self._rndc_base() + [rndc_op, domain['name']]
|
|
||||||
|
|
||||||
utils.execute(*rndc_call)
|
|
||||||
|
|
||||||
# This goes and gets the name of the .nzf file that is a mirror of the
|
|
||||||
# zones.config file we wish to maintain. The file name can change as it
|
|
||||||
# is a hash of rndc view name, we're only interested in the first file
|
|
||||||
# name this returns because there is only one .nzf file
|
|
||||||
nzf_name = glob.glob('%s/*.nzf' % cfg.CONF[self.name].nzf_path)
|
|
||||||
|
|
||||||
output_file = os.path.join(output_folder, 'zones.config')
|
|
||||||
|
|
||||||
shutil.copyfile(nzf_name[0], output_file)
|
|
||||||
|
|
||||||
def _sync_domain(self, domain, new_domain_flag=False):
|
|
||||||
"""Sync a single domain's zone file and reload bind config"""
|
|
||||||
|
|
||||||
# NOTE: Only one thread should be working with the Zonefile at a given
|
|
||||||
# time. The sleep(1) below introduces a not insignificant risk
|
|
||||||
# of more than 1 thread working with a zonefile at a given time.
|
|
||||||
with lockutils.lock('bind9-%s' % domain['id']):
|
|
||||||
LOG.debug('Synchronising Domain: %s' % domain['id'])
|
|
||||||
|
|
||||||
recordsets = self.central_service.find_recordsets(
|
|
||||||
self.admin_context, {'domain_id': domain['id']})
|
|
||||||
|
|
||||||
records = []
|
|
||||||
|
|
||||||
for recordset in recordsets:
|
|
||||||
criterion = {
|
|
||||||
'domain_id': domain['id'],
|
|
||||||
'recordset_id': recordset['id']
|
|
||||||
}
|
|
||||||
|
|
||||||
raw_records = self.central_service.find_records(
|
|
||||||
self.admin_context, criterion)
|
|
||||||
|
|
||||||
for record in raw_records:
|
|
||||||
records.append({
|
|
||||||
'name': recordset['name'],
|
|
||||||
'type': recordset['type'],
|
|
||||||
'ttl': recordset['ttl'],
|
|
||||||
'data': record['data'],
|
|
||||||
})
|
|
||||||
|
|
||||||
output_folder = os.path.join(os.path.abspath(cfg.CONF.state_path),
|
|
||||||
'bind9')
|
|
||||||
|
|
||||||
output_name = "_".join([domain['name'], domain['id']])
|
|
||||||
output_path = os.path.join(output_folder, '%s.zone' % output_name)
|
|
||||||
|
|
||||||
utils.render_template_to_file('bind9-zone.jinja2',
|
|
||||||
output_path,
|
|
||||||
domain=domain,
|
|
||||||
records=records)
|
|
||||||
|
|
||||||
rndc_call = self._rndc_base()
|
rndc_call = self._rndc_base()
|
||||||
|
|
||||||
if new_domain_flag:
|
|
||||||
rndc_op = [
|
|
||||||
'addzone',
|
|
||||||
'%s { type master; file "%s"; };' % (domain['name'],
|
|
||||||
output_path),
|
|
||||||
]
|
|
||||||
rndc_call.extend(rndc_op)
|
rndc_call.extend(rndc_op)
|
||||||
else:
|
LOG.debug('Executing RNDC call: %s' % " ".join(rndc_call))
|
||||||
rndc_op = 'reload'
|
|
||||||
rndc_call.extend([rndc_op])
|
|
||||||
rndc_call.extend([domain['name']])
|
|
||||||
|
|
||||||
if not new_domain_flag:
|
|
||||||
# NOTE: Bind9 will only ever attempt to re-read a zonefile if
|
|
||||||
# the file's timestamp has changed since the previous
|
|
||||||
# reload. A one second sleep ensures we cross over a
|
|
||||||
# second boundary before allowing the next change.
|
|
||||||
time.sleep(1)
|
|
||||||
|
|
||||||
LOG.debug('Calling RNDC with: %s' % " ".join(rndc_call))
|
|
||||||
utils.execute(*rndc_call)
|
utils.execute(*rndc_call)
|
||||||
|
except utils.processutils.ProcessExecutionError as e:
|
||||||
nzf_name = glob.glob('%s/*.nzf' % cfg.CONF[self.name].nzf_path)
|
LOG.debug('RNDC call failure: %s' % e)
|
||||||
|
raise exceptions.Backend(e)
|
||||||
output_file = os.path.join(output_folder, 'zones.config')
|
|
||||||
|
|
||||||
shutil.copyfile(nzf_name[0], output_file)
|
|
||||||
|
@@ -1,123 +0,0 @@
|
|||||||
# Copyright 2014 eBay Inc.
|
|
||||||
#
|
|
||||||
# Author: Ron Rickard <rrickard@ebay.com>
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# 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 socket
|
|
||||||
|
|
||||||
from oslo.config import cfg
|
|
||||||
|
|
||||||
from designate.openstack.common import log as logging
|
|
||||||
from designate import exceptions
|
|
||||||
from designate import utils
|
|
||||||
from designate.backend import base
|
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
DEFAULT_PORT = 5354
|
|
||||||
|
|
||||||
|
|
||||||
class Bind9PoolBackend(base.PoolBackend):
|
|
||||||
__plugin_name__ = 'bind9_pool'
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _get_common_cfg_opts(cls):
|
|
||||||
return [
|
|
||||||
cfg.StrOpt('rndc-host', default='127.0.0.1', help='RNDC Host'),
|
|
||||||
cfg.IntOpt('rndc-port', default=953, help='RNDC Port'),
|
|
||||||
cfg.StrOpt('rndc-config-file', default=None,
|
|
||||||
help='RNDC Config File'),
|
|
||||||
cfg.StrOpt('rndc-key-file', default=None, help='RNDC Key File'),
|
|
||||||
]
|
|
||||||
|
|
||||||
def __init__(self, backend_options):
|
|
||||||
super(Bind9PoolBackend, self).__init__(backend_options)
|
|
||||||
self.masters = [self._parse_master(master)
|
|
||||||
for master in self.get_backend_option('masters')]
|
|
||||||
self.rndc_host = self.get_backend_option('rndc_host')
|
|
||||||
self.rndc_port = self.get_backend_option('rndc_port')
|
|
||||||
self.rndc_config_file = self.get_backend_option('rndc_config_file')
|
|
||||||
self.rndc_key_file = self.get_backend_option('rndc_key_file')
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _parse_master(master):
|
|
||||||
try:
|
|
||||||
(ip_address, port) = master.split(':', 1)
|
|
||||||
except ValueError:
|
|
||||||
ip_address = str(master)
|
|
||||||
port = DEFAULT_PORT
|
|
||||||
try:
|
|
||||||
port = int(port)
|
|
||||||
except ValueError:
|
|
||||||
raise exceptions.ConfigurationError(
|
|
||||||
'Invalid port "%s" in masters option.' % port)
|
|
||||||
if port < 0 or port > 65535:
|
|
||||||
raise exceptions.ConfigurationError(
|
|
||||||
'Port "%s" is not between 0 and 65535 in masters option.' %
|
|
||||||
port)
|
|
||||||
try:
|
|
||||||
socket.inet_pton(socket.AF_INET, ip_address)
|
|
||||||
except socket.error:
|
|
||||||
raise exceptions.ConfigurationError(
|
|
||||||
'Invalid IP address "%s" in masters option.' % ip_address)
|
|
||||||
return {'ip-address': ip_address, 'port': port}
|
|
||||||
|
|
||||||
def create_domain(self, context, domain):
|
|
||||||
LOG.debug('Create Domain')
|
|
||||||
masters = []
|
|
||||||
for master in self.masters:
|
|
||||||
ip_address = master['ip-address']
|
|
||||||
port = master['port']
|
|
||||||
masters.append('%s port %s' % (ip_address, port))
|
|
||||||
rndc_op = [
|
|
||||||
'addzone',
|
|
||||||
'%s { type slave; masters { %s;}; file "slave.%s%s"; };' %
|
|
||||||
(domain['name'].rstrip('.'), '; '.join(masters), domain['name'],
|
|
||||||
domain['id']),
|
|
||||||
]
|
|
||||||
self._execute_rndc(rndc_op)
|
|
||||||
|
|
||||||
def delete_domain(self, context, domain):
|
|
||||||
LOG.debug('Delete Domain')
|
|
||||||
rndc_op = [
|
|
||||||
'delzone',
|
|
||||||
'%s' % domain['name'].rstrip('.'),
|
|
||||||
]
|
|
||||||
self._execute_rndc(rndc_op)
|
|
||||||
|
|
||||||
def _rndc_base(self):
|
|
||||||
rndc_call = [
|
|
||||||
'rndc',
|
|
||||||
'-s', self.rndc_host,
|
|
||||||
'-p', str(self.rndc_port),
|
|
||||||
]
|
|
||||||
|
|
||||||
if self.rndc_config_file:
|
|
||||||
rndc_call.extend(
|
|
||||||
['-c', self.rndc_config_file])
|
|
||||||
|
|
||||||
if self.rndc_key_file:
|
|
||||||
rndc_call.extend(
|
|
||||||
['-k', self.rndc_key_file])
|
|
||||||
|
|
||||||
return rndc_call
|
|
||||||
|
|
||||||
def _execute_rndc(self, rndc_op):
|
|
||||||
try:
|
|
||||||
rndc_call = self._rndc_base()
|
|
||||||
rndc_call.extend(rndc_op)
|
|
||||||
LOG.debug('Executing RNDC call: %s' % " ".join(rndc_call))
|
|
||||||
utils.execute(*rndc_call)
|
|
||||||
except utils.processutils.ProcessExecutionError as e:
|
|
||||||
LOG.debug('RNDC call failure: %s' % e)
|
|
||||||
raise exceptions.Backend(e)
|
|
@@ -1,3 +0,0 @@
|
|||||||
{% for domain in domains %}
|
|
||||||
zone "{{domain.name}}" { type master; file "{{state_path}}/bind9/{{domain.id}}.zone"; };
|
|
||||||
{%- endfor %}
|
|
@@ -22,7 +22,6 @@ from designate.tests.test_backend import BackendTestMixin
|
|||||||
|
|
||||||
class BackendTestCase(tests.TestCase, BackendTestMixin):
|
class BackendTestCase(tests.TestCase, BackendTestMixin):
|
||||||
scenarios = [
|
scenarios = [
|
||||||
('bind9', dict(backend_driver='bind9', group='service:agent')),
|
|
||||||
('fake', dict(backend_driver='fake', group='service:agent')),
|
('fake', dict(backend_driver='fake', group='service:agent')),
|
||||||
('nsd4slave', dict(backend_driver='nsd4slave', group='service:agent',
|
('nsd4slave', dict(backend_driver='nsd4slave', group='service:agent',
|
||||||
server_fixture=NSD4Fixture)),
|
server_fixture=NSD4Fixture)),
|
||||||
|
@@ -26,7 +26,7 @@ from designate import utils
|
|||||||
|
|
||||||
class TestUtils(TestCase):
|
class TestUtils(TestCase):
|
||||||
def test_resource_string(self):
|
def test_resource_string(self):
|
||||||
name = ['templates', 'bind9-config.jinja2']
|
name = ['templates', 'bind9-zone.jinja2']
|
||||||
|
|
||||||
resource_string = utils.resource_string(*name)
|
resource_string = utils.resource_string(*name)
|
||||||
|
|
||||||
@@ -48,14 +48,14 @@ class TestUtils(TestCase):
|
|||||||
utils.load_schema('v1', 'missing')
|
utils.load_schema('v1', 'missing')
|
||||||
|
|
||||||
def test_load_template(self):
|
def test_load_template(self):
|
||||||
name = 'bind9-config.jinja2'
|
name = 'bind9-zone.jinja2'
|
||||||
|
|
||||||
template = utils.load_template(name)
|
template = utils.load_template(name)
|
||||||
|
|
||||||
self.assertIsInstance(template, Template)
|
self.assertIsInstance(template, Template)
|
||||||
|
|
||||||
def test_load_template_keep_trailing_newline(self):
|
def test_load_template_keep_trailing_newline(self):
|
||||||
name = 'bind9-config.jinja2'
|
name = 'bind9-zone.jinja2'
|
||||||
template = utils.load_template(name)
|
template = utils.load_template(name)
|
||||||
self.assertTrue(template.environment.keep_trailing_newline)
|
self.assertTrue(template.environment.keep_trailing_newline)
|
||||||
|
|
||||||
|
@@ -109,7 +109,7 @@ debug = False
|
|||||||
#-----------------------
|
#-----------------------
|
||||||
[service:agent]
|
[service:agent]
|
||||||
# Driver used for backend communication (e.g. bind9, powerdns)
|
# Driver used for backend communication (e.g. bind9, powerdns)
|
||||||
#backend_driver = bind9
|
#backend_driver = powerdns
|
||||||
|
|
||||||
#-----------------------
|
#-----------------------
|
||||||
# Sink Service
|
# Sink Service
|
||||||
@@ -132,7 +132,7 @@ debug = False
|
|||||||
# Pool Manager Service
|
# Pool Manager Service
|
||||||
#-----------------------
|
#-----------------------
|
||||||
[service:pool_manager]
|
[service:pool_manager]
|
||||||
#backends = bind9_pool
|
#backends = bind9
|
||||||
#workers = None
|
#workers = None
|
||||||
#pool_name = default
|
#pool_name = default
|
||||||
#threshold-percentage = 100
|
#threshold-percentage = 100
|
||||||
@@ -213,27 +213,6 @@ debug = False
|
|||||||
########################
|
########################
|
||||||
## Backend Configuration
|
## Backend Configuration
|
||||||
########################
|
########################
|
||||||
#-----------------------
|
|
||||||
# Bind9 Backend
|
|
||||||
#-----------------------
|
|
||||||
[backend:bind9]
|
|
||||||
#rndc_host = 127.0.0.1
|
|
||||||
#rndc_port = 953
|
|
||||||
#rndc_config_file = /etc/rndc.conf
|
|
||||||
#rndc_key_file = /etc/rndc.key
|
|
||||||
|
|
||||||
#-----------------------
|
|
||||||
# Bind9+MySQL Backend
|
|
||||||
#-----------------------
|
|
||||||
[backend:mysqlbind9]
|
|
||||||
#connection = mysql://user:password@host/schema
|
|
||||||
#rndc_host = 127.0.0.1
|
|
||||||
#rndc_port = 953
|
|
||||||
#rndc_config_file = /etc/rndc.conf
|
|
||||||
#rndc_key_file = /etc/rndc.key
|
|
||||||
#write_database = True
|
|
||||||
#dns_server_type = master
|
|
||||||
|
|
||||||
#-----------------------
|
#-----------------------
|
||||||
# PowerDNS Backend
|
# PowerDNS Backend
|
||||||
#-----------------------
|
#-----------------------
|
||||||
@@ -268,7 +247,7 @@ debug = False
|
|||||||
#-----------------------
|
#-----------------------
|
||||||
# Global Bind9 Pool Backend
|
# Global Bind9 Pool Backend
|
||||||
#-----------------------
|
#-----------------------
|
||||||
[backend:bind9_pool]
|
[backend:bind9]
|
||||||
#server_ids = 6a5032b6-2d96-43ee-b25b-7d784e2bf3b2
|
#server_ids = 6a5032b6-2d96-43ee-b25b-7d784e2bf3b2
|
||||||
#masters = 127.0.0.1:5354
|
#masters = 127.0.0.1:5354
|
||||||
#rndc_host = 127.0.0.1
|
#rndc_host = 127.0.0.1
|
||||||
@@ -279,6 +258,6 @@ debug = False
|
|||||||
#-----------------------
|
#-----------------------
|
||||||
# Server Specific Bind9 Pool Backend
|
# Server Specific Bind9 Pool Backend
|
||||||
#-----------------------
|
#-----------------------
|
||||||
[backend:bind9_pool:6a5032b6-2d96-43ee-b25b-7d784e2bf3b2]
|
[backend:bind9:6a5032b6-2d96-43ee-b25b-7d784e2bf3b2]
|
||||||
# host = 127.0.0.1
|
# host = 127.0.0.1
|
||||||
# port = 53
|
# port = 53
|
||||||
|
@@ -69,7 +69,6 @@ designate.notification.handler =
|
|||||||
|
|
||||||
designate.backend =
|
designate.backend =
|
||||||
bind9 = designate.backend.impl_bind9:Bind9Backend
|
bind9 = designate.backend.impl_bind9:Bind9Backend
|
||||||
bind9_pool = designate.backend.impl_bind9_pool:Bind9PoolBackend
|
|
||||||
powerdns = designate.backend.impl_powerdns:PowerDNSBackend
|
powerdns = designate.backend.impl_powerdns:PowerDNSBackend
|
||||||
rpc = designate.backend.impl_rpc:RPCBackend
|
rpc = designate.backend.impl_rpc:RPCBackend
|
||||||
fake = designate.backend.impl_fake:FakeBackend
|
fake = designate.backend.impl_fake:FakeBackend
|
||||||
|
Reference in New Issue
Block a user