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

add geo support for ns1

This commit is contained in:
Steve Coursen
2017-12-28 16:01:22 -05:00
parent 1479d8804f
commit 61a86810ee
2 changed files with 79 additions and 14 deletions

View File

@@ -6,11 +6,13 @@ from __future__ import absolute_import, division, print_function, \
unicode_literals
from logging import getLogger
from nsone import NSONE
from itertools import chain
from nsone import NSONE, Config
from nsone.rest.errors import RateLimitException, ResourceException
from incf.countryutils import transformations
from time import sleep
from ..record import Record
from ..record import _GeoMixin, Record
from .base import BaseProvider
@@ -35,11 +37,38 @@ class Ns1Provider(BaseProvider):
self._client = NSONE(apiKey=api_key)
def _data_for_A(self, _type, record):
return {
# record meta (which would include geo information is only
# returned when getting a record's detail, not from zone detail
geo = {}
data = {
'ttl': record['ttl'],
'type': _type,
'values': record['short_answers'],
}
values, codes = [], []
if 'answers' not in record:
values = record['short_answers']
for answer in record.get('answers', []):
meta = answer.get('meta', {})
if meta:
country = meta.get('country', [])
us_state = meta.get('us_state', [])
ca_province = meta.get('ca_province', [])
for cntry in country:
cn = transformations.cc_to_cn(cntry)
con = transformations.cn_to_ctca2(cn)
geo['{}-{}'.format(con, cntry)] = answer['answer']
for state in us_state:
geo['NA-US-{}'.format(state)] = answer['answer']
for province in ca_province:
geo['NA-CA-{}'.format(state)] = answer['answer']
for code in meta.get('iso_region_code', []):
geo[code] = answer['answer']
else:
values.extend(answer['answer'])
codes.append([])
data['values'] = values
data['geo'] = geo
return data
_data_for_AAAA = _data_for_A
@@ -146,20 +175,25 @@ class Ns1Provider(BaseProvider):
try:
nsone_zone = self._client.loadZone(zone.name[:-1])
records = nsone_zone.data['records']
geo_records = nsone_zone.search(has_geo=True)
except ResourceException as e:
if e.message != self.ZONE_NOT_FOUND_MESSAGE:
raise
records = []
geo_records = []
before = len(zone.records)
for record in records:
# geo information isn't returned from the main endpoint, so we need
# to query for all records with geo information
zone_hash = {}
for record in chain(records, geo_records):
_type = record['type']
data_for = getattr(self, '_data_for_{}'.format(_type))
name = zone.hostname_from_fqdn(record['domain'])
record = Record.new(zone, name, data_for(_type, record),
source=self, lenient=lenient)
zone.add_record(record)
zone_hash[(_type, name)] = record
[zone.add_record(r) for r in zone_hash.values()]
self.log.info('populate: found %s records',
len(zone.records) - before)
@@ -168,15 +202,18 @@ class Ns1Provider(BaseProvider):
if hasattr(record, 'geo'):
# purposefully set non-geo answers to have an empty meta,
# so that we know we did this on purpose if/when troubleshooting
params['answers'] = [{"answer": x, "meta": {}}
params['answers'] = [{"answer": [x], "meta": {}} \
for x in record.values]
for iso_region, target in record.geo.items():
key = 'iso_region_code'
value = iso_region
params['answers'].append(
{
'answer': target.values,
'meta': {'iso_region_code': [iso_region]},
'meta': {key: [value]},
},
)
self.log.info("params for A: %s", params)
return params
_params_for_AAAA = _params_for_A