From: Thomas Markwalder Date: Thu, 26 Sep 2019 12:33:41 +0000 (-0400) Subject: [#35,!517] Added DDDNS parameters to networks,subnets, and their parsers X-Git-Tag: tmark-post-35-refactor~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e782a9d5a7b7b3da10e2066ab9b2e418ff74ccef;p=thirdparty%2Fkea.git [#35,!517] Added DDDNS parameters to networks,subnets, and their parsers src/lib/dhcpsrv/network.* Network - added DDNS parameters: Optional members, getters, setters Network::toElement() - added DDNS parameters src/lib/dhcpsrv/parsers/base_network_parser.* BaseNetworkParser::parseDdnsParams() - new method to parse DDNS parameters BaseNetworkParser::parseLifetime() - fixed unitialized variables warning src/lib/dhcpsrv/parsers/dhcp_parsers.cc Subnet4ConfigParser::initSubnet() Subnet6ConfigParser::initSubnet() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/shared_network_parser.cc SharedNetwork4Parser::parse() SharedNetwork6Parser::parse() - added call to parseDdnsParms(). src/lib/dhcpsrv/parsers/simple_parser4.cc SimpleParser4::GLOBAL4_PARAMETERS SimpleParser4::GLOBAL4_DEFAULTS SimpleParser4::SUBNET4_PARAMETERS SimpleParser4::INHERIT_TO_SUBNET4 SimpleParser4::SHARED_NETWORK4_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/parsers/simple_parser6.cc SimpleParser6::GLOBAL6_PARAMETERS SimpleParser6::GLOBAL6_DEFAULTS SimpleParser6::SUBNET6_PARAMETERS SimpleParser6::INHERIT_TO_SUBNET6 SimpleParser6::SHARED_NETWORK6_PARAMETERS - added DDNS parameters src/lib/dhcpsrv/tests/cfg_shared_networks4_unittest.cc src/lib/dhcpsrv/tests/cfg_shared_networks6_unittest.cc src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc src/lib/dhcpsrv/tests/network_unittest.cc src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc src/lib/dhcpsrv/tests/shared_network_unittest.cc src/lib/dhcpsrv/tests/subnet_unittest.cc Updated tests. --- diff --git a/src/lib/dhcpsrv/network.cc b/src/lib/dhcpsrv/network.cc index 27562b2740..41a8feca4f 100644 --- a/src/lib/dhcpsrv/network.cc +++ b/src/lib/dhcpsrv/network.cc @@ -242,6 +242,32 @@ Network::toElement() const { map->set("t2-percent", Element::create(t2_percent_)); } + if (!ddns_send_updates_.unspecified()) { + map->set("ddns-send-updates", Element::create(ddns_send_updates_)); + } + + if (!ddns_override_no_update_.unspecified()) { + map->set("ddns-override-no-update", Element::create(ddns_override_no_update_)); + } + + if (!ddns_override_client_update_.unspecified()) { + map->set("ddns-override-client-update", Element::create(ddns_override_client_update_)); + } + + if (!ddns_replace_client_name_mode_.unspecified()) { + map->set("ddns-replace-client-name", + Element::create(D2ClientConfig:: + replaceClientNameModeToString(ddns_replace_client_name_mode_))); + } + + if (!ddns_generated_prefix_.unspecified()) { + map->set("ddns-generated-prefix", Element::create(ddns_generated_prefix_)); + } + + if (!ddns_qualifying_suffix_.unspecified()) { + map->set("ddns-qualifying-suffix", Element::create(ddns_qualifying_suffix_)); + } + return (map); } diff --git a/src/lib/dhcpsrv/network.h b/src/lib/dhcpsrv/network.h index 65848eb133..928f5ea067 100644 --- a/src/lib/dhcpsrv/network.h +++ b/src/lib/dhcpsrv/network.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -203,7 +204,9 @@ public: Network() : iface_name_(), client_class_(), t1_(), t2_(), valid_(), host_reservation_mode_(HR_ALL, true), cfg_option_(new CfgOption()), - calculate_tee_times_(), t1_percent_(), t2_percent_() { + calculate_tee_times_(), t1_percent_(), t2_percent_(), + ddns_send_updates_(), ddns_override_no_update_(), ddns_override_client_update_(), + ddns_replace_client_name_mode_(), ddns_generated_prefix_(), ddns_qualifying_suffix_() { } /// @brief Virtual destructor. @@ -517,6 +520,132 @@ public: t2_percent_ = t2_percent; } + /// @brief Returns ddns-send-updates + /// + /// @param inheritance inheritance mode to be used. + util::Optional + getDdnsSendUpdates(const Inheritance& inheritance = Inheritance::ALL) const { + return (getProperty(&Network::getDdnsSendUpdates, ddns_send_updates_, + inheritance, "ddns-send-updates")); + } + + /// @brief Sets new ddns-send-updates + /// + /// @param ddns_send_updates_ New value to use. + void setDdnsSendUpdates(const util::Optional& ddns_send_updates) { + ddns_send_updates_ = ddns_send_updates; + } + + /// @brief Returns ddns-override-no-update + /// + /// @param inheritance inheritance mode to be used. + util::Optional + getDdnsOverrideNoUpdate(const Inheritance& inheritance = Inheritance::ALL) const { + return (getProperty(&Network::getDdnsOverrideNoUpdate, ddns_override_no_update_, + inheritance, "ddns-override-no-update")); + } + + /// @brief Sets new ddns-override-no-update + /// + /// @param ddns_override_no_update New value to use. + void setDdnsOverrideNoUpdate(const util::Optional& ddns_override_no_update) { + ddns_override_no_update_ = ddns_override_no_update; + } + + /// @brief Returns ddns-overridie-client-update + /// + /// @param inheritance inheritance mode to be used. + util::Optional + getDdnsOverrideClientUpdate(const Inheritance& inheritance = Inheritance::ALL) const { + return (getProperty(&Network::getDdnsOverrideClientUpdate, ddns_override_client_update_, + inheritance, "ddns-override-client-update")); + } + + /// @brief Sets new ddns-override-client-update + /// + /// @param ddns-override-client-update New value to use. + void setDdnsOverrideClientUpdate(const util::Optional& ddns_override_client_update) { + ddns_override_client_update_ = ddns_override_client_update; + } + + /// @brief Returns ddns-replace-client-name-mode + /// + /// @param inheritance inheritance mode to be used. + util::Optional + getDdnsReplaceClientNameMode(const Inheritance& inheritance = Inheritance::ALL) const { + // Inheritance for ddns-replace-client-name is a little different than for other + // parameters. The value at the global level is given as a string. + // Thus we call getProperty here without a global name to check if it + // is specified on network level only. + const util::Optional& mode + = getProperty(&Network::getDdnsReplaceClientNameMode, + ddns_replace_client_name_mode_, inheritance); + + // If it is not specified at network level we need this special + // case code to convert the global string value to an enum. + if (mode.unspecified() && (inheritance != Inheritance::NONE) && + (inheritance != Inheritance::PARENT_NETWORK)) { + // Get global mode. + util::Optional mode_label; + mode_label = getGlobalProperty(mode_label, "ddns-replace-client-name"); + if (!mode_label.unspecified()) { + try { + // If the mode is globally configured, convert it to an enum. + return (D2ClientConfig::stringToReplaceClientNameMode(mode_label.get())); + } catch (...) { + // This should not really happen because the configuration + // parser should have already verified the globally configured + // reservation mode. However, we want to be 100% sure that this + // method doesn't throw. Let's just return unspecified. + return (mode); + } + } + } + return (mode); + } + + /// @brief Sets new ddns-replace-client-name-mode + /// + /// @param ddns_replace_client_name_mode New value to use. + void setDdnsReplaceClientNameMode(const util::Optional& + ddns_replace_client_name_mode) { + ddns_replace_client_name_mode_ = ddns_replace_client_name_mode; + } + + /// @brief Returns ddns-generated-prefix + /// + /// @param inheritance inheritance mode to be used. + util::Optional + getDdnsGeneratedPrefix(const Inheritance& inheritance = Inheritance::ALL) const { + return (getProperty(&Network::getDdnsGeneratedPrefix, ddns_generated_prefix_, + inheritance, "ddns-generated-prefix")); + } + + /// @brief Sets new ddns-generated-prefix + /// + /// @param ddns_generated-prefix New value to use. + void setDdnsGeneratedPrefix(const util::Optional& ddns_generated_prefix) { + ddns_generated_prefix_ = ddns_generated_prefix; + } + + /// @brief Returns ddns-qualifying-suffix + /// + /// @param inheritance inheritance mode to be used. + util::Optional + getDdnsQualifyingSuffix(const Inheritance& inheritance = Inheritance::ALL) const { + return (getProperty(&Network::getDdnsQualifyingSuffix, ddns_qualifying_suffix_, + inheritance, "ddns-qualifying-suffix")); + } + + /// @brief Sets new ddns-qualifying-suffix + /// + /// @param ddns_qualifying_suffix New value to use. + void setDdnsQualifyingSuffix(const util::Optional& ddns_qualifying_suffix) { + ddns_qualifying_suffix_ = ddns_qualifying_suffix; + } + + + /// @brief Unparses network object. /// /// @return A pointer to unparsed network configuration. @@ -779,6 +908,26 @@ protected: /// @brief Percentage of the lease lifetime to use when calculating T2 timer util::Optional t2_percent_; + /// @brief Should Kea perform DNS updates. Used to provide scoped enabling + /// and disabling of updates. + util::Optional ddns_send_updates_; + + /// @brief Should Kea perform updates, even if client requested no updates. + /// Overrides the client request for no updates via the N flag. + util::Optional ddns_override_no_update_; + + /// @brief Should Kea perform updates, even if client requested delegation. + util::Optional ddns_override_client_update_; + + /// @brief How Kea should handle the domain-name supplied by the client. + util::Optional ddns_replace_client_name_mode_; + + /// @brief Prefix Kea should use when generating domain-names. + util::Optional ddns_generated_prefix_; + + /// @brief Suffix Kea should use when to qualify partial domain-names. + util::Optional ddns_qualifying_suffix_; + /// @brief Pointer to another network that this network belongs to. /// /// The most common case is that this instance is a subnet which belongs diff --git a/src/lib/dhcpsrv/parsers/base_network_parser.cc b/src/lib/dhcpsrv/parsers/base_network_parser.cc index a83614defe..c67ee172fe 100644 --- a/src/lib/dhcpsrv/parsers/base_network_parser.cc +++ b/src/lib/dhcpsrv/parsers/base_network_parser.cc @@ -18,11 +18,11 @@ namespace dhcp { const Triplet BaseNetworkParser::parseLifetime(const ConstElementPtr& scope, const std::string& name) { - uint32_t value; + uint32_t value = 0; bool has_value = false; - uint32_t min_value; + uint32_t min_value = 0; bool has_min = false; - uint32_t max_value; + uint32_t max_value = 0; bool has_max = false; if (scope->contains(name)) { value = getInteger(scope, name); @@ -167,5 +167,37 @@ BaseNetworkParser::parseHostReservationMode(const data::ConstElementPtr& network } } +void +BaseNetworkParser::parseDdnsParams(const data::ConstElementPtr& network_data, + NetworkPtr& network) { + + if (network_data->contains("ddns-send-updates")) { + network->setDdnsSendUpdates(getBoolean(network_data, "ddns-send-updates")); + } + + if (network_data->contains("ddns-override-no-update")) { + network->setDdnsOverrideNoUpdate(getBoolean(network_data, "ddns-override-no-update")); + } + + if (network_data->contains("ddns-override-client-update")) { + network->setDdnsOverrideClientUpdate(getBoolean(network_data, "ddns-override-client-update")); + } + + if (network_data->contains("ddns-replace-client-name")) { + network->setDdnsReplaceClientNameMode(getAndConvert + (network_data, "ddns-replace-client-name", + "ReplaceClientName mode")); + } + + if (network_data->contains("ddns-generated-prefix")) { + network->setDdnsGeneratedPrefix(getString(network_data, "ddns-generated-prefix")); + } + + if (network_data->contains("ddns-qualifying-suffix")) { + network->setDdnsQualifyingSuffix(getString(network_data, "ddns-qualifying-suffix")); + } +} + } // end of namespace isc::dhcp } // end of namespace isc diff --git a/src/lib/dhcpsrv/parsers/base_network_parser.h b/src/lib/dhcpsrv/parsers/base_network_parser.h index 1800524e6f..ac4196db8d 100644 --- a/src/lib/dhcpsrv/parsers/base_network_parser.h +++ b/src/lib/dhcpsrv/parsers/base_network_parser.h @@ -62,13 +62,30 @@ protected: NetworkPtr& network); /// @brief Parses host reservation mode. - // + /// /// @param network_data Data element holding shared network /// configuration to be parsed. /// @param [out] network Pointer to a network in which parsed data is /// to be stored. void parseHostReservationMode(const data::ConstElementPtr& network_data, NetworkPtr& network); + + /// @brief Parses parameters pertaining to DDNS behavior. + /// + /// The parsed parameters are: + /// - ddns-send-updates + /// - ddns-override-no-update + /// - ddns-override-client-update + /// - ddns-replace-client-name + /// - ddns-generated-prefix + /// - ddns-qualifying-suffix + /// + /// @param network_data Data element holding shared network + /// configuration to be parsed. + /// @param [out] network Pointer to a network in which parsed data is + /// to be stored. + void parseDdnsParams(const data::ConstElementPtr& network_data, + NetworkPtr& network); }; } // end of namespace isc::dhcp diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc index a50616e501..57ad4df376 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc @@ -925,6 +925,9 @@ Subnet4ConfigParser::initSubnet(data::ConstElementPtr params, // Parse t1-percent and t2-percent parseTeePercents(params, network); + + // Parse DDNS parameters + parseDdnsParams(params, network); } //**************************** Subnets4ListConfigParser ********************** @@ -1314,6 +1317,9 @@ Subnet6ConfigParser::initSubnet(data::ConstElementPtr params, // Parse t1-percent and t2-percent parseTeePercents(params, network); + + // Parse DDNS parameters + parseDdnsParams(params, network); } //**************************** Subnet6ListConfigParser ******************** diff --git a/src/lib/dhcpsrv/parsers/shared_network_parser.cc b/src/lib/dhcpsrv/parsers/shared_network_parser.cc index 4ec06d6381..4d3edba0d6 100644 --- a/src/lib/dhcpsrv/parsers/shared_network_parser.cc +++ b/src/lib/dhcpsrv/parsers/shared_network_parser.cc @@ -174,6 +174,8 @@ SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) { parseTeePercents(shared_network_data, network); + // Parse DDNS parameters + parseDdnsParams(shared_network_data, network); } catch (const DhcpConfigError&) { // Position was already added throw; @@ -326,6 +328,8 @@ SharedNetwork6Parser::parse(const data::ConstElementPtr& shared_network_data) { parseTeePercents(shared_network_data, network); + // Parse DDNS parameters + parseDdnsParams(shared_network_data, network); } catch (const std::exception& ex) { isc_throw(DhcpConfigError, ex.what() << " (" << shared_network_data->getPosition() << ")"); diff --git a/src/lib/dhcpsrv/parsers/simple_parser4.cc b/src/lib/dhcpsrv/parsers/simple_parser4.cc index 7e2ba9e614..a2a0e74557 100644 --- a/src/lib/dhcpsrv/parsers/simple_parser4.cc +++ b/src/lib/dhcpsrv/parsers/simple_parser4.cc @@ -75,14 +75,14 @@ const SimpleKeywords SimpleParser4::GLOBAL4_PARAMETERS = { { "t1-percent", Element::real }, { "t2-percent", Element::real }, { "loggers", Element::list }, + { "hostname-char-set", Element::string }, + { "hostname-char-replacement", Element::string }, { "ddns-send-updates", Element::boolean }, { "ddns-override-no-update", Element::boolean }, { "ddns-override-client-update", Element::boolean }, { "ddns-replace-client-name", Element::string }, { "ddns-generated-prefix", Element::string }, { "ddns-qualifying-suffix", Element::string } - { "hostname-char-set", Element::string }, - { "hostname-char-replacement", Element::string } }; /// @brief This table defines default global values for DHCPv4 @@ -109,7 +109,7 @@ const SimpleDefaults SimpleParser4::GLOBAL4_DEFAULTS = { { "ddns-override-no-update", Element::boolean, "false" }, { "ddns-override-client-update", Element::boolean, "false" }, { "ddns-replace-client-name", Element::string, "never" }, - { "ddns-generated-prefix", Element::string, "myhost" } + { "ddns-generated-prefix", Element::string, "myhost" }, // TKM should this still be true? qualifying-suffix has no default ?? { "ddns-generated-suffix", Element::string, "" } }; @@ -177,35 +177,41 @@ const SimpleDefaults SimpleParser4::OPTION4_DEFAULTS = { /// list and map types for entries. /// Order follows subnet4_param rule in bison grammar. const SimpleKeywords SimpleParser4::SUBNET4_PARAMETERS = { - { "valid-lifetime", Element::integer }, - { "min-valid-lifetime", Element::integer }, - { "max-valid-lifetime", Element::integer }, - { "renew-timer", Element::integer }, - { "rebind-timer", Element::integer }, - { "option-data", Element::list }, - { "pools", Element::list }, - { "subnet", Element::string }, - { "interface", Element::string }, - { "id", Element::integer }, - { "client-class", Element::string }, - { "require-client-classes", Element::list }, - { "reservations", Element::list }, - { "reservation-mode", Element::string }, - { "relay", Element::map }, - { "match-client-id", Element::boolean }, - { "authoritative", Element::boolean }, - { "next-server", Element::string }, - { "server-hostname", Element::string }, - { "boot-file-name", Element::string }, - { "4o6-interface", Element::string }, - { "4o6-interface-id", Element::string }, - { "4o6-subnet", Element::string }, - { "user-context", Element::map }, - { "comment", Element::string }, - { "calculate-tee-times", Element::boolean }, - { "t1-percent", Element::real }, - { "t2-percent", Element::real }, - { "metadata", Element::map } + { "valid-lifetime", Element::integer }, + { "min-valid-lifetime", Element::integer }, + { "max-valid-lifetime", Element::integer }, + { "renew-timer", Element::integer }, + { "rebind-timer", Element::integer }, + { "option-data", Element::list }, + { "pools", Element::list }, + { "subnet", Element::string }, + { "interface", Element::string }, + { "id", Element::integer }, + { "client-class", Element::string }, + { "require-client-classes", Element::list }, + { "reservations", Element::list }, + { "reservation-mode", Element::string }, + { "relay", Element::map }, + { "match-client-id", Element::boolean }, + { "authoritative", Element::boolean }, + { "next-server", Element::string }, + { "server-hostname", Element::string }, + { "boot-file-name", Element::string }, + { "4o6-interface", Element::string }, + { "4o6-interface-id", Element::string }, + { "4o6-subnet", Element::string }, + { "user-context", Element::map }, + { "comment", Element::string }, + { "calculate-tee-times", Element::boolean }, + { "t1-percent", Element::real }, + { "t2-percent", Element::real }, + { "ddns-send-updates", Element::boolean }, + { "ddns-override-no-update", Element::boolean }, + { "ddns-override-client-update", Element::boolean }, + { "ddns-replace-client-name", Element::string }, + { "ddns-generated-prefix", Element::string }, + { "ddns-qualifying-suffix", Element::string }, + { "metadata", Element::map }, }; /// @brief This table defines default values for each IPv4 subnet. @@ -263,7 +269,13 @@ const ParamsList SimpleParser4::INHERIT_TO_SUBNET4 = { "max-valid-lifetime", "calculate-tee-times", "t1-percent", - "t2-percent" + "t2-percent", + "ddns-send-updates", + "ddns-override-no-update", + "ddns-override-client-update", + "ddns-replace-client-name", + "ddns-generated-prefix", + "ddns-qualifying-suffix" }; /// @brief This table defines all pool parameters. @@ -287,30 +299,36 @@ const SimpleKeywords SimpleParser4::POOL4_PARAMETERS = { /// list and map types for entries. /// Order follows shared_network_param rule in bison grammar. const SimpleKeywords SimpleParser4::SHARED_NETWORK4_PARAMETERS = { - { "name", Element::string }, - { "subnet4", Element::list }, - { "interface", Element::string }, - { "renew-timer", Element::integer }, - { "rebind-timer", Element::integer }, - { "option-data", Element::list }, - { "match-client-id", Element::boolean }, - { "authoritative", Element::boolean }, - { "next-server", Element::string }, - { "server-hostname", Element::string }, - { "boot-file-name", Element::string }, - { "relay", Element::map }, - { "reservation-mode", Element::string }, - { "client-class", Element::string }, - { "require-client-classes", Element::list }, - { "valid-lifetime", Element::integer }, - { "min-valid-lifetime", Element::integer }, - { "max-valid-lifetime", Element::integer }, - { "user-context", Element::map }, - { "comment", Element::string }, - { "calculate-tee-times", Element::boolean }, - { "t1-percent", Element::real }, - { "t2-percent", Element::real }, - { "metadata", Element::map } + { "name", Element::string }, + { "subnet4", Element::list }, + { "interface", Element::string }, + { "renew-timer", Element::integer }, + { "rebind-timer", Element::integer }, + { "option-data", Element::list }, + { "match-client-id", Element::boolean }, + { "authoritative", Element::boolean }, + { "next-server", Element::string }, + { "server-hostname", Element::string }, + { "boot-file-name", Element::string }, + { "relay", Element::map }, + { "reservation-mode", Element::string }, + { "client-class", Element::string }, + { "require-client-classes", Element::list }, + { "valid-lifetime", Element::integer }, + { "min-valid-lifetime", Element::integer }, + { "max-valid-lifetime", Element::integer }, + { "user-context", Element::map }, + { "comment", Element::string }, + { "calculate-tee-times", Element::boolean }, + { "t1-percent", Element::real }, + { "t2-percent", Element::real }, + { "ddns-send-updates", Element::boolean }, + { "ddns-override-no-update", Element::boolean }, + { "ddns-override-client-update", Element::boolean }, + { "ddns-replace-client-name", Element::string }, + { "ddns-generated-prefix", Element::string }, + { "ddns-qualifying-suffix", Element::string }, + { "metadata", Element::map }, }; /// @brief This table defines default values for each IPv4 shared network. diff --git a/src/lib/dhcpsrv/parsers/simple_parser6.cc b/src/lib/dhcpsrv/parsers/simple_parser6.cc index d2c5d8b69c..0454560e6b 100644 --- a/src/lib/dhcpsrv/parsers/simple_parser6.cc +++ b/src/lib/dhcpsrv/parsers/simple_parser6.cc @@ -76,7 +76,13 @@ const SimpleKeywords SimpleParser6::GLOBAL6_PARAMETERS = { { "t2-percent", Element::real }, { "loggers", Element::list }, { "hostname-char-set", Element::string }, - { "hostname-char-replacement", Element::string } + { "hostname-char-replacement", Element::string }, + { "ddns-send-updates", Element::boolean }, + { "ddns-override-no-update", Element::boolean }, + { "ddns-override-client-update", Element::boolean }, + { "ddns-replace-client-name", Element::string }, + { "ddns-generated-prefix", Element::string }, + { "ddns-qualifying-suffix", Element::string } }; /// @brief This table defines default global values for DHCPv6 @@ -85,15 +91,22 @@ const SimpleKeywords SimpleParser6::GLOBAL6_PARAMETERS = { /// in Dhcp6) are optional. If not defined, the following values will be /// used. const SimpleDefaults SimpleParser6::GLOBAL6_DEFAULTS = { - { "preferred-lifetime", Element::integer, "3600" }, - { "valid-lifetime", Element::integer, "7200" }, - { "decline-probation-period", Element::integer, "86400" }, // 24h - { "dhcp4o6-port", Element::integer, "0" }, - { "server-tag", Element::string, "" }, - { "reservation-mode", Element::string, "all" }, - { "calculate-tee-times", Element::boolean, "true" }, - { "t1-percent", Element::real, ".50" }, - { "t2-percent", Element::real, ".80" } + { "preferred-lifetime", Element::integer, "3600" }, + { "valid-lifetime", Element::integer, "7200" }, + { "decline-probation-period", Element::integer, "86400" }, // 24h + { "dhcp4o6-port", Element::integer, "0" }, + { "server-tag", Element::string, "" }, + { "reservation-mode", Element::string, "all" }, + { "calculate-tee-times", Element::boolean, "true" }, + { "t1-percent", Element::real, ".50" }, + { "t2-percent", Element::real, ".80" }, + { "ddns-send-updates", Element::boolean, "false" }, + { "ddns-override-no-update", Element::boolean, "false" }, + { "ddns-override-client-update", Element::boolean, "false" }, + { "ddns-replace-client-name", Element::string, "never" }, + { "ddns-generated-prefix", Element::string, "myhost" }, + // TKM should this still be true? qualifying-suffix has no default ?? + { "ddns-generated-suffix", Element::string, "" } }; /// @brief This table defines all option definition parameters. @@ -159,33 +172,39 @@ const SimpleDefaults SimpleParser6::OPTION6_DEFAULTS = { /// list and map types for entries. /// Order follows subnet6_param rule in bison grammar. const SimpleKeywords SimpleParser6::SUBNET6_PARAMETERS = { - { "preferred-lifetime", Element::integer }, - { "min-preferred-lifetime", Element::integer }, - { "max-preferred-lifetime", Element::integer }, - { "valid-lifetime", Element::integer }, - { "min-valid-lifetime", Element::integer }, - { "max-valid-lifetime", Element::integer }, - { "renew-timer", Element::integer }, - { "rebind-timer", Element::integer }, - { "option-data", Element::list }, - { "pools", Element::list }, - { "pd-pools", Element::list }, - { "subnet", Element::string }, - { "interface", Element::string }, - { "interface-id", Element::string }, - { "id", Element::integer }, - { "rapid-commit", Element::boolean }, - { "client-class", Element::string }, - { "require-client-classes", Element::list }, - { "reservations", Element::list }, - { "reservation-mode", Element::string }, - { "relay", Element::map }, - { "user-context", Element::map }, - { "comment", Element::string }, - { "calculate-tee-times", Element::boolean }, - { "t1-percent", Element::real }, - { "t2-percent", Element::real }, - { "metadata", Element::map } + { "preferred-lifetime", Element::integer }, + { "min-preferred-lifetime", Element::integer }, + { "max-preferred-lifetime", Element::integer }, + { "valid-lifetime", Element::integer }, + { "min-valid-lifetime", Element::integer }, + { "max-valid-lifetime", Element::integer }, + { "renew-timer", Element::integer }, + { "rebind-timer", Element::integer }, + { "option-data", Element::list }, + { "pools", Element::list }, + { "pd-pools", Element::list }, + { "subnet", Element::string }, + { "interface", Element::string }, + { "interface-id", Element::string }, + { "id", Element::integer }, + { "rapid-commit", Element::boolean }, + { "client-class", Element::string }, + { "require-client-classes", Element::list }, + { "reservations", Element::list }, + { "reservation-mode", Element::string }, + { "relay", Element::map }, + { "user-context", Element::map }, + { "comment", Element::string }, + { "calculate-tee-times", Element::boolean }, + { "t1-percent", Element::real }, + { "t2-percent", Element::real }, + { "ddns-send-updates", Element::boolean }, + { "ddns-override-no-update", Element::boolean }, + { "ddns-override-client-update", Element::boolean }, + { "ddns-replace-client-name", Element::string }, + { "ddns-generated-prefix", Element::string }, + { "ddns-qualifying-suffix", Element::string }, + { "metadata", Element::map } }; /// @brief This table defines default values for each IPv6 subnet. @@ -231,7 +250,13 @@ const ParamsList SimpleParser6::INHERIT_TO_SUBNET6 = { "max-valid-lifetime", "calculate-tee-times", "t1-percent", - "t2-percent" + "t2-percent", + "ddns-send-updates", + "ddns-override-no-update", + "ddns-override-client-update", + "ddns-replace-client-name", + "ddns-generated-prefix", + "ddns-qualifying-suffix" }; /// @brief This table defines all pool parameters. @@ -274,30 +299,36 @@ const SimpleKeywords SimpleParser6::PD_POOL6_PARAMETERS = { /// list and map types for entries. /// Order follows shared_network_param rule in bison grammar. const SimpleKeywords SimpleParser6::SHARED_NETWORK6_PARAMETERS = { - { "name", Element::string }, - { "subnet6", Element::list }, - { "interface", Element::string }, - { "interface-id", Element::string }, - { "renew-timer", Element::integer }, - { "rebind-timer", Element::integer }, - { "option-data", Element::list }, - { "relay", Element::map }, - { "reservation-mode", Element::string }, - { "client-class", Element::string }, - { "require-client-classes", Element::list }, - { "preferred-lifetime", Element::integer }, - { "min-preferred-lifetime", Element::integer }, - { "max-preferred-lifetime", Element::integer }, - { "rapid-commit", Element::boolean }, - { "valid-lifetime", Element::integer }, - { "min-valid-lifetime", Element::integer }, - { "max-valid-lifetime", Element::integer }, - { "user-context", Element::map }, - { "comment", Element::string }, - { "calculate-tee-times", Element::boolean }, - { "t1-percent", Element::real }, - { "t2-percent", Element::real }, - { "metadata", Element::map } + { "name", Element::string }, + { "subnet6", Element::list }, + { "interface", Element::string }, + { "interface-id", Element::string }, + { "renew-timer", Element::integer }, + { "rebind-timer", Element::integer }, + { "option-data", Element::list }, + { "relay", Element::map }, + { "reservation-mode", Element::string }, + { "client-class", Element::string }, + { "require-client-classes", Element::list }, + { "preferred-lifetime", Element::integer }, + { "min-preferred-lifetime", Element::integer }, + { "max-preferred-lifetime", Element::integer }, + { "rapid-commit", Element::boolean }, + { "valid-lifetime", Element::integer }, + { "min-valid-lifetime", Element::integer }, + { "max-valid-lifetime", Element::integer }, + { "user-context", Element::map }, + { "comment", Element::string }, + { "calculate-tee-times", Element::boolean }, + { "t1-percent", Element::real }, + { "t2-percent", Element::real }, + { "ddns-send-updates", Element::boolean }, + { "ddns-override-no-update", Element::boolean }, + { "ddns-override-client-update", Element::boolean }, + { "ddns-replace-client-name", Element::string }, + { "ddns-generated-prefix", Element::string }, + { "ddns-qualifying-suffix", Element::string }, + { "metadata", Element::map } }; /// @brief This table defines default values for each IPv6 subnet. diff --git a/src/lib/dhcpsrv/tests/cfg_shared_networks4_unittest.cc b/src/lib/dhcpsrv/tests/cfg_shared_networks4_unittest.cc index 54b28e5af1..3114d0bea7 100644 --- a/src/lib/dhcpsrv/tests/cfg_shared_networks4_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_shared_networks4_unittest.cc @@ -192,17 +192,25 @@ TEST(CfgSharedNetworks4Test, unparse) { SharedNetwork4Ptr network1(new SharedNetwork4("frog")); SharedNetwork4Ptr network2(new SharedNetwork4("dog")); SharedNetwork4Ptr network3(new SharedNetwork4("cat")); + network1->setIface("eth0"); network1->addRelayAddress(IOAddress("198.16.1.1")); network1->addRelayAddress(IOAddress("198.16.1.2")); network1->setCalculateTeeTimes(true); network1->setT1Percent(.35); network1->setT2Percent(.655); + network1->setDdnsSendUpdates(true); + network1->setDdnsOverrideNoUpdate(true); + network1->setDdnsOverrideClientUpdate(true); + network1->setDdnsReplaceClientNameMode(D2ClientConfig::RCM_ALWAYS); + network1->setDdnsGeneratedPrefix("prefix"); + network1->setDdnsQualifyingSuffix("example.com."); network2->setIface("eth1"); network2->setT1(Triplet(100)); network2->setT2(Triplet(200)); network2->setValid(Triplet(200, 300, 400)); + network2->setDdnsSendUpdates(false); network3->setIface("eth2"); network3->setValid(Triplet(100)); @@ -223,6 +231,7 @@ TEST(CfgSharedNetworks4Test, unparse) { " \"valid-lifetime\": 100\n" " },\n" " {\n" + " \"ddns-send-updates\": false,\n" " \"interface\": \"eth1\",\n" " \"name\": \"dog\",\n" " \"rebind-timer\": 200,\n" @@ -236,6 +245,12 @@ TEST(CfgSharedNetworks4Test, unparse) { " },\n" " {\n" " \"calculate-tee-times\": true,\n" + " \"ddns-generated-prefix\": \"prefix\",\n" + " \"ddns-override-no-update\": true,\n" + " \"ddns-override-client-update\": true,\n" + " \"ddns-qualifying-suffix\": \"example.com.\",\n" + " \"ddns-replace-client-name\": \"always\",\n" + " \"ddns-send-updates\": true,\n" " \"interface\": \"eth0\",\n" " \"name\": \"frog\",\n" " \"option-data\": [ ],\n" diff --git a/src/lib/dhcpsrv/tests/cfg_shared_networks6_unittest.cc b/src/lib/dhcpsrv/tests/cfg_shared_networks6_unittest.cc index 6d338083fc..e6643657fc 100644 --- a/src/lib/dhcpsrv/tests/cfg_shared_networks6_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_shared_networks6_unittest.cc @@ -200,12 +200,19 @@ TEST(CfgSharedNetworks6Test, unparse) { network1->setCalculateTeeTimes(true); network1->setT1Percent(.35); network1->setT2Percent(.655); + network1->setDdnsSendUpdates(true); + network1->setDdnsOverrideNoUpdate(true); + network1->setDdnsOverrideClientUpdate(true); + network1->setDdnsReplaceClientNameMode(D2ClientConfig::RCM_ALWAYS); + network1->setDdnsGeneratedPrefix("prefix"); + network1->setDdnsQualifyingSuffix("example.com."); network2->setIface("eth1"); network2->setT1(Triplet(100)); network2->setT2(Triplet(200)); network2->setPreferred(Triplet(200)); network2->setValid(Triplet(300)); + network2->setDdnsSendUpdates(false); network3->setIface("eth2"); network3->setPreferred(Triplet(100,200,300)); @@ -232,6 +239,7 @@ TEST(CfgSharedNetworks6Test, unparse) { " \"max-valid-lifetime\": 400\n" " },\n" " {\n" + " \"ddns-send-updates\": false,\n" " \"interface\": \"eth1\",\n" " \"name\": \"dog\",\n" " \"option-data\": [ ],\n" @@ -244,6 +252,12 @@ TEST(CfgSharedNetworks6Test, unparse) { " },\n" " {\n" " \"calculate-tee-times\": true,\n" + " \"ddns-generated-prefix\": \"prefix\",\n" + " \"ddns-override-no-update\": true,\n" + " \"ddns-override-client-update\": true,\n" + " \"ddns-qualifying-suffix\": \"example.com.\",\n" + " \"ddns-replace-client-name\": \"always\",\n" + " \"ddns-send-updates\": true,\n" " \"interface\": \"eth0\",\n" " \"name\": \"frog\",\n" " \"option-data\": [ ],\n" diff --git a/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc b/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc index 4d670afed5..6f31c24a13 100644 --- a/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc +++ b/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc @@ -2763,6 +2763,24 @@ TEST_F(ParseConfigTest, defaultSubnet4) { EXPECT_TRUE(subnet->get4o6().getSubnet4o6().unspecified()); EXPECT_TRUE(subnet->get4o6().getSubnet4o6().get().first.isV6Zero()); EXPECT_EQ(128, subnet->get4o6().getSubnet4o6().get().second); + + EXPECT_TRUE(subnet->getDdnsSendUpdates().unspecified()); + EXPECT_FALSE(subnet->getDdnsSendUpdates().get()); + + EXPECT_TRUE(subnet->getDdnsOverrideNoUpdate().unspecified()); + EXPECT_FALSE(subnet->getDdnsOverrideNoUpdate().get()); + + EXPECT_TRUE(subnet->getDdnsOverrideClientUpdate().unspecified()); + EXPECT_FALSE(subnet->getDdnsOverrideClientUpdate().get()); + + EXPECT_TRUE(subnet->getDdnsReplaceClientNameMode().unspecified()); + EXPECT_EQ(D2ClientConfig::RCM_NEVER, subnet->getDdnsReplaceClientNameMode().get()); + + EXPECT_TRUE(subnet->getDdnsGeneratedPrefix().unspecified()); + EXPECT_TRUE(subnet->getDdnsGeneratedPrefix().empty()); + + EXPECT_TRUE(subnet->getDdnsQualifyingSuffix().unspecified()); + EXPECT_TRUE(subnet->getDdnsQualifyingSuffix().empty()); } // This test verifies that it is possible to parse an IPv6 subnet for which @@ -2816,6 +2834,24 @@ TEST_F(ParseConfigTest, defaultSubnet6) { EXPECT_TRUE(subnet->getRapidCommit().unspecified()); EXPECT_FALSE(subnet->getRapidCommit().get()); + + EXPECT_TRUE(subnet->getDdnsSendUpdates().unspecified()); + EXPECT_FALSE(subnet->getDdnsSendUpdates().get()); + + EXPECT_TRUE(subnet->getDdnsOverrideNoUpdate().unspecified()); + EXPECT_FALSE(subnet->getDdnsOverrideNoUpdate().get()); + + EXPECT_TRUE(subnet->getDdnsOverrideClientUpdate().unspecified()); + EXPECT_FALSE(subnet->getDdnsOverrideClientUpdate().get()); + + EXPECT_TRUE(subnet->getDdnsReplaceClientNameMode().unspecified()); + EXPECT_EQ(D2ClientConfig::RCM_NEVER, subnet->getDdnsReplaceClientNameMode().get()); + + EXPECT_TRUE(subnet->getDdnsGeneratedPrefix().unspecified()); + EXPECT_EQ("", subnet->getDdnsGeneratedPrefix().get()); + + EXPECT_TRUE(subnet->getDdnsQualifyingSuffix().unspecified()); + EXPECT_TRUE(subnet->getDdnsQualifyingSuffix().empty()); } // This test verifies that it is possible to parse an IPv4 shared network @@ -2870,6 +2906,24 @@ TEST_F(ParseConfigTest, defaultSharedNetwork4) { EXPECT_TRUE(network->getAuthoritative().unspecified()); EXPECT_FALSE(network->getAuthoritative().get()); + + EXPECT_TRUE(network->getDdnsSendUpdates().unspecified()); + EXPECT_FALSE(network->getDdnsSendUpdates().get()); + + EXPECT_TRUE(network->getDdnsOverrideNoUpdate().unspecified()); + EXPECT_FALSE(network->getDdnsOverrideNoUpdate().get()); + + EXPECT_TRUE(network->getDdnsOverrideClientUpdate().unspecified()); + EXPECT_FALSE(network->getDdnsOverrideClientUpdate().get()); + + EXPECT_TRUE(network->getDdnsReplaceClientNameMode().unspecified()); + EXPECT_EQ(D2ClientConfig::RCM_NEVER, network->getDdnsReplaceClientNameMode().get()); + + EXPECT_TRUE(network->getDdnsGeneratedPrefix().unspecified()); + EXPECT_TRUE(network->getDdnsGeneratedPrefix().empty()); + + EXPECT_TRUE(network->getDdnsQualifyingSuffix().unspecified()); + EXPECT_TRUE(network->getDdnsQualifyingSuffix().empty()); } // This test verifies that it is possible to parse an IPv6 shared network @@ -2924,9 +2978,25 @@ TEST_F(ParseConfigTest, defaultSharedNetwork6) { EXPECT_TRUE(network->getRapidCommit().unspecified()); EXPECT_FALSE(network->getRapidCommit().get()); -} + EXPECT_TRUE(network->getDdnsSendUpdates().unspecified()); + EXPECT_FALSE(network->getDdnsSendUpdates().get()); + + EXPECT_TRUE(network->getDdnsOverrideNoUpdate().unspecified()); + EXPECT_FALSE(network->getDdnsOverrideNoUpdate().get()); + + EXPECT_TRUE(network->getDdnsOverrideClientUpdate().unspecified()); + EXPECT_FALSE(network->getDdnsOverrideClientUpdate().get()); + EXPECT_TRUE(network->getDdnsReplaceClientNameMode().unspecified()); + EXPECT_EQ(D2ClientConfig::RCM_NEVER, network->getDdnsReplaceClientNameMode().get()); + + EXPECT_TRUE(network->getDdnsGeneratedPrefix().unspecified()); + EXPECT_TRUE(network->getDdnsGeneratedPrefix().empty()); + + EXPECT_TRUE(network->getDdnsQualifyingSuffix().unspecified()); + EXPECT_TRUE(network->getDdnsQualifyingSuffix().empty()); +} // There's no test for ControlSocketParser, as it is tested in the DHCPv4 code // (see CtrlDhcpv4SrvTest.commandSocketBasic in diff --git a/src/lib/dhcpsrv/tests/network_unittest.cc b/src/lib/dhcpsrv/tests/network_unittest.cc index ab74ea8af2..c5d140954e 100644 --- a/src/lib/dhcpsrv/tests/network_unittest.cc +++ b/src/lib/dhcpsrv/tests/network_unittest.cc @@ -128,7 +128,6 @@ public: EXPECT_EQ(global_value, ((*net_child).*GetMethodPointer)(Network::Inheritance::GLOBAL).get()); - EXPECT_TRUE(((*net_child).*GetMethodPointer)(Network::Inheritance::NONE).unspecified()); EXPECT_TRUE(((*net_child).*GetMethodPointer)(Network::Inheritance::PARENT_NETWORK).unspecified()); } @@ -174,6 +173,12 @@ TEST_F(NetworkTest, inheritanceSupport4) { globals_->set("next-server", Element::create("192.0.2.3")); globals_->set("server-hostname", Element::create("g")); globals_->set("boot-file-name", Element::create("g")); + globals_->set("ddns-send-updates", Element::create(true)); + globals_->set("ddns-override-no-update", Element::create(true)); + globals_->set("ddns-override-client-update", Element::create(true)); + globals_->set("ddns-replace-client-name", Element::create("always")); + globals_->set("ddns-generated-prefix", Element::create("gp")); + globals_->set("ddns-qualifying-suffix", Element::create("gs")); // For each parameter for which inheritance is supported run // the test that checks if the values are inherited properly. @@ -260,6 +265,44 @@ TEST_F(NetworkTest, inheritanceSupport4) { &Network4::setFilename, "n", "g"); } + { + SCOPED_TRACE("ddns-send-updates"); + testNetworkInheritance(&Network4::getDdnsSendUpdates, + &Network4::setDdnsSendUpdates, + false, true); + } + { + SCOPED_TRACE("ddns-override-no-update"); + testNetworkInheritance(&Network4::getDdnsOverrideNoUpdate, + &Network4::setDdnsOverrideNoUpdate, + false, true); + } + { + SCOPED_TRACE("ddns-override-client-update"); + testNetworkInheritance(&Network4::getDdnsOverrideClientUpdate, + &Network4::setDdnsOverrideClientUpdate, + false, true); + } + + { + SCOPED_TRACE("ddns-replace-client-name"); + testNetworkInheritance(&Network4::getDdnsReplaceClientNameMode, + &Network4::setDdnsReplaceClientNameMode, + D2ClientConfig::RCM_WHEN_PRESENT, + D2ClientConfig::RCM_ALWAYS); + } + { + SCOPED_TRACE("ddns-generated-prefix"); + testNetworkInheritance(&Network4::getDdnsGeneratedPrefix, + &Network4::setDdnsGeneratedPrefix, + "np", "gp"); + } + { + SCOPED_TRACE("ddns-qualifying-suffix"); + testNetworkInheritance(&Network4::getDdnsQualifyingSuffix, + &Network4::setDdnsQualifyingSuffix, + "ns", "gs"); + } } // This test verifies that the inheritance is supported for DHCPv6 @@ -268,6 +311,12 @@ TEST_F(NetworkTest, inheritanceSupport6) { // Set global values for each parameter. globals_->set("preferred-lifetime", Element::create(80)); globals_->set("rapid-commit", Element::create(false)); + globals_->set("ddns-send-updates", Element::create(true)); + globals_->set("ddns-override-no-update", Element::create(true)); + globals_->set("ddns-override-client-update", Element::create(true)); + globals_->set("ddns-replace-client-name", Element::create("always")); + globals_->set("ddns-generated-prefix", Element::create("gp")); + globals_->set("ddns-qualifying-suffix", Element::create("gs")); // For each parameter for which inheritance is supported run // the test that checks if the values are inherited properly. @@ -284,6 +333,44 @@ TEST_F(NetworkTest, inheritanceSupport6) { &Network6::setRapidCommit, true, false); } + { + SCOPED_TRACE("ddns-send-updates"); + testNetworkInheritance(&Network4::getDdnsSendUpdates, + &Network4::setDdnsSendUpdates, + false, true); + } + { + SCOPED_TRACE("ddns-override-no-update"); + testNetworkInheritance(&Network4::getDdnsOverrideNoUpdate, + &Network4::setDdnsOverrideNoUpdate, + false, true); + } + { + SCOPED_TRACE("ddns-override-client-update"); + testNetworkInheritance(&Network4::getDdnsOverrideClientUpdate, + &Network4::setDdnsOverrideClientUpdate, + false, true); + } + + { + SCOPED_TRACE("ddns-replace-client-name"); + testNetworkInheritance(&Network4::getDdnsReplaceClientNameMode, + &Network4::setDdnsReplaceClientNameMode, + D2ClientConfig::RCM_WHEN_PRESENT, + D2ClientConfig::RCM_ALWAYS); + } + { + SCOPED_TRACE("ddns-generated-prefix"); + testNetworkInheritance(&Network4::getDdnsGeneratedPrefix, + &Network4::setDdnsGeneratedPrefix, + "np", "gp"); + } + { + SCOPED_TRACE("ddns-qualifying-suffix"); + testNetworkInheritance(&Network4::getDdnsQualifyingSuffix, + &Network4::setDdnsQualifyingSuffix, + "ns", "gs"); + } // Interface-id requires special type of test. boost::shared_ptr net_child(new TestNetwork6()); diff --git a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc index 9fdbdf61f5..2dac1ffa76 100644 --- a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc +++ b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc @@ -135,6 +135,12 @@ public: " \"calculate-tee-times\": true," " \"t1-percent\": 0.345," " \"t2-percent\": 0.721," + " \"ddns-send-updates\": true," + " \"ddns-override-no-update\": true," + " \"ddns-override-client-update\": true," + " \"ddns-replace-client-name\": \"always\"," + " \"ddns-generated-prefix\": \"prefix\"," + " \"ddns-qualifying-suffix\": \"example.com.\"," " \"option-data\": [" " {" " \"name\": \"domain-name-servers\"," @@ -246,6 +252,12 @@ TEST_F(SharedNetwork4ParserTest, parse) { EXPECT_EQ("10.0.0.1", network->getSiaddr().get().toText()); EXPECT_EQ("example.org", network->getSname().get()); EXPECT_EQ(Network::HR_OUT_OF_POOL, network->getHostReservationMode()); + EXPECT_TRUE(network->getDdnsSendUpdates().get()); + EXPECT_TRUE(network->getDdnsOverrideNoUpdate().get()); + EXPECT_TRUE(network->getDdnsOverrideClientUpdate().get()); + EXPECT_EQ(D2ClientConfig::RCM_ALWAYS, network->getDdnsReplaceClientNameMode().get()); + EXPECT_EQ("prefix", network->getDdnsGeneratedPrefix().get()); + EXPECT_EQ("example.com.", network->getDdnsQualifyingSuffix().get()); // Relay information. auto relay_info = network->getRelayInfo(); @@ -445,6 +457,12 @@ public: " \"calculate-tee-times\": true," " \"t1-percent\": 0.345," " \"t2-percent\": 0.721," + " \"ddns-send-updates\": true," + " \"ddns-override-no-update\": true," + " \"ddns-override-client-update\": true," + " \"ddns-replace-client-name\": \"always\"," + " \"ddns-generated-prefix\": \"prefix\"," + " \"ddns-qualifying-suffix\": \"example.com.\"," " \"option-data\": [" " {" " \"name\": \"dns-servers\"," @@ -537,6 +555,12 @@ TEST_F(SharedNetwork6ParserTest, parse) { EXPECT_TRUE(network->getCalculateTeeTimes()); EXPECT_EQ(0.345, network->getT1Percent()); EXPECT_EQ(0.721, network->getT2Percent()); + EXPECT_TRUE(network->getDdnsSendUpdates().get()); + EXPECT_TRUE(network->getDdnsOverrideNoUpdate().get()); + EXPECT_TRUE(network->getDdnsOverrideClientUpdate().get()); + EXPECT_EQ(D2ClientConfig::RCM_ALWAYS, network->getDdnsReplaceClientNameMode().get()); + EXPECT_EQ("prefix", network->getDdnsGeneratedPrefix().get()); + EXPECT_EQ("example.com.", network->getDdnsQualifyingSuffix().get()); // Relay information. auto relay_info = network->getRelayInfo(); diff --git a/src/lib/dhcpsrv/tests/shared_network_unittest.cc b/src/lib/dhcpsrv/tests/shared_network_unittest.cc index 75e44215f3..2d66f18237 100644 --- a/src/lib/dhcpsrv/tests/shared_network_unittest.cc +++ b/src/lib/dhcpsrv/tests/shared_network_unittest.cc @@ -66,6 +66,24 @@ TEST(SharedNetwork4Test, defaults) { EXPECT_TRUE(network->getAuthoritative().unspecified()); EXPECT_FALSE(network->getAuthoritative().get()); + + EXPECT_TRUE(network->getDdnsSendUpdates().unspecified()); + EXPECT_FALSE(network->getDdnsSendUpdates().get()); + + EXPECT_TRUE(network->getDdnsOverrideNoUpdate().unspecified()); + EXPECT_FALSE(network->getDdnsOverrideNoUpdate().get()); + + EXPECT_TRUE(network->getDdnsOverrideClientUpdate().unspecified()); + EXPECT_FALSE(network->getDdnsOverrideClientUpdate().get()); + + EXPECT_TRUE(network->getDdnsReplaceClientNameMode().unspecified()); + EXPECT_EQ(D2ClientConfig::RCM_NEVER, network->getDdnsReplaceClientNameMode().get()); + + EXPECT_TRUE(network->getDdnsGeneratedPrefix().unspecified()); + EXPECT_TRUE(network->getDdnsGeneratedPrefix().empty()); + + EXPECT_TRUE(network->getDdnsQualifyingSuffix().unspecified()); + EXPECT_TRUE(network->getDdnsQualifyingSuffix().empty()); } // This test verifies that shared network can be given a name and that @@ -679,6 +697,24 @@ TEST(SharedNetwork6Test, defaults) { EXPECT_TRUE(network->getRapidCommit().unspecified()); EXPECT_FALSE(network->getRapidCommit().get()); + + EXPECT_TRUE(network->getDdnsSendUpdates().unspecified()); + EXPECT_FALSE(network->getDdnsSendUpdates().get()); + + EXPECT_TRUE(network->getDdnsOverrideNoUpdate().unspecified()); + EXPECT_FALSE(network->getDdnsOverrideNoUpdate().get()); + + EXPECT_TRUE(network->getDdnsOverrideClientUpdate().unspecified()); + EXPECT_FALSE(network->getDdnsOverrideClientUpdate().get()); + + EXPECT_TRUE(network->getDdnsReplaceClientNameMode().unspecified()); + EXPECT_EQ(D2ClientConfig::RCM_NEVER, network->getDdnsReplaceClientNameMode().get()); + + EXPECT_TRUE(network->getDdnsGeneratedPrefix().unspecified()); + EXPECT_TRUE(network->getDdnsGeneratedPrefix().empty()); + + EXPECT_TRUE(network->getDdnsQualifyingSuffix().unspecified()); + EXPECT_TRUE(network->getDdnsQualifyingSuffix().empty()); } // This test verifies that shared network can be given a name and that diff --git a/src/lib/dhcpsrv/tests/subnet_unittest.cc b/src/lib/dhcpsrv/tests/subnet_unittest.cc index 3201e71ea0..5bde914cda 100644 --- a/src/lib/dhcpsrv/tests/subnet_unittest.cc +++ b/src/lib/dhcpsrv/tests/subnet_unittest.cc @@ -115,6 +115,24 @@ TEST(Subnet4Test, defaults) { EXPECT_TRUE(subnet.get4o6().getSubnet4o6().unspecified()); EXPECT_TRUE(subnet.get4o6().getSubnet4o6().get().first.isV6Zero()); EXPECT_EQ(128, subnet.get4o6().getSubnet4o6().get().second); + + EXPECT_TRUE(subnet.getDdnsSendUpdates().unspecified()); + EXPECT_FALSE(subnet.getDdnsSendUpdates().get()); + + EXPECT_TRUE(subnet.getDdnsOverrideNoUpdate().unspecified()); + EXPECT_FALSE(subnet.getDdnsOverrideNoUpdate().get()); + + EXPECT_TRUE(subnet.getDdnsOverrideClientUpdate().unspecified()); + EXPECT_FALSE(subnet.getDdnsOverrideClientUpdate().get()); + + EXPECT_TRUE(subnet.getDdnsReplaceClientNameMode().unspecified()); + EXPECT_EQ(D2ClientConfig::RCM_NEVER, subnet.getDdnsReplaceClientNameMode().get()); + + EXPECT_TRUE(subnet.getDdnsGeneratedPrefix().unspecified()); + EXPECT_TRUE(subnet.getDdnsGeneratedPrefix().empty()); + + EXPECT_TRUE(subnet.getDdnsQualifyingSuffix().unspecified()); + EXPECT_TRUE(subnet.getDdnsQualifyingSuffix().empty()); } // Checks that the subnet id can be either autogenerated or set to an @@ -819,6 +837,24 @@ TEST(SharedNetwork6Test, defaults) { EXPECT_TRUE(subnet.getRapidCommit().unspecified()); EXPECT_FALSE(subnet.getRapidCommit().get()); + + EXPECT_TRUE(subnet.getDdnsSendUpdates().unspecified()); + EXPECT_FALSE(subnet.getDdnsSendUpdates().get()); + + EXPECT_TRUE(subnet.getDdnsOverrideNoUpdate().unspecified()); + EXPECT_FALSE(subnet.getDdnsOverrideNoUpdate().get()); + + EXPECT_TRUE(subnet.getDdnsOverrideClientUpdate().unspecified()); + EXPECT_FALSE(subnet.getDdnsOverrideClientUpdate().get()); + + EXPECT_TRUE(subnet.getDdnsReplaceClientNameMode().unspecified()); + EXPECT_EQ(D2ClientConfig::RCM_NEVER, subnet.getDdnsReplaceClientNameMode().get()); + + EXPECT_TRUE(subnet.getDdnsGeneratedPrefix().unspecified()); + EXPECT_TRUE(subnet.getDdnsGeneratedPrefix().empty()); + + EXPECT_TRUE(subnet.getDdnsQualifyingSuffix().unspecified()); + EXPECT_TRUE(subnet.getDdnsQualifyingSuffix().empty()); } // Checks that the subnet id can be either autogenerated or set to an