Browse Source

[2016] docstrings and cleanup

Jelte Jansen 13 years ago
parent
commit
342a2b3bcb
2 changed files with 38 additions and 25 deletions
  1. 3 9
      src/lib/python/isc/ddns/session.py
  2. 35 16
      src/lib/python/isc/xfrin/diff.py

+ 3 - 9
src/lib/python/isc/ddns/session.py

@@ -636,6 +636,7 @@ class UpdateSession:
            Special cases: if the delete statement is for the
            Special cases: if the delete statement is for the
            zone's apex, and the type is either SOA or NS, it
            zone's apex, and the type is either SOA or NS, it
            is ignored.'''
            is ignored.'''
+        # find the rrset with local updates
         result, to_delete, _ = self.__diff.find_updated(rrset.get_name(),
         result, to_delete, _ = self.__diff.find_updated(rrset.get_name(),
                                                         rrset.get_type())
                                                         rrset.get_type())
         if result == ZoneFinder.SUCCESS:
         if result == ZoneFinder.SUCCESS:
@@ -653,12 +654,7 @@ class UpdateSession:
            may never be removed (and any action that would do so
            may never be removed (and any action that would do so
            should be ignored).
            should be ignored).
         '''
         '''
-        # NOTE: This method is currently bad: it WILL delete all
-        # NS rrsets in a number of cases.
-        # We need an extension to our diff.py to handle this correctly
-        # (see ticket #2016)
-        # The related test is currently disabled. When this is fixed,
-        # enable that test again.
+        # Find the current NS rrset, including local additions and deletions
         result, orig_rrset, _ = self.__diff.find_updated(rrset.get_name(),
         result, orig_rrset, _ = self.__diff.find_updated(rrset.get_name(),
                                                          rrset.get_type())
                                                          rrset.get_type())
 
 
@@ -691,9 +687,7 @@ class UpdateSession:
            Special case: if the name is the zone's apex, SOA and
            Special case: if the name is the zone's apex, SOA and
            NS records are kept.
            NS records are kept.
         '''
         '''
-        # Remove any RRs for this name from the current list of additions
-        #self.__diff.remove_name_from_additions(rrset.get_name())
-
+        # Find everything with the name, including local additions
         result, rrsets, flags = self.__diff.find_all_updated(rrset.get_name())
         result, rrsets, flags = self.__diff.find_all_updated(rrset.get_name())
         if result == ZoneFinder.SUCCESS and\
         if result == ZoneFinder.SUCCESS and\
            (flags & ZoneFinder.RESULT_WILDCARD == 0):
            (flags & ZoneFinder.RESULT_WILDCARD == 0):

+ 35 - 16
src/lib/python/isc/xfrin/diff.py

@@ -452,7 +452,7 @@ class Diff:
         self.__additions = self.__remove_rr_from_buffer(self.__additions, rr)
         self.__additions = self.__remove_rr_from_buffer(self.__additions, rr)
         return len(self.__additions) != orig_size
         return len(self.__additions) != orig_size
 
 
-    def _get_name_from_additions(self, name):
+    def __get_name_from_additions(self, name):
         '''
         '''
         Returns a list of all rrs in the additions queue that have the given
         Returns a list of all rrs in the additions queue that have the given
         Name.
         Name.
@@ -462,7 +462,7 @@ class Diff:
         '''
         '''
         return [ rr for (_, rr) in self.__additions if rr.get_name() == name ]
         return [ rr for (_, rr) in self.__additions if rr.get_name() == name ]
 
 
-    def _get_name_from_deletions(self, name):
+    def __get_name_from_deletions(self, name):
         '''
         '''
         Returns a list of all rrs in the deletions queue that have the given
         Returns a list of all rrs in the deletions queue that have the given
         Name
         Name
@@ -472,38 +472,44 @@ class Diff:
         '''
         '''
         return [ rr for (_, rr) in self.__deletions if rr.get_name() == name ]
         return [ rr for (_, rr) in self.__deletions if rr.get_name() == name ]
 
 
-    def _get_name_type_from_additions(self, name, rrtype):
+    def __get_name_type_from_additions(self, name, rrtype):
         '''
         '''
         Returns a list of the rdatas of the rrs in the additions queue that
         Returns a list of the rdatas of the rrs in the additions queue that
         have the given name and type
         have the given name and type
         This method is protected; it is not meant to be called from anywhere
         This method is protected; it is not meant to be called from anywhere
         but the find_updated() method. It is not private for easier testing.
         but the find_updated() method. It is not private for easier testing.
         '''
         '''
-        #return [ rr.get_rdata()[0] for (_, rr) in self.__additions if rr.get_name() == name and rr.get_type() == rrtype ]
-        return [ rr for (_, rr) in self.__additions if rr.get_name() == name and rr.get_type() == rrtype ]
+        return [ rr for (_, rr) in self.__additions\
+                    if rr.get_name() == name and rr.get_type() == rrtype ]
 
 
-    def _get_name_type_from_deletions(self, name, rrtype):
+    def __get_name_type_from_deletions(self, name, rrtype):
         '''
         '''
         Returns a list of the rdatas of the rrs in the deletions queue that
         Returns a list of the rdatas of the rrs in the deletions queue that
         have the given name and type
         have the given name and type
         This method is protected; it is not meant to be called from anywhere
         This method is protected; it is not meant to be called from anywhere
         but the find_updated() method. It is not private for easier testing.
         but the find_updated() method. It is not private for easier testing.
         '''
         '''
-        return [ rr.get_rdata()[0] for (_, rr) in self.__deletions if rr.get_name() == name and rr.get_type() == rrtype ]
+        return [ rr.get_rdata()[0] for (_, rr) in self.__deletions\
+                    if rr.get_name() == name and rr.get_type() == rrtype ]
 
 
     def find_updated(self, name, rrtype):
     def find_updated(self, name, rrtype):
         '''
         '''
         Returns the result of find(), but with current updates applied, i.e.
         Returns the result of find(), but with current updates applied, i.e.
-        as if this diff has been committed. Only works for find results
-        SUCCESS, NXDOMAIN, and NXRRSET.
+        as if this diff has been committed. Only performs additional
+        processing in the case find() returns SUCCESS, NXDOMAIN, or NXRRSET;
+        in all other cases, the results are returned directly.
+        Any RRs in the current deletions buffer are removed from the result,
+        and RRs in the current additions buffer are added to the result.
+        If the result was SUCCESS, but every RR in it is removed due to
+        deletions, and there is nothing in the additions, the rcode is changed
+        to NXRRSET.
+        If the result was NXDOMAIN or NXRRSET, and there are rrs in the
+        additions buffer, the result is changed to SUCCESS.
         '''
         '''
         result, rrset, flags = self.find(name, rrtype)
         result, rrset, flags = self.find(name, rrtype)
 
 
-        # Create a new rrset object;
-        # - add all rdatas from the found rrset, unless they are in __deletions
-        # - add all rdatas from additions
-        added_rrs = self._get_name_type_from_additions(name, rrtype)
-        deleted_rrs = self._get_name_type_from_deletions(name, rrtype)
+        added_rrs = self.__get_name_type_from_additions(name, rrtype)
+        deleted_rrs = self.__get_name_type_from_deletions(name, rrtype)
 
 
         if result == ZoneFinder.SUCCESS:
         if result == ZoneFinder.SUCCESS:
             new_rrset = isc.dns.RRset(name, self.__updater.get_class(),
             new_rrset = isc.dns.RRset(name, self.__updater.get_class(),
@@ -537,12 +543,25 @@ class Diff:
         return result, new_rrset, flags
         return result, new_rrset, flags
 
 
     def find_all_updated(self, name):
     def find_all_updated(self, name):
+        '''
+        Returns the result of find_all(), but with current updates applied,
+        i.e. as if this diff has been committed. Only performs additional
+        processing in the case find() returns SUCCESS or NXDOMAIN;
+        in all other cases, the results are returned directly.
+        Any RRs in the current deletions buffer are removed from the result,
+        and RRs in the current additions buffer are added to the result.
+        If the result was SUCCESS, but every RR in it is removed due to
+        deletions, and there is nothing in the additions, the rcode is changed
+        to NXDOMAIN.
+        If the result was NXDOMAIN, and there are rrs in the additions buffer,
+        the result is changed to SUCCESS.
+        '''
         result, rrsets, flags = self.find_all(name)
         result, rrsets, flags = self.find_all(name)
         new_rrsets = []
         new_rrsets = []
-        added_rrs = self._get_name_from_additions(name)
+        added_rrs = self.__get_name_from_additions(name)
         if result == ZoneFinder.SUCCESS and\
         if result == ZoneFinder.SUCCESS and\
            (flags & ZoneFinder.RESULT_WILDCARD == 0):
            (flags & ZoneFinder.RESULT_WILDCARD == 0):
-            deleted_rrs = self._get_name_from_deletions(name)
+            deleted_rrs = self.__get_name_from_deletions(name)
             for rr in rrsets:
             for rr in rrsets:
                 if rr not in deleted_rrs:
                 if rr not in deleted_rrs:
                     new_rrsets.append(rr)
                     new_rrsets.append(rr)