Browse Source

[1457] more CNAME update tests and fixes

Jelte Jansen 13 years ago
parent
commit
0db71e6a18
2 changed files with 53 additions and 34 deletions
  1. 13 10
      src/lib/python/isc/ddns/session.py
  2. 40 24
      src/lib/python/isc/ddns/tests/session_tests.py

+ 13 - 10
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):

+ 40 - 24
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")