mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-09-03 23:45:27 +00:00
[#103,!277] Implemented the CBControlDHCPv4::databaseConfigApply.
This commit is contained in:
@@ -66,6 +66,7 @@ libkea_dhcpsrv_la_SOURCES += assignable_network.h
|
|||||||
libkea_dhcpsrv_la_SOURCES += base_host_data_source.h
|
libkea_dhcpsrv_la_SOURCES += base_host_data_source.h
|
||||||
libkea_dhcpsrv_la_SOURCES += cache_host_data_source.h
|
libkea_dhcpsrv_la_SOURCES += cache_host_data_source.h
|
||||||
libkea_dhcpsrv_la_SOURCES += callout_handle_store.h
|
libkea_dhcpsrv_la_SOURCES += callout_handle_store.h
|
||||||
|
libkea_dhcpsrv_la_SOURCES += cb_ctl_dhcp.h
|
||||||
libkea_dhcpsrv_la_SOURCES += cb_ctl_dhcp4.cc cb_ctl_dhcp4.h
|
libkea_dhcpsrv_la_SOURCES += cb_ctl_dhcp4.cc cb_ctl_dhcp4.h
|
||||||
libkea_dhcpsrv_la_SOURCES += cfg_4o6.cc cfg_4o6.h
|
libkea_dhcpsrv_la_SOURCES += cfg_4o6.cc cfg_4o6.h
|
||||||
libkea_dhcpsrv_la_SOURCES += cfg_consistency.cc cfg_consistency.h
|
libkea_dhcpsrv_la_SOURCES += cfg_consistency.cc cfg_consistency.h
|
||||||
@@ -283,6 +284,7 @@ libkea_dhcpsrv_include_HEADERS = \
|
|||||||
base_host_data_source.h \
|
base_host_data_source.h \
|
||||||
cache_host_data_source.h \
|
cache_host_data_source.h \
|
||||||
callout_handle_store.h \
|
callout_handle_store.h \
|
||||||
|
cb_ctl_dhcp.h \
|
||||||
cb_ctl_dhcp4.h \
|
cb_ctl_dhcp4.h \
|
||||||
cfg_4o6.h \
|
cfg_4o6.h \
|
||||||
cfg_consistency.h \
|
cfg_consistency.h \
|
||||||
|
63
src/lib/dhcpsrv/cb_ctl_dhcp.h
Normal file
63
src/lib/dhcpsrv/cb_ctl_dhcp.h
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
// Copyright (C) 2019 Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
#ifndef CB_CTL_DHCP_H
|
||||||
|
#define CB_CTL_DHCP_H
|
||||||
|
|
||||||
|
#include <cc/stamped_value.h>
|
||||||
|
#include <process/cb_ctl_base.h>
|
||||||
|
#include <dhcpsrv/srv_config.h>
|
||||||
|
|
||||||
|
namespace isc {
|
||||||
|
namespace dhcp {
|
||||||
|
|
||||||
|
/// @brief Base class for implementing mechanisms to control the use
|
||||||
|
/// of the Configuration Backends by DHCPv4 and DHCPv6 servers.
|
||||||
|
///
|
||||||
|
/// It includes common methods used by the DHCPv4 and DHCPv6 specific
|
||||||
|
/// derivations.
|
||||||
|
///
|
||||||
|
/// @tparam ConfigBackendMgrType Type of the Config Backend Manager used
|
||||||
|
/// by the server implementing this class. For example, for the DHCPv4
|
||||||
|
/// server it will be @c ConfigBackendDHCPv4Mgr.
|
||||||
|
template<typename ConfigBackendMgrType>
|
||||||
|
class CBControlDHCP : public process::CBControlBase<ConfigBackendMgrType> {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// @brief Constructor.
|
||||||
|
CBControlDHCP()
|
||||||
|
: process::CBControlBase<ConfigBackendMgrType>() {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/// @brief Adds globals fetched from config backend(s) to a SrvConfig instance
|
||||||
|
///
|
||||||
|
/// Iterates over the given collection of global parameters and adds them to the
|
||||||
|
/// given configuration's list of configured globals.
|
||||||
|
///
|
||||||
|
/// @param external_cfg SrvConfig instance to update
|
||||||
|
/// @param cb_globals collection of global parameters supplied by configuration
|
||||||
|
/// backend
|
||||||
|
void addGlobalsToConfig(SrvConfigPtr external_cfg,
|
||||||
|
data::StampedValueCollection& cb_globals) const {
|
||||||
|
const auto& index = cb_globals.get<data::StampedValueNameIndexTag>();
|
||||||
|
for (auto cb_global = index.begin(); cb_global != index.end(); ++cb_global) {
|
||||||
|
|
||||||
|
if ((*cb_global)->amNull()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
external_cfg->addConfiguredGlobal((*cb_global)->getName(),
|
||||||
|
(*cb_global)->getElementValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // end of namespace isc::dhcp
|
||||||
|
} // end of namespace isc
|
||||||
|
|
||||||
|
#endif // CB_CTL_DHCP_H
|
@@ -6,15 +6,81 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <dhcpsrv/cb_ctl_dhcp4.h>
|
#include <dhcpsrv/cb_ctl_dhcp4.h>
|
||||||
|
#include <dhcpsrv/cfgmgr.h>
|
||||||
|
#include <dhcpsrv/dhcpsrv_log.h>
|
||||||
|
|
||||||
|
using namespace isc::data;
|
||||||
using namespace isc::process;
|
using namespace isc::process;
|
||||||
|
|
||||||
namespace isc {
|
namespace isc {
|
||||||
namespace dhcp {
|
namespace dhcp {
|
||||||
|
|
||||||
CBControlDHCPv4::CBControlDHCPv4()
|
void
|
||||||
: CBControlBase<ConfigBackendDHCPv4Mgr>() {
|
CBControlDHCPv4::databaseConfigApply(const ConfigPtr& srv_cfg,
|
||||||
|
const db::BackendSelector& backend_selector,
|
||||||
|
const db::ServerSelector& server_selector,
|
||||||
|
const boost::posix_time::ptime& lb_modification_time,
|
||||||
|
const db::AuditEntryCollection& audit_entries) {
|
||||||
|
// Create the external config into which we'll fetch backend config data.
|
||||||
|
SrvConfigPtr external_cfg = CfgMgr::instance().createExternalCfg();
|
||||||
|
|
||||||
|
// First let's fetch the globals and add them to external config.
|
||||||
|
if (fetchConfigElement(audit_entries, "dhcp4_global_parameter")) {
|
||||||
|
data::StampedValueCollection globals;
|
||||||
|
globals = getMgr().getPool()->getModifiedGlobalParameters4(backend_selector, server_selector,
|
||||||
|
lb_modification_time);
|
||||||
|
addGlobalsToConfig(external_cfg, globals);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we fetch the option definitions and add them.
|
||||||
|
if (fetchConfigElement(audit_entries, "dhcp4_option_def")) {
|
||||||
|
OptionDefContainer option_defs =
|
||||||
|
getMgr().getPool()->getModifiedOptionDefs4(backend_selector, server_selector,
|
||||||
|
lb_modification_time);
|
||||||
|
for (auto option_def = option_defs.begin(); option_def != option_defs.end(); ++option_def) {
|
||||||
|
external_cfg->getCfgOptionDef()->add((*option_def), (*option_def)->getOptionSpaceName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next fetch the options. They are returned as a container of OptionDescriptors.
|
||||||
|
if (fetchConfigElement(audit_entries, "dhcp4_options")) {
|
||||||
|
OptionContainer options = getMgr().getPool()->getModifiedOptions4(backend_selector,
|
||||||
|
server_selector,
|
||||||
|
lb_modification_time);
|
||||||
|
for (auto option = options.begin(); option != options.end(); ++option) {
|
||||||
|
external_cfg->getCfgOption()->add((*option), (*option).space_name_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now fetch the shared networks.
|
||||||
|
if (fetchConfigElement(audit_entries, "dhcp4_shared_network")) {
|
||||||
|
SharedNetwork4Collection networks =
|
||||||
|
getMgr().getPool()->getModifiedSharedNetworks4(backend_selector, server_selector,
|
||||||
|
lb_modification_time);
|
||||||
|
for (auto network = networks.begin(); network != networks.end(); ++network) {
|
||||||
|
external_cfg->getCfgSharedNetworks4()->add((*network));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next we fetch subnets.
|
||||||
|
if (fetchConfigElement(audit_entries, "dhcp4_subnet")) {
|
||||||
|
Subnet4Collection subnets = getMgr().getPool()->getModifiedSubnets4(backend_selector,
|
||||||
|
server_selector,
|
||||||
|
lb_modification_time);
|
||||||
|
for (auto subnet = subnets.begin(); subnet != subnets.end(); ++subnet) {
|
||||||
|
external_cfg->getCfgSubnets4()->add((*subnet));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (audit_entries.empty()) {
|
||||||
|
CfgMgr::instance().mergeIntoStagingCfg(external_cfg->getSequence());
|
||||||
|
|
||||||
|
} else {
|
||||||
|
CfgMgr::instance().mergeIntoCurrentCfg(external_cfg->getSequence());
|
||||||
|
}
|
||||||
|
LOG_INFO(dhcpsrv_logger, DHCPSRV_CFGMGR_CONFIG4_MERGED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} // end of namespace isc::dhcp
|
} // end of namespace isc::dhcp
|
||||||
} // end of namespace isc
|
} // end of namespace isc
|
||||||
|
@@ -7,18 +7,48 @@
|
|||||||
#ifndef CB_CTL_DHCP4_H
|
#ifndef CB_CTL_DHCP4_H
|
||||||
#define CB_CTL_DHCP4_H
|
#define CB_CTL_DHCP4_H
|
||||||
|
|
||||||
#include <process/cb_ctl_base.h>
|
#include <dhcpsrv/cb_ctl_dhcp.h>
|
||||||
#include <dhcpsrv/config_backend_dhcp4_mgr.h>
|
#include <dhcpsrv/config_backend_dhcp4_mgr.h>
|
||||||
|
#include <dhcpsrv/srv_config.h>
|
||||||
|
|
||||||
namespace isc {
|
namespace isc {
|
||||||
namespace dhcp {
|
namespace dhcp {
|
||||||
|
|
||||||
class CBControlDHCPv4 : public process::CBControlBase<ConfigBackendDHCPv4Mgr> {
|
/// @brief Implementation of the mechanisms to control the use of
|
||||||
public:
|
/// the Configuration Backends by the DHCPv4 server.
|
||||||
|
///
|
||||||
|
/// It implements fetching and merging DHCPv4 server configuration from
|
||||||
|
/// the database into the staging or current configuration.
|
||||||
|
///
|
||||||
|
/// @tparam ConfigBackendMgrType Type of the Config Backend Manager used
|
||||||
|
/// by the server implementing this class. For example, for the DHCPv4
|
||||||
|
/// server it will be @c ConfigBackendDHCPv4Mgr.
|
||||||
|
class CBControlDHCPv4 : public CBControlDHCP<ConfigBackendDHCPv4Mgr> {
|
||||||
|
protected:
|
||||||
|
|
||||||
CBControlDHCPv4();
|
/// @brief Fetches the entire or partial configuration from the database.
|
||||||
|
///
|
||||||
|
/// This method is called by the starting up server to fetch and merge
|
||||||
|
/// the entire configuration from the database or to fetch configuration
|
||||||
|
/// updates periodically, e.g. as a result of triggering an interval
|
||||||
|
/// timer callback.
|
||||||
|
///
|
||||||
|
/// @param srv_cfg pointer to the staging configuration that should
|
||||||
|
/// hold the config backends list and other partial configuration read
|
||||||
|
/// from the file in case the method is called upon the server's start
|
||||||
|
/// up. It is a pointer to the current server configuration if the
|
||||||
|
/// method is called to fetch configuration updates.
|
||||||
|
/// @param fetch_updates_only boolean value indicating if the method is
|
||||||
|
/// called upon the server start up (false) or it is called to fetch
|
||||||
|
/// configuration updates (true).
|
||||||
|
virtual void databaseConfigApply(const process::ConfigPtr& srv_cfg,
|
||||||
|
const db::BackendSelector& backend_selector,
|
||||||
|
const db::ServerSelector& server_selector,
|
||||||
|
const boost::posix_time::ptime& lb_modification_time,
|
||||||
|
const db::AuditEntryCollection& audit_entries);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef boost::shared_ptr<CBControlDHCPv4> CBControlDHCPv4Ptr;
|
||||||
|
|
||||||
} // end of namespace isc::dhcp
|
} // end of namespace isc::dhcp
|
||||||
} // end of namespace isc
|
} // end of namespace isc
|
||||||
|
@@ -63,6 +63,7 @@ libdhcpsrv_unittests_SOURCES += alloc_engine_hooks_unittest.cc
|
|||||||
libdhcpsrv_unittests_SOURCES += alloc_engine4_unittest.cc
|
libdhcpsrv_unittests_SOURCES += alloc_engine4_unittest.cc
|
||||||
libdhcpsrv_unittests_SOURCES += alloc_engine6_unittest.cc
|
libdhcpsrv_unittests_SOURCES += alloc_engine6_unittest.cc
|
||||||
libdhcpsrv_unittests_SOURCES += callout_handle_store_unittest.cc
|
libdhcpsrv_unittests_SOURCES += callout_handle_store_unittest.cc
|
||||||
|
libdhcpsrv_unittests_SOURCES += cb_ctl_dhcp_unittest.cc
|
||||||
libdhcpsrv_unittests_SOURCES += cfg_db_access_unittest.cc
|
libdhcpsrv_unittests_SOURCES += cfg_db_access_unittest.cc
|
||||||
libdhcpsrv_unittests_SOURCES += cfg_duid_unittest.cc
|
libdhcpsrv_unittests_SOURCES += cfg_duid_unittest.cc
|
||||||
libdhcpsrv_unittests_SOURCES += cfg_expiration_unittest.cc
|
libdhcpsrv_unittests_SOURCES += cfg_expiration_unittest.cc
|
||||||
|
32
src/lib/dhcpsrv/tests/cb_ctl_dhcp_unittest.cc
Normal file
32
src/lib/dhcpsrv/tests/cb_ctl_dhcp_unittest.cc
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// Copyright (C) 2019 Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <dhcpsrv/cb_ctl_dhcp4.h>
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
using namespace isc::dhcp;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
/// @brief Test fixture class for @c CBControlDHCPv4 unit tests.
|
||||||
|
class TestCBControlDHCPv4 : public CBControlDHCPv4 {
|
||||||
|
public:
|
||||||
|
|
||||||
|
using CBControlDHCPv4::databaseConfigApply;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// This test verifies that the configuration updates are
|
||||||
|
// merged into the current configuration.
|
||||||
|
TEST(CBControlDHCPv4Test, databaseConfigApplyUpdates) {
|
||||||
|
TestCBControlDHCPv4 ctl;
|
||||||
|
/// @todo implement the actual test.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user