]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[512-remote-network4-del-update] Added deleteSharedNetworkSubnets4 support
authorFrancis Dupont <fdupont@isc.org>
Sat, 2 Mar 2019 19:16:00 +0000 (20:16 +0100)
committerFrancis Dupont <fdupont@isc.org>
Mon, 11 Mar 2019 15:39:21 +0000 (11:39 -0400)
13 files changed:
src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc
src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.h
src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc
src/lib/dhcpsrv/config_backend_dhcp4.h
src/lib/dhcpsrv/config_backend_dhcp6.h
src/lib/dhcpsrv/config_backend_pool_dhcp4.cc
src/lib/dhcpsrv/config_backend_pool_dhcp4.h
src/lib/dhcpsrv/config_backend_pool_dhcp6.cc
src/lib/dhcpsrv/config_backend_pool_dhcp6.h
src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc
src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h
src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc
src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.h

index 57c7eba0d43d20dd1d788a06428f12a6b3a2a2b5..31268cc3a7755cbbc4fb54b9e1f54f7dc6e28244 100644 (file)
@@ -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) {
index f1ef0fb3df632d046d6b8928872d8f46c90933a7..3e1ffc99ad2df2ea068867d0055e0c4d600fb005 100644 (file)
@@ -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.
index de1529d3333004634d33dfd82809ed3fdebecdb5..8a0463b6bfba0334ec5946bffae525c788d3e549 100644 (file)
@@ -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.
index 63c992bb28613c76cf2e1da2927b9ce67ae7e138..1a95a024474de74457cc51a095ee93bcad04a624 100644 (file)
@@ -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.
index a30d76c01f1df6af21140f303c369d3b1ec118b1..6f7b94f74c50e6078e83fbd6c36c13f49d5d2b95 100644 (file)
@@ -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.
index 95b55309b86ded22500e37a1c3c15979eb1d5862..f7fea147090cba2b1cac9b50b55c0509ef9fdc0d 100644 (file)
@@ -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<uint64_t, const std::string&>
+            (&ConfigBackendDHCPv4::deleteSharedNetworkSubnets4, backend_selector, server_selector,
+             shared_network_name));
+}
+
 uint64_t
 ConfigBackendPoolDHCPv4::deleteSharedNetwork4(const BackendSelector& backend_selector,
                                               const ServerSelector& server_selector,
index 70e78342fae81521c5678e94ab24adda615deb7a..15d9b9211c130adbf94d09da6946d01e4eea9da4 100644 (file)
@@ -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.
index 3bf3fb3716c7852fbccf9b3f07317b3af90ea11c..d4a0071b2a81cd9fb13fd31d2b5c5f4fa4306517 100644 (file)
@@ -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<uint64_t, const std::string&>
+            (&ConfigBackendDHCPv6::deleteSharedNetworkSubnets6, backend_selector, server_selector,
+             shared_network_name));
+}
+
 uint64_t
 ConfigBackendPoolDHCPv6::deleteSharedNetwork6(const BackendSelector& backend_selector,
                                               const ServerSelector& server_selector,
index 5a2cec863a460de54fa335470603a8bbf2522cc4..6031450895491a625e24feac45b20b3a4e5df980 100644 (file)
@@ -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.
index e06bec8f96e40cc9b468a7a07d64d93a5c866323..d822eb37e8bf6eb4cc3538378a4fc8e78e5de4e9 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <database/database_connection.h>
 #include <test_config_backend_dhcp4.h>
+#include <list>
 
 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<SharedNetworkNameIndexTag>();
+    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<SubnetSubnetIdIndexTag>();
+        cnt += subnet_index.erase(subnet_id);
+    }
+    (*network_it)->delAll();
+    return (cnt);
+}
+
 uint64_t
 TestConfigBackendDHCPv4::deleteSharedNetwork4(const db::ServerSelector& /* server_selector */,
                                               const std::string& name) {
index a6693b733ceff4b0dc8664931e96f66a041cd3c8..28145a54c90c77cbb105f7dd8bcb671b31dbed8a 100644 (file)
@@ -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.
index 17149ccc00a71d9b6720db374e7741833b15d982..33f9ff0fbb55904ececae172348f3adb79648872 100644 (file)
@@ -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<SharedNetworkNameIndexTag>();
+    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<SubnetSubnetIdIndexTag>();
+        cnt += subnet_index.erase(subnet_id);
+    }
+    (*network_it)->delAll();
+    return (cnt);
+}
+
 uint64_t
 TestConfigBackendDHCPv6::deleteSharedNetwork6(const db::ServerSelector& /* server_selector */,
                                               const std::string& name) {
index 6e7a425a0a87cc27b6a589da32f06b17968baf3f..b89ee0c96f59e2c31e9794ca943d8457258899a6 100644 (file)
@@ -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.