def test_zone_changed(zone): # Read-only is not changed! with zone.reader() as txn: assert not txn.changed() # delete an existing name with zone.writer() as txn: assert not txn.changed() txn.delete(dns.name.from_text("bar.foo", None)) assert txn.changed() # delete a nonexistent name with zone.writer() as txn: assert not txn.changed() txn.delete(dns.name.from_text("unknown.bar.foo", None)) assert not txn.changed() # delete a nonexistent rdataset from an extant node with zone.writer() as txn: assert not txn.changed() txn.delete(dns.name.from_text("bar.foo", None), "txt") assert not txn.changed() # add an rdataset to an extant Node with zone.writer() as txn: assert not txn.changed() txn.add("bar.foo", 300, dns.rdata.from_text("in", "txt", "hi")) assert txn.changed() # add an rdataset to a nonexistent Node with zone.writer() as txn: assert not txn.changed() txn.add("foo.foo", 300, dns.rdata.from_text("in", "txt", "hi")) assert txn.changed()
def test_zone_changed(zone): # Read-only is not changed! with zone.reader() as txn: assert not txn.changed() # delete an existing name with zone.writer() as txn: assert not txn.changed() txn.delete(dns.name.from_text('bar.foo', None)) assert txn.changed() # delete a nonexistent name with zone.writer() as txn: assert not txn.changed() txn.delete(dns.name.from_text('unknown.bar.foo', None)) assert not txn.changed() # delete a nonexistent rdataset from an extant node with zone.writer() as txn: assert not txn.changed() txn.delete(dns.name.from_text('bar.foo', None), 'txt') assert not txn.changed() # add an rdataset to an extant Node with zone.writer() as txn: assert not txn.changed() txn.add('bar.foo', 300, dns.rdata.from_text('in', 'txt', 'hi')) assert txn.changed() # add an rdataset to a nonexistent Node with zone.writer() as txn: assert not txn.changed() txn.add('foo.foo', 300, dns.rdata.from_text('in', 'txt', 'hi')) assert txn.changed()
def test_zone_add_and_delete(zone): with zone.writer() as txn: a99 = dns.name.from_text("a99", None) a100 = dns.name.from_text("a100", None) a101 = dns.name.from_text("a101", None) rds = dns.rdataset.from_text("in", "a", 300, "10.0.0.99") txn.add(a99, rds) txn.delete(a99, dns.rdatatype.A) txn.delete(a100, dns.rdatatype.A) txn.delete(a101) assert not txn.name_exists(a99) assert not txn.name_exists(a100) assert not txn.name_exists(a101) ns1 = dns.name.from_text("ns1", None) txn.delete(ns1, dns.rdatatype.A) assert not txn.name_exists(ns1) with zone.writer() as txn: txn.add(a99, rds) txn.delete(a99) assert not txn.name_exists(a99) with zone.writer() as txn: txn.add(a100, rds) txn.delete(a99) assert not txn.name_exists(a99) assert txn.name_exists(a100)
def test_zone_add_and_delete(zone): with zone.writer() as txn: a99 = dns.name.from_text('a99', None) a100 = dns.name.from_text('a100', None) a101 = dns.name.from_text('a101', None) rds = dns.rdataset.from_text('in', 'a', 300, '10.0.0.99') txn.add(a99, rds) txn.delete(a99, dns.rdatatype.A) txn.delete(a100, dns.rdatatype.A) txn.delete(a101) assert not txn.name_exists(a99) assert not txn.name_exists(a100) assert not txn.name_exists(a101) ns1 = dns.name.from_text('ns1', None) txn.delete(ns1, dns.rdatatype.A) assert not txn.name_exists(ns1) with zone.writer() as txn: txn.add(a99, rds) txn.delete(a99) assert not txn.name_exists(a99) with zone.writer() as txn: txn.add(a100, rds) txn.delete(a99) assert not txn.name_exists(a99) assert txn.name_exists(a100)
def test_write_after_rollback(zone): with pytest.raises(ExpectedException): with zone.writer() as txn: a99 = dns.name.from_text('a99', None) rds = dns.rdataset.from_text('in', 'a', 300, '10.0.0.99') txn.add(a99, rds) raise ExpectedException with zone.writer() as txn: a99 = dns.name.from_text('a99', None) rds = dns.rdataset.from_text('in', 'a', 300, '10.99.99.99') txn.add(a99, rds) assert zone.get_rdataset('a99', 'a') == rds
def test_write_after_rollback(zone): with pytest.raises(ExpectedException): with zone.writer() as txn: a99 = dns.name.from_text("a99", None) rds = dns.rdataset.from_text("in", "a", 300, "10.0.0.99") txn.add(a99, rds) raise ExpectedException with zone.writer() as txn: a99 = dns.name.from_text("a99", None) rds = dns.rdataset.from_text("in", "a", 300, "10.99.99.99") txn.add(a99, rds) assert zone.get_rdataset("a99", "a") == rds
def test_zone_base_layer(zone): with zone.writer() as txn: # Get a set from the zone layer rdataset = txn.get(dns.name.empty, dns.rdatatype.NS, dns.rdatatype.NONE) expected = dns.rdataset.from_text("in", "ns", 300, "ns1", "ns2") assert rdataset == expected
def run_two(zone): # wait until one has the lock so we know we will block if we # get the call done before the sleep in one completes one_got_lock.wait() with zone.writer() as txn: rds = dns.rdataset.from_text("in", "a", 300, "10.0.0.99") txn.add("a99", rds)
def run_one(zone): with zone.writer() as txn: one_got_lock.set() # wait until two blocks while len(zone._write_waiters) == 0: time.sleep(0.01) rds = dns.rdataset.from_text("in", "a", 300, "10.0.0.98") txn.add("a98", rds)
def run_one(zone): with zone.writer() as txn: one_got_lock.set() # wait until two blocks while len(zone._write_waiters) == 0: time.sleep(0.01) rds = dns.rdataset.from_text('in', 'a', 300, '10.0.0.98') txn.add('a98', rds)
def test_update_serial(zone): # basic with zone.writer() as txn: txn.update_serial() rdataset = zone.find_rdataset("@", "soa") assert rdataset[0].serial == 2 # max with zone.writer() as txn: txn.update_serial(0xFFFFFFFF, False) rdataset = zone.find_rdataset("@", "soa") assert rdataset[0].serial == 0xFFFFFFFF # wraparound to 1 with zone.writer() as txn: txn.update_serial() rdataset = zone.find_rdataset("@", "soa") assert rdataset[0].serial == 1 # trying to set to zero sets to 1 with zone.writer() as txn: txn.update_serial(0, False) rdataset = zone.find_rdataset("@", "soa") assert rdataset[0].serial == 1 with pytest.raises(KeyError): with zone.writer() as txn: txn.update_serial(name=dns.name.from_text("unknown", None)) with pytest.raises(ValueError): with zone.writer() as txn: txn.update_serial(-1) with pytest.raises(ValueError): with zone.writer() as txn: txn.update_serial(2**31)
def test_zone_basic(zone): with zone.writer() as txn: txn.delete(dns.name.from_text("bar.foo", None)) rd = dns.rdata.from_text("in", "ns", "ns3") txn.add(dns.name.empty, 3600, rd) rd = dns.rdata.from_text("in", "a", "10.0.0.3") txn.add(dns.name.from_text("ns3", None), 3600, rd) output = zone.to_text() assert output == example_text_output
def test_zone_bad_class(zone): with zone.writer() as txn: rds = dns.rdataset.from_text("ch", "ns", 300, "ns1", "ns2") with pytest.raises(ValueError): txn.add(dns.name.empty, rds) with pytest.raises(ValueError): txn.replace(dns.name.empty, rds) with pytest.raises(ValueError): txn.delete(dns.name.empty, rds)
def test_zone_basic(zone): with zone.writer() as txn: txn.delete(dns.name.from_text('bar.foo', None)) rd = dns.rdata.from_text('in', 'ns', 'ns3') txn.add(dns.name.empty, 3600, rd) rd = dns.rdata.from_text('in', 'a', '10.0.0.3') txn.add(dns.name.from_text('ns3', None), 3600, rd) output = zone.to_text() assert output == example_text_output
def test_zone_iteration(zone): expected = {} for (name, rdataset) in zone.iterate_rdatasets(): expected[(name, rdataset.rdtype, rdataset.covers)] = rdataset with zone.writer() as txn: actual = {} for (name, rdataset) in txn: actual[(name, rdataset.rdtype, rdataset.covers)] = rdataset assert actual == expected
def test_zone_get_deleted(zone): with zone.writer() as txn: ns1 = dns.name.from_text("ns1", None) assert txn.get(ns1, dns.rdatatype.A) is not None txn.delete(ns1) assert txn.get(ns1, dns.rdatatype.A) is None ns2 = dns.name.from_text("ns2", None) txn.delete(ns2, dns.rdatatype.A) assert txn.get(ns2, dns.rdatatype.A) is None
def test_iteration_in_replacement_txn(zone): rds = dns.rdataset.from_text("in", "a", 300, "1.2.3.4", "5.6.7.8") expected = {} expected[(dns.name.empty, rds.rdtype, rds.covers)] = rds with zone.writer(True) as txn: txn.replace(dns.name.empty, rds) actual = {} for (name, rdataset) in txn: actual[(name, rdataset.rdtype, rdataset.covers)] = rdataset assert actual == expected
def test_zone_get_deleted(zone): with zone.writer() as txn: print(zone.to_text()) ns1 = dns.name.from_text('ns1', None) assert txn.get(ns1, dns.rdatatype.A) is not None txn.delete(ns1) assert txn.get(ns1, dns.rdatatype.A) is None ns2 = dns.name.from_text('ns2', None) txn.delete(ns2, dns.rdatatype.A) assert txn.get(ns2, dns.rdatatype.A) is None
def test_zone_rollback(zone): a99 = dns.name.from_text("a99.example.") try: with zone.writer() as txn: rds = dns.rdataset.from_text("in", "a", 300, "10.0.0.99") txn.add(a99, rds) assert txn.name_exists(a99) raise ExpectedException except ExpectedException: pass assert not zone.get_node(a99)
def test_zone_rollback(zone): try: with zone.writer() as txn: a99 = dns.name.from_text('a99.example.') rds = dns.rdataset.from_text('in', 'a', 300, '10.0.0.99') txn.add(a99, rds) assert txn.name_exists(a99) raise ExpectedException except ExpectedException: pass assert not zone.get_node(a99)
def load(filename, origin=None): """ Read a master zone file and construct a :class:`Zone <Zone>` object. :param filename: The path to the zone's master file. :type filename: string :param origin: (optional) The zone's origin domain :type origin: string :return: :class:`Zone <Zone>` object :rtype: localzone.Zone """ with open(filename) as text: tok = dns.tokenizer.Tokenizer(text, filename) if DNSPYTHON21: zone = Zone( origin, dns.rdataclass.IN, relativize=True, ) with zone.writer() as txn: reader = Reader( tok, rdclass=dns.rdataclass.IN, txn=txn, allow_include=True, ) reader.read() else: reader = _MasterReader( tok, origin=origin, rdclass=dns.rdataclass.IN, relativize=True, zone_factory=Zone, allow_include=True, check_origin=True, ) reader.read() zone = reader.zone # TODO: remember that any method using the zone.filename property should # have it passed as a parameter zone._filename = filename # starting with dnspython v1.16.0, use default_ttl try: zone._ttl = reader.default_ttl except AttributeError: zone._ttl = reader.ttl return zone
def test_zone_transaction_layer(zone): with zone.writer() as txn: # Make a change rd = dns.rdata.from_text('in', 'ns', 'ns3') txn.add(dns.name.empty, 3600, rd) # Get a set from the transaction layer expected = dns.rdataset.from_text('in', 'ns', 300, 'ns1', 'ns2', 'ns3') rdataset = txn.get(dns.name.empty, dns.rdatatype.NS, dns.rdatatype.NONE) assert rdataset == expected assert txn.name_exists(dns.name.empty) ns1 = dns.name.from_text('ns1', None) assert txn.name_exists(ns1) ns99 = dns.name.from_text('ns99', None) assert not txn.name_exists(ns99)
def test_explicit_rollback_and_commit(zone): with zone.writer() as txn: assert not txn.changed() txn.delete(dns.name.from_text('bar.foo', None)) txn.rollback() assert zone.get_node('bar.foo') is not None with zone.writer() as txn: assert not txn.changed() txn.delete(dns.name.from_text('bar.foo', None)) txn.commit() assert zone.get_node('bar.foo') is None with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.delete(dns.name.from_text('bar.foo', None)) with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.add('bar.foo', 300, dns.rdata.from_text('in', 'txt', 'hi')) with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.replace('bar.foo', 300, dns.rdata.from_text('in', 'txt', 'hi')) with pytest.raises(dns.transaction.AlreadyEnded): with zone.reader() as txn: txn.rollback() txn.get('bar.foo', 'in', 'mx') with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.delete_exact('bar.foo') with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.name_exists('bar.foo') with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.update_serial() with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.changed() with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.rollback() with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.commit() with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() for rdataset in txn: print(rdataset)
def test_explicit_rollback_and_commit(zone): with zone.writer() as txn: assert not txn.changed() txn.delete(dns.name.from_text("bar.foo", None)) txn.rollback() assert zone.get_node("bar.foo") is not None with zone.writer() as txn: assert not txn.changed() txn.delete(dns.name.from_text("bar.foo", None)) txn.commit() assert zone.get_node("bar.foo") is None with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.delete(dns.name.from_text("bar.foo", None)) with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.add("bar.foo", 300, dns.rdata.from_text("in", "txt", "hi")) with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.replace("bar.foo", 300, dns.rdata.from_text("in", "txt", "hi")) with pytest.raises(dns.transaction.AlreadyEnded): with zone.reader() as txn: txn.rollback() txn.get("bar.foo", "in", "mx") with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.delete_exact("bar.foo") with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.name_exists("bar.foo") with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.update_serial() with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.changed() with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.rollback() with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() txn.commit() with pytest.raises(dns.transaction.AlreadyEnded): with zone.writer() as txn: txn.rollback() for rdataset in txn: pass
def test_replacement_get(zone): with zone.writer(True) as txn: rds = txn.get(dns.name.empty, "soa") assert rds is None
def test_zone_ooz_name(zone): with zone.writer() as txn: with pytest.raises(KeyError): a99 = dns.name.from_text("a99.not-example.") assert txn.name_exists(a99)