From: Marcin Siodelski Date: Tue, 4 Jun 2019 15:43:45 +0000 (+0200) Subject: [#641,!352] Added API functions for servers. X-Git-Tag: Kea-1.6.0-beta2~317 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=c924128c508c9d6933a2b682066d9275c2838a02;p=thirdparty%2Fkea.git [#641,!352] Added API functions for servers. --- diff --git a/src/lib/config_backend/base_config_backend_pool.h b/src/lib/config_backend/base_config_backend_pool.h index 9b255133c2..2fc67b5164 100644 --- a/src/lib/config_backend/base_config_backend_pool.h +++ b/src/lib/config_backend/base_config_backend_pool.h @@ -161,6 +161,68 @@ protected: } } + /// @brief Retrieve a single configuration property from the backend. + /// + /// This is common method for retrieving a single configuration property + /// from the selected database without specifying the server selector. The + /// server specific backends call this method to retrieve a single object. + /// For example, the DHCPv4 configuration backend pool may use this function + /// to implement a @c getServer4 method: + /// + /// @code + /// ServerPtr getServer4(const BackendSelector& backend_selector, + /// const std::string& server_tag) const { + /// ServerPtr server; + /// getPropertyPtrConst + /// (&ConfigBackendDHCPv4::getServer4, backend_selector, + /// server_tag); + /// return (server); + /// } + /// @endcode + /// + /// where @c ConfigBackendDHCPv4::getServer4 has the following signature: + /// + /// @code + /// ServerPtr getServer4(const std::string&) const; + /// @endcode + /// + /// This method is used in cases when server selector is not applicable. + /// + /// @tparam PropertyType Type of the object returned by the backend call. + /// @tparam FnPtrArgs Parameter pack holding argument types of the backend + /// method to be invoked. + /// @tparam Args Parameter pack holding types of the arguments provided + /// in the call to this method. + /// + /// @param MethodPointer Pointer to the backend method to be called. + /// @param backend_selector Backend selector. + /// @param [out] property Reference to the shared pointer where retrieved + /// property should be assigned. + /// @param input Values to be used as input to the backend call. + /// + /// @throw db::NoSuchDatabase if no database matching the given selector + /// was found. + /// @throw db::AmbiguousDatabase if multiple databases matching the selector + /// were found. + template + void getBackendPropertyPtrConst(PropertyType (ConfigBackendType::*MethodPointer) + (FnPtrArgs...) const, + const db::BackendSelector& backend_selector, + PropertyType& property, + Args... input) const { + auto backends = selectBackends(backend_selector); + if (backends.empty()) { + isc_throw(db::NoSuchDatabase, "no such database found for selector: " + << backend_selector.toText()); + + } else if (backends.size() > 1) { + isc_throw(db::AmbiguousDatabase, "more than one database found for " + "selector: " << backend_selector.toText()); + } + + property = ((*(*(backends.begin())).*MethodPointer)(input...)); + } + /// @brief Retrieve multiple configuration properties from the pool. /// /// This is a common method for retrieving multiple configuration properties @@ -309,6 +371,59 @@ protected: } } + /// @brief Get all configuration properties from the backend. + /// + /// This is a common method for retrieving all configuration properties + /// from the selected database without specifying the server selector. The + /// server specific backends call this method to retrieve all objects of + /// the same type. For example, the DHCPv4 configuration backend pool may + /// use this function to implement a @c getAllServers4 method: + /// + /// @code + /// ServerCollection getAllServers4(const BackendSelector&) const { + /// ServerCollection servers; + /// getAllBackendPropertiesConst + /// (&ConfigBackendDHCPv4::getAllServers4, backend_selector, servers); + /// return (servers); + /// } + /// @endcode + /// + /// where @c ConfigBackendDHCPv4::getAllServers4 has the following signature: + /// + /// @code + /// ServerCollection getAllServers4() const; + /// @endcode + /// + /// This method is used in cases when server selector is not applicable. + /// + /// @tparam PropertyCollectionType Type of the container into which the + /// properties are stored. + /// + /// @param MethodPointer Pointer to the backend method to be called. + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param [out] properties Reference to the collection of retrieved properties. + /// + /// @throw db::NoSuchDatabase if no database matching the given selector + /// was found. + /// @throw db::AmbiguousDatabase if multiple databases matching the selector + /// were found. + template + void getAllBackendPropertiesConst(PropertyCollectionType (ConfigBackendType::*MethodPointer)() const, + const db::BackendSelector& backend_selector, + PropertyCollectionType& properties) const { + auto backends = selectBackends(backend_selector); + if (backends.empty()) { + isc_throw(db::NoSuchDatabase, "no such database found for selector: " + << backend_selector.toText()); + + } else if (backends.size() > 1) { + isc_throw(db::AmbiguousDatabase, "more than one database found for " + "selector: " << backend_selector.toText()); + } + + properties = (*(*(backends.begin())).*MethodPointer)(); + } /// @brief Add, update or delete property from the backend. /// @@ -375,6 +490,67 @@ protected: return ((*(*(backends.begin())).*MethodPointer)(server_selector, input...)); } + /// @brief Add, update or delete property from the backend. + /// + /// This is a common method for storing a single configuration property in + /// a database, updating an existing property or deleting the property + /// without specifying the server selector. The server specific backends + /// call this method. For example, the DHCPv4 configuration backend pool + /// may use this function to implement the @c createUpdateServer4 method: + /// + /// @code + /// void createUpdateServer4(const BackendSelector& backend_selector, + /// const ServerSelector& server_selector, + /// const ServerPtr& server) { + /// createUpdateDeleteBackendProperty + /// (&ConfigBackendDHCPv4::createUpdateServer4, backend_selector, + /// server); + /// } + /// @endcode + /// + /// where @c ConfigBackendDHCPv4::createUpdateServer4 has the following + /// signature: + /// + /// @code + /// void createUpdateServer4(const ServerPtr&); + /// @endcode + /// + /// This method is used in cases when server selector is not applicable. + /// + /// @tparam ReturnValue Returned value, typically void or uint64_t. + /// @tparam FnPtrArgs Parameter pack holding argument types of the backend + /// method to be invoked. + /// @tparam Args Parameter pack holding types of the arguments provided + /// in the call to this method. + /// + /// @param MethodPointer Pointer to the backend method to be called. + /// @param backend_selector Backend selector. + /// @param input Objects used as arguments to the backend method to be + /// called. + /// + /// @throw db::NoSuchDatabase if no database matching the given selector + /// was found. + /// @throw db::AmbiguousDatabase if multiple databases matching the selector + /// were found. + /// @return Number of affected properties, if the value is non void. + template + ReturnValue createUpdateDeleteBackendProperty(ReturnValue (ConfigBackendType::*MethodPointer) + (FnPtrArgs...), + const db::BackendSelector& backend_selector, + Args... input) { + auto backends = selectBackends(backend_selector); + if (backends.empty()) { + isc_throw(db::NoSuchDatabase, "no such database found for selector: " + << backend_selector.toText()); + + } else if (backends.size() > 1) { + isc_throw(db::AmbiguousDatabase, "more than one database found for " + "selector: " << backend_selector.toText()); + } + + return ((*(*(backends.begin())).*MethodPointer)(input...)); + } + /// @brief Selects existing backends matching the selector. /// /// This method selects backends matching the selector. If the selector is diff --git a/src/lib/dhcpsrv/config_backend_dhcp4.h b/src/lib/dhcpsrv/config_backend_dhcp4.h index 90c0505e83..5a38867f2e 100644 --- a/src/lib/dhcpsrv/config_backend_dhcp4.h +++ b/src/lib/dhcpsrv/config_backend_dhcp4.h @@ -197,6 +197,20 @@ public: getRecentAuditEntries(const db::ServerSelector& server_selector, const boost::posix_time::ptime& modification_time) const = 0; + /// @brief Retrieves all servers. + /// + /// @return Collection of servers from the backend. + virtual db::ServerCollection + getAllServers4() const = 0; + + /// @brief Retrieves a server. + /// + /// @param server_tag Tag of the server to be retrieved. + /// @return Pointer to the server instance or null pointer if no server + /// with the particular tag was found. + virtual db::ServerPtr + getServer4(const data::ServerTag& server_tag) const = 0; + /// @brief Creates or updates a subnet. /// /// @param server_selector Server selector. @@ -272,6 +286,12 @@ public: createUpdateGlobalParameter4(const db::ServerSelector& server_selector, const data::StampedValuePtr& value) = 0; + /// @brief Creates or updates a server. + /// + /// @param server Instance of the server to be stored. + virtual void + createUpdateServer4(const db::ServerPtr& server) = 0; + /// @brief Deletes subnet by prefix. /// /// @param server_selector Server selector. @@ -406,6 +426,20 @@ public: /// @return Number of deleted global parameters. virtual uint64_t deleteAllGlobalParameters4(const db::ServerSelector& server_selector) = 0; + + /// @brief Deletes a server from the backend. + /// + /// @param server_tag Tag of the server to be deleted. + /// @return Number of deleted servers. + virtual uint64_t + deleteServer4(const std::string& server_tag) = 0; + + /// @brief Deletes all servers from the backend except the logical + /// server 'all'. + /// + /// @return Number of deleted servers. + virtual uint64_t + deleteAllServers4() = 0; }; /// @brief Shared pointer to the @c ConfigBackendDHCPv4 instance. diff --git a/src/lib/dhcpsrv/config_backend_dhcp6.h b/src/lib/dhcpsrv/config_backend_dhcp6.h index a887e32704..61785aa356 100644 --- a/src/lib/dhcpsrv/config_backend_dhcp6.h +++ b/src/lib/dhcpsrv/config_backend_dhcp6.h @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include #include #include @@ -197,6 +199,20 @@ public: getRecentAuditEntries(const db::ServerSelector& server_selector, const boost::posix_time::ptime& modification_time) const = 0; + /// @brief Retrieves all servers. + /// + /// @return Collection of servers from the backend. + virtual db::ServerCollection + getAllServers6() const = 0; + + /// @brief Retrieves a server. + /// + /// @param server_tag Tag of the server to be retrieved. + /// @return Pointer to the server instance or null pointer if no server + /// with the particular tag was found. + virtual db::ServerPtr + getServer6(const data::ServerTag& server_tag) const = 0; + /// @brief Creates or updates a subnet. /// /// @param server_selector Server selector. @@ -286,6 +302,12 @@ public: createUpdateGlobalParameter6(const db::ServerSelector& server_selector, const data::StampedValuePtr& value) = 0; + /// @brief Creates or updates a server. + /// + /// @param server Instance of the server to be stored. + virtual void + createUpdateServer6(const db::ServerPtr& server) = 0; + /// @brief Deletes subnet by prefix. /// /// @param server_selector Server selector. @@ -437,6 +459,20 @@ public: /// @return Number of deleted global parameters. virtual uint64_t deleteAllGlobalParameters6(const db::ServerSelector& server_selector) = 0; + + /// @brief Deletes a server from the backend. + /// + /// @param server_tag Tag of the server to be deleted. + /// @return Number of deleted servers. + virtual uint64_t + deleteServer6(const std::string& server_tag) = 0; + + /// @brief Deletes all servers from the backend except the logical + /// server 'all'. + /// + /// @return Number of deleted servers. + virtual uint64_t + deleteAllServers6() = 0; }; /// @brief Shared pointer to the @c ConfigBackendDHCPv6 instance. diff --git a/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc b/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc index 018bdf53b4..ae7024f136 100644 --- a/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc @@ -212,6 +212,24 @@ getRecentAuditEntries(const db::BackendSelector& backend_selector, return (audit_entries); } +ServerCollection +ConfigBackendPoolDHCPv4::getAllServers4(const BackendSelector& backend_selector) const { + ServerCollection servers; + getAllBackendPropertiesConst + (&ConfigBackendDHCPv4::getAllServers4, backend_selector, servers); + return (servers); +} + +ServerPtr +ConfigBackendPoolDHCPv4::getServer4(const BackendSelector& backend_selector, + const ServerTag& server_tag) const { + ServerPtr server; + getBackendPropertyPtrConst + (&ConfigBackendDHCPv4::getServer4, backend_selector, server, + server_tag); + return (server); +} + void ConfigBackendPoolDHCPv4::createUpdateSubnet4(const BackendSelector& backend_selector, const ServerSelector& server_selector, @@ -290,6 +308,14 @@ ConfigBackendPoolDHCPv4::createUpdateGlobalParameter4(const BackendSelector& bac server_selector, value); } +void +ConfigBackendPoolDHCPv4::createUpdateServer4(const BackendSelector& backend_selector, + const ServerPtr& server) { + createUpdateDeleteBackendProperty + (&ConfigBackendDHCPv4::createUpdateServer4, backend_selector, + server); +} + uint64_t ConfigBackendPoolDHCPv4::deleteSubnet4(const BackendSelector& backend_selector, const ServerSelector& server_selector, @@ -420,6 +446,19 @@ ConfigBackendPoolDHCPv4::deleteAllGlobalParameters4(const BackendSelector& backe server_selector)); } +uint64_t +ConfigBackendPoolDHCPv4::deleteServer4(const BackendSelector& backend_selector, + const std::string& server_tag) { + return (createUpdateDeleteBackendProperty + (&ConfigBackendDHCPv4::deleteServer4, backend_selector, + server_tag)); +} + +uint64_t +ConfigBackendPoolDHCPv4::deleteAllServers4(const BackendSelector& backend_selector) { + return (createUpdateDeleteBackendProperty + (&ConfigBackendDHCPv4::deleteAllServers4, backend_selector)); +} } // end of namespace isc::dhcp } // end of namespace isc diff --git a/src/lib/dhcpsrv/config_backend_pool_dhcp4.h b/src/lib/dhcpsrv/config_backend_pool_dhcp4.h index 302ffe7960..5aec95dfb5 100644 --- a/src/lib/dhcpsrv/config_backend_pool_dhcp4.h +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp4.h @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include #include #include @@ -231,6 +233,23 @@ public: const db::ServerSelector& server_selector, const boost::posix_time::ptime& modification_time) const; + /// @brief Retrieves all servers from the particular backend. + /// + /// @param backend_selector Backend selector. + /// @return Collection of servers from the backend. + virtual db::ServerCollection + getAllServers4(const db::BackendSelector& backend_selector) const; + + /// @brief Retrieves a server from the particular backend. + /// + /// @param backend_selector Backend selector. + /// @param server_tag Tag of the server to be retrieved. + /// @return Pointer to the server instance or null pointer if no server + /// with the particular tag was found. + virtual db::ServerPtr + getServer4(const db::BackendSelector& backend_selector, + const data::ServerTag& server_tag) const; + /// @brief Creates or updates a subnet. /// /// @param backend_selector Backend selector. @@ -322,6 +341,14 @@ public: const db::ServerSelector& server_selector, const data::StampedValuePtr& value); + /// @brief Creates or updates a server. + /// + /// @param backend_selector Backend selector. + /// @param server Instance of the server to be stored. + virtual void + createUpdateServer4(const db::BackendSelector& backend_selector, + const db::ServerPtr& server); + /// @brief Deletes subnet by prefix. /// /// @param backend_selector Backend selector. @@ -488,6 +515,23 @@ public: virtual uint64_t deleteAllGlobalParameters4(const db::BackendSelector& backend_selector, const db::ServerSelector& server_selector); + + /// @brief Deletes a server from the backend. + /// + /// @param backend_selector Backend selector. + /// @param server_tag Tag of the server to be deleted. + /// @return Number of deleted servers. + virtual uint64_t + deleteServer4(const db::BackendSelector& backend_selector, + const std::string& server_tag); + + /// @brief Deletes all servers from the backend except the logical + /// server 'all'. + /// + /// @param backend_selector Backend selector. + /// @return Number of deleted servers. + virtual uint64_t + deleteAllServers4(const db::BackendSelector& backend_selector); }; diff --git a/src/lib/dhcpsrv/config_backend_pool_dhcp6.cc b/src/lib/dhcpsrv/config_backend_pool_dhcp6.cc index 66d8f01c62..eec5501248 100644 --- a/src/lib/dhcpsrv/config_backend_pool_dhcp6.cc +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp6.cc @@ -212,6 +212,24 @@ getRecentAuditEntries(const db::BackendSelector& backend_selector, return (audit_entries); } +ServerCollection +ConfigBackendPoolDHCPv6::getAllServers6(const BackendSelector& backend_selector) const { + ServerCollection servers; + getAllBackendPropertiesConst + (&ConfigBackendDHCPv6::getAllServers6, backend_selector, servers); + return (servers); +} + +ServerPtr +ConfigBackendPoolDHCPv6::getServer6(const BackendSelector& backend_selector, + const ServerTag& server_tag) const { + ServerPtr server; + getBackendPropertyPtrConst + (&ConfigBackendDHCPv6::getServer6, backend_selector, server, + server_tag); + return (server); +} + void ConfigBackendPoolDHCPv6::createUpdateSubnet6(const BackendSelector& backend_selector, const ServerSelector& server_selector, @@ -302,6 +320,14 @@ ConfigBackendPoolDHCPv6::createUpdateGlobalParameter6(const BackendSelector& bac server_selector, value); } +void +ConfigBackendPoolDHCPv6::createUpdateServer6(const BackendSelector& backend_selector, + const ServerPtr& server) { + createUpdateDeleteBackendProperty + (&ConfigBackendDHCPv6::createUpdateServer6, backend_selector, + server); +} + uint64_t ConfigBackendPoolDHCPv6::deleteSubnet6(const BackendSelector& backend_selector, const ServerSelector& server_selector, @@ -445,6 +471,19 @@ ConfigBackendPoolDHCPv6::deleteAllGlobalParameters6(const BackendSelector& backe server_selector)); } +uint64_t +ConfigBackendPoolDHCPv6::deleteServer6(const BackendSelector& backend_selector, + const std::string& server_tag) { + return (createUpdateDeleteBackendProperty + (&ConfigBackendDHCPv6::deleteServer6, backend_selector, + server_tag)); +} + +uint64_t +ConfigBackendPoolDHCPv6::deleteAllServers6(const BackendSelector& backend_selector) { + return (createUpdateDeleteBackendProperty + (&ConfigBackendDHCPv6::deleteAllServers6, backend_selector)); +} } // end of namespace isc::dhcp } // end of namespace isc diff --git a/src/lib/dhcpsrv/config_backend_pool_dhcp6.h b/src/lib/dhcpsrv/config_backend_pool_dhcp6.h index f26fa606e5..820997fc7d 100644 --- a/src/lib/dhcpsrv/config_backend_pool_dhcp6.h +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp6.h @@ -231,6 +231,23 @@ public: const db::ServerSelector& server_selector, const boost::posix_time::ptime& modification_time) const; + /// @brief Retrieves all servers from the particular backend. + /// + /// @param backend_selector Backend selector. + /// @return Collection of servers from the backend. + virtual db::ServerCollection + getAllServers6(const db::BackendSelector& backend_selector) const; + + /// @brief Retrieves a server from the particular backend. + /// + /// @param backend_selector Backend selector. + /// @param server_tag Tag of the server to be retrieved. + /// @return Pointer to the server instance or null pointer if no server + /// with the particular tag was found. + virtual db::ServerPtr + getServer6(const db::BackendSelector& backend_selector, + const data::ServerTag& server_tag) const; + /// @brief Creates or updates a subnet. /// /// @param backend_selector Backend selector. @@ -338,6 +355,14 @@ public: const db::ServerSelector& server_selector, const data::StampedValuePtr& value); + /// @brief Creates or updates a server. + /// + /// @param backend_selector Backend selector. + /// @param server Instance of the server to be stored. + virtual void + createUpdateServer6(const db::BackendSelector& backend_selector, + const db::ServerPtr& server); + /// @brief Deletes subnet by prefix. /// /// @param backend_selector Backend selector. @@ -523,6 +548,23 @@ public: virtual uint64_t deleteAllGlobalParameters6(const db::BackendSelector& backend_selector, const db::ServerSelector& server_selector); + + /// @brief Deletes a server from the backend. + /// + /// @param backend_selector Backend selector. + /// @param server_tag Tag of the server to be deleted. + /// @return Number of deleted servers. + virtual uint64_t + deleteServer6(const db::BackendSelector& backend_selector, + const std::string& server_tag); + + /// @brief Deletes all servers from the backend except the logical + /// server 'all'. + /// + /// @param backend_selector Backend selector. + /// @return Number of deleted servers. + virtual uint64_t + deleteAllServers6(const db::BackendSelector& 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 70b2ba830f..863677cc38 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc @@ -217,6 +217,18 @@ TestConfigBackendDHCPv4::getRecentAuditEntries(const db::ServerSelector&, return (AuditEntryCollection()); } +ServerCollection +TestConfigBackendDHCPv4::getAllServers4() const { + return (servers_); +} + +ServerPtr +TestConfigBackendDHCPv4::getServer4(const ServerTag& server_tag) const { + const auto& index = servers_.get(); + auto server_it = index.find(server_tag.get()); + return ((server_it != index.cend()) ? (*server_it) : ServerPtr()); +} + void TestConfigBackendDHCPv4::createUpdateSubnet4(const db::ServerSelector& server_selector, const Subnet4Ptr& subnet) { @@ -352,6 +364,19 @@ TestConfigBackendDHCPv4::createUpdateGlobalParameter4(const db::ServerSelector& } } +void +TestConfigBackendDHCPv4::createUpdateServer4(const db::ServerPtr& server) { + auto& index = servers_.get(); + auto server_it = index.find(server->getServerTag()); + + if (server_it != index.end()) { + index.replace(server_it, server); + + } else { + index.insert(server); + } +} + uint64_t TestConfigBackendDHCPv4::deleteSubnet4(const db::ServerSelector& /* server_selector */, const std::string& subnet_prefix) { @@ -524,6 +549,19 @@ TestConfigBackendDHCPv4::deleteAllGlobalParameters4(const db::ServerSelector& /* return (globals_size); } +uint64_t +TestConfigBackendDHCPv4::deleteServer4(const std::string& server_tag) { + auto& index = servers_.get(); + return (index.erase(server_tag)); +} + +uint64_t +TestConfigBackendDHCPv4::deleteAllServers4() { + auto servers_size = servers_.size(); + servers_.clear(); + return (servers_size); +} + } // namespace test } // namespace dhcp } // namespace isc diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h index 2754c1bc83..3973452a73 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h @@ -10,6 +10,8 @@ #include #include +#include +#include #include #include @@ -218,6 +220,20 @@ public: getRecentAuditEntries(const db::ServerSelector& server_selector, const boost::posix_time::ptime& modification_time) const; + /// @brief Retrieves all servers. + /// + /// @return Collection of servers from the backend. + virtual db::ServerCollection + getAllServers4() const; + + /// @brief Retrieves a server. + /// + /// @param server_tag Tag of the server to be retrieved. + /// @return Pointer to the server instance or null pointer if no server + /// with the particular tag was found. + virtual db::ServerPtr + getServer4(const data::ServerTag& server_tag) const; + /// @brief Creates or updates a subnet. /// /// @param server_selector Server selector. @@ -293,6 +309,12 @@ public: createUpdateGlobalParameter4(const db::ServerSelector& server_selector, const data::StampedValuePtr& value); + /// @brief Creates or updates a server. + /// + /// @param server Instance of the server to be stored. + virtual void + createUpdateServer4(const db::ServerPtr& server); + /// @brief Deletes subnet by prefix. /// /// @param server_selector Server selector. @@ -428,6 +450,20 @@ public: virtual uint64_t deleteAllGlobalParameters4(const db::ServerSelector& server_selector); + /// @brief Deletes a server from the backend. + /// + /// @param server_tag Tag of the server to be deleted. + /// @return Number of deleted servers. + virtual uint64_t + deleteServer4(const std::string& server_tag); + + /// @brief Deletes all servers from the backend except the logical + /// server 'all'. + /// + /// @return Number of deleted servers. + virtual uint64_t + deleteAllServers4(); + /// @{ /// @brief Containers used to house the "database" entries Subnet4Collection subnets_; @@ -435,6 +471,7 @@ public: OptionDefContainer option_defs_; OptionContainer options_; data::StampedValueCollection globals_; + db::ServerCollection servers_; /// @} }; diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc index 74303f673d..6f68212a87 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc @@ -216,6 +216,18 @@ TestConfigBackendDHCPv6::getRecentAuditEntries(const db::ServerSelector&, return (AuditEntryCollection()); } +ServerCollection +TestConfigBackendDHCPv6::getAllServers6() const { + return (servers_); +} + +ServerPtr +TestConfigBackendDHCPv6::getServer6(const ServerTag& server_tag) const { + const auto& index = servers_.get(); + auto server_it = index.find(server_tag.get()); + return ((server_it != index.cend()) ? (*server_it) : ServerPtr()); +} + void TestConfigBackendDHCPv6::createUpdateSubnet6(const db::ServerSelector& server_selector, const Subnet6Ptr& subnet) { @@ -371,6 +383,19 @@ TestConfigBackendDHCPv6::createUpdateGlobalParameter6(const db::ServerSelector& } } +void +TestConfigBackendDHCPv6::createUpdateServer6(const db::ServerPtr& server) { + auto& index = servers_.get(); + auto server_it = index.find(server->getServerTag()); + + if (server_it != index.end()) { + index.replace(server_it, server); + + } else { + index.insert(server); + } +} + uint64_t TestConfigBackendDHCPv6::deleteSubnet6(const db::ServerSelector& /* server_selector */, const std::string& subnet_prefix) { @@ -561,6 +586,20 @@ TestConfigBackendDHCPv6::deleteAllGlobalParameters6(const db::ServerSelector& /* return (globals_size); } +uint64_t +TestConfigBackendDHCPv6::deleteServer6(const std::string& server_tag) { + auto& index = servers_.get(); + return (index.erase(server_tag)); +} + +uint64_t +TestConfigBackendDHCPv6::deleteAllServers6() { + auto servers_size = servers_.size(); + servers_.clear(); + return (servers_size); +} + + } // namespace test } // namespace dhcp } // namespace isc diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.h b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.h index e18bba3b6a..b0f319f5c7 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.h +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.h @@ -10,6 +10,8 @@ #include #include +#include +#include #include #include @@ -218,6 +220,20 @@ public: getRecentAuditEntries(const db::ServerSelector& server_selector, const boost::posix_time::ptime& modification_time) const; + /// @brief Retrieves all servers. + /// + /// @return Collection of servers from the backend. + virtual db::ServerCollection + getAllServers6() const; + + /// @brief Retrieves a server. + /// + /// @param server_tag Tag of the server to be retrieved. + /// @return Pointer to the server instance or null pointer if no server + /// with the particular tag was found. + virtual db::ServerPtr + getServer6(const data::ServerTag& server_tag) const; + /// @brief Creates or updates a subnet. /// /// @param server_selector Server selector. @@ -307,6 +323,12 @@ public: createUpdateGlobalParameter6(const db::ServerSelector& server_selector, const data::StampedValuePtr& value); + /// @brief Creates or updates a server. + /// + /// @param server Instance of the server to be stored. + virtual void + createUpdateServer6(const db::ServerPtr& server); + /// @brief Deletes subnet by prefix. /// /// @param server_selector Server selector. @@ -459,6 +481,20 @@ public: virtual uint64_t deleteAllGlobalParameters6(const db::ServerSelector& server_selector); + /// @brief Deletes a server from the backend. + /// + /// @param server_tag Tag of the server to be deleted. + /// @return Number of deleted servers. + virtual uint64_t + deleteServer6(const std::string& server_tag); + + /// @brief Deletes all servers from the backend except the logical + /// server 'all'. + /// + /// @return Number of deleted servers. + virtual uint64_t + deleteAllServers6(); + /// @{ /// @brief Containers used to house the "database" entries Subnet6Collection subnets_; @@ -466,6 +502,7 @@ public: OptionDefContainer option_defs_; OptionContainer options_; data::StampedValueCollection globals_; + db::ServerCollection servers_; /// @} };