Merge "Add Akamai EDNS Backend"

This commit is contained in:
Jenkins 2015-03-31 18:27:58 +00:00 committed by Gerrit Code Review
commit 4356e49113
6 changed files with 578 additions and 1 deletions

View File

@ -33,8 +33,9 @@ source $TOP_DIR/exerciserc
# Skip if designate is not enabled
is_service_enabled designate || exit 55
# Skip if the DynECT backend is in use
# Skip if the DynECT or Akamai backend is in use
[ "$DESIGNATE_BACKEND_DRIVER" != "dynect" ] || exit 55
[ "$DESIGNATE_BACKEND_DRIVER" != "akamai" ] || exit 55
# Import designate library
source $TOP_DIR/lib/designate

View File

@ -0,0 +1,107 @@
# lib/designate_plugins/backend-akamai
# Configure the Akamai backend
# Requirements:
# An active Akamai account / contract will be requied to use this DevStack
# plugin.
# Enable with:
# DESIGNATE_BACKEND_DRIVER=akamai
# 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_AKAMAI_XTRACE=$(set +o | grep xtrace)
set +o xtrace
# Defaults
# --------
DESIGNATE_AKAMAI_USERNAME=${DESIGNATE_AKAMAI_USERNAME:-username}
DESIGNATE_AKAMAI_PASSWORD=${DESIGNATE_AKAMAI_PASSWORD:-password}
DESIGNATE_AKAMAI_MASTERS=${DESIGNATE_AKAMAI_MASTERS:-"$DESIGNATE_SERVICE_HOST:$DESIGNATE_SERVICE_PORT_MDNS"}
DESIGNATE_AKAMAI_NAMESERVERS=${DESIGNATE_AKAMAI_NAMESERVERS:-""}
DESIGNATE_AKAMAI_ALSO_NOTIFIES=${DESIGNATE_AKAMAI_ALSO_NOTIFIES:-"193.108.155.34:53,23.73.134.141:53,80.67.64.148:53,23.73.134.237:53,23.73.133.141:53,23.73.133.237:53,80.67.64.10:53,72.246.0.10:53,72.247.45.157:53,72.246.192.168:53,193.108.152.143:53,60.254.128.45:53,72.247.45.110:53,72.247.45.65:53,72.247.45.25:53"}
# Sanity Checks
# -------------
if [ -z "$DESIGNATE_AKAMAI_NAMESERVERS" ]; then
die $LINENO "You must configure DESIGNATE_AKAMAI_NAMESERVERS"
fi
# Entry Points
# ------------
# install_designate_backend - install any external requirements
function install_designate_backend {
:
}
# configure_designate_backend - make configuration changes, including those to other services
function configure_designate_backend {
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID type akamai
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID masters $DESIGNATE_AKAMAI_MASTERS
iniset $DESIGNATE_CONF pool_target:$DESIGNATE_TARGET_ID options "username: $DESIGNATE_AKAMAI_USERNAME, password: $DESIGNATE_AKAMAI_PASSWORD"
# Create a Pool Nameserver for each of the Akamai nameservers
local nameserver_ids=""
IFS=',' read -a nameservers <<< "$DESIGNATE_AKAMAI_NAMESERVERS"
for nameserver in "${nameservers[@]}"; do
local nameserver_id=`uuidgen`
iniset $DESIGNATE_CONF pool_nameserver:$nameserver_id host $(dig +short A $nameserver | head -n 1)
iniset $DESIGNATE_CONF pool_nameserver:$nameserver_id port 53
# Append the Nameserver ID to the list
nameserver_ids+=${nameserver_id},
done
# Configure the Pool for the set of nameserver IDs, minus the trailing comma
iniset $DESIGNATE_CONF pool:$DESIGNATE_POOL_ID nameservers "${nameserver_ids:0:-1}"
# Configure the Pool to Notify Akamai's Transfer Agents
iniset $DESIGNATE_CONF pool:$DESIGNATE_POOL_ID also_notifies "$DESIGNATE_AKAMAI_ALSO_NOTIFIES"
}
# create_designate_ns_records - Create Pool NS Records
function create_designate_ns_records_backend {
# Build an array of the Akamai nameservers.
IFS=',' read -a ns_records <<< "$DESIGNATE_AKAMAI_NAMESERVERS"
# Create a NS Record for each of the Akamai nameservers
for ns_record in "${ns_records[@]}"; do
designate server-create --name "${ns_record%%.}."
done
}
# init_designate_backend - initialize databases, etc.
function init_designate_backend {
:
}
# start_designate_backend - start any external services
function start_designate_backend {
:
}
# stop_designate_backend - stop any external services
function stop_designate_backend {
:
}
# cleanup_designate_backend - remove transient data and cache
function cleanup_designate_backend {
:
}
# Restore xtrace
$DP_AKAMAI_XTRACE

View File

@ -50,6 +50,12 @@ ENABLED_SERVICES+=,designate,designate-central,designate-api,designate-pool-mana
#DESIGNATE_DYNECT_NAMESERVERS=ns1.p13.dynect.net,ns2.p13.dynect.net,ns3.p13.dynect.net,ns4.p13.dynect.net
#DESIGNATE_DYNECT_MASTERS=
# Akamai Backend
#DESIGNATE_AKAMAI_USERNAME=
#DESIGNATE_AKAMAI_PASSWORD=
#DESIGNATE_AKAMAI_NAMESERVERS=a5-64.akam.net,a11-65.akam.net,a13-66.akam.net,a14-64.akam.net,a20-65.akam.net,a22-66.akam.net
#DESIGNATE_AKAMAI_MASTERS=
# Other Devstack Config
# =====================
# Optional TLS Proxy

View File

@ -0,0 +1,224 @@
# Copyright 2012-2015 Hewlett-Packard Development Company, L.P.
#
# Author: Kiall Mac Innes <kiall@hp.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 os
from oslo_log import log as logging
from oslo_config import cfg
from suds.client import Client as SudsClient
from suds.transport.https import HttpAuthenticated
from designate import exceptions
from designate import utils
from designate.backend import base
LOG = logging.getLogger(__name__)
CONF = cfg.CONF
WSDL = os.path.join(os.path.dirname(__file__),
'..',
'resources',
'wsdl',
'EnhancedDNS.xml')
class EnhancedDNSException(exceptions.Backend):
pass
class DelegationExists(exceptions.BadRequest, EnhancedDNSException):
"""
Raised when an attempt to delete a zone which is still delegated to Akamai
is made
"""
error_type = 'delegation_exists'
class DuplicateDomain(exceptions.DuplicateDomain, EnhancedDNSException):
"""
Raised when an attempt to create a zone which is registered to another
Akamai account is made
"""
pass
class Forbidden(exceptions.Forbidden, EnhancedDNSException):
"""
Raised when an attempt to modify a zone which is registered to another
Akamai account is made.
This appears to be returned when creating a new subdomain of domain which
already exists in another Akamai account.
"""
pass
class EnhancedDNSHttpAuthenticated(HttpAuthenticated):
def addenhanceddnsheaders(self, request):
request.headers['Pragma'] = ('akamai-x-get-request-id, '
'akamai-x-cache-on, '
'akamai-x-cache-remote-on, '
'akamai-x-get-cache-key')
def logenhanceddnsheaders(self, response):
request_id = response.headers.get('x-akamai-request-id', '-')
cache = response.headers.get('x-cache', '-')
cache_key = response.headers.get('x-cache-key', '-')
cache_remote = response.headers.get('x-cache-remote', '-')
LOG.debug('Akamai Request-ID: %s, Cache-Key: %s, Cache: %s, '
'Cache-Remote: %s', request_id, cache_key, cache,
cache_remote)
def send(self, request):
self.addenhanceddnsheaders(request)
response = HttpAuthenticated.send(self, request)
self.logenhanceddnsheaders(response)
return response
class EnhancedDNSClient(object):
"""EnhancedDNS SOAP API Client"""
def __init__(self, username, password):
# Prepare a SUDS transport with the approperiate credentials
transport = EnhancedDNSHttpAuthenticated(
username=username,
password=password,
proxy=utils.get_proxies())
# Prepare a SUDS client
self.client = SudsClient(CONF['backend:akamai'].enhanceddns_wsdl,
transport=transport)
def buildZone(self, zoneName, masters, endCustomerId, tsigKeyName=None,
tsigKey=None, tsigAlgorithm=None):
zone = self.client.factory.create('ns3:Zone')
# Set some defaults
zone.transferMode = "axfr"
zone.type = "edns"
zone.notify = 1
zone.dnssec = False
# Set the remaining options
zone.zoneName = self._sanitizeZoneName(zoneName)
zone.masters = masters
zone.tsigKeyName = tsigKeyName
zone.tsigKey = tsigKey
zone.tsigAlgorithm = tsigAlgorithm
zone.endCustomerId = endCustomerId
return zone
def setZone(self, zone):
LOG.debug("Performing setZone with zoneName: %s", zone.zoneName)
try:
self.client.service.setZone(zone=zone)
except Exception as e:
if 'You do not have permission to view this zone' in str(e):
raise DuplicateDomain()
elif 'You do not have access to edit this zone' in str(e):
raise Forbidden()
else:
raise EnhancedDNSException('Akamai Communication Failure: %s'
% e)
def deleteZone(self, zoneName):
LOG.debug("Performing deleteZone with zoneName: %s", zoneName)
zoneName = self._sanitizeZoneName(zoneName)
self.deleteZones(zoneNames=[zoneName])
def deleteZones(self, zoneNames):
LOG.debug("Performing deleteZones with zoneNames: %r", zoneNames)
zoneNames = [self._sanitizeZoneName(zN) for zN in zoneNames]
try:
self.client.service.deleteZones(zoneNames=zoneNames)
except Exception as e:
if 'Could not retrive object ID for zone' in str(e):
# The zone has already been purged, ignore and move on
pass
elif 'The following zones are still delegated to Akamai' in str(e):
raise DelegationExists()
else:
raise EnhancedDNSException('Akamai Communication Failure: %s'
% e)
def _sanitizeZoneName(self, zoneName):
return zoneName.rstrip('.').lower()
class AkamaiBackend(base.Backend):
__plugin_name__ = 'akamai'
@classmethod
def get_cfg_opts(cls):
group = cfg.OptGroup(
name='backend:akamai', title='Backend options for Akamai'
)
opts = [
cfg.StrOpt('enhanceddns_wsdl',
default='file://%s' % WSDL,
help='Akamai EnhancedDNS WSDL URL'),
]
return [(group, opts)]
def __init__(self, target):
super(AkamaiBackend, self).__init__(target)
self.username = self.options.get('username')
self.password = self.options.get('password')
self.tsig_key_name = self.options.get('tsig_key_name', None)
self.tsig_key_algorithm = self.options.get('tsig_key_algorithm', None)
self.tsig_key_secret = self.options.get('tsig_key_secret', None)
self.client = EnhancedDNSClient(self.username, self.password)
def _build_zone(self, domain):
masters = ["%(host)s:%(port)d" % m for m in self.masters]
if self.tsig_key_name is not None:
return self.client.buildZone(
domain.name,
masters,
domain.id,
self.tsig_key_name,
self.tsig_key_secret,
self.tsig_key_algorithm)
else:
return self.client.buildZone(
domain.name,
masters,
domain.id)
def create_domain(self, context, domain):
"""Create a DNS domain"""
zone = self._build_zone(domain)
self.client.setZone(zone=zone)
def delete_domain(self, context, domain):
"""Delete a DNS domain"""
self.client.deleteZone(zoneName=domain['name'])

View File

@ -0,0 +1,238 @@
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:akaawsdt="https://control.akamai.com/AWS.xsd" xmlns:akaedns="https://control.akamai.com/2007/May/EnhancedDNS.xsd" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:zoneinfo="https://control.akamai.com/Edns.xsd" targetNamespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd">
<!--WSDL created by Apache Axis version: 1.3
Built on Jan 26, 2006 (05:12:02 PST)-->
<wsdl:types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd">
<import namespace="https://control.akamai.com/AWS.xsd" />
<import namespace="https://control.akamai.com/Edns.xsd" />
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
<complexType name="ArrayOfString">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]" />
</restriction>
</complexContent>
</complexType>
<complexType name="ArrayOfZone">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="zoneinfo:Zone[]" />
</restriction>
</complexContent>
</complexType>
</schema>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="https://control.akamai.com/Edns.xsd">
<import namespace="https://control.akamai.com/AWS.xsd" />
<import namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" />
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
<complexType name="Zone">
<sequence>
<element name="currentDNSKEYRecord" nillable="true" type="xsd:string" />
<element name="currentDSRecord" nillable="true" type="xsd:string" />
<element name="currentKeyDate" nillable="true" type="xsd:dateTime" />
<element name="deletePending" type="xsd:boolean" />
<element name="deleteRequested" nillable="true" type="xsd:dateTime" />
<element name="dnssec" type="xsd:boolean" />
<element name="endCustomerId" nillable="true" type="xsd:string" />
<element name="lastAttempt" nillable="true" type="xsd:dateTime" />
<element name="lastModifiedDate" nillable="true" type="xsd:dateTime" />
<element name="lastStatus" nillable="true" type="xsd:string" />
<element name="lastSuccess" nillable="true" type="xsd:dateTime" />
<element name="masters" nillable="true" type="akaedns:ArrayOfString" />
<element name="newDNSKEYRecord" nillable="true" type="xsd:string" />
<element name="newDSRecord" nillable="true" type="xsd:string" />
<element name="newKeyDate" nillable="true" type="xsd:dateTime" />
<element name="notify" type="xsd:int" />
<element name="toplevels" nillable="true" type="akaedns:ArrayOfString" />
<element name="transferMode" nillable="true" type="xsd:string" />
<element name="tsigAlgorithm" nillable="true" type="xsd:string" />
<element name="tsigKey" nillable="true" type="xsd:string" />
<element name="tsigKeyName" nillable="true" type="xsd:string" />
<element name="type" nillable="true" type="xsd:string" />
<element name="zoneName" nillable="true" type="xsd:string" />
</sequence>
</complexType>
</schema>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="https://control.akamai.com/AWS.xsd">
<import namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" />
<import namespace="https://control.akamai.com/Edns.xsd" />
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
<complexType name="AWSFault">
<sequence />
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="reassignTopLevelsResponse">
<wsdl:part name="reassignTopLevelsReturn" type="xsd:boolean" />
</wsdl:message>
<wsdl:message name="setZonesRequest">
<wsdl:part name="zones" type="akaedns:ArrayOfZone" />
</wsdl:message>
<wsdl:message name="getZoneResponse">
<wsdl:part name="getZoneReturn" type="zoneinfo:Zone" />
</wsdl:message>
<wsdl:message name="cancelDeleteZonesResponse">
<wsdl:part name="cancelDeleteZonesReturn" type="xsd:boolean" />
</wsdl:message>
<wsdl:message name="deleteZonesResponse">
<wsdl:part name="deleteZonesReturn" type="xsd:boolean" />
</wsdl:message>
<wsdl:message name="getZonesRequest" />
<wsdl:message name="AWSFault">
<wsdl:part name="fault" type="akaawsdt:AWSFault" />
</wsdl:message>
<wsdl:message name="setZoneResponse">
<wsdl:part name="setZoneReturn" type="xsd:boolean" />
</wsdl:message>
<wsdl:message name="reassignTopLevelsRequest">
<wsdl:part name="zones" type="akaedns:ArrayOfZone" />
</wsdl:message>
<wsdl:message name="getZoneRequest">
<wsdl:part name="zoneName" type="xsd:string" />
</wsdl:message>
<wsdl:message name="setZonesResponse">
<wsdl:part name="setZonesReturn" type="xsd:boolean" />
</wsdl:message>
<wsdl:message name="cancelDeleteZonesRequest">
<wsdl:part name="zoneNames" type="akaedns:ArrayOfString" />
</wsdl:message>
<wsdl:message name="deleteZonesRequest">
<wsdl:part name="zoneNames" type="akaedns:ArrayOfString" />
</wsdl:message>
<wsdl:message name="getZonesResponse">
<wsdl:part name="getZonesReturn" type="akaedns:ArrayOfZone" />
</wsdl:message>
<wsdl:message name="setZoneRequest">
<wsdl:part name="zone" type="zoneinfo:Zone" />
</wsdl:message>
<wsdl:portType name="EDNSService">
<wsdl:operation name="getZone" parameterOrder="zoneName">
<wsdl:input message="akaedns:getZoneRequest" name="getZoneRequest" />
<wsdl:output message="akaedns:getZoneResponse" name="getZoneResponse" />
<wsdl:fault message="akaedns:AWSFault" name="AWSFault" />
</wsdl:operation>
<wsdl:operation name="setZone" parameterOrder="zone">
<wsdl:input message="akaedns:setZoneRequest" name="setZoneRequest" />
<wsdl:output message="akaedns:setZoneResponse" name="setZoneResponse" />
<wsdl:fault message="akaedns:AWSFault" name="AWSFault" />
</wsdl:operation>
<wsdl:operation name="getZones">
<wsdl:input message="akaedns:getZonesRequest" name="getZonesRequest" />
<wsdl:output message="akaedns:getZonesResponse" name="getZonesResponse" />
<wsdl:fault message="akaedns:AWSFault" name="AWSFault" />
</wsdl:operation>
<wsdl:operation name="setZones" parameterOrder="zones">
<wsdl:input message="akaedns:setZonesRequest" name="setZonesRequest" />
<wsdl:output message="akaedns:setZonesResponse" name="setZonesResponse" />
<wsdl:fault message="akaedns:AWSFault" name="AWSFault" />
</wsdl:operation>
<wsdl:operation name="reassignTopLevels" parameterOrder="zones">
<wsdl:input message="akaedns:reassignTopLevelsRequest" name="reassignTopLevelsRequest" />
<wsdl:output message="akaedns:reassignTopLevelsResponse" name="reassignTopLevelsResponse" />
<wsdl:fault message="akaedns:AWSFault" name="AWSFault" />
</wsdl:operation>
<wsdl:operation name="deleteZones" parameterOrder="zoneNames">
<wsdl:input message="akaedns:deleteZonesRequest" name="deleteZonesRequest" />
<wsdl:output message="akaedns:deleteZonesResponse" name="deleteZonesResponse" />
<wsdl:fault message="akaedns:AWSFault" name="AWSFault" />
</wsdl:operation>
<wsdl:operation name="cancelDeleteZones" parameterOrder="zoneNames">
<wsdl:input message="akaedns:cancelDeleteZonesRequest" name="cancelDeleteZonesRequest" />
<wsdl:output message="akaedns:cancelDeleteZonesResponse" name="cancelDeleteZonesResponse" />
<wsdl:fault message="akaedns:AWSFault" name="AWSFault" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="EnhancedDNS" type="akaedns:EDNSService">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="getZone">
<wsdlsoap:operation soapAction="" />
<wsdl:input name="getZoneRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:input>
<wsdl:output name="getZoneResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:output>
<wsdl:fault name="AWSFault">
<wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="AWSFault" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="setZone">
<wsdlsoap:operation soapAction="" />
<wsdl:input name="setZoneRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:input>
<wsdl:output name="setZoneResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:output>
<wsdl:fault name="AWSFault">
<wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="AWSFault" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getZones">
<wsdlsoap:operation soapAction="" />
<wsdl:input name="getZonesRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:input>
<wsdl:output name="getZonesResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:output>
<wsdl:fault name="AWSFault">
<wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="AWSFault" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="setZones">
<wsdlsoap:operation soapAction="" />
<wsdl:input name="setZonesRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:input>
<wsdl:output name="setZonesResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:output>
<wsdl:fault name="AWSFault">
<wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="AWSFault" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="reassignTopLevels">
<wsdlsoap:operation soapAction="" />
<wsdl:input name="reassignTopLevelsRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:input>
<wsdl:output name="reassignTopLevelsResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:output>
<wsdl:fault name="AWSFault">
<wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="AWSFault" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="deleteZones">
<wsdlsoap:operation soapAction="" />
<wsdl:input name="deleteZonesRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:input>
<wsdl:output name="deleteZonesResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:output>
<wsdl:fault name="AWSFault">
<wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="AWSFault" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="cancelDeleteZones">
<wsdlsoap:operation soapAction="" />
<wsdl:input name="cancelDeleteZonesRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:input>
<wsdl:output name="cancelDeleteZonesResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:output>
<wsdl:fault name="AWSFault">
<wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="AWSFault" namespace="https://control.akamai.com/2007/May/EnhancedDNS.xsd" use="encoded" />
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="EnhancedDNS">
<wsdl:port binding="akaedns:EnhancedDNS" name="EnhancedDNS">
<wsdlsoap:address location="https://control.akamai.com/webservices/services/EnhancedDNS" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

View File

@ -81,6 +81,7 @@ designate.backend =
bind9 = designate.backend.impl_bind9:Bind9Backend
powerdns = designate.backend.impl_powerdns:PowerDNSBackend
dynect = designate.backend.impl_dynect:DynECTBackend
akamai = designate.backend.impl_akamai:AkamaiBackend
fake = designate.backend.impl_fake:FakeBackend
designate.backend.agent_backend =