]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#35,!517] Added DDDNS parameters to networks,subnets, and their parsers
authorThomas Markwalder <tmark@isc.org>
Thu, 26 Sep 2019 12:33:41 +0000 (08:33 -0400)
committerThomas Markwalder <tmark@isc.org>
Thu, 10 Oct 2019 12:32:44 +0000 (08:32 -0400)
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.

15 files changed:
src/lib/dhcpsrv/network.cc
src/lib/dhcpsrv/network.h
src/lib/dhcpsrv/parsers/base_network_parser.cc
src/lib/dhcpsrv/parsers/base_network_parser.h
src/lib/dhcpsrv/parsers/dhcp_parsers.cc
src/lib/dhcpsrv/parsers/shared_network_parser.cc
src/lib/dhcpsrv/parsers/simple_parser4.cc
src/lib/dhcpsrv/parsers/simple_parser6.cc
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

index 27562b2740f1c19cc78a5c1f1c8aaf0c838c054e..41a8feca4f10a94b2b69e6bd92dbae4b0cb40fed 100644 (file)
@@ -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);
 }
 
index 65848eb133d10912ab399b03b6b36a6eddd758f2..928f5ea067730b4dcabc05d7f95b77b25a22f3b9 100644 (file)
@@ -16,6 +16,7 @@
 #include <dhcp/option.h>
 #include <dhcpsrv/cfg_option.h>
 #include <dhcpsrv/cfg_4o6.h>
+#include <dhcpsrv/d2_client_cfg.h>
 #include <dhcpsrv/triplet.h>
 #include <util/optional.h>
 #include <boost/shared_ptr.hpp>
@@ -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<bool>
+    getDdnsSendUpdates(const Inheritance& inheritance = Inheritance::ALL) const {
+        return (getProperty<Network>(&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<bool>& ddns_send_updates) {
+        ddns_send_updates_ = ddns_send_updates;
+    }
+
+    /// @brief Returns ddns-override-no-update 
+    ///
+    /// @param inheritance inheritance mode to be used.
+    util::Optional<bool>
+    getDdnsOverrideNoUpdate(const Inheritance& inheritance = Inheritance::ALL) const {
+        return (getProperty<Network>(&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<bool>& 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<bool>
+    getDdnsOverrideClientUpdate(const Inheritance& inheritance = Inheritance::ALL) const {
+        return (getProperty<Network>(&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<bool>& 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<D2ClientConfig::ReplaceClientNameMode>
+    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<D2ClientConfig::ReplaceClientNameMode>& mode
+            = getProperty<Network>(&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<std::string> 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<D2ClientConfig::ReplaceClientNameMode>& 
+                                          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<std::string>
+    getDdnsGeneratedPrefix(const Inheritance& inheritance = Inheritance::ALL) const {
+        return (getProperty<Network>(&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<std::string>& ddns_generated_prefix) {
+        ddns_generated_prefix_ = ddns_generated_prefix;
+    }
+
+    /// @brief Returns ddns-qualifying-suffix 
+    ///
+    /// @param inheritance inheritance mode to be used.
+    util::Optional<std::string>
+    getDdnsQualifyingSuffix(const Inheritance& inheritance = Inheritance::ALL) const {
+        return (getProperty<Network>(&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<std::string>& 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<double> t2_percent_;
 
+    /// @brief Should Kea perform DNS updates. Used to provide scoped enabling
+    /// and disabling of updates.
+    util::Optional<bool> 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<bool> ddns_override_no_update_;
+
+    /// @brief Should Kea perform updates, even if client requested delegation.
+    util::Optional<bool> ddns_override_client_update_;
+
+    /// @brief How Kea should handle the domain-name supplied by the client.
+    util::Optional<D2ClientConfig::ReplaceClientNameMode> ddns_replace_client_name_mode_;
+
+    /// @brief Prefix Kea should use when generating domain-names.
+    util::Optional<std::string> ddns_generated_prefix_;
+
+    /// @brief Suffix Kea should use when to qualify partial domain-names.
+    util::Optional<std::string> 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
index a83614defef7819e2c1038e7343d18f7891f48c1..c67ee172fe493ff1bfa2b78e7ff3e9bb9325c39c 100644 (file)
@@ -18,11 +18,11 @@ namespace dhcp {
 const Triplet<uint32_t>
 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<D2ClientConfig::ReplaceClientNameMode,
+                                                            D2ClientConfig::stringToReplaceClientNameMode>
+                                                            (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
index 1800524e6f6541409b6e93486ec37af527dd3733..ac4196db8d84be10d79b543044085786abb42cc9 100644 (file)
@@ -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
index a50616e5014eeb873de3c6eef90a549754466e1c..57ad4df3766c1c6ab17af5d9f2e70399268311c9 100644 (file)
@@ -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 ********************
index 4ec06d6381ae74f76ca6ba89190fe971568eea8a..4d3edba0d6630476dcb91ac3fcb7950db06497b8 100644 (file)
@@ -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() << ")");
index 7e2ba9e614c9dbc05c4b3acf0fcd9693637db948..a2a0e74557984fb2837ec1cd19c6d67f8263588d 100644 (file)
@@ -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.
index d2c5d8b69cdcb6443c93ed8e408bd481027985f1..0454560e6b677efeb3e4293236d31b1d8d1cfedf 100644 (file)
@@ -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.
index 54b28e5af17ac5903649212cddee25fee894334d..3114d0bea73bd03a97cf17138eb09c49a3ae0b5c 100644 (file)
@@ -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<uint32_t>(100));
     network2->setT2(Triplet<uint32_t>(200));
     network2->setValid(Triplet<uint32_t>(200, 300, 400));
+    network2->setDdnsSendUpdates(false);
 
     network3->setIface("eth2");
     network3->setValid(Triplet<uint32_t>(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"
index 6d338083fc465a83798f9c1ce6b8b6c0975f17d7..e6643657fcdce753f9ac6864ed85166324e8bb87 100644 (file)
@@ -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<uint32_t>(100));
     network2->setT2(Triplet<uint32_t>(200));
     network2->setPreferred(Triplet<uint32_t>(200));
     network2->setValid(Triplet<uint32_t>(300));
+    network2->setDdnsSendUpdates(false);
 
     network3->setIface("eth2");
     network3->setPreferred(Triplet<uint32_t>(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"
index 4d670afed5fd874f646ac467158b17647c1436c7..6f31c24a13e2d4b00ff5eea9cf7240ffe0854500 100644 (file)
@@ -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
index ab74ea8af2aab5e974410d49d1f446c19a744ddc..c5d140954e577d76ae5d7e69b3b90b6585ea0595 100644 (file)
@@ -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<TestNetwork4>(&Network4::getDdnsSendUpdates,
+                                             &Network4::setDdnsSendUpdates,
+                                             false, true);
+    }
+    {
+        SCOPED_TRACE("ddns-override-no-update");
+        testNetworkInheritance<TestNetwork4>(&Network4::getDdnsOverrideNoUpdate,
+                                             &Network4::setDdnsOverrideNoUpdate,
+                                             false, true);
+    }
+    {
+        SCOPED_TRACE("ddns-override-client-update");
+        testNetworkInheritance<TestNetwork4>(&Network4::getDdnsOverrideClientUpdate,
+                                             &Network4::setDdnsOverrideClientUpdate,
+                                             false, true);
+    }
+
+    {
+        SCOPED_TRACE("ddns-replace-client-name");
+        testNetworkInheritance<TestNetwork4>(&Network4::getDdnsReplaceClientNameMode,
+                                             &Network4::setDdnsReplaceClientNameMode,
+                                             D2ClientConfig::RCM_WHEN_PRESENT,
+                                             D2ClientConfig::RCM_ALWAYS); 
+    }
+    {
+        SCOPED_TRACE("ddns-generated-prefix");
+        testNetworkInheritance<TestNetwork4>(&Network4::getDdnsGeneratedPrefix,
+                                             &Network4::setDdnsGeneratedPrefix,
+                                             "np", "gp");
+    }
+    {
+        SCOPED_TRACE("ddns-qualifying-suffix");
+        testNetworkInheritance<TestNetwork4>(&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<TestNetwork4>(&Network4::getDdnsSendUpdates,
+                                             &Network4::setDdnsSendUpdates,
+                                             false, true);
+    }
+    {
+        SCOPED_TRACE("ddns-override-no-update");
+        testNetworkInheritance<TestNetwork4>(&Network4::getDdnsOverrideNoUpdate,
+                                             &Network4::setDdnsOverrideNoUpdate,
+                                             false, true);
+    }
+    {
+        SCOPED_TRACE("ddns-override-client-update");
+        testNetworkInheritance<TestNetwork4>(&Network4::getDdnsOverrideClientUpdate,
+                                             &Network4::setDdnsOverrideClientUpdate,
+                                             false, true);
+    }
+
+    {
+        SCOPED_TRACE("ddns-replace-client-name");
+        testNetworkInheritance<TestNetwork4>(&Network4::getDdnsReplaceClientNameMode,
+                                             &Network4::setDdnsReplaceClientNameMode,
+                                             D2ClientConfig::RCM_WHEN_PRESENT,
+                                             D2ClientConfig::RCM_ALWAYS); 
+    }
+    {
+        SCOPED_TRACE("ddns-generated-prefix");
+        testNetworkInheritance<TestNetwork4>(&Network4::getDdnsGeneratedPrefix,
+                                             &Network4::setDdnsGeneratedPrefix,
+                                             "np", "gp");
+    }
+    {
+        SCOPED_TRACE("ddns-qualifying-suffix");
+        testNetworkInheritance<TestNetwork4>(&Network4::getDdnsQualifyingSuffix,
+                                             &Network4::setDdnsQualifyingSuffix,
+                                             "ns", "gs");
+    }
 
     // Interface-id requires special type of test.
     boost::shared_ptr<TestNetwork6> net_child(new TestNetwork6());
index 9fdbdf61f54e5d3892d1baba82f25b5acf9b70b8..2dac1ffa76d203147e2f0ac18ff42c024cbd1bb1 100644 (file)
@@ -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();
index 75e44215f3e7f5821d8f69e497016a1ab29aec55..2d66f182374eb2bbef430912b086d7fab041f039 100644 (file)
@@ -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
index 3201e71ea017b1dabdd3ea61f244b3903f3fbdeb..5bde914cdaa3253091ab1ed8092ed4b40857559e 100644 (file)
@@ -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