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

Consolidate googlecloud provider to single class

remove _GoogleCloudRecordSetMaker into the GoogleCloudProvider, and consolidate methods.
This commit is contained in:
Petter Hassberg
2017-10-03 13:25:36 +02:00
parent 2a3690e877
commit 8230700ad1
2 changed files with 72 additions and 110 deletions

View File

@@ -16,76 +16,6 @@ from .base import BaseProvider
from ..record import Record
class _GoogleCloudRecordSetMaker(object):
"""Wrapper to make google cloud client resource record sets from OctoDNS
Records.
googlecloud.py:
class: octodns.provider.googlecloud._GoogleCloudRecordSetMaker
An _GoogleCloudRecordSetMaker creates google cloued client resource
records which can be used to update the Google Cloud DNS zones.
"""
def __init__(self, gcloud_zone, record):
self.gcloud_zone = gcloud_zone
self.record = record
self._record_set_func = getattr(
self, '_record_set_from_{}'.format(record._type))
def get_record_set(self):
return self._record_set_func(self.record)
def _record_set_from_A(self, record):
return self.gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, record.values)
_record_set_from_AAAA = _record_set_from_A
def _record_set_from_CAA(self, record):
return self.gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, [
'{flags} {tag} {value}'.format(**record.data['value'])])
def _record_set_from_CNAME(self, record):
return self.gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, [record.value])
def _record_set_from_MX(self, record):
return self.gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, [
'{preference} {exchange}'.format(**v.data)
for v in record.values])
def _record_set_from_NAPTR(self, record):
return self.gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, [
'{order} {preference} "{flags}" "{service}" '
'"{regexp}" {replacement}'
.format(**v.data) for v in record.values])
_record_set_from_NS = _record_set_from_A
_record_set_from_PTR = _record_set_from_CNAME
_record_set_from_SPF = _record_set_from_A
def _record_set_from_SRV(self, record):
return self.gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, [
'{priority} {weight} {port} {target}'
.format(**v.data) for v in record.values])
def _record_set_from_TXT(self, record):
if 'values' in record.data:
val = record.data['values']
else:
val = [record.data['value']]
return self.gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, val)
class GoogleCloudProvider(BaseProvider):
"""
Google Cloud DNS provider
@@ -146,17 +76,20 @@ class GoogleCloudProvider(BaseProvider):
for change in changes:
class_name = change.__class__.__name__
_rrset_func = getattr(
self, '_rrset_for_{}'.format(change.record._type))
if class_name in 'Create':
gcloud_changes.add_record_set(
self._record_to_record_set(gcloud_zone, change.record))
_rrset_func(gcloud_zone, change.record))
elif class_name == 'Delete':
gcloud_changes.delete_record_set(
self._record_to_record_set(gcloud_zone, change.record))
_rrset_func(gcloud_zone, change.record))
elif class_name == 'Update':
gcloud_changes.delete_record_set(
self._record_to_record_set(gcloud_zone, change.existing))
_rrset_func(gcloud_zone, change.existing))
gcloud_changes.add_record_set(
self._record_to_record_set(gcloud_zone, change.new))
_rrset_func(gcloud_zone, change.new))
else:
raise RuntimeError('Change type "{}" for change "{!s}" '
'is none of "Create", "Delete" or "Update'
@@ -260,20 +193,6 @@ class GoogleCloudProvider(BaseProvider):
if create:
return self._create_gcloud_zone(dns_name)
@staticmethod
def _record_to_record_set(gcloud_zone, record):
"""create google.cloud.dns.ResourceRecordSet from ocdodns.Record
:param record: a record object
:type record: ocdodns.Record
:param gcloud_zone: a google gcloud zone
:type gcloud_zone: google.cloud.dns.ManagedZone
:type return: google.cloud.dns.ResourceRecordSet
"""
grm = _GoogleCloudRecordSetMaker(gcloud_zone, record)
return grm.get_record_set()
def populate(self, zone, target=False, lenient=False):
"""Required function of manager.py to collect records from zone.
@@ -373,3 +292,52 @@ class GoogleCloudProvider(BaseProvider):
for v in [shlex.split(g) for g in gcloud_record.rrdatas]]}
_data_for_TXT = _data_for_SPF
def _rrset_for_A(self, gcloud_zone, record):
return gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, record.values)
_rrset_for_AAAA = _rrset_for_A
def _rrset_for_CAA(self, gcloud_zone, record):
return gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, [
'{flags} {tag} {value}'.format(**record.data['value'])])
def _rrset_for_CNAME(self, gcloud_zone, record):
return gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, [record.value])
def _rrset_for_MX(self, gcloud_zone, record):
return gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, [
'{preference} {exchange}'.format(**v.data)
for v in record.values])
def _rrset_for_NAPTR(self, gcloud_zone, record):
return gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, [
'{order} {preference} "{flags}" "{service}" '
'"{regexp}" {replacement}'
.format(**v.data) for v in record.values])
_rrset_for_NS = _rrset_for_A
_rrset_for_PTR = _rrset_for_CNAME
def _rrset_for_SPF(self, gcloud_zone, record):
if 'values' in record.data:
val = record.data['values']
else:
val = [record.data['value']]
return gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, val)
def _rrset_for_SRV(self, gcloud_zone, record):
return gcloud_zone.resource_record_set(
record.fqdn, record._type, record.ttl, [
'{priority} {weight} {port} {target}'
.format(**v.data) for v in record.values])
_rrset_for_TXT = _rrset_for_SPF

View File

@@ -6,8 +6,7 @@ from __future__ import absolute_import, division, print_function, \
unicode_literals
from octodns.record import Create, Delete, Update, Record
from octodns.provider.googlecloud import GoogleCloudProvider, \
_GoogleCloudRecordSetMaker
from octodns.provider.googlecloud import GoogleCloudProvider
from octodns.zone import Zone
from octodns.provider.base import Plan, BaseProvider
@@ -194,19 +193,6 @@ class DummyIterator:
return self.iterable.next()
class TestGoogleCloudRecordSetMaker(TestCase):
def test_get_record_set(self):
mz = DummyGoogleCloudZone('unit.tests.')
record_sets = []
for record in octo_records:
mm = _GoogleCloudRecordSetMaker(mz, record)
record_sets.append(mm.get_record_set())
self.assertEqual(
len(octo_records),
len(record_sets))
class TestGoogleCloudProvider(TestCase):
@patch('octodns.provider.googlecloud.dns')
def _get_provider(*args):
@@ -304,6 +290,10 @@ class TestGoogleCloudProvider(TestCase):
unsupported_change = Mock()
unsupported_change.__len__ = Mock(return_value=1)
type_mock = Mock()
type_mock._type = "A"
unsupported_change.record = type_mock
mock_plan = Mock()
type(mock_plan).desired = PropertyMock(return_value=DummyDesired(
"dummy name", []))
@@ -312,13 +302,6 @@ class TestGoogleCloudProvider(TestCase):
with self.assertRaises(RuntimeError):
provider.apply(mock_plan)
def test__record_to_record_set(self):
provider = self._get_provider()
gcloud_zone = DummyGoogleCloudZone('unit.tests.')
for record in octo_records:
self.assertIsNotNone(provider._record_to_record_set(
gcloud_zone, record))
def test__get_gcloud_client(self):
provider = self._get_provider()
@@ -404,6 +387,17 @@ class TestGoogleCloudProvider(TestCase):
msg="Check that nonexistant zones return None when"
"there's no create=True flag")
def test__get_rrsets(self):
provider = self._get_provider()
dummy_gcloud_zone = DummyGoogleCloudZone("unit.tests")
for octo_record in octo_records:
_rrset_func = getattr(
provider, '_rrset_for_{}'.format(octo_record._type))
self.assertEqual(
_rrset_func(dummy_gcloud_zone, octo_record).record_type,
octo_record._type
)
def test__create_zone(self):
provider = self._get_provider()