From: Marcin Siodelski Date: Fri, 7 Sep 2018 14:15:02 +0000 (+0200) Subject: [#28,!20] Implemented Config Backend pool for DHCPv4. X-Git-Tag: 134-bugs--xcode-10_base~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ee64ceb86df335beed1d73e828dbc052d84823a1;p=thirdparty%2Fkea.git [#28,!20] Implemented Config Backend pool for DHCPv4. --- diff --git a/src/lib/config_backend/base_config_backend_pool.h b/src/lib/config_backend/base_config_backend_pool.h index 8989ba1a8b..1aa830c22d 100644 --- a/src/lib/config_backend/base_config_backend_pool.h +++ b/src/lib/config_backend/base_config_backend_pool.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -75,7 +76,7 @@ protected: /// const BackendSelector& selector, /// const ServerSelector& server_selector) const { /// Subnet4Ptr subnet; - /// getPropertyPtrConst + /// getPropertyPtrConst /// (&ConfigBackendDHCPv4::getSubnet4, selector, subnet, subnet_id); /// return (subnet); /// } @@ -142,6 +143,84 @@ protected: } } + /// @brief Retrieve a single value encapsulated in the @c OptionalValue + /// template. + /// + /// This is common method for retrieving a single configuration property + /// from the databases. The property is encapsulated in the @c OptionalValue + /// class. The value is set to "unspecified" if it is null in the database. + /// The following is the example implementation of the method retrieving + /// global conifguration value: + /// + /// @code + /// OptionalValue + /// getGlobalParameter4(const std::string& parameter_name, + /// const BackendSelector& selector, + /// const ServerSelector& server_selector) const { + /// std::string parameter; + /// getOptionalPropertyConst + /// (&ConfigBackendDHCPv4::getGlobalParameter4, selector, server_selector, + /// parameter, parameter_name); + /// return (parameter); + /// } + /// @endcode + /// + /// where @c ConfigBackendDHCPv4::getGlobalParameter has the following signature: + /// + /// @code + /// std::string getGlobalParameter4(const ServerSelector&, const std::string&) const; + /// @endcode + /// + /// + /// @tparam PropertyType Type of the object returned by the backend call. + /// @tparam InputType Type of the objects used as input to the backend call. + /// + /// @param MethodPointer Pointer to the backend method to be called. + /// @param selector Backend selector. + /// @param server_selector Server 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. + template + void getOptionalPropertyConst(util::OptionalValue + (ConfigBackendType::*MethodPointer) + (const db::ServerSelector&, InputType...) const, + const db::BackendSelector& selector, + const db::ServerSelector& server_selector, + util::OptionalValue& property, + InputType... input) const { + + // If no particular backend is selected, call each backend and return + // the first non-null (non zero) value. + if (selector.amUnspecified()) { + for (auto backend : backends_) { + property = ((*backend).*MethodPointer)(server_selector, input...); + if (property.isSpecified()) { + break; + } + } + + } else { + // Backend selected, find the one that matches selection. + auto backends = selectBackends(selector); + if (!backends.empty()) { + for (auto backend : backends) { + property = ((*backend).*MethodPointer)(server_selector, input...); + if (property.isSpecified()) { + break; + } + } + + } else { + isc_throw(db::NoSuchDatabase, "no such database found for selector: " + << selector.toText()); + } + } + } + /// @brief Retrieve multiple configuration properties from the pool. /// /// This is a common method for retrieving multiple configuration properties diff --git a/src/lib/dhcpsrv/Makefile.am b/src/lib/dhcpsrv/Makefile.am index 3243f20377..6f88a6418d 100644 --- a/src/lib/dhcpsrv/Makefile.am +++ b/src/lib/dhcpsrv/Makefile.am @@ -108,6 +108,8 @@ libkea_dhcpsrv_la_SOURCES += cfg_subnets6.cc cfg_subnets6.h libkea_dhcpsrv_la_SOURCES += cfg_mac_source.cc cfg_mac_source.h libkea_dhcpsrv_la_SOURCES += cfgmgr.cc cfgmgr.h libkea_dhcpsrv_la_SOURCES += client_class_def.cc client_class_def.h +libkea_dhcpsrv_la_SOURCES += config_backend_dhcp4.h +libkea_dhcpsrv_la_SOURCES += config_backend_pool_dhcp4.cc config_backend_pool_dhcp4.h libkea_dhcpsrv_la_SOURCES += csv_lease_file4.cc csv_lease_file4.h libkea_dhcpsrv_la_SOURCES += csv_lease_file6.cc csv_lease_file6.h libkea_dhcpsrv_la_SOURCES += d2_client_cfg.cc d2_client_cfg.h @@ -211,6 +213,7 @@ if HAVE_CQL libkea_dhcpsrv_la_LIBADD += $(top_builddir)/src/lib/cql/libkea-cql.la endif +libkea_dhcpsrv_la_LIBADD += $(top_builddir)/src/lib/config_backend/libkea-cb.la libkea_dhcpsrv_la_LIBADD += $(top_builddir)/src/lib/database/libkea-database.la libkea_dhcpsrv_la_LIBADD += $(top_builddir)/src/lib/asiolink/libkea-asiolink.la libkea_dhcpsrv_la_LIBADD += $(top_builddir)/src/lib/cc/libkea-cc.la @@ -270,6 +273,8 @@ libkea_dhcpsrv_include_HEADERS = \ cfg_subnets6.h \ cfgmgr.h \ client_class_def.h \ + config_backend_dhcp4.h \ + config_backend_pool_dhcp4.h \ csv_lease_file4.h \ csv_lease_file6.h \ dhcpsrv_exceptions.h \ diff --git a/src/lib/dhcpsrv/config_backend_dhcp4.h b/src/lib/dhcpsrv/config_backend_dhcp4.h new file mode 100644 index 0000000000..9e19b01a5c --- /dev/null +++ b/src/lib/dhcpsrv/config_backend_dhcp4.h @@ -0,0 +1,318 @@ +// Copyright (C) 2018 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 +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef CONFIG_BACKEND_DHCP4_H +#define CONFIG_BACKEND_DHCP4_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace isc { +namespace dhcp { + +/// @brief Interface implemented by DHCPv4 configuration backends. +class ConfigBackendDHCPv4 : public cb::BaseConfigBackend { +public: + + /// @brief Virtual destructor. + virtual ~ConfigBackendDHCPv4() { } + + /// @brief Retrieves a single subnet by subnet_prefix. + /// + /// @param selector Server selector. + /// @param subnet_prefix Prefix of the subnet to be retrieved. + /// @return Pointer to the retrieved subnet or NULL if not found. + virtual Subnet4Ptr + getSubnet4(const db::ServerSelector& selector, + const std::string& subnet_prefix) const = 0; + + /// @brief Retrieves a single subnet by subnet identifier. + /// + /// @param selector Server selector. + /// @param subnet_id Identifier of a subnet to be retrieved. + /// @return Pointer to the retrieved subnet or NULL if not found. + virtual Subnet4Ptr + getSubnet4(const db::ServerSelector& selector, const SubnetID& subnet_id) const = 0; + + /// @brief Retrieves all subnets. + /// + /// @param selector Server selector. + /// @return Collection of subnets or empty collection if no subnet found. + virtual Subnet4Collection + getAllSubnets4(const db::ServerSelector& selector) const = 0; + + /// @brief Retrieves subnets modified after specified time. + /// + /// @param selector Server selector. + /// @param modification_time Lower bound subnet modification time. + /// @return Collection of subnets or empty collection if no subnet found. + virtual Subnet4Collection + getModifiedSubnets4(const db::ServerSelector& selector, + const boost::posix_time::ptime& modification_time) const = 0; + + /// @brief Retrieves shared network by name. + /// + /// @param selector Server selector. + /// @param name Name of the shared network to be retrieved. + /// @return Pointer to the shared network or NULL if not found. + virtual SharedNetwork4Ptr + getSharedNetwork4(const db::ServerSelector& selector, + const std::string& name) const = 0; + + /// @brief Retrieves all shared networks. + /// + /// @param selector Server selector. + /// @return Collection of shared network or empty collection if + /// no shared network found. + virtual SharedNetwork4Collection + getAllSharedNetworks4(const db::ServerSelector& selector) const = 0; + + /// @brief Retrieves shared networks modified after specified time. + /// + /// @param selector Server selector. + /// @param Lower bound shared network modification time. + /// @return Collection of shared network or empty collection if + /// no shared network found. + virtual SharedNetwork4Collection + getModifiedSharedNetworks4(const db::ServerSelector& selector, + const boost::posix_time::ptime& modification_time) const = 0; + + /// @brief Retrieves single option definition by code and space. + /// + /// @param selector Server selector. + /// @param code Code of the option to be retrieved. + /// @param space Option space of the option to be retrieved. + /// @return Pointer to the option definition or NULL if not found. + virtual OptionDefinitionPtr + getOptionDef4(const db::ServerSelector& selector, const uint16_t code, + const std::string& space) const = 0; + + /// @brief Retrieves all option definitions. + /// + /// @param selector Server selector. + /// @return Collection of option definitions or empty collection if + /// no option definition found. + virtual OptionDefContainer + getAllOptionDefs4(const db::ServerSelector& selector) const = 0; + + /// @brief Retrieves option definitions modified after specified time. + /// + /// @param selector Server selector. + /// @param modification_time Lower bound option definition modification + /// time. + /// @return Collection of option definitions or empty collection if + /// no option definition found. + virtual OptionDefContainer + getModifiedOptionDefs4(const db::ServerSelector& selector, + const boost::posix_time::ptime& modification_time) const = 0; + + /// @brief Retrieves global string parameter value. + /// + /// @param selector Server selector. + /// @param name Name of the global parameter to be retrieved. + /// @return Value of the global string parameter. + virtual util::OptionalValue + getGlobalStringParameter4(const db::ServerSelector& selector, + const std::string& name) const = 0; + + /// @brief Retrieves global number parameter. + /// + /// @param selector Server selector. + /// @param name Name of the parameter to be retrieved. + virtual util::OptionalValue + getGlobalNumberParameter4(const db::ServerSelector& selector, + const std::string& name) const = 0; + + /// @brief Retrieves all global parameters as strings. + /// + /// @param selector Server selector. + virtual std::map + getAllGlobalParameters4(const db::ServerSelector& selector) const = 0; + + /// @brief Creates or updates a subnet. + /// + /// @param selector Server selector. + /// @param subnet Subnet to be added or updated. + virtual void + createUpdateSubnet4(const db::ServerSelector& selector, + const Subnet4Ptr& subnet) = 0; + + /// @brief Creates or updates a shared network. + /// + /// @param selector Server selector. + /// @param shared_network Shared network to be added or updated. + virtual void + createUpdateSharedNetwork4(const db::ServerSelector& selector, + const SharedNetwork4Ptr& shared_network) = 0; + + /// @brief Creates or updates an option definition. + /// + /// @param selector Server selector. + /// @param option_def Option definition to be added or updated. + virtual void + createUpdateOptionDef4(const db::ServerSelector& selector, + const OptionDefinitionPtr& option_def) = 0; + + /// @brief Creates or updates global option. + /// + /// @param selector Server selector. + /// @param option Option to be added or updated. + virtual void + createUpdateOption4(const db::ServerSelector& selector, + const OptionPtr& option) = 0; + + /// @brief Creates or updates subnet level option. + /// + /// @param selector Server selector. + /// @param subnet_id Identifier of a subnet to which option belongs. + virtual void + createUpdateOption4(const db::ServerSelector& selector, + const SubnetID& subnet_id, const OptionPtr& option) = 0; + + /// @brief Creates or updates pool level option. + /// + /// @param selector Server selector. + /// @param pool_start_address Lower bound address of the pool to which + /// the option belongs. + /// @param pool_end_address Upper bound address of the pool to which the + /// option belongs. + virtual void + createUpdateOption4(const db::ServerSelector& selector, + const asiolink::IOAddress& pool_start_address, + const asiolink::IOAddress& pool_end_address, + const OptionPtr& option) = 0; + + /// @brief Creates or updates global string parameter. + /// + /// @param selector Server selector. + /// @param name Name of the global parameter. + /// @param value Value of the global parameter. + virtual void + createUpdateGlobalParameter4(const db::ServerSelector& selector, + const std::string& name, + const std::string& value) = 0; + + /// @brief Creates or updates global number parameter. + /// + /// @param selector Server selector. + /// @param name Name of the global parameter. + /// @param value Value of the global parameter. + virtual void + createUpdateGlobalParameter4(const db::ServerSelector& selector, + const std::string& name, + const int64_t value) = 0; + + /// @brief Deletes subnet by prefix. + /// + /// @param selector Server selector. + /// @param subnet_prefix Prefix of the subnet to be deleted. + virtual void + deleteSubnet4(const db::ServerSelector& selector, + const std::string& subnet_prefix) = 0; + + /// @brief Deletes subnet by identifier. + /// + /// @param selector Server selector. + /// @param subnet_id Identifier of the subnet to be deleted. + virtual void + deleteSubnet4(const db::ServerSelector& selector, const SubnetID& subnet_id) = 0; + + /// @brief Deletes all subnets. + /// + /// @param selector Server selector. + virtual void + deleteAllSubnets4(const db::ServerSelector& selector) = 0; + + /// @brief Deletes shared network by name. + /// + /// @param selector Server selector. + /// @param name Name of the shared network to be deleted. + virtual void + deleteSharedNetwork4(const db::ServerSelector& selector, + const std::string& name) = 0; + + /// @brief Deletes all shared networks. + /// + /// @param selector Server selector. + virtual void + deleteAllSharedNetworks4(const db::ServerSelector& selector) = 0; + + /// @brief Deletes option definition. + /// + /// @param selector Server selector. + /// @param code Code of the option to be deleted. + /// @param space Option space of the option to be deleted. + virtual void + deleteOptionDef4(const db::ServerSelector& selector, const uint16_t code, + const std::string& space) = 0; + + /// @brief Deletes all option definitions. + /// + /// @param selector Server selector. + virtual void + deleteAllOptionDefs4(const db::ServerSelector& selector) = 0; + + /// @brief Deletes global option. + /// + /// @param selector Server selector. + /// @param code Code of the option to be deleted. + /// @param space Option space of the option to be deleted. + virtual void + deleteOption4(const db::ServerSelector& selector, const uint16_t code, + const std::string& space) = 0; + + /// @brief Deletes subnet level option. + /// + /// @param selector Server selector. + /// @param subnet_id Identifier of the subnet to which deleted option + /// belongs. + /// @param code Code of the deleted option. + /// @param space Option space of the deleted option. + virtual void + deleteOption4(const db::ServerSelector& selector, const SubnetID& subnet_id, + const uint16_t code, const std::string& space) = 0; + + /// @brief Deletes pool level option. + /// + /// @param selector Server selector. + /// @param pool_start_address Lower bound address of the pool to which + /// deleted option belongs. + /// @param pool_end_start Upper bound address of the pool to which the + /// deleted option belongs. + virtual void + deleteOption4(const db::ServerSelector& selector, + const asiolink::IOAddress& pool_start_address, + const asiolink::IOAddress& pool_end_address, + const uint16_t code, + const std::string& space) = 0; + + /// @brief Deletes global parameter. + /// + /// @param selector Server selector. + /// @param name Name of the global parameter to be deleted. + virtual void + deleteGlobalParameter4(const db::ServerSelector& selector, + const std::string& name) = 0; + + /// @brief Deletes all global parameters. + /// + /// @param selector Server selector. + virtual void + deleteAllGlobalParameters4(const db::ServerSelector& selector) = 0; +}; + +} // end of namespace isc::dhcp +} // end of namespace isc + +#endif // CONFIG_BACKEND_DHCP4_H diff --git a/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc b/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc new file mode 100644 index 0000000000..24b6272cec --- /dev/null +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc @@ -0,0 +1,346 @@ +// Copyright (C) 2018 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 +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include +#include + +using namespace isc::asiolink; +using namespace isc::db; +using namespace isc::util; + +namespace isc { +namespace dhcp { + +Subnet4Ptr +ConfigBackendPoolDHCPv4::getSubnet4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const std::string& subnet_prefix) const { + Subnet4Ptr subnet; + getPropertyPtrConst + (&ConfigBackendDHCPv4::getSubnet4, backend_selector, server_selector, + subnet, subnet_prefix); + return (subnet); +} + +Subnet4Ptr +ConfigBackendPoolDHCPv4::getSubnet4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const SubnetID& subnet_id) const { + Subnet4Ptr subnet; + getPropertyPtrConst + (&ConfigBackendDHCPv4::getSubnet4, backend_selector, server_selector, + subnet, subnet_id); + return (subnet); +} + +Subnet4Collection +ConfigBackendPoolDHCPv4::getAllSubnets4(const BackendSelector& backend_selector, + const ServerSelector& server_selector) const { + Subnet4Collection subnets; + getAllPropertiesConst + (&ConfigBackendDHCPv4::getAllSubnets4, backend_selector, server_selector, + subnets); + return (subnets); +} + +Subnet4Collection +ConfigBackendPoolDHCPv4::getModifiedSubnets4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const boost::posix_time::ptime& modification_time) const { + Subnet4Collection subnets; + getMultiplePropertiesConst + (&ConfigBackendDHCPv4::getModifiedSubnets4, backend_selector, server_selector, + subnets, modification_time); + return (subnets); +} + +SharedNetwork4Ptr +ConfigBackendPoolDHCPv4::getSharedNetwork4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const std::string& name) const { + SharedNetwork4Ptr shared_network; + getPropertyPtrConst + (&ConfigBackendDHCPv4::getSharedNetwork4, backend_selector, server_selector, + shared_network, name); + return (shared_network); +} + +SharedNetwork4Collection +ConfigBackendPoolDHCPv4::getAllSharedNetworks4(const BackendSelector& backend_selector, + const ServerSelector& server_selector) const { + SharedNetwork4Collection shared_networks; + getAllPropertiesConst + (&ConfigBackendDHCPv4::getAllSharedNetworks4, backend_selector, server_selector, + shared_networks); + return (shared_networks); +} + +SharedNetwork4Collection +ConfigBackendPoolDHCPv4:: +getModifiedSharedNetworks4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const boost::posix_time::ptime& modification_time) const { + SharedNetwork4Collection shared_networks; + getMultiplePropertiesConst + (&ConfigBackendDHCPv4::getModifiedSharedNetworks4, backend_selector, server_selector, + shared_networks, modification_time); + return (shared_networks); +} + +OptionDefinitionPtr +ConfigBackendPoolDHCPv4::getOptionDef4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const uint16_t code, + const std::string& space) const { + OptionDefinitionPtr option_def; + getPropertyPtrConst + (&ConfigBackendDHCPv4::getOptionDef4, backend_selector, server_selector, + option_def, code, space); + return (option_def); +} + +OptionDefContainer +ConfigBackendPoolDHCPv4::getAllOptionDefs4(const BackendSelector& backend_selector, + const ServerSelector& server_selector) const { + OptionDefContainer option_defs; + getAllPropertiesConst + (&ConfigBackendDHCPv4::getAllOptionDefs4, backend_selector, server_selector, + option_defs); + return (option_defs); +} + +OptionDefContainer +ConfigBackendPoolDHCPv4::getModifiedOptionDefs4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const boost::posix_time::ptime& modification_time) const { + OptionDefContainer option_defs; + getMultiplePropertiesConst + (&ConfigBackendDHCPv4::getModifiedOptionDefs4, backend_selector, server_selector, + option_defs, modification_time); + return (option_defs); +} + +util::OptionalValue +ConfigBackendPoolDHCPv4::getGlobalStringParameter4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const std::string& name) const { + OptionalValue parameter; + getOptionalPropertyConst + (&ConfigBackendDHCPv4::getGlobalStringParameter4, backend_selector, + server_selector, parameter, name); + return (parameter); +} + +util::OptionalValue +ConfigBackendPoolDHCPv4::getGlobalNumberParameter4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const std::string& name) const { + OptionalValue parameter; + getOptionalPropertyConst + (&ConfigBackendDHCPv4::getGlobalNumberParameter4, backend_selector, + server_selector, parameter, name); + return (parameter); +} + +std::map +ConfigBackendPoolDHCPv4::getAllGlobalParameters4(const BackendSelector& backend_selector, + const ServerSelector& server_selector) const { + std::map parameters; + getAllPropertiesConst > + (&ConfigBackendDHCPv4::getAllGlobalParameters4, backend_selector, + server_selector, parameters); + return (parameters); +} + +void +ConfigBackendPoolDHCPv4::createUpdateSubnet4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const Subnet4Ptr& subnet) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::createUpdateSubnet4, backend_selector, + server_selector, subnet); +} + +void +ConfigBackendPoolDHCPv4::createUpdateSharedNetwork4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const SharedNetwork4Ptr& shared_network) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::createUpdateSharedNetwork4, backend_selector, + server_selector, shared_network); +} + +void +ConfigBackendPoolDHCPv4::createUpdateOptionDef4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const OptionDefinitionPtr& option_def) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::createUpdateOptionDef4, backend_selector, + server_selector, option_def); +} + +void +ConfigBackendPoolDHCPv4::createUpdateOption4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const OptionPtr& option) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::createUpdateOption4, backend_selector, + server_selector, option); +} + +void +ConfigBackendPoolDHCPv4::createUpdateOption4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const SubnetID& subnet_id, + const OptionPtr& option) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::createUpdateOption4, backend_selector, + server_selector, subnet_id, option); +} + +void +ConfigBackendPoolDHCPv4::createUpdateOption4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const IOAddress& pool_start_address, + const IOAddress& pool_end_address, + const OptionPtr& option) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::createUpdateOption4, backend_selector, + server_selector, pool_start_address, pool_end_address, option); +} + +void +ConfigBackendPoolDHCPv4::createUpdateGlobalParameter4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const std::string& name, + const std::string& value) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::createUpdateGlobalParameter4, backend_selector, + server_selector, name, value); +} + +void +ConfigBackendPoolDHCPv4::createUpdateGlobalParameter4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const std::string& name, + const int64_t value) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::createUpdateGlobalParameter4, backend_selector, + server_selector, name, value); +} + +void +ConfigBackendPoolDHCPv4::deleteSubnet4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const std::string& subnet_prefix) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::deleteSubnet4, backend_selector, server_selector, + subnet_prefix); +} + +void +ConfigBackendPoolDHCPv4::deleteSubnet4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const SubnetID& subnet_id) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::deleteSubnet4, backend_selector, server_selector, + subnet_id); +} + +void +ConfigBackendPoolDHCPv4::deleteAllSubnets4(const BackendSelector& backend_selector, + const ServerSelector& server_selector) { + createUpdateDeleteProperty<> + (&ConfigBackendDHCPv4::deleteAllSubnets4, backend_selector, server_selector); +} + +void +ConfigBackendPoolDHCPv4::deleteSharedNetwork4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const std::string& name) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::deleteSharedNetwork4, backend_selector, + server_selector, name); +} + +void +ConfigBackendPoolDHCPv4::deleteAllSharedNetworks4(const BackendSelector& backend_selector, + const ServerSelector& server_selector) { + createUpdateDeleteProperty<> + (&ConfigBackendDHCPv4::deleteAllSharedNetworks4, backend_selector, server_selector); +} + +void +ConfigBackendPoolDHCPv4::deleteOptionDef4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const uint16_t code, + const std::string& space) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::deleteOptionDef4, backend_selector, + server_selector, code, space); +} + +void +ConfigBackendPoolDHCPv4::deleteAllOptionDefs4(const BackendSelector& backend_selector, + const ServerSelector& server_selector) { + createUpdateDeleteProperty<> + (&ConfigBackendDHCPv4::deleteAllOptionDefs4, backend_selector, server_selector); +} + +void +ConfigBackendPoolDHCPv4::deleteOption4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const uint16_t code, + const std::string& space) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::deleteOption4, backend_selector, server_selector, + code, space); +} + +void +ConfigBackendPoolDHCPv4::deleteOption4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const SubnetID& subnet_id, + const uint16_t code, + const std::string& space) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::deleteOption4, backend_selector, server_selector, + subnet_id, code, space); +} + +void +ConfigBackendPoolDHCPv4::deleteOption4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const asiolink::IOAddress& pool_start_address, + const asiolink::IOAddress& pool_end_address, + const uint16_t code, + const std::string& space) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::deleteOption4, backend_selector, server_selector, + pool_start_address, pool_end_address, code, space); +} + +void +ConfigBackendPoolDHCPv4::deleteGlobalParameter4(const BackendSelector& backend_selector, + const ServerSelector& server_selector, + const std::string& name) { + createUpdateDeleteProperty + (&ConfigBackendDHCPv4::deleteGlobalParameter4, backend_selector, + server_selector, name); +} + +void +ConfigBackendPoolDHCPv4::deleteAllGlobalParameters4(const BackendSelector& backend_selector, + const ServerSelector& server_selector) { + createUpdateDeleteProperty<> + (&ConfigBackendDHCPv4::deleteAllGlobalParameters4, backend_selector, + server_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 new file mode 100644 index 0000000000..75e962a278 --- /dev/null +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp4.h @@ -0,0 +1,389 @@ +// Copyright (C) 2018 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 +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef CONFIG_BACKEND_POOL_DHCP4_H +#define CONFIG_BACKEND_POOL_DHCP4_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace isc { +namespace dhcp { + +/// @brief Implementation of the Configuration Backend Pool for DHCPv4. +class ConfigBackendPoolDHCPv4 : cb::BaseConfigBackendPool { +public: + + /// @brief Retrieves a single subnet by subnet_prefix. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param subnet_prefix Prefix of the subnet to be retrieved. + /// @return Pointer to the retrieved subnet or NULL if not found. + virtual Subnet4Ptr + getSubnet4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const std::string& subnet_prefix) const; + + /// @brief Retrieves a single subnet by subnet identifier. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param subnet_id Identifier of a subnet to be retrieved. + /// @return Pointer to the retrieved subnet or NULL if not found. + virtual Subnet4Ptr + getSubnet4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const SubnetID& subnet_id) const; + + /// @brief Retrieves all subnets. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @return Collection of subnets or empty collection if no subnet found. + virtual Subnet4Collection + getAllSubnets4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector) const; + + /// @brief Retrieves subnets modified after specified time. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param modification_time Lower bound subnet modification time. + /// @return Collection of subnets or empty collection if no subnet found. + virtual Subnet4Collection + getModifiedSubnets4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const boost::posix_time::ptime& modification_time) const; + + /// @brief Retrieves shared network by name. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param name Name of the shared network to be retrieved. + /// @return Pointer to the shared network or NULL if not found. + virtual SharedNetwork4Ptr + getSharedNetwork4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const std::string& name) const; + + /// @brief Retrieves all shared networks. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @return Collection of shared network or empty collection if + /// no shared network found. + virtual SharedNetwork4Collection + getAllSharedNetworks4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector) const; + + /// @brief Retrieves shared networks modified after specified time. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param Lower bound shared network modification time. + /// @return Collection of shared network or empty collection if + /// no shared network found. + virtual SharedNetwork4Collection + getModifiedSharedNetworks4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const boost::posix_time::ptime& modification_time) const; + + /// @brief Retrieves single option definition by code and space. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param code Code of the option to be retrieved. + /// @param space Option space of the option to be retrieved. + /// @return Pointer to the option definition or NULL if not found. + virtual OptionDefinitionPtr + getOptionDef4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const uint16_t code, + const std::string& space) const; + + /// @brief Retrieves all option definitions. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @return Collection of option definitions or empty collection if + /// no option definition found. + virtual OptionDefContainer + getAllOptionDefs4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector) const; + + /// @brief Retrieves option definitions modified after specified time. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param modification_time Lower bound option definition modification + /// time. + /// @return Collection of option definitions or empty collection if + /// no option definition found. + virtual OptionDefContainer + getModifiedOptionDefs4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const boost::posix_time::ptime& modification_time) const; + + /// @brief Retrieves global string parameter value. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param name Name of the global parameter to be retrieved. + /// @return Value of the global string parameter. + virtual util::OptionalValue + getGlobalStringParameter4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const std::string& name) const; + + /// @brief Retrieves global number parameter. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param name Name of the parameter to be retrieved. + virtual util::OptionalValue + getGlobalNumberParameter4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const std::string& name) const; + + /// @brief Retrieves all global parameters as strings. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + virtual std::map + getAllGlobalParameters4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector) const; + + /// @brief Creates or updates a subnet. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param subnet Subnet to be added or updated. + virtual void + createUpdateSubnet4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const Subnet4Ptr& subnet); + + /// @brief Creates or updates a shared network. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param shared_network Shared network to be added or updated. + virtual void + createUpdateSharedNetwork4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const SharedNetwork4Ptr& shared_network); + + /// @brief Creates or updates an option definition. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param option_def Option definition to be added or updated. + virtual void + createUpdateOptionDef4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const OptionDefinitionPtr& option_def); + + /// @brief Creates or updates global option. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param option Option to be added or updated. + virtual void + createUpdateOption4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const OptionPtr& option); + + /// @brief Creates or updates subnet level option. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param subnet_id Identifier of a subnet to which option belongs. + virtual void + createUpdateOption4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const SubnetID& subnet_id, const OptionPtr& option); + + /// @brief Creates or updates pool level option. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param pool_start_address Lower bound address of the pool to which + /// the option belongs. + /// @param pool_end_address Upper bound address of the pool to which the + /// option belongs. + virtual void + createUpdateOption4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const asiolink::IOAddress& pool_start_address, + const asiolink::IOAddress& pool_end_address, + const OptionPtr& option); + + /// @brief Creates or updates global string parameter. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param name Name of the global parameter. + /// @param value Value of the global parameter. + virtual void + createUpdateGlobalParameter4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const std::string& name, + const std::string& value); + + /// @brief Creates or updates global number parameter. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param name Name of the global parameter. + /// @param value Value of the global parameter. + virtual void + createUpdateGlobalParameter4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const std::string& name, + const int64_t value); + + /// @brief Deletes subnet by prefix. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param subnet_prefix Prefix of the subnet to be deleted. + virtual void + deleteSubnet4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const std::string& subnet_prefix); + + /// @brief Deletes subnet by identifier. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param subnet_id Identifier of the subnet to be deleted. + virtual void + deleteSubnet4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const SubnetID& subnet_id); + + /// @brief Deletes all subnets. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + virtual void + deleteAllSubnets4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector); + + /// @brief Deletes shared network by name. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param name Name of the shared network to be deleted. + virtual void + deleteSharedNetwork4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const std::string& name); + + /// @brief Deletes all shared networks. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + virtual void + deleteAllSharedNetworks4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector); + + /// @brief Deletes option definition. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param code Code of the option to be deleted. + /// @param space Option space of the option to be deleted. + virtual void + deleteOptionDef4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const uint16_t code, + const std::string& space); + + /// @brief Deletes all option definitions. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + virtual void + deleteAllOptionDefs4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector); + + /// @brief Deletes global option. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param code Code of the option to be deleted. + /// @param space Option space of the option to be deleted. + virtual void + deleteOption4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const uint16_t code, + const std::string& space); + + /// @brief Deletes subnet level option. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param subnet_id Identifier of the subnet to which deleted option + /// belongs. + /// @param code Code of the deleted option. + /// @param space Option space of the deleted option. + virtual void + deleteOption4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const SubnetID& subnet_id, + const uint16_t code, const std::string& space); + + /// @brief Deletes pool level option. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param pool_start_address Lower bound address of the pool to which + /// deleted option belongs. + /// @param pool_end_start Upper bound address of the pool to which the + /// deleted option belongs. + virtual void + deleteOption4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const asiolink::IOAddress& pool_start_address, + const asiolink::IOAddress& pool_end_address, + const uint16_t code, + const std::string& space); + + /// @brief Deletes global parameter. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + /// @param name Name of the global parameter to be deleted. + virtual void + deleteGlobalParameter4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector, + const std::string& name); + + /// @brief Deletes all global parameters. + /// + /// @param backend_selector Backend selector. + /// @param server_selector Server selector. + virtual void + deleteAllGlobalParameters4(const db::BackendSelector& backend_selector, + const db::ServerSelector& server_selector); +}; + + +} // end of namespace isc::dhcp +} // end of namespace isc + +#endif // CONFIG_BACKEND_POOL_DHCP4_H