From 8230700ad17ebe9f8fcaf80212bec9a424d5f1ec Mon Sep 17 00:00:00 2001 From: Petter Hassberg Date: Tue, 3 Oct 2017 13:25:36 +0200 Subject: [PATCH] Consolidate googlecloud provider to single class remove _GoogleCloudRecordSetMaker into the GoogleCloudProvider, and consolidate methods. --- octodns/provider/googlecloud.py | 144 ++++++++------------- tests/test_octodns_provider_googlecloud.py | 38 +++--- 2 files changed, 72 insertions(+), 110 deletions(-) diff --git a/octodns/provider/googlecloud.py b/octodns/provider/googlecloud.py index 8aa8c99..0f20587 100644 --- a/octodns/provider/googlecloud.py +++ b/octodns/provider/googlecloud.py @@ -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 diff --git a/tests/test_octodns_provider_googlecloud.py b/tests/test_octodns_provider_googlecloud.py index c7b93e3..76eedba 100644 --- a/tests/test_octodns_provider_googlecloud.py +++ b/tests/test_octodns_provider_googlecloud.py @@ -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()