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:
@@ -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
|
||||
|
Reference in New Issue
Block a user