Commit 0be1868f authored by Thomas Markwalder's avatar Thomas Markwalder

[#101, !73] Addresses review comments

parent 210105df
...@@ -11,6 +11,11 @@ This message is printed when DHCPv4 server enabled an interface to be used ...@@ -11,6 +11,11 @@ This message is printed when DHCPv4 server enabled an interface to be used
to receive DHCPv4 traffic. IPv4 socket on this interface will be opened once to receive DHCPv4 traffic. IPv4 socket on this interface will be opened once
Interface Manager starts up procedure of opening sockets. Interface Manager starts up procedure of opening sockets.
% DHCP4_ADDING_CONFIG_DB Opening configuration database: %1
This message is printed when the DHCPv4 server is attempting to open a
configuration database. The database access string with password redacted
is logged.
% DHCP4_ALREADY_RUNNING %1 already running? %2 % DHCP4_ALREADY_RUNNING %1 already running? %2
This is an error message that occurs when the DHCPv4 server encounters This is an error message that occurs when the DHCPv4 server encounters
a pre-existing PID file which contains the PID of a running process. a pre-existing PID file which contains the PID of a running process.
......
...@@ -52,6 +52,7 @@ using namespace isc::data; ...@@ -52,6 +52,7 @@ using namespace isc::data;
using namespace isc::asiolink; using namespace isc::asiolink;
using namespace isc::hooks; using namespace isc::hooks;
using namespace isc::process; using namespace isc::process;
using namespace isc::config;
namespace { namespace {
...@@ -284,7 +285,7 @@ isc::data::ConstElementPtr ...@@ -284,7 +285,7 @@ isc::data::ConstElementPtr
configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set, configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set,
bool check_only) { bool check_only) {
if (!config_set) { if (!config_set) {
ConstElementPtr answer = isc::config::createAnswer(1, ConstElementPtr answer = isc::config::createAnswer(CONTROL_RESULT_ERROR,
string("Can't parse NULL config")); string("Can't parse NULL config"));
return (answer); return (answer);
} }
...@@ -547,7 +548,7 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set, ...@@ -547,7 +548,7 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set,
} catch (const isc::Exception& ex) { } catch (const isc::Exception& ex) {
LOG_ERROR(dhcp4_logger, DHCP4_PARSER_FAIL) LOG_ERROR(dhcp4_logger, DHCP4_PARSER_FAIL)
.arg(config_pair.first).arg(ex.what()); .arg(config_pair.first).arg(ex.what());
answer = isc::config::createAnswer(1, ex.what()); answer = isc::config::createAnswer(CONTROL_RESULT_ERROR, ex.what());
// An error occurred, so make sure that we restore original data. // An error occurred, so make sure that we restore original data.
rollback = true; rollback = true;
...@@ -555,7 +556,7 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set, ...@@ -555,7 +556,7 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set,
} catch (...) { } catch (...) {
// For things like bad_cast in boost::lexical_cast // For things like bad_cast in boost::lexical_cast
LOG_ERROR(dhcp4_logger, DHCP4_PARSER_EXCEPTION).arg(config_pair.first); LOG_ERROR(dhcp4_logger, DHCP4_PARSER_EXCEPTION).arg(config_pair.first);
answer = isc::config::createAnswer(1, "undefined configuration" answer = isc::config::createAnswer(CONTROL_RESULT_ERROR, "undefined configuration"
" processing error"); " processing error");
// An error occurred, so make sure that we restore original data. // An error occurred, so make sure that we restore original data.
...@@ -565,7 +566,7 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set, ...@@ -565,7 +566,7 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set,
if (check_only) { if (check_only) {
rollback = true; rollback = true;
if (!answer) { if (!answer) {
answer = isc::config::createAnswer(0, answer = isc::config::createAnswer(CONTROL_RESULT_SUCCESS,
"Configuration seems sane. Control-socket, hook-libraries, and D2 " "Configuration seems sane. Control-socket, hook-libraries, and D2 "
"configuration were sanity checked, but not applied."); "configuration were sanity checked, but not applied.");
} }
...@@ -600,12 +601,12 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set, ...@@ -600,12 +601,12 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set,
} }
catch (const isc::Exception& ex) { catch (const isc::Exception& ex) {
LOG_ERROR(dhcp4_logger, DHCP4_PARSER_COMMIT_FAIL).arg(ex.what()); LOG_ERROR(dhcp4_logger, DHCP4_PARSER_COMMIT_FAIL).arg(ex.what());
answer = isc::config::createAnswer(2, ex.what()); answer = isc::config::createAnswer(CONTROL_RESULT_ERROR, ex.what());
rollback = true; rollback = true;
} catch (...) { } catch (...) {
// For things like bad_cast in boost::lexical_cast // For things like bad_cast in boost::lexical_cast
LOG_ERROR(dhcp4_logger, DHCP4_PARSER_COMMIT_EXCEPTION); LOG_ERROR(dhcp4_logger, DHCP4_PARSER_COMMIT_EXCEPTION);
answer = isc::config::createAnswer(2, "undefined configuration" answer = isc::config::createAnswer(CONTROL_RESULT_ERROR, "undefined configuration"
" parsing error"); " parsing error");
rollback = true; rollback = true;
} }
...@@ -625,7 +626,7 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set, ...@@ -625,7 +626,7 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set,
getConfigSummary(SrvConfig::CFGSEL_ALL4)); getConfigSummary(SrvConfig::CFGSEL_ALL4));
// Everything was fine. Configuration is successful. // Everything was fine. Configuration is successful.
answer = isc::config::createAnswer(0, "Configuration successful."); answer = isc::config::createAnswer(CONTROL_RESULT_SUCCESS, "Configuration successful.");
return (answer); return (answer);
} }
...@@ -635,23 +636,25 @@ bool databaseConfigConnect(const SrvConfigPtr& srv_cfg) { ...@@ -635,23 +636,25 @@ bool databaseConfigConnect(const SrvConfigPtr& srv_cfg) {
ConfigBackendDHCPv4Mgr& mgr = ConfigBackendDHCPv4Mgr::instance(); ConfigBackendDHCPv4Mgr& mgr = ConfigBackendDHCPv4Mgr::instance();
mgr.delAllBackends(); mgr.delAllBackends();
// SrvConfigPtr staging_cfg = CfgMgr::instance().getStagingCfg(); // Fetch the config-control info.
ConstConfigControlInfoPtr config_ctl = srv_cfg->getConfigControlInfo(); ConstConfigControlInfoPtr config_ctl = srv_cfg->getConfigControlInfo();
if (!config_ctl || config_ctl->getConfigDatabases().empty()) { if (!config_ctl || config_ctl->getConfigDatabases().empty()) {
// No config dbs, nothing to do. // No config dbs, nothing to do.
return (false); return (false);
} }
// First step is to create all of the backends. // Iterate over the configured DBs and instantiate them.
for (auto db : config_ctl->getConfigDatabases()) { for (auto db : config_ctl->getConfigDatabases()) {
// Good place for a log message? LOG_INFO(dhcp4_logger, DHCP4_ADDING_CONFIG_DB)
mgr.addBackend(db.getAccessString()); .arg(db.redactedAccessString());
mgr.addBackend(db.getAccessString());
} }
// Let the caller know we have opened DBs.
return (true); return (true);
} }
void databaseConfigFetch(const SrvConfigPtr& srv_cfg, ElementPtr /*global_scope*/) { void databaseConfigFetch(const SrvConfigPtr& srv_cfg, ElementPtr /* mutable_cfg */) {
// Close any existing CB databasess, then open all in srv_cfg (if any) // Close any existing CB databasess, then open all in srv_cfg (if any)
if (!databaseConfigConnect(srv_cfg)) { if (!databaseConfigConnect(srv_cfg)) {
...@@ -664,10 +667,10 @@ void databaseConfigFetch(const SrvConfigPtr& srv_cfg, ElementPtr /*global_scope* ...@@ -664,10 +667,10 @@ void databaseConfigFetch(const SrvConfigPtr& srv_cfg, ElementPtr /*global_scope*
// Next we have to fetch the pieces we care about it and merge them // Next we have to fetch the pieces we care about it and merge them
// probably in this order? // probably in this order?
// globals // globals
// shared networks
// subnets
// option defs // option defs
// options // options
// shared networks
// subnets
} }
......
...@@ -59,33 +59,34 @@ configureDhcp4Server(Dhcpv4Srv&, ...@@ -59,33 +59,34 @@ configureDhcp4Server(Dhcpv4Srv&,
isc::data::ConstElementPtr config_set, isc::data::ConstElementPtr config_set,
bool check_only = false); bool check_only = false);
/// @brief Attempts to the configured CB databases (if any) /// @brief Attempts to connect to configured CB databases
/// ///
/// This function will close all the existing CB backends. It /// First, this function will close all existing CB backends. It
/// then attempt to connect to all of the CB databases in the /// will then attempt to connect to all of the CB backends defined
/// given SrvConfig (if any). /// in the given SrvConfig (if any).
/// ///
/// It will return true if there are configured CB databases /// It will return true if there are configured CB databases,
/// false, otherwise. Any errors encountered along the way /// and false otherwise. Any errors encountered along the way
/// should generate throws. /// should generate throws.
/// ///
/// @param srv_cfg Server configuration from which to get /// @param srv_cfg Server configuration from which to get
/// the config-control information to use. /// the config-control information to use.
/// ///
/// @return True if are configured CB databases, false if not. /// @return True if there are configured CB databases, false if not.
bool bool
databaseConfigConnect(const SrvConfigPtr& srv_cfg); databaseConfigConnect(const SrvConfigPtr& srv_cfg);
/// @brief Fetch configuration from CB databases and merge it into the given configuration /// @brief Fetch configuration from CB databases and merge it into the given configuration
/// ///
/// It will call @c databaseConfigConnect passing in the given server configuration. If /// It will call @c databaseConfigConnect, passing in the given server configuration. If
/// results in open CB databases it will proceed to fetch configuration components from /// that call results in open CB databases, the function will then proceed to fetch
/// those databases and merge them into the given server configuration. /// configuration components from said databases and merge them into the given server
/// configuration.
/// ///
/// @param srv_config Server configuration to merge into /// @param srv_cfg Server configuration into which database configuration should be merged
/// @param global_scope global configuration as elements /// @param mutable_cfg parsed configuration from the configuration file plus default values
void void
databaseConfigFetch(const SrvConfigPtr& srv_cfg, isc::data::ElementPtr /*global_scope*/); databaseConfigFetch(const SrvConfigPtr& srv_cfg, isc::data::ElementPtr /*mutable_scope*/);
}; // end of isc::dhcp namespace }; // end of isc::dhcp namespace
}; // end of isc namespace }; // end of isc namespace
......
...@@ -6265,7 +6265,7 @@ TEST_F(Dhcp4ParserTest, configControlInfoNoFactory) { ...@@ -6265,7 +6265,7 @@ TEST_F(Dhcp4ParserTest, configControlInfoNoFactory) {
extractConfig(config); extractConfig(config);
// Should fail because "type=mysql" has no factories. // Should fail because "type=mysql" has no factories.
configure(config, CONTROL_RESULT_COMMAND_UNSUPPORTED, configure(config, CONTROL_RESULT_ERROR,
"The type of the configuration backend: 'mysql' is not supported"); "The type of the configuration backend: 'mysql' is not supported");
} }
...@@ -6275,7 +6275,7 @@ TEST_F(Dhcp4ParserTest, configControlInfo) { ...@@ -6275,7 +6275,7 @@ TEST_F(Dhcp4ParserTest, configControlInfo) {
extractConfig(config); extractConfig(config);
// Should be able to register a backend factory for "mysql". // Should be able to register a backend factory for "mysql".
ASSERT_TRUE(TestConfigBackendDHCPv4Impl:: ASSERT_TRUE(TestConfigBackendDHCPv4::
registerBackendType(ConfigBackendDHCPv4Mgr::instance(), registerBackendType(ConfigBackendDHCPv4Mgr::instance(),
"mysql")); "mysql"));
......
...@@ -19,6 +19,7 @@ libdhcpsrvtest_la_SOURCES += memory_host_data_source.cc memory_host_data_source. ...@@ -19,6 +19,7 @@ libdhcpsrvtest_la_SOURCES += memory_host_data_source.cc memory_host_data_source.
libdhcpsrvtest_la_SOURCES += generic_backend_unittest.cc generic_backend_unittest.h libdhcpsrvtest_la_SOURCES += generic_backend_unittest.cc generic_backend_unittest.h
libdhcpsrvtest_la_SOURCES += generic_host_data_source_unittest.cc generic_host_data_source_unittest.h libdhcpsrvtest_la_SOURCES += generic_host_data_source_unittest.cc generic_host_data_source_unittest.h
libdhcpsrvtest_la_SOURCES += lease_file_io.cc lease_file_io.h libdhcpsrvtest_la_SOURCES += lease_file_io.cc lease_file_io.h
libdhcpsrvtest_la_SOURCES += test_config_backend.h
libdhcpsrvtest_la_SOURCES += test_config_backend_dhcp4.cc test_config_backend_dhcp4.h libdhcpsrvtest_la_SOURCES += test_config_backend_dhcp4.cc test_config_backend_dhcp4.h
libdhcpsrvtest_la_CXXFLAGS = $(AM_CXXFLAGS) libdhcpsrvtest_la_CXXFLAGS = $(AM_CXXFLAGS)
......
// 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 TEST_CONFIG_BACKEND_H
#define TEST_CONFIG_BACKEND_H
#include <config.h>
#include <database/database_connection.h>
#include <dhcpsrv/config_backend_dhcp4_mgr.h>
#include <boost/shared_ptr.hpp>
#include <boost/lexical_cast.hpp>
namespace isc {
namespace dhcp {
namespace test {
/// @brief Base class for implementing fake backends
template<typename ConfigBackendType>
class TestConfigBackend : public ConfigBackendType {
public:
/// @brief Constructor
///
/// @param params database connection parameters
/// @throw BadValue if parameters do not include "type"
TestConfigBackend(const db::DatabaseConnection::ParameterMap& params)
: connection_(params) {
try {
db_type_ = connection_.getParameter("type");
} catch (...) {
isc_throw(BadValue, "Backend parameters must include \"type\"");
}
try {
db_type_ = connection_.getParameter("host");
} catch (...) {
host_ = "default_host";
}
try {
port_ = boost::lexical_cast<uint16_t>(connection_.getParameter("host"));
} catch (...) {
port_ = 0;
}
}
/// @brief virtual Destructor.
virtual ~TestConfigBackend(){};
/// @brief Returns backend type.
///
/// @return string db_type name
virtual std::string getType() const { return (db_type_);
}
/// @brief Returns backend host.
///
/// @return string host
virtual std::string getHost() const {
return (host_);
}
/// @brief Returns backend port.
///
/// @return uint16_t port
virtual uint16_t getPort() const {
return (port_);
}
/// @brief Fake database connection
db::DatabaseConnection connection_;
/// @brief Back end type
std::string db_type_;
/// @brief Back end host
std::string host_;
/// @brief Back end port
uint16_t port_;
};
} // namespace test
} // namespace dhcp
} // namespace isc
#endif // TEST_CONFIG_BACKEND_H
...@@ -14,240 +14,240 @@ namespace dhcp { ...@@ -14,240 +14,240 @@ namespace dhcp {
namespace test { namespace test {
bool bool
TestConfigBackendDHCPv4Impl::registerBackendType(ConfigBackendDHCPv4Mgr& mgr, TestConfigBackendDHCPv4::registerBackendType(ConfigBackendDHCPv4Mgr& mgr,
const std::string& db_type) { const std::string& db_type) {
return(mgr.registerBackendFactory(db_type, return(mgr.registerBackendFactory(db_type,
[](const db::DatabaseConnection::ParameterMap& params) [](const db::DatabaseConnection::ParameterMap& params)
-> dhcp::ConfigBackendDHCPv4Ptr { -> dhcp::ConfigBackendDHCPv4Ptr {
return (TestConfigBackendDHCPv4ImplPtr(new TestConfigBackendDHCPv4Impl(params))); return (TestConfigBackendDHCPv4Ptr(new TestConfigBackendDHCPv4(params)));
}) })
); );
} }
void void
TestConfigBackendDHCPv4Impl::unregisterBackendType(ConfigBackendDHCPv4Mgr& mgr, TestConfigBackendDHCPv4::unregisterBackendType(ConfigBackendDHCPv4Mgr& mgr,
const std::string& db_type) { const std::string& db_type) {
mgr.unregisterBackendFactory(db_type); mgr.unregisterBackendFactory(db_type);
} }
Subnet4Ptr Subnet4Ptr
TestConfigBackendDHCPv4Impl::getSubnet4(const db::ServerSelector& /* server_selector */, TestConfigBackendDHCPv4::getSubnet4(const db::ServerSelector& /* server_selector */,
const std::string& /* subnet_prefix */) const{ const std::string& /* subnet_prefix */) const{
return (Subnet4Ptr()); return (Subnet4Ptr());
} }
Subnet4Ptr Subnet4Ptr
TestConfigBackendDHCPv4Impl::getSubnet4(const db::ServerSelector& /* server_selector */, TestConfigBackendDHCPv4::getSubnet4(const db::ServerSelector& /* server_selector */,
const SubnetID& /* subnet_id */) const { const SubnetID& /* subnet_id */) const {
return (Subnet4Ptr()); return (Subnet4Ptr());
} }
Subnet4Collection Subnet4Collection
TestConfigBackendDHCPv4Impl::getAllSubnets4(const db::ServerSelector& /* server_selector */) const { TestConfigBackendDHCPv4::getAllSubnets4(const db::ServerSelector& /* server_selector */) const {
return(subnets_); return(subnets_);
} }
Subnet4Collection Subnet4Collection
TestConfigBackendDHCPv4Impl::getModifiedSubnets4(const db::ServerSelector& /* server_selector */, TestConfigBackendDHCPv4::getModifiedSubnets4(const db::ServerSelector& /* server_selector */,
const boost::posix_time::ptime& /* modification_time */) const { const boost::posix_time::ptime& /* modification_time */) const {
return(subnets_); return(subnets_);
} }
SharedNetwork4Ptr SharedNetwork4Ptr
TestConfigBackendDHCPv4Impl::getSharedNetwork4(const db::ServerSelector& /* server_selector */, TestConfigBackendDHCPv4::getSharedNetwork4(const db::ServerSelector& /* server_selector */,
const std::string& /* name */) const { const std::string& /* name */) const {
return(SharedNetwork4Ptr()); return(SharedNetwork4Ptr());
} }
SharedNetwork4Collection SharedNetwork4Collection
TestConfigBackendDHCPv4Impl::getAllSharedNetworks4(const db::ServerSelector& /* server_selector */) const{ TestConfigBackendDHCPv4::getAllSharedNetworks4(const db::ServerSelector& /* server_selector */) const{
return(shared_networks_); return(shared_networks_);
} }
SharedNetwork4Collection SharedNetwork4Collection
TestConfigBackendDHCPv4Impl::getModifiedSharedNetworks4(const db::ServerSelector& /* server_selector */, TestConfigBackendDHCPv4::getModifiedSharedNetworks4(const db::ServerSelector& /* server_selector */,
const boost::posix_time::ptime& /* modification_time */) const { const boost::posix_time::ptime& /* modification_time */) const {
return(shared_networks_); return(shared_networks_);
} }
OptionDefinitionPtr OptionDefinitionPtr
TestConfigBackendDHCPv4Impl::getOptionDef4(const db::ServerSelector& /* server_selector */, TestConfigBackendDHCPv4::getOptionDef4(const db::ServerSelector& /* server_selector */,
const uint16_t /* code */, const uint16_t /* code */,
const std::string& /* space */) const { const std::string& /* space */) const {
return (OptionDefinitionPtr()); return (OptionDefinitionPtr());
} }
OptionDefContainer OptionDefContainer
TestConfigBackendDHCPv4Impl::getAllOptionDefs4(const db::ServerSelector& /* server_selector */) const { TestConfigBackendDHCPv4::getAllOptionDefs4(const db::ServerSelector& /* server_selector */) const {
return (option_defs_); return (option_defs_);
} }
OptionDefContainer OptionDefContainer
TestConfigBackendDHCPv4Impl::getModifiedOptionDefs4(const db::ServerSelector& /* server_selector */, TestConfigBackendDHCPv4::getModifiedOptionDefs4(const db::ServerSelector& /* server_selector */,
const boost::posix_time::ptime& /* modification_time */) const { const boost::posix_time::ptime& /* modification_time */) const {
return (option_defs_); return (option_defs_);
} }
OptionDescriptorPtr OptionDescriptorPtr
TestConfigBackendDHCPv4Impl::getOption4(const db::ServerSelector& /* server_selector */, TestConfigBackendDHCPv4::getOption4(const db::ServerSelector& /* server_selector */,
const uint16_t /* code */, const uint16_t /* code */,
const std::string& /* space */) const { const std::string& /* space */) const {
return (OptionDescriptorPtr()); return (OptionDescriptorPtr());
} }
OptionContainer OptionContainer
TestConfigBackendDHCPv4Impl::getAllOptions4(const db::ServerSelector& /* server_selector */) const { TestConfigBackendDHCPv4::getAllOptions4(const db::ServerSelector& /* server_selector */) const {
return (options_); return (options_);
} }
OptionContainer OptionContainer
TestConfigBackendDHCPv4Impl::getModifiedOptions4(const db::ServerSelector& /* selector */, TestConfigBackendDHCPv4::getModifiedOptions4(const db::ServerSelector& /* server_selector */,
const boost::posix_time::ptime& /* modification_time */) const { const boost::posix_time::ptime& /* modification_time */) const {
return (options_); return (options_);
} }
data::StampedValuePtr data::StampedValuePtr
TestConfigBackendDHCPv4Impl::getGlobalParameter4(const db::ServerSelector& /* selector */, TestConfigBackendDHCPv4::getGlobalParameter4(const db::ServerSelector& /* server_selector */,
const std::string& /* name */) const { const std::string& /* name */) const {
return(data::StampedValuePtr()); return(data::StampedValuePtr());
} }
data::StampedValueCollection data::StampedValueCollection
TestConfigBackendDHCPv4Impl::getAllGlobalParameters4(const db::ServerSelector& /* selector */) const { TestConfigBackendDHCPv4::getAllGlobalParameters4(const db::ServerSelector& /* server_selector */) const {
return (globals_); return (globals_);
} }
data::StampedValueCollection data::StampedValueCollection
TestConfigBackendDHCPv4Impl::getModifiedGlobalParameters4(const db::ServerSelector& /* selector */, TestConfigBackendDHCPv4::getModifiedGlobalParameters4(const db::ServerSelector& /* server_selector */,
const boost::posix_time::ptime& /* modification_time */) const { const boost::posix_time::ptime& /* modification_time */) const {
return (globals_); return (globals_);
} }
void void
TestConfigBackendDHCPv4Impl::createUpdateSubnet4(const db::ServerSelector& /* server_selector */, TestConfigBackendDHCPv4::createUpdateSubnet4(const db::ServerSelector& /* server_selector */,
const Subnet4Ptr& /* subnet */) { const Subnet4Ptr& /* subnet */) {
} }
void void
TestConfigBackendDHCPv4Impl::createUpdateSharedNetwork4(const db::ServerSelector& /* server_selector */, TestConfigBackendDHCPv4::createUpdateSharedNetwork4(const db::ServerSelector& /* server_selector */,
const SharedNetwork4Ptr& /* shared_network */) { const SharedNetwork4Ptr& /* shared_network */) {
} }
void void
TestConfigBackendDHCPv4Impl::createUpdateOptionDef4(const db::ServerSelector& /* server_selector */, TestConfigBackendDHCPv4::createUpdateOptionDef4(const db::ServerSelector& /* server_selector */,
const OptionDefinitionPtr& /* option_def */) { const OptionDefinitionPtr& /* option_def */) {
} }
void void
TestConfigBackendDHCPv4Impl::createUpdateOption4(const db::ServerSelector& /* server_selector */, TestConfigBackendDHCPv4::createUpdateOption4(const db::ServerSelector& /* server_selector */,
const OptionDescriptorPtr& /* option */) { const OptionDescriptorPtr& /* option */) {
} }
void void
TestConfigBackendDHCPv4Impl::createUpdateOption4(const db::ServerSelector& /* selector */, TestConfigBackendDHCPv4::createUpdateOption4(const db::ServerSelector& /* server_selector */,
const std::string& /* shared_network_name */, const std::string& /* shared_network_name */,
const OptionDescriptorPtr& /* option */) { const OptionDescriptorPtr& /* option */) {
} }
<