From 3f369712e4cbff55b1ac3a2d634a552c77bd67be Mon Sep 17 00:00:00 2001 From: Terrence Cole Date: Wed, 2 Aug 2017 10:51:12 -0700 Subject: [PATCH] Updates need to be able to create records as well as delete them. --- octodns/provider/rackspace.py | 18 +++++++--- tests/test_octodns_provider_rackspace.py | 46 ++++++++++++++++++++---- 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/octodns/provider/rackspace.py b/octodns/provider/rackspace.py index 0eb0b2f..a856295 100644 --- a/octodns/provider/rackspace.py +++ b/octodns/provider/rackspace.py @@ -371,8 +371,11 @@ class RackspaceProvider(BaseProvider): return [record.value] def _mod_Create(self, change): + return self._create_given_change_values(change, self._get_values(change.new)) + + def _create_given_change_values(self, change, values): out = [] - for value in self._get_values(change.new): + for value in values: transformer = getattr(self, "_record_for_{}".format(change.new._type)) out.append(transformer(change.new, value)) return out @@ -386,8 +389,14 @@ class RackspaceProvider(BaseProvider): deleted_values = set(existing_values) - set(new_values) delete_out = self._delete_given_change_values(change, deleted_values) + # An increase in number of values in an update record needs + # to get upgraded into a Create change for the added values. + create_values = set(new_values) - set(existing_values) + create_out = self._create_given_change_values(change, create_values) + update_out = [] - for value in new_values: + update_values = set(new_values).intersection(set(existing_values)) + for value in update_values: transformer = getattr(self, "_record_for_{}".format(change.new._type)) prior_rs_record = transformer(change.existing, value) prior_key = self._key_for_record(prior_rs_record) @@ -398,7 +407,7 @@ class RackspaceProvider(BaseProvider): update_out.append(next_rs_record) self._id_map[next_key] = self._id_map[prior_key] del self._id_map[prior_key] - return update_out, delete_out + return create_out, update_out, delete_out def _mod_Delete(self, change): return self._delete_given_change_values(change, self._get_values(change.existing)) @@ -427,7 +436,8 @@ class RackspaceProvider(BaseProvider): if change.__class__.__name__ == 'Create': creates += self._mod_Create(change) elif change.__class__.__name__ == 'Update': - add_updates, add_deletes = self._mod_Update(change) + add_creates, add_updates, add_deletes = self._mod_Update(change) + creates += add_creates updates += add_updates deletes += add_deletes elif change.__class__.__name__ == 'Delete': diff --git a/tests/test_octodns_provider_rackspace.py b/tests/test_octodns_provider_rackspace.py index 243ebc4..ce80112 100644 --- a/tests/test_octodns_provider_rackspace.py +++ b/tests/test_octodns_provider_rackspace.py @@ -392,7 +392,6 @@ class TestRackspaceProvider(TestCase): ExpectedUpdates = None return self._test_apply_with_data(TestData) - def test_apply_multiple_additions_exploding(self): class TestData(object): OtherRecords = [ @@ -674,6 +673,41 @@ class TestRackspaceProvider(TestCase): } return self._test_apply_with_data(TestData) + def test_apply_update_TXT(self): + class TestData(object): + OtherRecords = [ + { + "subdomain": '', + "data": { + 'type': 'TXT', + 'ttl': 300, + 'value': 'othervalue' + } + } + ] + OwnRecords = { + "totalEntries": 1, + "records": [{ + "name": "unit.tests", + "id": "TXT-111111", + "type": "TXT", + "data": "somevalue", + "ttl": 300 + }] + } + ExpectChanges = True + ExpectedAdditions = { + "records": [{ + "name": "unit.tests", + "type": "TXT", + "data": "othervalue", + "ttl": 300 + }] + } + ExpectedDeletions = 'id=TXT-111111' + ExpectedUpdates = None + return self._test_apply_with_data(TestData) + def test_apply_multiple_updates(self): class TestData(object): OtherRecords = [ @@ -712,15 +746,15 @@ class TestRackspaceProvider(TestCase): ExpectedAdditions = None ExpectedDeletions = None ExpectedUpdates = { - "records": [{ + "records": [ { "name": "unit.tests", - "id": "A-111111", - "data": "1.2.3.4", + "id": "A-222222", + "data": "1.2.3.5", "ttl": 3600 }, { "name": "unit.tests", - "id": "A-222222", - "data": "1.2.3.5", + "id": "A-111111", + "data": "1.2.3.4", "ttl": 3600 }, { "name": "unit.tests",