Browse Source

Merge pull request #705 from omarkilani/master

Update the AzureProvider to support azure-mgmt-dns 8.0.0 and azure-identity.
pull/709/head
Ross McFarland 5 years ago
committed by GitHub
parent
commit
056cec8935
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 31 additions and 30 deletions
  1. +1
    -1
      README.md
  2. +13
    -13
      octodns/provider/azuredns.py
  3. +3
    -2
      requirements.txt
  4. +14
    -14
      tests/test_octodns_provider_azuredns.py

+ 1
- 1
README.md View File

@ -192,7 +192,7 @@ The above command pulled the existing data out of Route53 and placed the results
| Provider | Requirements | Record Support | Dynamic | Notes | | Provider | Requirements | Record Support | Dynamic | Notes |
|--|--|--|--|--| |--|--|--|--|--|
| [AzureProvider](/octodns/provider/azuredns.py) | azure-mgmt-dns | A, AAAA, CAA, CNAME, MX, NS, PTR, SRV, TXT | No | |
| [AzureProvider](/octodns/provider/azuredns.py) | azure-identity, azure-mgmt-dns | A, AAAA, CAA, CNAME, MX, NS, PTR, SRV, TXT | No | |
| [Akamai](/octodns/provider/edgedns.py) | edgegrid-python | A, AAAA, CNAME, MX, NAPTR, NS, PTR, SPF, SRV, SSHFP, TXT | No | | | [Akamai](/octodns/provider/edgedns.py) | edgegrid-python | A, AAAA, CNAME, MX, NAPTR, NS, PTR, SPF, SRV, SSHFP, TXT | No | |
| [CloudflareProvider](/octodns/provider/cloudflare.py) | | A, AAAA, ALIAS, CAA, CNAME, LOC, MX, NS, PTR, SPF, SRV, TXT | No | CAA tags restricted | | [CloudflareProvider](/octodns/provider/cloudflare.py) | | A, AAAA, ALIAS, CAA, CNAME, LOC, MX, NS, PTR, SPF, SRV, TXT | No | CAA tags restricted |
| [ConstellixProvider](/octodns/provider/constellix.py) | | A, AAAA, ALIAS (ANAME), CAA, CNAME, MX, NS, PTR, SPF, SRV, TXT | No | CAA tags restricted | | [ConstellixProvider](/octodns/provider/constellix.py) | | A, AAAA, ALIAS (ANAME), CAA, CNAME, MX, NS, PTR, SPF, SRV, TXT | No | CAA tags restricted |


+ 13
- 13
octodns/provider/azuredns.py View File

@ -5,7 +5,7 @@
from __future__ import absolute_import, division, print_function, \ from __future__ import absolute_import, division, print_function, \
unicode_literals unicode_literals
from azure.common.credentials import ServicePrincipalCredentials
from azure.identity import ClientSecretCredential
from azure.mgmt.dns import DnsManagementClient from azure.mgmt.dns import DnsManagementClient
from azure.mgmt.dns.models import ARecord, AaaaRecord, CaaRecord, \ from azure.mgmt.dns.models import ARecord, AaaaRecord, CaaRecord, \
@ -71,10 +71,11 @@ class _AzureRecord(object):
'''Constructor for _AzureRecord. '''Constructor for _AzureRecord.
Notes on Azure records: An Azure record set has the form Notes on Azure records: An Azure record set has the form
RecordSet(name=<...>, type=<...>, arecords=[...], aaaa_records, ..)
RecordSet(name=<...>, type=<...>, a_records=[...],
aaaa_records=[...], ...)
When constructing an azure record as done in self._apply_Create, When constructing an azure record as done in self._apply_Create,
the argument parameters for an A record would be the argument parameters for an A record would be
parameters={'ttl': <int>, 'arecords': [ARecord(<str ip>),]}.
parameters={'ttl': <int>, 'a_records': [ARecord(<str ip>),]}.
As another example for CNAME record: As another example for CNAME record:
parameters={'ttl': <int>, 'cname_record': CnameRecord(<str>)}. parameters={'ttl': <int>, 'cname_record': CnameRecord(<str>)}.
@ -101,8 +102,7 @@ class _AzureRecord(object):
return return
# Refer to function docstring for key_name and class_name. # Refer to function docstring for key_name and class_name.
format_u_s = '' if record._type == 'A' else '_'
key_name = '{}{}records'.format(self.record_type, format_u_s).lower()
key_name = '{}_records'.format(self.record_type).lower()
if record._type == 'CNAME': if record._type == 'CNAME':
key_name = key_name[:len(key_name) - 1] key_name = key_name[:len(key_name) - 1]
azure_class = self.TYPE_MAP[self.record_type] azure_class = self.TYPE_MAP[self.record_type]
@ -263,7 +263,7 @@ def _parse_azure_type(string):
def _check_for_alias(azrecord): def _check_for_alias(azrecord):
if (azrecord.target_resource.id and not azrecord.arecords and not
if (azrecord.target_resource.id and not azrecord.a_records and not
azrecord.cname_record): azrecord.cname_record):
return True return True
return False return False
@ -343,14 +343,14 @@ class AzureProvider(BaseProvider):
@property @property
def _dns_client(self): def _dns_client(self):
if self.__dns_client is None: if self.__dns_client is None:
credentials = ServicePrincipalCredentials(
self._dns_client_client_id,
secret=self._dns_client_key,
tenant=self._dns_client_directory_id
credential = ClientSecretCredential(
client_id=self._dns_client_client_id,
client_secret=self._dns_client_key,
tenant_id=self._dns_client_directory_id
) )
self.__dns_client = DnsManagementClient( self.__dns_client = DnsManagementClient(
credentials,
self._dns_client_subscription_id
credential=credential,
subscription_id=self._dns_client_subscription_id
) )
return self.__dns_client return self.__dns_client
@ -452,7 +452,7 @@ class AzureProvider(BaseProvider):
return exists return exists
def _data_for_A(self, azrecord): def _data_for_A(self, azrecord):
return {'values': [ar.ipv4_address for ar in azrecord.arecords]}
return {'values': [ar.ipv4_address for ar in azrecord.a_records]}
def _data_for_AAAA(self, azrecord): def _data_for_AAAA(self, azrecord):
return {'values': [ar.ipv6_address for ar in azrecord.aaaa_records]} return {'values': [ar.ipv6_address for ar in azrecord.aaaa_records]}


+ 3
- 2
requirements.txt View File

@ -1,6 +1,7 @@
PyYaml==5.4 PyYaml==5.4
azure-common==1.1.25
azure-mgmt-dns==3.0.0
azure-common==1.1.27
azure-identity==1.5.0
azure-mgmt-dns==8.0.0
boto3==1.15.9 boto3==1.15.9
botocore==1.18.9 botocore==1.18.9
dnspython==1.16.0 dnspython==1.16.0


+ 14
- 14
tests/test_octodns_provider_azuredns.py View File

@ -152,8 +152,8 @@ _base0.zone_name = 'unit.tests'
_base0.relative_record_set_name = '@' _base0.relative_record_set_name = '@'
_base0.record_type = 'A' _base0.record_type = 'A'
_base0.params['ttl'] = 0 _base0.params['ttl'] = 0
_base0.params['arecords'] = [ARecord(ipv4_address='1.2.3.4'),
ARecord(ipv4_address='10.10.10.10')]
_base0.params['a_records'] = [ARecord(ipv4_address='1.2.3.4'),
ARecord(ipv4_address='10.10.10.10')]
azure_records.append(_base0) azure_records.append(_base0)
_base1 = _AzureRecord('TestAzure', octo_records[1]) _base1 = _AzureRecord('TestAzure', octo_records[1])
@ -161,8 +161,8 @@ _base1.zone_name = 'unit.tests'
_base1.relative_record_set_name = 'a' _base1.relative_record_set_name = 'a'
_base1.record_type = 'A' _base1.record_type = 'A'
_base1.params['ttl'] = 1 _base1.params['ttl'] = 1
_base1.params['arecords'] = [ARecord(ipv4_address='1.2.3.4'),
ARecord(ipv4_address='1.1.1.1')]
_base1.params['a_records'] = [ARecord(ipv4_address='1.2.3.4'),
ARecord(ipv4_address='1.1.1.1')]
azure_records.append(_base1) azure_records.append(_base1)
_base2 = _AzureRecord('TestAzure', octo_records[2]) _base2 = _AzureRecord('TestAzure', octo_records[2])
@ -170,7 +170,7 @@ _base2.zone_name = 'unit.tests'
_base2.relative_record_set_name = 'aa' _base2.relative_record_set_name = 'aa'
_base2.record_type = 'A' _base2.record_type = 'A'
_base2.params['ttl'] = 9001 _base2.params['ttl'] = 9001
_base2.params['arecords'] = ARecord(ipv4_address='1.2.4.3')
_base2.params['a_records'] = ARecord(ipv4_address='1.2.4.3')
azure_records.append(_base2) azure_records.append(_base2)
_base3 = _AzureRecord('TestAzure', octo_records[3]) _base3 = _AzureRecord('TestAzure', octo_records[3])
@ -178,7 +178,7 @@ _base3.zone_name = 'unit.tests'
_base3.relative_record_set_name = 'aaa' _base3.relative_record_set_name = 'aaa'
_base3.record_type = 'A' _base3.record_type = 'A'
_base3.params['ttl'] = 2 _base3.params['ttl'] = 2
_base3.params['arecords'] = ARecord(ipv4_address='1.1.1.3')
_base3.params['a_records'] = ARecord(ipv4_address='1.1.1.3')
azure_records.append(_base3) azure_records.append(_base3)
_base4 = _AzureRecord('TestAzure', octo_records[4]) _base4 = _AzureRecord('TestAzure', octo_records[4])
@ -366,7 +366,7 @@ class Test_CheckAzureAlias(TestCase):
alias_record = type('C', (object,), {}) alias_record = type('C', (object,), {})
alias_record.target_resource = type('C', (object,), {}) alias_record.target_resource = type('C', (object,), {})
alias_record.target_resource.id = "/subscriptions/x/resourceGroups/y/z" alias_record.target_resource.id = "/subscriptions/x/resourceGroups/y/z"
alias_record.arecords = None
alias_record.a_records = None
alias_record.cname_record = None alias_record.cname_record = None
self.assertEquals(_check_for_alias(alias_record), True) self.assertEquals(_check_for_alias(alias_record), True)
@ -377,7 +377,7 @@ class TestAzureDnsProvider(TestCase):
return self._get_provider('mock_spc', 'mock_dns_client') return self._get_provider('mock_spc', 'mock_dns_client')
@patch('octodns.provider.azuredns.DnsManagementClient') @patch('octodns.provider.azuredns.DnsManagementClient')
@patch('octodns.provider.azuredns.ServicePrincipalCredentials')
@patch('octodns.provider.azuredns.ClientSecretCredential')
def _get_provider(self, mock_spc, mock_dns_client): def _get_provider(self, mock_spc, mock_dns_client):
'''Returns a mock AzureProvider object to use in testing. '''Returns a mock AzureProvider object to use in testing.
@ -399,12 +399,12 @@ class TestAzureDnsProvider(TestCase):
provider = self._get_provider() provider = self._get_provider()
rs = [] rs = []
recordSet = RecordSet(arecords=[ARecord(ipv4_address='1.1.1.1')])
recordSet = RecordSet(a_records=[ARecord(ipv4_address='1.1.1.1')])
recordSet.name, recordSet.ttl, recordSet.type = 'a1', 0, 'A' recordSet.name, recordSet.ttl, recordSet.type = 'a1', 0, 'A'
recordSet.target_resource = SubResource() recordSet.target_resource = SubResource()
rs.append(recordSet) rs.append(recordSet)
recordSet = RecordSet(arecords=[ARecord(ipv4_address='1.1.1.1'),
ARecord(ipv4_address='2.2.2.2')])
recordSet = RecordSet(a_records=[ARecord(ipv4_address='1.1.1.1'),
ARecord(ipv4_address='2.2.2.2')])
recordSet.name, recordSet.ttl, recordSet.type = 'a2', 1, 'A' recordSet.name, recordSet.ttl, recordSet.type = 'a2', 1, 'A'
recordSet.target_resource = SubResource() recordSet.target_resource = SubResource()
rs.append(recordSet) rs.append(recordSet)
@ -575,11 +575,11 @@ class TestAzureDnsProvider(TestCase):
provider = self._get_provider() provider = self._get_provider()
rs = [] rs = []
recordSet = RecordSet(arecords=[ARecord(ipv4_address='1.1.1.1')])
recordSet = RecordSet(a_records=[ARecord(ipv4_address='1.1.1.1')])
recordSet.name, recordSet.ttl, recordSet.type = 'a1', 0, 'A' recordSet.name, recordSet.ttl, recordSet.type = 'a1', 0, 'A'
rs.append(recordSet) rs.append(recordSet)
recordSet = RecordSet(arecords=[ARecord(ipv4_address='1.1.1.1'),
ARecord(ipv4_address='2.2.2.2')])
recordSet = RecordSet(a_records=[ARecord(ipv4_address='1.1.1.1'),
ARecord(ipv4_address='2.2.2.2')])
recordSet.name, recordSet.ttl, recordSet.type = 'a2', 1, 'A' recordSet.name, recordSet.ttl, recordSet.type = 'a2', 1, 'A'
rs.append(recordSet) rs.append(recordSet)


Loading…
Cancel
Save