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,
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)
"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) {
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.
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());
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.
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.
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.
-// 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
(&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,
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.
(&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,
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.
#include <database/database_connection.h>
#include <test_config_backend_dhcp4.h>
+#include <list>
using namespace isc::data;
using namespace isc::db;
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) {
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.
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) {
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.