From e9fb494693c46c15d17fa4c85aff1dba17dabf86 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Wed, 27 Mar 2019 10:08:23 +0100 Subject: [PATCH] [#490,!284] Enable inheritance of globals upon config merge. --- src/lib/dhcpsrv/cb_ctl_dhcp4.cc | 12 ++++++++++++ src/lib/dhcpsrv/network.h | 8 ++++++++ src/lib/dhcpsrv/tests/cb_ctl_dhcp_unittest.cc | 4 +++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/lib/dhcpsrv/cb_ctl_dhcp4.cc b/src/lib/dhcpsrv/cb_ctl_dhcp4.cc index e9e7e83677..2ca78b4a23 100644 --- a/src/lib/dhcpsrv/cb_ctl_dhcp4.cc +++ b/src/lib/dhcpsrv/cb_ctl_dhcp4.cc @@ -57,6 +57,12 @@ CBControlDHCPv4::databaseConfigApply(const db::BackendSelector& backend_selector getMgr().getPool()->getModifiedSharedNetworks4(backend_selector, server_selector, lb_modification_time); for (auto network = networks.begin(); network != networks.end(); ++network) { + // In order to take advantage of the dynamic inheritance of global + // parameters to a shared network we need to set a callback function + // for each network which can be used to fetch global parameters. + (*network)->setFetchGlobalsFn([] () -> ConstElementPtr { + return (CfgMgr::instance().getCurrentCfg()->getConfiguredGlobals()); + }); external_cfg->getCfgSharedNetworks4()->add((*network)); } } @@ -67,6 +73,12 @@ CBControlDHCPv4::databaseConfigApply(const db::BackendSelector& backend_selector server_selector, lb_modification_time); for (auto subnet = subnets.begin(); subnet != subnets.end(); ++subnet) { + // In order to take advantage of the dynamic inheritance of global + // parameters to a subnet we need to set a callback function for each + // subnet which can be used to fetch global parameters. + (*subnet)->setFetchGlobalsFn([] () -> ConstElementPtr { + return (CfgMgr::instance().getCurrentCfg()->getConfiguredGlobals()); + }); external_cfg->getCfgSubnets4()->add((*subnet)); } } diff --git a/src/lib/dhcpsrv/network.h b/src/lib/dhcpsrv/network.h index b2760681a9..1682263ee8 100644 --- a/src/lib/dhcpsrv/network.h +++ b/src/lib/dhcpsrv/network.h @@ -220,6 +220,14 @@ public: fetch_globals_fn_ = fetch_globals_fn; } + /// @brief Checks if the network is associated with a function used to + /// fetch globally configured parameters. + /// + /// @return true if it is associated, false otherwise. + bool hasFetchGlobalsFn() const { + return (static_cast(fetch_globals_fn_)); + } + /// @brief Sets local name of the interface for which this network is /// selected. /// diff --git a/src/lib/dhcpsrv/tests/cb_ctl_dhcp_unittest.cc b/src/lib/dhcpsrv/tests/cb_ctl_dhcp_unittest.cc index d64c4b584e..f38a2aecbc 100644 --- a/src/lib/dhcpsrv/tests/cb_ctl_dhcp_unittest.cc +++ b/src/lib/dhcpsrv/tests/cb_ctl_dhcp_unittest.cc @@ -295,6 +295,7 @@ public: if (fetchConfigElement("dhcp4_shared_network") && (network->getModificationTime() > lb_modification_time)) { EXPECT_TRUE(found_network); + EXPECT_TRUE(found_network->hasFetchGlobalsFn()); } else { EXPECT_FALSE(found_network); @@ -306,7 +307,8 @@ public: auto found_subnet = subnets->getSubnet(1); if (fetchConfigElement("dhcp4_subnet") && (subnet->getModificationTime() > lb_modification_time)) { - EXPECT_TRUE(found_subnet); + ASSERT_TRUE(found_subnet); + EXPECT_TRUE(found_subnet->hasFetchGlobalsFn()); } else { EXPECT_FALSE(found_subnet); -- 2.47.2