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

Updates need to be able to create records as well as delete them.

This commit is contained in:
Terrence Cole
2017-08-02 10:51:12 -07:00
parent 41617e69a7
commit 3f369712e4
2 changed files with 55 additions and 11 deletions

View File

@@ -371,8 +371,11 @@ class RackspaceProvider(BaseProvider):
return [record.value] return [record.value]
def _mod_Create(self, change): 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 = [] out = []
for value in self._get_values(change.new): for value in values:
transformer = getattr(self, "_record_for_{}".format(change.new._type)) transformer = getattr(self, "_record_for_{}".format(change.new._type))
out.append(transformer(change.new, value)) out.append(transformer(change.new, value))
return out return out
@@ -386,8 +389,14 @@ class RackspaceProvider(BaseProvider):
deleted_values = set(existing_values) - set(new_values) deleted_values = set(existing_values) - set(new_values)
delete_out = self._delete_given_change_values(change, deleted_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 = [] 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)) transformer = getattr(self, "_record_for_{}".format(change.new._type))
prior_rs_record = transformer(change.existing, value) prior_rs_record = transformer(change.existing, value)
prior_key = self._key_for_record(prior_rs_record) prior_key = self._key_for_record(prior_rs_record)
@@ -398,7 +407,7 @@ class RackspaceProvider(BaseProvider):
update_out.append(next_rs_record) update_out.append(next_rs_record)
self._id_map[next_key] = self._id_map[prior_key] self._id_map[next_key] = self._id_map[prior_key]
del 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): def _mod_Delete(self, change):
return self._delete_given_change_values(change, self._get_values(change.existing)) return self._delete_given_change_values(change, self._get_values(change.existing))
@@ -427,7 +436,8 @@ class RackspaceProvider(BaseProvider):
if change.__class__.__name__ == 'Create': if change.__class__.__name__ == 'Create':
creates += self._mod_Create(change) creates += self._mod_Create(change)
elif change.__class__.__name__ == 'Update': 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 updates += add_updates
deletes += add_deletes deletes += add_deletes
elif change.__class__.__name__ == 'Delete': elif change.__class__.__name__ == 'Delete':

View File

@@ -392,7 +392,6 @@ class TestRackspaceProvider(TestCase):
ExpectedUpdates = None ExpectedUpdates = None
return self._test_apply_with_data(TestData) return self._test_apply_with_data(TestData)
def test_apply_multiple_additions_exploding(self): def test_apply_multiple_additions_exploding(self):
class TestData(object): class TestData(object):
OtherRecords = [ OtherRecords = [
@@ -674,6 +673,41 @@ class TestRackspaceProvider(TestCase):
} }
return self._test_apply_with_data(TestData) 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): def test_apply_multiple_updates(self):
class TestData(object): class TestData(object):
OtherRecords = [ OtherRecords = [
@@ -712,16 +746,16 @@ class TestRackspaceProvider(TestCase):
ExpectedAdditions = None ExpectedAdditions = None
ExpectedDeletions = None ExpectedDeletions = None
ExpectedUpdates = { ExpectedUpdates = {
"records": [{ "records": [ {
"name": "unit.tests",
"id": "A-111111",
"data": "1.2.3.4",
"ttl": 3600
}, {
"name": "unit.tests", "name": "unit.tests",
"id": "A-222222", "id": "A-222222",
"data": "1.2.3.5", "data": "1.2.3.5",
"ttl": 3600 "ttl": 3600
}, {
"name": "unit.tests",
"id": "A-111111",
"data": "1.2.3.4",
"ttl": 3600
}, { }, {
"name": "unit.tests", "name": "unit.tests",
"id": "A-333333", "id": "A-333333",