1
0
mirror of https://github.com/github/octodns.git synced 2024-05-11 05:55:00 +00:00

Parse all data in the sample return set

This commit is contained in:
Vietor Davis
2017-07-07 18:21:59 -07:00
parent 679c2be0e0
commit c19ec41b6b
2 changed files with 46 additions and 31 deletions

View File

@@ -8,6 +8,7 @@ from __future__ import absolute_import, division, print_function, \
from requests import HTTPError, Session, post from requests import HTTPError, Session, post
import json import json
from collections import defaultdict
import logging import logging
from ..record import Create, Record from ..record import Create, Record
@@ -46,10 +47,10 @@ class RackspaceProvider(BaseProvider):
cloud_dns_endpoint = [x for x in ret.json()['access']['serviceCatalog'] if x['name'] == 'cloudDNS'][0]['endpoints'][0]['publicURL'] cloud_dns_endpoint = [x for x in ret.json()['access']['serviceCatalog'] if x['name'] == 'cloudDNS'][0]['endpoints'][0]['publicURL']
return ret.json()['access']['token']['id'], cloud_dns_endpoint return ret.json()['access']['token']['id'], cloud_dns_endpoint
def _get_zone_id_for(self, zone_name): def _get_zone_id_for(self, zone):
ret = self._request('GET', 'domains', pagination_key='domains') ret = self._request('GET', 'domains', pagination_key='domains')
if ret and 'name' in ret: if ret:
return [x for x in ret if x['name'] == zone_name][0]['id'] return [x for x in ret if x['name'] == zone.name[:-1]][0]['id']
else: else:
return None return None
@@ -79,7 +80,8 @@ class RackspaceProvider(BaseProvider):
next_page = [x for x in resp.json().get('links', []) if x['rel'] == 'next'] next_page = [x for x in resp.json().get('links', []) if x['rel'] == 'next']
if next_page: if next_page:
url = next_page[0]['href'] url = next_page[0]['href']
return acc.extend(self._paginated_request_for_url(method, url, data, pagination_key)) acc.extend(self._paginated_request_for_url(method, url, data, pagination_key))
return acc
else: else:
return acc return acc
@@ -95,20 +97,27 @@ class RackspaceProvider(BaseProvider):
def _data_for_multiple(self, rrset): def _data_for_multiple(self, rrset):
# TODO: geo not supported # TODO: geo not supported
return { return {
'type': rrset['type'], 'type': rrset[0]['type'],
'values': [r['content'] for r in rrset['records']], 'values': [r['data'] for r in rrset],
'ttl': rrset['ttl'] 'ttl': rrset[0]['ttl']
} }
_data_for_A = _data_for_multiple _data_for_A = _data_for_multiple
_data_for_AAAA = _data_for_multiple _data_for_AAAA = _data_for_multiple
_data_for_NS = _data_for_multiple
def _data_for_NS(self, rrset):
# TODO: geo not supported
return {
'type': rrset[0]['type'],
'values': ["{}.".format(r['data']) for r in rrset],
'ttl': rrset[0]['ttl']
}
def _data_for_single(self, record): def _data_for_single(self, record):
return { return {
'type': record['type'], 'type': record[0]['type'],
'value': record['data'], 'value': "{}.".format(record[0]['data']),
'ttl': record['ttl'] 'ttl': record[0]['ttl']
} }
_data_for_ALIAS = _data_for_single _data_for_ALIAS = _data_for_single
@@ -127,16 +136,15 @@ class RackspaceProvider(BaseProvider):
def _data_for_MX(self, rrset): def _data_for_MX(self, rrset):
values = [] values = []
for record in rrset['records']: for record in rrset:
priority, value = record['content'].split(' ', 1)
values.append({ values.append({
'priority': priority, 'priority': record['priority'],
'value': value, 'value': record['data'],
}) })
return { return {
'type': rrset['type'], 'type': rrset[0]['type'],
'values': values, 'values': values,
'ttl': rrset['ttl'] 'ttl': rrset[0]['ttl']
} }
def _data_for_NAPTR(self, rrset): def _data_for_NAPTR(self, rrset):
@@ -193,10 +201,10 @@ class RackspaceProvider(BaseProvider):
def populate(self, zone, target=False): def populate(self, zone, target=False):
self.log.debug('populate: name=%s', zone.name) self.log.debug('populate: name=%s', zone.name)
resp = None resp_data = None
try: try:
domain_id = self._get_zone_id_for(zone.name) domain_id = self._get_zone_id_for(zone)
resp = self._request('GET', '/domains/{}/records'.format(domain_id), pagination_key='records') resp_data = self._request('GET', '/domains/{}/records'.format(domain_id), pagination_key='records')
self.log.debug('populate: loaded') self.log.debug('populate: loaded')
except HTTPError as e: except HTTPError as e:
if e.response.status_code == 401: if e.response.status_code == 401:
@@ -213,20 +221,27 @@ class RackspaceProvider(BaseProvider):
before = len(zone.records) before = len(zone.records)
if resp: if resp_data:
for record in resp.json()['records']: records = self._group_records(resp_data)
record_type = record['type'] for record_type, records_of_type in records.items():
for raw_record_name, record_set in records_of_type.items():
if record_type == 'SOA': if record_type == 'SOA':
continue continue
data_for = getattr(self, '_data_for_{}'.format(record_type)) data_for = getattr(self, '_data_for_{}'.format(record_type))
record_name = zone.hostname_from_fqdn(record['name']) record_name = zone.hostname_from_fqdn(raw_record_name)
record = Record.new(zone, record_name, data_for(record), record = Record.new(zone, record_name, data_for(record_set),
source=self) source=self)
zone.add_record(record) zone.add_record(record)
self.log.info('populate: found %s records', self.log.info('populate: found %s records',
len(zone.records) - before) len(zone.records) - before)
def _group_records(self, all_records):
records = defaultdict(lambda: defaultdict(list))
for record in all_records:
records[record['type']][record['name']].append(record)
return records
def _records_for_multiple(self, record): def _records_for_multiple(self, record):
return [{'content': v, 'disabled': False} return [{'content': v, 'disabled': False}
for v in record.values] for v in record.values]

View File

@@ -58,7 +58,7 @@
"accountId" : 1234, "accountId" : 1234,
"created" : "2011-06-15T19:02:07.000+0000" "created" : "2011-06-15T19:02:07.000+0000"
}, { }, {
"name" : "dnsaas.example", "name" : "unit.tests",
"id" : 2722347, "id" : 2722347,
"comment" : "Sample comment", "comment" : "Sample comment",
"updated" : "2011-06-21T15:54:31.000+0000", "updated" : "2011-06-21T15:54:31.000+0000",