Parcourir la source

[1455] rfc2136 check for name_is_in_use

Jelte Jansen il y a 13 ans
Parent
commit
7055c97492

+ 13 - 2
src/lib/python/isc/ddns/session.py

@@ -228,8 +228,19 @@ class UpdateSession:
         '''
         '''
         return not self.__check_prerequisite_rrset_exists(datasrc_client, rrset)
         return not self.__check_prerequisite_rrset_exists(datasrc_client, rrset)
 
 
-    def __check_prerequisite_name_in_use(self):
-        pass
+    def __check_prerequisite_name_in_use(self, datasrc_client, rrset):
+        '''Check whether the name of the given RRset is in use (i.e. has
+           1 or more RRs).
+           RFC2136 Section 2.4.4
+        '''
+        _, finder = datasrc_client.find_zone(rrset.get_name())
+        result, rrsets, flags = finder.find_all(rrset.get_name(),
+                                                finder.NO_WILDCARD |
+                                                finder.FIND_GLUE_OK)
+        if result == finder.SUCCESS and\
+           (flags & finder.RESULT_WILDCARD == 0):
+            return True
+        return False
 
 
     def __check_prerequisite_name_not_in_use(self):
     def __check_prerequisite_name_not_in_use(self):
         pass
         pass

+ 43 - 1
src/lib/python/isc/ddns/tests/session_tests.py

@@ -179,6 +179,15 @@ class SessionTest(unittest.TestCase):
                 _UpdateSession__check_prerequisite_rrset_does_not_exist(client,
                 _UpdateSession__check_prerequisite_rrset_does_not_exist(client,
                                                                         rrset))
                                                                         rrset))
 
 
+    def __check_prerequisite_name_in_use(self, expected, client, rrset):
+        '''Similar to __check_prerequisite_exists(), but for checking
+           the result of __check_prerequisite_name_in_use().
+        '''
+        self.assertEqual(expected,
+            self.__session.
+                 _UpdateSession__check_prerequisite_name_in_use(client,
+                                                                rrset))
+
     def test_check_prerequisite_exists(self):
     def test_check_prerequisite_exists(self):
         # Basic existence checks
         # Basic existence checks
         # www.example.org should have an A, but not an MX
         # www.example.org should have an A, but not an MX
@@ -379,7 +388,40 @@ class SessionTest(unittest.TestCase):
         self.__check_prerequisite_does_not_exist(False, self.__datasrc_client, rrset)
         self.__check_prerequisite_does_not_exist(False, self.__datasrc_client, rrset)
 
 
     def test_check_prerequisite_name_in_use(self):
     def test_check_prerequisite_name_in_use(self):
-        pass
+        rrset = isc.dns.RRset(isc.dns.Name("example.org"),
+                              isc.dns.RRClass.ANY(), isc.dns.RRType.ANY(),
+                              isc.dns.RRTTL(0))
+        self.__check_prerequisite_name_in_use(True, self.__datasrc_client, rrset)
+
+        rrset = isc.dns.RRset(isc.dns.Name("www.example.org"),
+                              isc.dns.RRClass.ANY(), isc.dns.RRType.ANY(),
+                              isc.dns.RRTTL(0))
+        self.__check_prerequisite_name_in_use(True, self.__datasrc_client, rrset)
+
+        rrset = isc.dns.RRset(isc.dns.Name("doesnotexist.example.org"),
+                              isc.dns.RRClass.ANY(), isc.dns.RRType.ANY(),
+                              isc.dns.RRTTL(0))
+        self.__check_prerequisite_name_in_use(False, self.__datasrc_client, rrset)
+
+        rrset = isc.dns.RRset(isc.dns.Name("belowdelegation.sub.example.org"),
+                              isc.dns.RRClass.ANY(), isc.dns.RRType.ANY(),
+                              isc.dns.RRTTL(0))
+        self.__check_prerequisite_name_in_use(False, self.__datasrc_client, rrset)
+
+        rrset = isc.dns.RRset(isc.dns.Name("foo.wildcard.example.org"),
+                              isc.dns.RRClass.ANY(), isc.dns.RRType.ANY(),
+                              isc.dns.RRTTL(0))
+        self.__check_prerequisite_name_in_use(False, self.__datasrc_client, rrset)
+
+        # empty nonterminal should not match
+        rrset = isc.dns.RRset(isc.dns.Name("nonterminal.example.org"),
+                              isc.dns.RRClass.ANY(), isc.dns.RRType.ANY(),
+                              isc.dns.RRTTL(0))
+        self.__check_prerequisite_name_in_use(False, self.__datasrc_client, rrset)
+        rrset = isc.dns.RRset(isc.dns.Name("empty.nonterminal.example.org"),
+                              isc.dns.RRClass.ANY(), isc.dns.RRType.ANY(),
+                              isc.dns.RRTTL(0))
+        self.__check_prerequisite_name_in_use(True, self.__datasrc_client, rrset)
 
 
     def test_check_prerequisite_name_not_in_use(self):
     def test_check_prerequisite_name_not_in_use(self):
         pass
         pass

BIN
src/lib/testutils/testdata/rwtest.sqlite3