| # 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. |
| """ |
| BuddyNS DNS Driver |
| """ |
| |
| try: |
| import simplejson as json |
| except ImportError: |
| import json |
| |
| from libcloud.dns.types import Provider, ZoneDoesNotExistError,\ |
| ZoneAlreadyExistsError |
| from libcloud.dns.base import DNSDriver, Zone |
| from libcloud.common.buddyns import BuddyNSConnection, BuddyNSResponse,\ |
| BuddyNSException |
| |
| __all__ = [ |
| 'BuddyNSDNSDriver' |
| ] |
| |
| |
| class BuddyNSDNSResponse(BuddyNSResponse): |
| pass |
| |
| |
| class BuddyNSDNSConnection(BuddyNSConnection): |
| responseCls = BuddyNSDNSResponse |
| |
| |
| class BuddyNSDNSDriver(DNSDriver): |
| name = 'BuddyNS DNS' |
| website = 'https://www.buddyns.com' |
| type = Provider.BUDDYNS |
| connectionCls = BuddyNSDNSConnection |
| |
| def list_zones(self): |
| action = '/api/v2/zone/' |
| response = self.connection.request(action=action, method='GET') |
| zones = self._to_zones(items=response.parse_body()) |
| |
| return zones |
| |
| def get_zone(self, zone_id): |
| """ |
| :param zone_id: Zone domain name (e.g. example.com) |
| :return: :class:`Zone` |
| """ |
| action = '/api/v2/zone/%s' % zone_id |
| try: |
| response = self.connection.request(action=action, method='GET') |
| except BuddyNSException as e: |
| if e.message == 'Not found': |
| raise ZoneDoesNotExistError(value=e.message, driver=self, |
| zone_id=zone_id) |
| else: |
| raise e |
| zone = self._to_zone(response.parse_body()) |
| |
| return zone |
| |
| def create_zone(self, domain, type='master', ttl=None, extra=None): |
| """ |
| :param domain: Zone domain name (e.g. example.com) |
| :type domain: ``str`` |
| |
| :param type: Zone type (This is not really used. See API docs for \ |
| extra parameters) |
| :type type: ``str`` |
| |
| :param ttl: TTL for new records (This is used through the extra param) |
| :type ttl: ``int`` |
| |
| :param extra: Extra attributes that are specific to the driver |
| such as ttl. |
| :type extra: ``dict`` |
| |
| :rtype: :class:`Zone` |
| Do not forget to pass the master in extra, |
| extra = {'master':'65.55.37.62'} for example. |
| """ |
| action = '/api/v2/zone/' |
| data = {'name': domain} |
| if extra is not None: |
| data.update(extra) |
| post_data = json.dumps(data) |
| try: |
| response = self.connection.request(action=action, method='POST', |
| data=post_data) |
| except BuddyNSException as e: |
| if e.message == 'Invalid zone submitted for addition.': |
| raise ZoneAlreadyExistsError(value=e.message, driver=self, |
| zone_id=domain) |
| else: |
| raise e |
| |
| zone = self._to_zone(response.parse_body()) |
| |
| return zone |
| |
| def delete_zone(self, zone): |
| """ |
| :param zone: Zone to be deleted. |
| :type zone: :class:`Zone` |
| |
| :return: Boolean |
| """ |
| action = '/api/v2/zone/%s' % zone.domain |
| try: |
| self.connection.request(action=action, method='DELETE') |
| except BuddyNSException as e: |
| if e.message == 'Not found': |
| raise ZoneDoesNotExistError(value=e.message, driver=self, |
| zone_id=zone.id) |
| else: |
| raise e |
| |
| return True |
| |
| def _to_zone(self, item): |
| common_keys = ['name', ] |
| extra = {} |
| for key in item: |
| if key not in common_keys: |
| extra[key] = item.get(key) |
| zone = Zone(domain=item['name'], id=item['name'], type=None, |
| extra=extra, ttl=None, driver=self) |
| |
| return zone |
| |
| def _to_zones(self, items): |
| zones = [] |
| for item in items: |
| zones.append(self._to_zone(item)) |
| |
| return zones |