From: Francis Dupont Date: Sat, 2 Mar 2019 19:16:00 +0000 (+0100) Subject: [512-remote-network4-del-update] Added deleteSharedNetworkSubnets4 support X-Git-Tag: 512-fix-TestConfigBackendDHCPv4-deleteSharedNetworkSubnets4_base~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0905408bce25237a5e3d504c6cd6c87e39ebe313;p=thirdparty%2Fkea.git [512-remote-network4-del-update] Added deleteSharedNetworkSubnets4 support --- diff --git a/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc b/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc index 57c7eba0d4..31268cc3a7 100644 --- a/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc +++ b/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc @@ -99,6 +99,7 @@ public: DELETE_SUBNET4_ID, DELETE_SUBNET4_PREFIX, DELETE_ALL_SUBNETS4, + DELETE_ALL_SUBNETS4_SHARED_NETWORK_NAME, DELETE_POOLS4_SUBNET_ID, DELETE_SHARED_NETWORK4_NAME, DELETE_ALL_SHARED_NETWORKS4, @@ -2268,6 +2269,11 @@ TaggedStatementArray tagged_statements = { { MYSQL_DELETE_SUBNET(dhcp4) }, + // Delete all subnets for a shared network. + { MySqlConfigBackendDHCPv4Impl:: DELETE_ALL_SUBNETS4_SHARED_NETWORK_NAME, + MYSQL_DELETE_SUBNET(dhcp4, AND s.shared_network_name = ?) + }, + // Delete pools for a subnet. { MySqlConfigBackendDHCPv4Impl::DELETE_POOLS4_SUBNET_ID, MYSQL_DELETE_POOLS(dhcp4) @@ -2574,6 +2580,16 @@ MySqlConfigBackendDHCPv4::deleteAllSubnets4(const ServerSelector& server_selecto "deleted all subnets", true)); } +uint64_t +MySqlConfigBackendDHCPv4::deleteSharedNetworkSubnets4(const db::ServerSelector& server_selector, + const std::string& shared_network_name) { + return (impl_->deleteTransactional(MySqlConfigBackendDHCPv4Impl::DELETE_ALL_SUBNETS4_SHARED_NETWORK_NAME, + server_selector, + "deleting all subnets for a shared network", + "deleted all subnets for a shared network", + true, shared_network_name)); +} + uint64_t MySqlConfigBackendDHCPv4::deleteSharedNetwork4(const ServerSelector& server_selector, const std::string& name) { diff --git a/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.h b/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.h index f1ef0fb3df..3e1ffc99ad 100644 --- a/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.h +++ b/src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.h @@ -306,6 +306,16 @@ public: virtual uint64_t deleteAllSubnets4(const db::ServerSelector& server_selector); + /// @brief Deletes all subnets belonging to a specified shared network. + /// + /// @param server_selector Server selector. + /// @param shared_network_name Name of the shared network for which the + /// subnets should be deleted. + /// @return Number of deleted subnets. + virtual uint64_t + deleteSharedNetworkSubnets4(const db::ServerSelector& server_selector, + const std::string& shared_network_name); + /// @brief Deletes shared network by name. /// /// @param server_selector Server selector. diff --git a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc index de1529d333..8a0463b6bf 100644 --- a/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc +++ b/src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc @@ -1088,21 +1088,60 @@ TEST_F(MySqlConfigBackendDHCPv4Test, getAllSharedNetworks4) { networks[i]->toElement()->str()); } + // Add some subnets. + test_networks_[1]->add(test_subnets_[0]); + test_subnets_[2]->setSharedNetworkName("level2"); + test_networks_[2]->add(test_subnets_[3]); + cbptr_->createUpdateSubnet4(ServerSelector::ALL(), test_subnets_[0]); + cbptr_->createUpdateSubnet4(ServerSelector::ALL(), test_subnets_[2]); + cbptr_->createUpdateSubnet4(ServerSelector::ALL(), test_subnets_[3]); + + // Both ways to attach a subnet are equivalent. + Subnet4Ptr subnet = cbptr_->getSubnet4(ServerSelector::ALL(), + test_subnets_[0]->getID()); + ASSERT_TRUE(subnet); + EXPECT_EQ("level1", subnet->getSharedNetworkName()); + + { + SCOPED_TRACE("CREATE audit entry for subnets"); + testNewAuditEntry("dhcp4_subnet", + AuditEntry::ModificationType::CREATE, + "subnet set", 3); + } + // Deleting non-existing shared network should return 0. EXPECT_EQ(0, cbptr_->deleteSharedNetwork4(ServerSelector::ALL(), "big-fish")); // All shared networks should be still there. ASSERT_EQ(test_networks_.size() - 1, networks.size()); - // Should not delete the subnet for explicit server tag because - // our shared network is for all servers. + // Should not delete the shared network for explicit server tag + // because our shared network is for all servers. EXPECT_EQ(0, cbptr_->deleteSharedNetwork4(ServerSelector::ONE("server1"), test_networks_[1]->getName())); // Same for all shared networks. EXPECT_EQ(0, cbptr_->deleteAllSharedNetworks4(ServerSelector::ONE("server1"))); - // Delete first shared network and verify it is gone. + // Delete first shared network with it subnets and verify it is gone. + + // Begin by its subnet. + EXPECT_EQ(1, cbptr_->deleteSharedNetworkSubnets4(ServerSelector::ALL(), + test_networks_[1]->getName())); + + { + SCOPED_TRACE("DELETE audit entry for subnets of the first shared network"); + testNewAuditEntry("dhcp4_subnet", + AuditEntry::ModificationType::DELETE, + "deleted all subnets for a shared network"); + } + + // Check that the subnet is gone.. + subnet = cbptr_->getSubnet4(ServerSelector::ALL(), + test_subnets_[0]->getID()); + EXPECT_FALSE(subnet); + + // And after the shared network itself. EXPECT_EQ(1, cbptr_->deleteSharedNetwork4(ServerSelector::ALL(), test_networks_[1]->getName())); networks = cbptr_->getAllSharedNetworks4(ServerSelector::ALL()); @@ -1127,6 +1166,16 @@ TEST_F(MySqlConfigBackendDHCPv4Test, getAllSharedNetworks4) { AuditEntry::ModificationType::DELETE, "deleted all shared networks", 2); } + + // Check that subnets are still there but detached. + subnet = cbptr_->getSubnet4(ServerSelector::ALL(), + test_subnets_[2]->getID()); + ASSERT_TRUE(subnet); + EXPECT_TRUE(subnet->getSharedNetworkName().empty()); + subnet = cbptr_->getSubnet4(ServerSelector::ALL(), + test_subnets_[3]->getID()); + ASSERT_TRUE(subnet); + EXPECT_TRUE(subnet->getSharedNetworkName().empty()); } // Test that shared networks modified after given time can be fetched. diff --git a/src/lib/dhcpsrv/config_backend_dhcp4.h b/src/lib/dhcpsrv/config_backend_dhcp4.h index 63c992bb28..1a95a02447 100644 --- a/src/lib/dhcpsrv/config_backend_dhcp4.h +++ b/src/lib/dhcpsrv/config_backend_dhcp4.h @@ -296,6 +296,16 @@ public: virtual uint64_t deleteAllSubnets4(const db::ServerSelector& server_selector) = 0; + /// @brief Deletes all subnets belonging to a specified shared network. + /// + /// @param server_selector Server selector. + /// @param shared_network_name Name of the shared network for which the + /// subnets should be deleted. + /// @return Number of deleted subnets. + virtual uint64_t + deleteSharedNetworkSubnets4(const db::ServerSelector& server_selector, + const std::string& shared_network_name) = 0; + /// @brief Deletes shared network by name. /// /// @param server_selector Server selector. diff --git a/src/lib/dhcpsrv/config_backend_dhcp6.h b/src/lib/dhcpsrv/config_backend_dhcp6.h index a30d76c01f..6f7b94f74c 100644 --- a/src/lib/dhcpsrv/config_backend_dhcp6.h +++ b/src/lib/dhcpsrv/config_backend_dhcp6.h @@ -310,6 +310,16 @@ public: virtual uint64_t deleteAllSubnets6(const db::ServerSelector& server_selector) = 0; + /// @brief Deletes all subnets belonging to a specified shared network. + /// + /// @param server_selector Server selector. + /// @param shared_network_name Name of the shared network for which the + /// subnets should be deleted. + /// @return Number of deleted subnets. + virtual uint64_t + deleteSharedNetworkSubnets6(const db::ServerSelector& server_selector, + const std::string& shared_network_name) = 0; + /// @brief Deletes shared network by name. /// /// @param server_selector Server selector. diff --git a/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc b/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc index 95b55309b8..f7fea14709 100644 --- a/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2018-2019 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -315,6 +315,15 @@ ConfigBackendPoolDHCPv4::deleteAllSubnets4(const BackendSelector& backend_select (&ConfigBackendDHCPv4::deleteAllSubnets4, backend_selector, server_selector)); } +uint64_t +ConfigBackendPoolDHCPv4::deleteSharedNetworkSubnets4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const std::string& shared_network_name) { + return (createUpdateDeleteProperty + (&ConfigBackendDHCPv4::deleteSharedNetworkSubnets4, backend_selector, server_selector, + shared_network_name)); +} + uint64_t ConfigBackendPoolDHCPv4::deleteSharedNetwork4(const BackendSelector& backend_selector, const ServerSelector& server_selector, diff --git a/src/lib/dhcpsrv/config_backend_pool_dhcp4.h b/src/lib/dhcpsrv/config_backend_pool_dhcp4.h index 70e78342fa..15d9b9211c 100644 --- a/src/lib/dhcpsrv/config_backend_pool_dhcp4.h +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp4.h @@ -353,6 +353,18 @@ public: deleteAllSubnets4(const db::BackendSelector& backend_selector, const db::ServerSelector& server_selector); + /// @brief Deletes all subnets belonging to a specified shared network. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param shared_network_name Name of the shared network for which the + /// subnets should be deleted. + /// @return Number of deleted subnets. + virtual uint64_t + deleteSharedNetworkSubnets4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const std::string& shared_network_name); + /// @brief Deletes shared network by name. /// /// @param backend_selector Backend selector. diff --git a/src/lib/dhcpsrv/config_backend_pool_dhcp6.cc b/src/lib/dhcpsrv/config_backend_pool_dhcp6.cc index 3bf3fb3716..d4a0071b2a 100644 --- a/src/lib/dhcpsrv/config_backend_pool_dhcp6.cc +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp6.cc @@ -327,6 +327,15 @@ ConfigBackendPoolDHCPv6::deleteAllSubnets6(const BackendSelector& backend_select (&ConfigBackendDHCPv6::deleteAllSubnets6, backend_selector, server_selector)); } +uint64_t +ConfigBackendPoolDHCPv6::deleteSharedNetworkSubnets6(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const std::string& shared_network_name) { + return (createUpdateDeleteProperty + (&ConfigBackendDHCPv6::deleteSharedNetworkSubnets6, backend_selector, server_selector, + shared_network_name)); +} + uint64_t ConfigBackendPoolDHCPv6::deleteSharedNetwork6(const BackendSelector& backend_selector, const ServerSelector& server_selector, diff --git a/src/lib/dhcpsrv/config_backend_pool_dhcp6.h b/src/lib/dhcpsrv/config_backend_pool_dhcp6.h index 5a2cec863a..6031450895 100644 --- a/src/lib/dhcpsrv/config_backend_pool_dhcp6.h +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp6.h @@ -369,6 +369,18 @@ public: deleteAllSubnets6(const db::BackendSelector& backend_selector, const db::ServerSelector& server_selector); + /// @brief Deletes all subnets belonging to a specified shared network. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param shared_network_name Name of the shared network for which the + /// subnets should be deleted. + /// @return Number of deleted subnets. + virtual uint64_t + deleteSharedNetworkSubnets6(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const std::string& shared_network_name); + /// @brief Deletes shared network by name. /// /// @param backend_selector Backend selector. diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc index e06bec8f96..d822eb37e8 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc @@ -8,6 +8,7 @@ #include #include +#include using namespace isc::data; using namespace isc::db; @@ -362,6 +363,24 @@ TestConfigBackendDHCPv4::deleteAllSubnets4(const db::ServerSelector& /* server_s return (subnets_size); } +uint64_t +TestConfigBackendDHCPv4::deleteSharedNetworkSubnets4(const db::ServerSelector& /* server_selector */, + const std::string& shared_network_name) { + uint64_t cnt = 0; + auto& index = shared_networks_.get(); + auto network_it = index.find(shared_network_name); + if (network_it == index.end()) { + return (cnt); + } + for (auto subnet : *(*network_it)->getAllSubnets()) { + const SubnetID& subnet_id = subnet->getID(); + auto& subnet_index = subnets_.get(); + cnt += subnet_index.erase(subnet_id); + } + (*network_it)->delAll(); + return (cnt); +} + uint64_t TestConfigBackendDHCPv4::deleteSharedNetwork4(const db::ServerSelector& /* server_selector */, const std::string& name) { diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h index a6693b733c..28145a54c9 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h @@ -317,6 +317,16 @@ public: virtual uint64_t deleteAllSubnets4(const db::ServerSelector& server_selector); + /// @brief Deletes all subnets belonging to a specified shared network. + /// + /// @param server_selector Server selector. + /// @param shared_network_name Name of the shared network for which the + /// subnets should be deleted. + /// @return Number of deleted subnets. + virtual uint64_t + deleteSharedNetworkSubnets4(const db::ServerSelector& server_selector, + const std::string& shared_network_name); + /// @brief Deletes shared network by name. /// /// @param server_selector Server selector. diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc index 17149ccc00..33f9ff0fbb 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc @@ -382,6 +382,24 @@ TestConfigBackendDHCPv6::deleteAllSubnets6(const db::ServerSelector& /* server_s return (subnets_size); } +uint64_t +TestConfigBackendDHCPv6::deleteSharedNetworkSubnets6(const db::ServerSelector& /* server_selector */, + const std::string& shared_network_name) { + uint64_t cnt = 0; + auto& index = shared_networks_.get(); + auto network_it = index.find(shared_network_name); + if (network_it == index.end()) { + return (cnt); + } + for (auto subnet : *(*network_it)->getAllSubnets()) { + const SubnetID& subnet_id = subnet->getID(); + auto& subnet_index = subnets_.get(); + cnt += subnet_index.erase(subnet_id); + } + (*network_it)->delAll(); + return (cnt); +} + uint64_t TestConfigBackendDHCPv6::deleteSharedNetwork6(const db::ServerSelector& /* server_selector */, const std::string& name) { diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.h b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.h index 6e7a425a0a..b89ee0c96f 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.h +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.h @@ -331,6 +331,16 @@ public: virtual uint64_t deleteAllSubnets6(const db::ServerSelector& server_selector); + /// @brief Deletes all subnets belonging to a specified shared network. + /// + /// @param server_selector Server selector. + /// @param shared_network_name Name of the shared network for which the + /// subnets should be deleted. + /// @return Number of deleted subnets. + virtual uint64_t + deleteSharedNetworkSubnets6(const db::ServerSelector& server_selector, + const std::string& shared_network_name); + /// @brief Deletes shared network by name. /// /// @param server_selector Server selector.