# 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
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):
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(),
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(),
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"),
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 ])
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 ])
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(),
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(),
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")