219 lines
7.6 KiB
Python
219 lines
7.6 KiB
Python
# Licensed to the Apache Software Foundation (ASF) under one or more
|
|
# contributor license agreements. See the NOTICE file distributed with
|
|
# this work for additional information regarding copyright ownership.
|
|
# The ASF licenses this file to You 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.
|
|
|
|
from libcloud.dns.base import DNSDriver, Zone, Record
|
|
from libcloud.dns.types import RecordType
|
|
from libcloud.dns.types import ZoneDoesNotExistError, ZoneAlreadyExistsError
|
|
from libcloud.dns.types import RecordDoesNotExistError
|
|
from libcloud.dns.types import RecordAlreadyExistsError
|
|
|
|
|
|
class DummyDNSDriver(DNSDriver):
|
|
"""
|
|
Dummy DNS driver.
|
|
|
|
>>> from libcloud.dns.drivers.dummy import DummyDNSDriver
|
|
>>> driver = DummyDNSDriver('key', 'secret')
|
|
>>> driver.name
|
|
'Dummy DNS Provider'
|
|
"""
|
|
|
|
name = 'Dummy DNS Provider'
|
|
website = 'http://example.com'
|
|
|
|
def __init__(self, api_key, api_secret):
|
|
"""
|
|
:param api_key: API key or username to used (required)
|
|
:type api_key: ``str``
|
|
|
|
:param api_secret: Secret password to be used (required)
|
|
:type api_secret: ``str``
|
|
|
|
:rtype: ``None``
|
|
"""
|
|
self._zones = {}
|
|
|
|
def list_record_types(self):
|
|
"""
|
|
>>> driver = DummyDNSDriver('key', 'secret')
|
|
>>> driver.list_record_types()
|
|
['A']
|
|
|
|
@inherits: :class:`DNSDriver.list_record_types`
|
|
"""
|
|
return [RecordType.A]
|
|
|
|
def list_zones(self):
|
|
"""
|
|
>>> driver = DummyDNSDriver('key', 'secret')
|
|
>>> driver.list_zones()
|
|
[]
|
|
|
|
@inherits: :class:`DNSDriver.list_zones`
|
|
"""
|
|
|
|
return [zone['zone'] for zone in list(self._zones.values())]
|
|
|
|
def list_records(self, zone):
|
|
"""
|
|
>>> driver = DummyDNSDriver('key', 'secret')
|
|
>>> zone = driver.create_zone(domain='apache.org', type='master',
|
|
... ttl=100)
|
|
>>> list(zone.list_records())
|
|
[]
|
|
>>> record = driver.create_record(name='libcloud', zone=zone,
|
|
... type=RecordType.A, data='127.0.0.1')
|
|
>>> list(zone.list_records()) #doctest: +ELLIPSIS
|
|
[<Record: zone=apache.org, name=libcloud, type=A...>]
|
|
"""
|
|
return self._zones[zone.id]['records'].values()
|
|
|
|
def get_zone(self, zone_id):
|
|
"""
|
|
>>> driver = DummyDNSDriver('key', 'secret')
|
|
>>> driver.get_zone(zone_id='foobar')
|
|
... #doctest: +IGNORE_EXCEPTION_DETAIL
|
|
Traceback (most recent call last):
|
|
ZoneDoesNotExistError:
|
|
|
|
@inherits: :class:`DNSDriver.get_zone`
|
|
"""
|
|
|
|
if zone_id not in self._zones:
|
|
raise ZoneDoesNotExistError(driver=self, value=None,
|
|
zone_id=zone_id)
|
|
|
|
return self._zones[zone_id]['zone']
|
|
|
|
def get_record(self, zone_id, record_id):
|
|
"""
|
|
>>> driver = DummyDNSDriver('key', 'secret')
|
|
>>> driver.get_record(zone_id='doesnotexist', record_id='exists')
|
|
... #doctest: +IGNORE_EXCEPTION_DETAIL
|
|
Traceback (most recent call last):
|
|
ZoneDoesNotExistError:
|
|
|
|
@inherits: :class:`DNSDriver.get_record`
|
|
"""
|
|
|
|
self.get_zone(zone_id=zone_id)
|
|
zone_records = self._zones[zone_id]['records']
|
|
|
|
if record_id not in zone_records:
|
|
raise RecordDoesNotExistError(record_id=record_id, value=None,
|
|
driver=self)
|
|
|
|
return zone_records[record_id]
|
|
|
|
def create_zone(self, domain, type='master', ttl=None, extra=None):
|
|
"""
|
|
>>> driver = DummyDNSDriver('key', 'secret')
|
|
>>> zone = driver.create_zone(domain='apache.org', type='master',
|
|
... ttl=100)
|
|
>>> zone
|
|
<Zone: domain=apache.org, ttl=100, provider=Dummy DNS Provider ...>
|
|
>>> zone = driver.create_zone(domain='apache.org', type='master',
|
|
... ttl=100)
|
|
... #doctest: +IGNORE_EXCEPTION_DETAIL
|
|
Traceback (most recent call last):
|
|
ZoneAlreadyExistsError:
|
|
|
|
@inherits: :class:`DNSDriver.create_zone`
|
|
"""
|
|
|
|
id = 'id-%s' % (domain)
|
|
|
|
if id in self._zones:
|
|
raise ZoneAlreadyExistsError(zone_id=id, value=None, driver=self)
|
|
|
|
zone = Zone(id=id, domain=domain, type=type, ttl=ttl, extra={},
|
|
driver=self)
|
|
self._zones[id] = {'zone': zone,
|
|
'records': {}}
|
|
return zone
|
|
|
|
def create_record(self, name, zone, type, data, extra=None):
|
|
"""
|
|
>>> driver = DummyDNSDriver('key', 'secret')
|
|
>>> zone = driver.create_zone(domain='apache.org', type='master',
|
|
... ttl=100)
|
|
>>> record = driver.create_record(name='libcloud', zone=zone,
|
|
... type=RecordType.A, data='127.0.0.1')
|
|
>>> record #doctest: +ELLIPSIS
|
|
<Record: zone=apache.org, name=libcloud, type=A, data=127.0.0.1...>
|
|
>>> record = driver.create_record(name='libcloud', zone=zone,
|
|
... type=RecordType.A, data='127.0.0.1')
|
|
... #doctest: +IGNORE_EXCEPTION_DETAIL
|
|
Traceback (most recent call last):
|
|
RecordAlreadyExistsError:
|
|
|
|
@inherits: :class:`DNSDriver.create_record`
|
|
"""
|
|
id = 'id-%s' % (name)
|
|
|
|
zone = self.get_zone(zone_id=zone.id)
|
|
|
|
if id in self._zones[zone.id]['records']:
|
|
raise RecordAlreadyExistsError(record_id=id, value=None,
|
|
driver=self)
|
|
|
|
record = Record(id=id, name=name, type=type, data=data, extra=extra,
|
|
zone=zone, driver=self)
|
|
self._zones[zone.id]['records'][id] = record
|
|
return record
|
|
|
|
def delete_zone(self, zone):
|
|
"""
|
|
>>> driver = DummyDNSDriver('key', 'secret')
|
|
>>> zone = driver.create_zone(domain='apache.org', type='master',
|
|
... ttl=100)
|
|
>>> driver.delete_zone(zone)
|
|
True
|
|
>>> driver.delete_zone(zone) #doctest: +IGNORE_EXCEPTION_DETAIL
|
|
Traceback (most recent call last):
|
|
ZoneDoesNotExistError:
|
|
|
|
@inherits: :class:`DNSDriver.delete_zone`
|
|
"""
|
|
self.get_zone(zone_id=zone.id)
|
|
|
|
del self._zones[zone.id]
|
|
return True
|
|
|
|
def delete_record(self, record):
|
|
"""
|
|
>>> driver = DummyDNSDriver('key', 'secret')
|
|
>>> zone = driver.create_zone(domain='apache.org', type='master',
|
|
... ttl=100)
|
|
>>> record = driver.create_record(name='libcloud', zone=zone,
|
|
... type=RecordType.A, data='127.0.0.1')
|
|
>>> driver.delete_record(record)
|
|
True
|
|
>>> driver.delete_record(record) #doctest: +IGNORE_EXCEPTION_DETAIL
|
|
Traceback (most recent call last):
|
|
RecordDoesNotExistError:
|
|
|
|
@inherits: :class:`DNSDriver.delete_record`
|
|
"""
|
|
self.get_record(zone_id=record.zone.id, record_id=record.id)
|
|
|
|
del self._zones[record.zone.id]['records'][record.id]
|
|
return True
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import doctest
|
|
doctest.testmod()
|