From b58210328ff2ca7942fd6457ca45ca4c861aeb6f Mon Sep 17 00:00:00 2001 From: Basir Jamil Date: Wed, 12 Jun 2019 20:31:11 -0400 Subject: [PATCH] implemented API v2 - client fxns to request records functionality --- octodns/provider/fastdns.py | 127 +++++++++++++++++++++++++++--------- 1 file changed, 95 insertions(+), 32 deletions(-) diff --git a/octodns/provider/fastdns.py b/octodns/provider/fastdns.py index 1405d17..a6d5cae 100644 --- a/octodns/provider/fastdns.py +++ b/octodns/provider/fastdns.py @@ -18,6 +18,30 @@ from ..record import Record from .base import BaseProvider +class AkamaiClientException(Exception): + pass + +class AkamaiClientBadRequest(AkamaiClientException): #400 + def __init__(self): + super(AkamaiClientBadRequest, self).__init__('Bad request') + +class AkamaiClientNotAuthorized(AkamaiClientException): #403 + def __init__(self): + super(AkamaiClientNotAuthorized, self).__init__('Forbidden') + +class AkamaiClientNotFound(AkamaiClientException): #404 + def __init__(self): + super(AkamaiClientNotFound, self).__init__('Not found') + +class AkamaiClientNotAcceptable(AkamaiClientException): #406 + def __init__(self): + super(AkamaiClientNotAcceptable, self).__init__('Not acceptable') + +class AkamaiClientGenericExcp(AkamaiClientException): + def __init__(self, num): + super(AkamaiClientGenericExcp, self).__init__('HTTP Error: ' + str(num)) + + class _AkamaiRecord(object): pass @@ -26,7 +50,8 @@ class AkamaiClient(object): def __init__(self, _client_secret, _host, _access_token, _client_token): - self.base = "https://" + _host + "/config-dns/v1/zones/" + self.base = "https://" + _host + "/config-dns/v2/zones/" + self.basev1 = "https://" + _host + "/config-dns/v1/zones/" sess = requests.Session() sess.auth = EdgeGridAuth( @@ -36,22 +61,71 @@ class AkamaiClient(object): ) self._sess = sess + def _request(self, method, path, params=None, data=None): + # url = '{}{}'.format(self.base, path) + url = urljoin(self.base, path) + print(url) + resp = self._sess.request(method, url, params=params, json=data) - def getZone(self, name): - path = urljoin(self.base, name) - result = self._sess.get(path) + if resp.status_code == 400: + raise AkamaiClientBadRequest() + if resp.status_code == 403: + raise AkamaiClientNotAuthorized() + if resp.status_code == 404: + raise AkamaiClientNotFound() + if resp.status_code == 406: + raise AkamaiClientNotAcceptable() + resp.raise_for_status() + return resp + + + # def getZone(self, name): + # path = name + "/recordsets/" + # result = self._request('GET', path, "sortBy=type&types=A") + + # return result.json() + + # def getNames(self, name): + # path = name + "/names/" + # result = self._request('GET', path) + + # return result.json() + + + + def record_get(self, zone, name, record_type): + + path = '/zones/{}/names/{}/types/'.format(zone, name, record_type) + result = self._request('GET', path) + return result.json() - # return result + + def record_create(self, zone, name, record_type, params): + path = '/zones/{}/names/{}/types/'.format(zone, name, record_type) + result = self._request('POST', path, data=params) + + return result + def record_delete(self, zone, name, record_type): + path = '/zones/{}/names/{}/types/'.format(zone, name, record_type) + result = self._request('DELETE', path) + + return result + + def record_replace(self, zone, name, record_type, params): + path = '/zones/{}/names/{}/types/'.format(zone, name, record_type) + result = self._request('PUT', path, data=params) + + return result class AkamaiProvider(BaseProvider): SUPPORTS_GEO = False SUPPORTS_DYNAMIC = False - SUPPORTS = set(('A', 'AAAA', 'CAA', 'CNAME', 'MX', 'NS', 'PTR', 'SRV', - 'TXT')) + SUPPORTS = set(('A', 'AAAA', 'CNAME', 'MX', 'NAPTR', 'NS', 'PTR', 'SPF', + 'SRV', 'SSHFP', 'TXT')) def __init__(self, id, client_secret, host, access_token, client_token, @@ -64,44 +138,33 @@ class AkamaiProvider(BaseProvider): self._dns_client = AkamaiClient(client_secret, host, access_token, client_token) - #self._authenticate(client_secret, host, access_token, client_token) + self._zone_records = {} - - - def _authenticate(self, client_secret, host, access_token, client_token): - - ## generate edgegrid - home = expanduser("~") - filename = "%s/.edgerc" % home - with open(filename, 'a') as credFile: - - credFile.write('[dns]\n') - - credFile.write('client_secret = ' + str(client_secret) + '\n') - credFile.write('host = ' + str(host) + '\n') - credFile.write('access_token = ' + str(access_token) + '\n') - credFile.write('client_token = ' + str(client_token) + '\n') - credFile.close() - def populate(self, zone, target=False, lenient=False): self.log.debug('populate: name=%s, target=%s, lenient=%s', zone.name, target, lenient) zone_name = zone.name[:len(zone.name)-1] - result = self._dns_client.getZone(zone_name) + zone = self._dns_client.getZone(zone_name) + names = self._dns_client.getNames(zone_name) - - print() - print() - print(type(result)) + # print(type(result)) #print(result.text) - print (json.dumps(result, indent=4, separators=(',', ': '))) - print ("\n\n") + zoneFile = open('zoneFile.json', 'w') + namesFile = open('namesFile.json', 'w') + zoneFile.write(json.dumps(zone, indent=4, separators=(',', ': '))) + namesFile.write(json.dumps(names, indent=4, separators=(',', ': '))) + zoneFile.close() + namesFile.close() + + + + #print (json.dumps(result, indent=4, separators=(',', ': '))) return