diff --git a/src/dns/bind/named_config.cc b/src/dns/bind/named_config.cc index 3a6a0065d8e..b14cbfd69f6 100644 --- a/src/dns/bind/named_config.cc +++ b/src/dns/bind/named_config.cc @@ -74,13 +74,6 @@ void NamedConfig::ChangeView(const VirtualDnsConfig *vdns) { zones.push_back(old_domain); RemoveZoneFiles(vdns, zones); } - // If reverse resolution is disabled now, remove the reverse zone files - bool reverse_resolution = vdns->IsReverseResolutionEnabled(); - if (!reverse_resolution && vdns->HasReverseResolutionChanged()) { - ZoneList zones; - MakeReverseZoneList(vdns, zones); - RemoveZoneFiles(vdns, zones); - } } void NamedConfig::DelView(const VirtualDnsConfig *vdns) { @@ -262,11 +255,13 @@ void NamedConfig::WriteViewConfig(const VirtualDnsConfig *updated_vdns) { file_ << " forwarders {" << default_forwarders_ << "};" << endl; } + bool reverse_resolution = curr_vdns->IsReverseResolutionEnabled(); for (unsigned int i = 0; i < zones.size(); i++) { - WriteZone(view_name, zones[i], true); + WriteZone(view_name, zones[i], true, reverse_resolution, next_dns); // update the zone view map, to be used to generate default view if (curr_vdns->IsExternalVisible()) zone_view_map.insert(ZoneViewPair(zones[i], view_name)); + } file_ << "};" << endl << endl; @@ -290,18 +285,25 @@ void NamedConfig::WriteDefaultView(ZoneViewMap &zone_view_map) { } for (ZoneViewMap::iterator it = zone_view_map.begin(); it != zone_view_map.end(); ++it) { - WriteZone(it->second, it->first, false); + WriteZone(it->second, it->first, false, false, ""); } file_ << "};" << endl << endl; } void NamedConfig::WriteZone(const string &vdns, const string &name, - bool is_master) { + bool is_master, bool is_rr, const string &next_dns) { file_ << " zone \"" << name << "\" IN \{" << endl; if (is_master) { file_ << " type master;" << endl; file_ << " file \"" << GetZoneFilePath(vdns, name) << "\";" << endl; file_ << " allow-update {127.0.0.1;};" << endl; + if (!next_dns.empty()) { + if (!is_rr && (name.find("in-addr.arpa") != std::string::npos)) { + file_ << " forwarders { };" << endl; + } + } else { + file_ << " forwarders { };" << endl; + } } else { file_ << " type static-stub;" << endl; file_ << " virtual-server-name \"" << vdns << "\";" << endl; @@ -404,9 +406,6 @@ void NamedConfig::MakeZoneList(const VirtualDnsConfig *vdns_config, zones.push_back(dns_domain); // Reverse zones - if (!vdns_config->IsReverseResolutionEnabled()) { - return; - } MakeReverseZoneList(vdns_config, zones); } diff --git a/src/dns/bind/named_config.h b/src/dns/bind/named_config.h index 9025da2054a..a9852611b83 100644 --- a/src/dns/bind/named_config.h +++ b/src/dns/bind/named_config.h @@ -114,7 +114,7 @@ class NamedConfig { void WriteViewConfig(const VirtualDnsConfig *updated_vdns); void WriteDefaultView(ZoneViewMap &zone_view_map); void WriteZone(const std::string &vdns, const std::string &name, - bool is_master); + bool is_master, bool is_rr, const std::string &next_dns); void AddZoneFiles(ZoneList &zones, const VirtualDnsConfig *vdns); void RemoveZoneFile(const VirtualDnsConfig *vdns, std::string &zone); std::string GetZoneNSName(const std::string domain_name); diff --git a/src/dns/mgr/dns_mgr.cc b/src/dns/mgr/dns_mgr.cc index e6d3553c3f5..be36977fc37 100644 --- a/src/dns/mgr/dns_mgr.cc +++ b/src/dns/mgr/dns_mgr.cc @@ -183,13 +183,13 @@ void DnsManager::DnsPtrZone(const Subnet &subnet, const VirtualDnsConfig *vdns, if (!bind_status_.IsUp()) return; - bool reverse_resolution = vdns->IsReverseResolutionEnabled(); std::string dns_domain = vdns->GetDomainName(); - if (dns_domain.empty() || !reverse_resolution) { + if (dns_domain.empty()) { DNS_BIND_TRACE(DnsBindTrace, "Ptr Zone <" << vdns->GetName() << "> ; ignoring event: " << DnsConfig::ToEventString(ev) << " Domain: " << dns_domain << " Reverse Resolution: " << - (reverse_resolution ? "enabled" : "disabled")); + (vdns->IsReverseResolutionEnabled()? "enabled" : + "disabled")); return; } diff --git a/src/dns/test/dns_bind_test.cc b/src/dns/test/dns_bind_test.cc index 20fc8cc7221..4b1a549fab0 100644 --- a/src/dns/test/dns_bind_test.cc +++ b/src/dns/test/dns_bind_test.cc @@ -271,16 +271,13 @@ TEST_F(DnsBindTest, Reordered) { boost::replace_all(content, "true", "false"); EXPECT_TRUE(parser_.Parse(content)); task_util::WaitForIdle(); - for (int i = 0; i < 4; i++) { + EXPECT_TRUE(FilesEqual(cfg->named_config_file().c_str(), + "controller/src/dns/testdata/named.conf.rr_ext_disabled")); + // Now we create all zones irrespective of reverse_resolution + for (int i = 0; i < 17; i++) { string s1 = cfg->GetZoneFilePath(dns_domains[i]); EXPECT_TRUE(FileExists(s1.c_str())); } - for (int i = 4; i < 17; i++) { - string s1 = cfg->GetZoneFilePath(dns_domains[i]); - EXPECT_FALSE(FileExists(s1.c_str())); - } - EXPECT_TRUE(FilesEqual(cfg->named_config_file().c_str(), - "controller/src/dns/testdata/named.conf.9")); // change external-visible and reverse_resolution fields to true boost::replace_all(content, "false", "true"); @@ -547,20 +544,21 @@ TEST_F(DnsBindTest, ReorderedExternalReverseResolutionDisabled) { }; EXPECT_TRUE(FilesEqual(cfg->named_config_file().c_str(), - "controller/src/dns/testdata/named.conf.9")); + "controller/src/dns/testdata/named.conf.rr_ext_disabled")); for (int i = 0; i < 4; i++) { string s1 = cfg->GetZoneFilePath(dns_domains[i]); EXPECT_TRUE(FileExists(s1.c_str())); } for (int i = 4; i < 17; i++) { string s1 = cfg->GetZoneFilePath(dns_domains[i]); - EXPECT_FALSE(FileExists(s1.c_str())); + EXPECT_TRUE(FileExists(s1.c_str())); } EXPECT_TRUE(FileExists("rndc.conf")); EXPECT_TRUE(FilesEqual("rndc.conf", "controller/src/dns/testdata/rndc.conf")); + // Case1 : Add subnet to an ipam const char config_change[] = "\ \ \ @@ -589,14 +587,16 @@ TEST_F(DnsBindTest, ReorderedExternalReverseResolutionDisabled) { } for (int i = 4; i < 17; i++) { string s1 = cfg->GetZoneFilePath(dns_domains[i]); - EXPECT_FALSE(FileExists(s1.c_str())); + EXPECT_TRUE(FileExists(s1.c_str())); } + string zone = "3.2.25.in-addr.arpa"; string s1 = cfg->GetZoneFilePath(zone); - EXPECT_FALSE(FileExists(s1.c_str())); - EXPECT_TRUE(FilesEqual(cfg->named_config_file().c_str(), - "controller/src/dns/testdata/named.conf.9")); + EXPECT_TRUE(FileExists(s1.c_str())); + EXPECT_FALSE(FilesEqual(cfg->named_config_file().c_str(), + "controller/src/dns/testdata/named.conf.rr_ext_disabled.2")); + // Case 2: Add and Delete a subnet from an ipam const char config_change_1[] = "\ \ \ @@ -648,24 +648,25 @@ TEST_F(DnsBindTest, ReorderedExternalReverseResolutionDisabled) { string new_dns_domains[] = { "3.2.129.in-addr.arpa", "3.2.130.in-addr.arpa", - "3.2.25.in-addr.arpa", }; + EXPECT_TRUE(parser_.Parse(config_change_1)); task_util::WaitForIdle(); - EXPECT_TRUE(FilesEqual(cfg->named_config_file().c_str(), - "controller/src/dns/testdata/named.conf.9")); - for (int i = 0; i < 4; i++) { + EXPECT_FALSE(FilesEqual(cfg->named_config_file().c_str(), + "controller/src/dns/testdata/named.conf.rr_ext_disabled")); + + for (int i = 0; i < 12; i++) { string s1 = cfg->GetZoneFilePath(dns_domains[i]); EXPECT_TRUE(FileExists(s1.c_str())); } - for (int i = 4; i < 17; i++) { + for (int i = 12; i < 17; i++) { string s1 = cfg->GetZoneFilePath(dns_domains[i]); EXPECT_FALSE(FileExists(s1.c_str())); } - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 2; i++) { string s1 = cfg->GetZoneFilePath(new_dns_domains[i]); - EXPECT_FALSE(FileExists(s1.c_str())); + EXPECT_TRUE(FileExists(s1.c_str())); } const char config_change_2[] = "\ @@ -707,8 +708,19 @@ TEST_F(DnsBindTest, ReorderedExternalReverseResolutionDisabled) { EXPECT_TRUE(parser_.Parse(config_change_2)); task_util::WaitForIdle(); - EXPECT_TRUE(FilesEqual(cfg->named_config_file().c_str(), - "controller/src/dns/testdata/named.conf.9")); + + string deleted_dns_subnets[] = { + "3.2.129.in-addr.arpa", + "3.2.130.in-addr.arpa", + "13.2.12.in-addr.arpa", + }; + + for (int i = 0; i < 3; i++) { + string s1 = cfg->GetZoneFilePath(deleted_dns_subnets[i]); + EXPECT_FALSE(FileExists(s1.c_str())); + } + EXPECT_FALSE(FilesEqual(cfg->named_config_file().c_str(), + "controller/src/dns/testdata/named.conf.rr_ext_disabled")); const char config_change_3[] = "\ \ @@ -735,31 +747,31 @@ TEST_F(DnsBindTest, ReorderedExternalReverseResolutionDisabled) { string deleted_domains[] = { "3.2.129.in-addr.arpa", "3.2.130.in-addr.arpa", - "13.2.12.in-addr.arpa", "0.3.13.in-addr.arpa", + "13.2.12.in-addr.arpa", "1.3.13.in-addr.arpa", "2.3.13.in-addr.arpa", "3.3.13.in-addr.arpa", }; string remaining_domains[] = { - "3.2.25.in-addr.arpa", "192.1.1.in-addr.arpa", "193.1.1.in-addr.arpa", "3.2.1.in-addr.arpa", + "3.2.25.in-addr.arpa", }; EXPECT_TRUE(parser_.Parse(config_change_3)); task_util::WaitForIdle(); - EXPECT_TRUE(FilesEqual(cfg->named_config_file().c_str(), - "controller/src/dns/testdata/named.conf.9")); + EXPECT_FALSE(FilesEqual(cfg->named_config_file().c_str(), + "controller/src/dns/testdata/named.conf.rr_ext_disabled")); for (int i = 0; i < 7; i++) { string s1 = cfg->GetZoneFilePath(deleted_domains[i]); EXPECT_FALSE(FileExists(s1.c_str())); } for (int i = 0; i < 4; i++) { string s1 = cfg->GetZoneFilePath(remaining_domains[i]); - EXPECT_FALSE(FileExists(s1.c_str())); + EXPECT_TRUE(FileExists(s1.c_str())); } const char config_change_4[] = "\ @@ -786,10 +798,6 @@ TEST_F(DnsBindTest, ReorderedExternalReverseResolutionDisabled) { string s1 = cfg->GetZoneFilePath(dns_domains[i]); EXPECT_FALSE(FileExists(s1.c_str())); } - for (int i = 0; i < 3; i++) { - string s1 = cfg->GetZoneFilePath(new_dns_domains[i]); - EXPECT_FALSE(FileExists(s1.c_str())); - } } } // namespace diff --git a/src/dns/testdata/named.conf.rr_ext_disabled b/src/dns/testdata/named.conf.rr_ext_disabled new file mode 100644 index 00000000000..616c8d09832 --- /dev/null +++ b/src/dns/testdata/named.conf.rr_ext_disabled @@ -0,0 +1,162 @@ +options { + directory "./"; + managed-keys-directory "./"; + empty-zones-enable no; + pid-file "./contrail-named.pid"; + listen-on port 53 { any; }; + allow-query { any; }; + allow-recursion { any; }; + allow-query-cache { any; }; + max-cache-size 100M; +}; + +key "rndc-key" { + algorithm hmac-md5; + secret "xvysmOR8lnUQRBcunkC6vg=="; +}; + +controls { + inet 127.0.0.1 port 8094 + allow { 127.0.0.1; } keys { "rndc-key"; }; +}; + +logging { + channel debug_log { + file "/var/log/named/bind.log" versions 3 size 5m; + severity debug; + print-time yes; + print-severity yes; + print-category yes; + }; + category default { + debug_log; + }; + category queries { + debug_log; + }; +}; + +view "last-DNS" { + rrset-order {order cyclic;}; + virtual-forwarder "juniper.net"; + zone "test.juniper.net" IN { + type master; + file "./test.juniper.net.zone"; + allow-update {127.0.0.1;}; + }; +}; + +view "last-DNS1" { + rrset-order {order fixed;}; + virtual-forwarder "juniper.net"; + zone "0.3.13.in-addr.arpa." IN { + type master; + file "./0.3.13.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "1.3.13.in-addr.arpa." IN { + type master; + file "./1.3.13.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "13.2.12.in-addr.arpa." IN { + type master; + file "./13.2.12.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "2.3.13.in-addr.arpa." IN { + type master; + file "./2.3.13.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "3.3.13.in-addr.arpa." IN { + type master; + file "./3.3.13.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "test1.juniper.net" IN { + type master; + file "./test1.juniper.net.zone"; + allow-update {127.0.0.1;}; + }; +}; + +view "new-DNS" { + rrset-order {order random;}; + virtual-forwarder "example.com"; + zone "192.1.1.in-addr.arpa." IN { + type master; + file "./192.1.1.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "193.1.1.in-addr.arpa." IN { + type master; + file "./193.1.1.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "3.2.1.in-addr.arpa." IN { + type master; + file "./3.2.1.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "6.5.4.in-addr.arpa." IN { + type master; + file "./6.5.4.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "64.3.2.2.in-addr.arpa." IN { + type master; + file "./64.3.2.2.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "65.3.2.2.in-addr.arpa." IN { + type master; + file "./65.3.2.2.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "66.3.2.2.in-addr.arpa." IN { + type master; + file "./66.3.2.2.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "67.3.2.2.in-addr.arpa." IN { + type master; + file "./67.3.2.2.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "test.example.com" IN { + type master; + file "./test.example.com.zone"; + allow-update {127.0.0.1;}; + }; +}; + +view "test-DNS" { + rrset-order {order random;}; + virtual-forwarder "juniper.net"; + zone "contrail.juniper.net" IN { + type master; + file "./contrail.juniper.net.zone"; + allow-update {127.0.0.1;}; + }; +}; + +view "_default_view_" { + match-clients {any;}; + match-destinations {any;}; + match-recursive-only no; +}; + diff --git a/src/dns/testdata/named.conf.rr_ext_disabled.2 b/src/dns/testdata/named.conf.rr_ext_disabled.2 new file mode 100644 index 00000000000..a468b755ffb --- /dev/null +++ b/src/dns/testdata/named.conf.rr_ext_disabled.2 @@ -0,0 +1,168 @@ +options { + directory "./"; + managed-keys-directory "./"; + empty-zones-enable no; + pid-file "./contrail-named.pid"; + listen-on port 53 { any; }; + allow-query { any; }; + allow-recursion { any; }; + allow-query-cache { any; }; + max-cache-size 100M; +}; + +key "rndc-key" { + algorithm hmac-md5; + secret "xvysmOR8lnUQRBcunkC6vg=="; +}; + +controls { + inet 127.0.0.1 port 8094 + allow { 127.0.0.1; } keys { "rndc-key"; }; +}; + +logging { + channel debug_log { + file "/var/log/named/bind.log" versions 3 size 5m; + severity debug; + print-time yes; + print-severity yes; + print-category yes; + }; + category default { + debug_log; + }; + category queries { + debug_log; + }; +}; + +view "last-DNS" { + rrset-order {order cyclic;}; + virtual-forwarder "juniper.net"; + zone "test.juniper.net" IN { + type master; + file "./test.juniper.net.zone"; + allow-update {127.0.0.1;}; + }; +}; + +view "last-DNS1" { + rrset-order {order fixed;}; + virtual-forwarder "juniper.net"; + zone "0.3.13.in-addr.arpa." IN { + type master; + file "./0.3.13.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "1.3.13.in-addr.arpa." IN { + type master; + file "./1.3.13.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "13.2.12.in-addr.arpa." IN { + type master; + file "./13.2.12.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "2.3.13.in-addr.arpa." IN { + type master; + file "./2.3.13.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "3.3.13.in-addr.arpa." IN { + type master; + file "./3.3.13.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "test1.juniper.net" IN { + type master; + file "./test1.juniper.net.zone"; + allow-update {127.0.0.1;}; + }; +}; + +view "new-DNS" { + rrset-order {order random;}; + virtual-forwarder "example.com"; + zone "192.1.1.in-addr.arpa." IN { + type master; + file "./192.1.1.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "193.1.1.in-addr.arpa." IN { + type master; + file "./193.1.1.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "3.2.1.in-addr.arpa." IN { + type master; + file "./3.2.1.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "3.2.25.in-addr.arpa." IN { + type master; + file "./3.2.1.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "6.5.4.in-addr.arpa." IN { + type master; + file "./6.5.4.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "64.3.2.2.in-addr.arpa." IN { + type master; + file "./64.3.2.2.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "65.3.2.2.in-addr.arpa." IN { + type master; + file "./65.3.2.2.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "66.3.2.2.in-addr.arpa." IN { + type master; + file "./66.3.2.2.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "67.3.2.2.in-addr.arpa." IN { + type master; + file "./67.3.2.2.in-addr.arpa.zone"; + allow-update {127.0.0.1;}; + forwarders { }; + }; + zone "test.example.com" IN { + type master; + file "./test.example.com.zone"; + allow-update {127.0.0.1;}; + }; +}; + +view "test-DNS" { + rrset-order {order random;}; + virtual-forwarder "juniper.net"; + zone "contrail.juniper.net" IN { + type master; + file "./contrail.juniper.net.zone"; + allow-update {127.0.0.1;}; + }; +}; + +view "_default_view_" { + match-clients {any;}; + match-destinations {any;}; + match-recursive-only no; +}; +