]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
implement dns.zone.Zone.get_soa()
authorJakob Schlyter <jakob@kirei.se>
Sat, 19 Feb 2022 11:37:56 +0000 (12:37 +0100)
committerJakob Schlyter <jakob@kirei.se>
Sat, 19 Feb 2022 11:37:56 +0000 (12:37 +0100)
dns/zone.py
tests/test_zone.py

index 71028ae3530eb305c8ed021e3c2fa60f1e48199b..c126f5c20e14e85242db6ef95115607a9b82df03 100644 (file)
@@ -713,6 +713,22 @@ class Zone(dns.transaction.TransactionManager):
         if self.get_rdataset(name, dns.rdatatype.NS) is None:
             raise NoNS
 
+    def get_soa(self):
+        """Get the zone SOA RR.
+
+        Raises ``KeyError`` if there is no SOA record.
+
+        Returns a ``dns.node.Node``.
+        """
+        if self.relativize:
+            origin_name = dns.name.empty
+        else:
+            origin_name = self.origin
+        soa = self.get_rdataset(origin_name, dns.rdatatype.SOA)
+        if soa is None:
+            raise KeyError
+        return soa[0]
+
     def _compute_digest(self, hash_algorithm, scheme=DigestScheme.SIMPLE):
         hashinfo = _digest_hashers.get(hash_algorithm)
         if not hashinfo:
index 4b5272da04cd6fd4ba6911a18218f57ee112c377..8bdb49fc5fb36e39b2ed2c53cbee9ecfbe984a86 100644 (file)
@@ -1062,6 +1062,18 @@ class VersionedZoneTestCase(unittest.TestCase):
                                             dns.rdatatype.RRSIG,
                                             dns.rdatatype.NSEC))
 
+    def testGetSoa(self):
+        z = dns.zone.from_text(example_text, 'example.', relativize=True,
+                               zone_factory=dns.versioned.Zone)
+        soa = z.get_soa()
+        self.assertTrue(soa.rdtype, dns.rdatatype.SOA)
+        self.assertEqual(soa.serial, 1)
+
+    def testGetSoaEmptyZone(self):
+        z = dns.zone.Zone('example.')
+        with self.assertRaises(KeyError):
+            soa = z.get_soa()
+
 
 if __name__ == '__main__':
     unittest.main()