diff --git a/src/bin/dhcp4/json_config_parser.cc b/src/bin/dhcp4/json_config_parser.cc index a3a28c0b1b..f127c16307 100644 --- a/src/bin/dhcp4/json_config_parser.cc +++ b/src/bin/dhcp4/json_config_parser.cc @@ -414,12 +414,14 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set) { // depend on the global values. Also, option values configuration // must be performed after the option definitions configurations. // Thus we group parsers and will fire them in the right order: - // all parsers other than subnet4 and option-data parser, - // option-data parser, subnet4 parser. + // all parsers other than: lease-database, subnet4 and option-data parser, + // then: option-data parser, subnet4 parser, lease-database parser. + // Please do not change this order! ParserCollection independent_parsers; ParserPtr subnet_parser; ParserPtr option_parser; ParserPtr iface_parser; + ParserPtr leases_parser; // Some of the parsers alter the state of the system in a way that can't // easily be undone. (Or alter it in a way such that undoing the change has @@ -455,6 +457,8 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set) { .arg(config_pair.first); if (config_pair.first == "subnet4") { subnet_parser = parser; + } else if (config_pair.first == "lease-database") { + leases_parser = parser; } else if (config_pair.first == "option-data") { option_parser = parser; } else if (config_pair.first == "interfaces-config") { @@ -489,7 +493,7 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set) { option_parser->commit(); } - // The subnet parser is the last one to be run. + // The subnet parser is the next one to be run. std::map::const_iterator subnet_config = values_map.find("subnet4"); if (subnet_config != values_map.end()) { @@ -497,6 +501,15 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set) { subnet_parser->build(subnet_config->second); } + // the leases database parser is the last to be run. + std::map::const_iterator leases_config = + values_map.find("lease-database"); + if (leases_config != values_map.end()) { + config_pair.first = "lease-database"; + leases_parser->build(leases_config->second); + leases_parser->commit(); + } + } catch (const isc::Exception& ex) { LOG_ERROR(dhcp4_logger, DHCP4_PARSER_FAIL) .arg(config_pair.first).arg(ex.what()); diff --git a/src/bin/dhcp6/json_config_parser.cc b/src/bin/dhcp6/json_config_parser.cc index b170b534b1..8e5a6ddaf2 100644 --- a/src/bin/dhcp6/json_config_parser.cc +++ b/src/bin/dhcp6/json_config_parser.cc @@ -626,12 +626,15 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set) { // depend on the global values. Also, option values configuration // must be performed after the option definitions configurations. // Thus we group parsers and will fire them in the right order: - // all parsers other than subnet6 and option-data parser, - // option-data parser, subnet6 parser. + // all parsers other than lease-database, subnet6 and + // option-data parser, then option-data parser, subnet6 parser, + // lease-database parser. + // Please do not change this order! ParserCollection independent_parsers; ParserPtr subnet_parser; ParserPtr option_parser; ParserPtr iface_parser; + ParserPtr leases_parser; // Some of the parsers alter state of the system that can't easily // be undone. (Or alter it in a way such that undoing the change @@ -668,6 +671,8 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set) { .arg(config_pair.first); if (config_pair.first == "subnet6") { subnet_parser = parser; + } else if (config_pair.first == "lease-database") { + leases_parser = parser; } else if (config_pair.first == "option-data") { option_parser = parser; } else if (config_pair.first == "hooks-libraries") { @@ -703,7 +708,7 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set) { option_parser->commit(); } - // The subnet parser is the last one to be run. + // The subnet parser is the next one to be run. std::map::const_iterator subnet_config = values_map.find("subnet6"); if (subnet_config != values_map.end()) { @@ -711,6 +716,15 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set) { subnet_parser->build(subnet_config->second); } + // The lease database parser is the last to be run. + std::map::const_iterator leases_config = + values_map.find("lease-database"); + if (leases_config != values_map.end()) { + config_pair.first = "lease-database"; + leases_parser->build(leases_config->second); + leases_parser->commit(); + } + } catch (const isc::Exception& ex) { LOG_ERROR(dhcp6_logger, DHCP6_PARSER_FAIL) .arg(config_pair.first).arg(ex.what());