From: Jelte Jansen Date: Sun, 27 May 2012 10:40:39 +0000 (+0200) Subject: [1457] more CNAME update tests and fixes X-Git-Tag: trac2351_base~226^2~59^2~25 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0db71e6a18ea01c52c6fe9280c15ddfc7aebd163;p=thirdparty%2Fkea.git [1457] more CNAME update tests and fixes --- diff --git a/src/lib/python/isc/ddns/session.py b/src/lib/python/isc/ddns/session.py index 49f2c41a83..f3fb5a8c79 100644 --- a/src/lib/python/isc/ddns/session.py +++ b/src/lib/python/isc/ddns/session.py @@ -510,9 +510,12 @@ class UpdateSession: # helper for __do_update_add_rrs_to_rrset, only add the # rr if it is not present yet # (note that rr here is already a single-rr rrset) - rr_rdata = rr.get_rdata()[0] - if not rr_rdata in existing_rrset.get_rdata(): + if existing_rrset is None: diff.add_data(rr) + else: + rr_rdata = rr.get_rdata()[0] + if not rr_rdata in existing_rrset.get_rdata(): + diff.add_data(rr) def __do_update_add_rrs_to_rrset(self, datasrc_client, diff, rrset): # For a number of cases, we may need to remove data in the zone @@ -536,18 +539,18 @@ class UpdateSession: elif result == finder.SUCCESS: # if update is cname, and zone rr is not, ignore if rrset.get_type() == RRType.CNAME(): - if orig_rrset.get_type() != RRType.CNAME(): - # Ignore CNAME update for non-CNAME data - return - else: - # Remove original CNAME record (the new one - # is added below) - diff.delete_data(orig_rrset) + # Remove original CNAME record (the new one + # is added below) + diff.delete_data(orig_rrset) # We do not have WKS support at this time, but if there # are special Update equality rules such as for WKS, and # we do have support for the type, this is where the check # (and potential delete) would go. - print("[XX] UPDATE RRSET: " + str(rrset)) + elif result == finder.NXRRSET: + # There is data present, but not for this type. + # If this type is CNAME, ignore the update + if rrset.get_type() == RRType.CNAME(): + return foreach_rr_in_rrset(rrset, self.__do_update_add_single_rr, diff, rrset, orig_rrset) def __do_update_delete_rrset(self, datasrc_client, zname, diff, rrset): diff --git a/src/lib/python/isc/ddns/tests/session_tests.py b/src/lib/python/isc/ddns/tests/session_tests.py index 09be8b6d18..ba43105776 100644 --- a/src/lib/python/isc/ddns/tests/session_tests.py +++ b/src/lib/python/isc/ddns/tests/session_tests.py @@ -156,7 +156,7 @@ class SessionTest(unittest.TestCase): def foreach_rr_in_rrset_helper(self, rr, l): l.append(rr.to_text()) - def test_foreach_rr_in_rrsetet(self): + def test_foreach_rr_in_rrset(self): rrset = isc.dns.RRset(isc.dns.Name("www.example.org"), TEST_RRCLASS, isc.dns.RRType.A(), @@ -707,6 +707,15 @@ class SessionTest(unittest.TestCase): def initialize_update_rrsets(self): '''Prepare a number of RRsets to be used in several update tests The rrsets are stored in self''' + orig_a_rrset = isc.dns.RRset(isc.dns.Name("www.example.org"), + TEST_RRCLASS, + isc.dns.RRType.A(), + isc.dns.RRTTL(3600)) + orig_a_rrset.add_rdata(isc.dns.Rdata(orig_a_rrset.get_type(), + orig_a_rrset.get_class(), + "192.0.2.1")) + self.orig_a_rrset = orig_a_rrset + rrset_update_a = isc.dns.RRset(isc.dns.Name("www.example.org"), TEST_RRCLASS, isc.dns.RRType.A(), @@ -958,13 +967,7 @@ class SessionTest(unittest.TestCase): self.initialize_update_rrsets() # initially, the www should only contain one rr - orig_a_rrset = isc.dns.RRset(isc.dns.Name("www.example.org"), - TEST_RRCLASS, - isc.dns.RRType.A(), - isc.dns.RRTTL(3600)) - orig_a_rrset.add_rdata(isc.dns.Rdata(orig_a_rrset.get_type(), - orig_a_rrset.get_class(), - "192.0.2.1")) + # (set to self.orig_a_rrset) # during this test, we will extend it at some point extended_a_rrset = isc.dns.RRset(isc.dns.Name("www.example.org"), @@ -985,7 +988,7 @@ class SessionTest(unittest.TestCase): self.check_inzone_data(isc.datasrc.ZoneFinder.SUCCESS, isc.dns.Name("www.example.org"), isc.dns.RRType.A(), - orig_a_rrset) + self.orig_a_rrset) # Add two rrs self.check_full_handle_result(Rcode.NOERROR(), [ self.rrset_update_a ]) @@ -1008,14 +1011,14 @@ class SessionTest(unittest.TestCase): self.check_inzone_data(isc.datasrc.ZoneFinder.SUCCESS, isc.dns.Name("www.example.org"), isc.dns.RRType.A(), - orig_a_rrset) + self.orig_a_rrset) # 'Deleting' them again should make no difference self.check_full_handle_result(Rcode.NOERROR(), [ self.rrset_update_del_rrset_part ]) self.check_inzone_data(isc.datasrc.ZoneFinder.SUCCESS, isc.dns.Name("www.example.org"), isc.dns.RRType.A(), - orig_a_rrset) + self.orig_a_rrset) # Check that if we update the SOA, it is updated to our value self.check_full_handle_result(Rcode.NOERROR(), [ self.rrset_update_soa2 ]) @@ -1124,10 +1127,10 @@ class SessionTest(unittest.TestCase): isc.dns.RRType.NS(), short_ns_rrset) - def test_update_apex_special_cases(self): + def test_update_cname_special_cases(self): self.initialize_update_rrsets() - # The original cname, for checking + # Sanity check orig_cname_rrset = isc.dns.RRset(isc.dns.Name("cname.example.org"), TEST_RRCLASS, isc.dns.RRType.CNAME(), @@ -1135,16 +1138,6 @@ class SessionTest(unittest.TestCase): orig_cname_rrset.add_rdata(isc.dns.Rdata(orig_cname_rrset.get_type(), orig_cname_rrset.get_class(), "www.example.org.")) - # The CNAME we will change it to - new_cname_rrset = isc.dns.RRset(isc.dns.Name("cname.example.org"), - TEST_RRCLASS, - isc.dns.RRType.CNAME(), - isc.dns.RRTTL(3600)) - new_cname_rrset.add_rdata(isc.dns.Rdata(new_cname_rrset.get_type(), - new_cname_rrset.get_class(), - "mail.example.org.")) - - # Sanity check self.check_inzone_data(isc.datasrc.ZoneFinder.CNAME, isc.dns.Name("cname.example.org"), isc.dns.RRType.A(), @@ -1166,15 +1159,38 @@ class SessionTest(unittest.TestCase): orig_cname_rrset) # But updating the cname itself should work + new_cname_rrset = isc.dns.RRset(isc.dns.Name("cname.example.org"), + TEST_RRCLASS, + isc.dns.RRType.CNAME(), + isc.dns.RRTTL(3600)) + new_cname_rrset.add_rdata(isc.dns.Rdata(new_cname_rrset.get_type(), + new_cname_rrset.get_class(), + "mail.example.org.")) self.check_full_handle_result(Rcode.NOERROR(), [ new_cname_rrset ]) self.check_inzone_data(isc.datasrc.ZoneFinder.CNAME, isc.dns.Name("cname.example.org"), isc.dns.RRType.A(), new_cname_rrset) + self.initialize_update_rrsets() # Likewise, adding a cname where other data is # present should do nothing either - + self.check_inzone_data(isc.datasrc.ZoneFinder.SUCCESS, + isc.dns.Name("www.example.org"), + isc.dns.RRType.A(), + self.orig_a_rrset) + new_cname_rrset = isc.dns.RRset(isc.dns.Name("www.example.org"), + TEST_RRCLASS, + isc.dns.RRType.CNAME(), + isc.dns.RRTTL(3600)) + new_cname_rrset.add_rdata(isc.dns.Rdata(new_cname_rrset.get_type(), + new_cname_rrset.get_class(), + "mail.example.org.")) + self.check_full_handle_result(Rcode.NOERROR(), [ new_cname_rrset ]) + self.check_inzone_data(isc.datasrc.ZoneFinder.SUCCESS, + isc.dns.Name("www.example.org"), + isc.dns.RRType.A(), + self.orig_a_rrset) if __name__ == "__main__": isc.log.init("bind10")