]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#65,!96] TranslatorConfig reworked
authorTomek Mrugalski <tomasz@isc.org>
Thu, 25 Oct 2018 10:29:17 +0000 (12:29 +0200)
committerTomek Mrugalski <tomasz@isc.org>
Thu, 25 Oct 2018 10:29:17 +0000 (12:29 +0200)
 - getParam added
 - many larger functions refactored

src/lib/yang/translator_config.cc
src/lib/yang/translator_config.h

index 04a7ae8c8eae0179b18193f1b7d49e180492aad5..7ea51fb0807997c82a6a1e8e58b146d2ed46bd2a 100644 (file)
@@ -97,55 +97,18 @@ TranslatorConfig::getConfigKea6() {
     return (result);
 }
 
-ElementPtr
-TranslatorConfig::getServerKeaDhcpCommon(const string& xpath) {
-    ElementPtr result = Element::createMap();
-    ConstElementPtr valid = getItem(xpath + "/valid-lifetime");
-    if (valid) {
-        result->set("valid-lifetime", valid);
-    }
-    ConstElementPtr renew = getItem(xpath + "/renew-timer");
-    if (renew) {
-        result->set("renew-timer", renew);
-    }
-    ConstElementPtr rebind = getItem(xpath + "/rebind-timer");
-    if (rebind) {
-        result->set("rebind-timer", rebind);
-    }
-    ConstElementPtr period = getItem(xpath + "/decline-probation-period");
-    if (period) {
-        result->set("decline-probation-period", period);
-    }
-    ConstElementPtr networks = getSharedNetworks(xpath + "/shared-networks");
-    if (networks && (networks->size() > 0)) {
-        result->set("shared-networks", networks);
-    }
-    ConstElementPtr classes = getClasses(xpath + "/client-classes");
-    if (classes && (classes->size() > 0)) {
-        result->set("client-classes", classes);
-    }
-    ConstElementPtr database = getDatabase(xpath + "/lease-database");
-    if (database) {
-        result->set("lease-database", database);
-    }
-    ConstElementPtr databases = getDatabases(xpath + "/hosts-databases");
-    if (databases && (databases->size() > 0)) {
-        result->set("hosts-databases", databases);
-    }
-    ConstElementPtr host_ids =
-        getItems(xpath + "/host-reservation-identifiers");
-    if (host_ids) {
-        result->set("host-reservation-identifiers", host_ids);
-    }
-    ConstElementPtr defs = getOptionDefList(xpath + "/option-def-list");
-    if (defs && (defs->size() > 0)) {
-        result->set("option-def", defs);
-    }
-    ConstElementPtr options = getOptionDataList(xpath + "/option-data-list");
-    if (options && (options->size() > 0)) {
-        result->set("option-data", options);
+void
+TranslatorConfig::getParam(ElementPtr& storage, const std::string& xpath,
+                           const std::string& name) {
+    ConstElementPtr x = getItem(xpath + "/" + name);
+    if (x) {
+        storage->set(name, x);
     }
-    S_Iter_Value iter = getIter(xpath + "/hooks-libraries/*");
+}
+
+ElementPtr
+TranslatorConfig::getHooksKea(std::string xpath) {
+    S_Iter_Value iter = getIter(xpath + "/*");
     if (iter) {
         ElementPtr hook_libs = Element::createList();
         for (;;) {
@@ -168,137 +131,142 @@ TranslatorConfig::getServerKeaDhcpCommon(const string& xpath) {
                 hook_libs->add(hook_lib);
             }
         }
-        if (hook_libs->size() > 0) {
-            result->set("hooks-libraries", hook_libs);
+        if (!hook_libs->empty()) {
+            return (hook_libs);
         }
     }
+    return (ElementPtr());
+}
+
+isc::data::ElementPtr
+TranslatorConfig::getExpiredKea(std::string xpath) {
     ElementPtr expired = Element::createMap();
-    ConstElementPtr reclaim =
-        getItem(xpath + "/expired-leases-processing/reclaim-timer-wait-time");
-    if (reclaim) {
-        expired->set("reclaim-timer-wait-time", reclaim);
-    }
-    ConstElementPtr flush =
-        getItem(xpath + "/expired-leases-processing/flush-reclaimed-timer-wait-time");
-    if (flush) {
-        expired->set("flush-reclaimed-timer-wait-time", flush);
-    }
-    ConstElementPtr hold =
-        getItem(xpath + "/expired-leases-processing/hold-reclaimed-time");
-    if (hold) {
-        expired->set("hold-reclaimed-time", hold);
-    }
-    ConstElementPtr max_leases =
-        getItem(xpath + "/expired-leases-processing/max-reclaim-leases");
-    if (max_leases) {
-        expired->set("max-reclaim-leases", max_leases);
-    }
-    ConstElementPtr max_time =
-        getItem(xpath + "/expired-leases-processing/max-reclaim-time");
-    if (max_time) {
-        expired->set("max-reclaim-time", max_time);
-    }
-    ConstElementPtr unwarned =
-        getItem(xpath + "/expired-leases-processing/unwarned-reclaim-cycles");
-    if (unwarned) {
-        expired->set("unwarned-reclaim-cycles", unwarned);
-    }
+
+    getParam(expired, xpath, "reclaim-timer-wait-time");
+    getParam(expired, xpath, "flush-reclaimed-timer-wait-time");
+    getParam(expired, xpath, "hold-reclaimed-time");
+    getParam(expired, xpath, "max-reclaim-leases");
+    getParam(expired, xpath, "max-reclaim-time");
+    getParam(expired, xpath, "unwarned-reclaim-cycles");
+
     if (expired->size() > 0) {
-        result->set("expired-leases-processing", expired);
-    }
-    ConstElementPtr port = getItem(xpath + "/dhcp4o6-port");
-    if (port) {
-        result->set("dhcp4o6-port", port);
-    }
-    ConstElementPtr socket = getControlSocket(xpath + "/control-socket");
-    if (socket) {
-        result->set("control-socket", socket);
+        return (expired);
     }
+
+    return (ElementPtr());
+}
+
+isc::data::ElementPtr
+TranslatorConfig::getDdnsKea(std::string xpath) {
     ElementPtr ddns = Element::createMap();
-    ConstElementPtr enable = getItem(xpath + "/dhcp-ddns/enable-updates");
-    if (enable) {
-        ddns->set("enable-updates", enable);
-    }
-    ConstElementPtr suffix = getItem(xpath + "/dhcp-ddns/qualifying-suffix");
-    if (suffix) {
-        ddns->set("qualifying-suffix", suffix);
-    }
-    ConstElementPtr server_ip = getItem(xpath + "/dhcp-ddns/server-ip");
-    if (server_ip) {
-        ddns->set("server-ip", server_ip);
-    }
-    ConstElementPtr server_port = getItem(xpath + "/dhcp-ddns/server-port");
-    if (server_port) {
-        ddns->set("server-port", server_port);
-    }
-    ConstElementPtr sender_ip = getItem(xpath + "/dhcp-ddns/sender-ip");
-    if (sender_ip) {
-        ddns->set("sender-ip", sender_ip);
-    }
-    ConstElementPtr sender_port = getItem(xpath + "/dhcp-ddns/sender-port");
-    if (sender_port) {
-        ddns->set("sender-port", sender_port);
+    getParam(ddns, xpath, "enable-updates");
+    getParam(ddns, xpath, "qualifying-suffix");
+    getParam(ddns, xpath, "server-ip");
+    getParam(ddns, xpath, "server-port");
+    getParam(ddns, xpath, "sender-ip");
+    getParam(ddns, xpath, "sender-port");
+    getParam(ddns, xpath, "max-queue-size");
+    getParam(ddns, xpath, "ncr-protocol");
+    getParam(ddns, xpath, "ncr-format");
+    getParam(ddns, xpath, "always-include-fqdn");
+    getParam(ddns, xpath, "override-no-update");
+    getParam(ddns, xpath, "override-client-update");
+    getParam(ddns, xpath, "replace-client-name");
+    getParam(ddns, xpath, "generated-prefix");
+    getParam(ddns, xpath, "hostname-char-set");
+    getParam(ddns, xpath, "hostname-char-replacement");
+    getParam(ddns, xpath, "");
+    getParam(ddns, xpath, "");
+
+    ConstElementPtr context = getItem(xpath + "/dhcp-ddns/user-context");
+    if (context) {
+        ddns->set("user-context", Element::fromJSON(context->stringValue()));
     }
-    ConstElementPtr queue = getItem(xpath + "/dhcp-ddns/max-queue-size");
-    if (queue) {
-        ddns->set("max-queue-size", queue);
+
+    if (!ddns->empty()) {
+        // If there's something to return, use it.
+        return (ddns);
     }
-    ConstElementPtr protocol = getItem(xpath + "/dhcp-ddns/ncr-protocol");
-    if (protocol) {
-        ddns->set("ncr-protocol", protocol);
+
+    // If not, return null
+    return (ElementPtr());
+}
+
+ElementPtr
+TranslatorConfig::getServerKeaDhcpCommon(const string& xpath) {
+    ElementPtr result = Element::createMap();
+
+    getParam(result, xpath, "valid-lifetime");
+    getParam(result, xpath, "renew-timer");
+    getParam(result, xpath, "rebind-timer");
+    getParam(result, xpath, "decline-probation-period");
+
+    ConstElementPtr networks = getSharedNetworks(xpath + "/shared-networks");
+    if (networks && !networks->empty()) {
+        result->set("shared-networks", networks);
     }
-    ConstElementPtr format = getItem(xpath + "/dhcp-ddns/ncr-format");
-    if (format) {
-        ddns->set("ncr-format", format);
+    ConstElementPtr classes = getClasses(xpath + "/client-classes");
+    if (classes && !classes->empty()) {
+        result->set("client-classes", classes);
     }
-    ConstElementPtr always = getItem(xpath + "/dhcp-ddns/always-include-fqdn");
-    if (always) {
-        ddns->set("always-include-fqdn", always);
+    ConstElementPtr database = getDatabase(xpath + "/lease-database");
+    if (database) {
+        result->set("lease-database", database);
     }
-    ConstElementPtr no_up = getItem(xpath + "/dhcp-ddns/override-no-update");
-    if (no_up) {
-        ddns->set("override-no-update", no_up);
+    ConstElementPtr databases = getDatabases(xpath + "/hosts-databases");
+    if (databases && !databases->empty()) {
+        result->set("hosts-databases", databases);
     }
-    ConstElementPtr client =
-        getItem(xpath + "/dhcp-ddns/override-client-update");
-    if (client) {
-        ddns->set("override-client-update", client);
+
+    getParam(result, xpath, "host-reservation-identifiers");
+    ConstElementPtr host_ids =
+        getItems(xpath + "/");
+    if (host_ids) {
+        result->set("host-reservation-identifiers", host_ids);
     }
-    ConstElementPtr replace =
-        getItem(xpath + "/dhcp-ddns/replace-client-name");
-    if (replace) {
-        ddns->set("replace-client-name", replace);
+    ConstElementPtr defs = getOptionDefList(xpath + "/option-def-list");
+    if (defs && !defs->empty()) {
+        result->set("option-def", defs);
     }
-    ConstElementPtr generated = getItem(xpath + "/dhcp-ddns/generated-prefix");
-    if (generated) {
-        ddns->set("generated-prefix", generated);
+    ConstElementPtr options = getOptionDataList(xpath + "/option-data-list");
+    if (options && !options->empty()) {
+        result->set("option-data", options);
     }
-    ConstElementPtr char_set = getItem(xpath + "/dhcp-ddns/hostname-char-set");
-    if (char_set) {
-        ddns->set("hostname-char-set", char_set);
+
+    ConstElementPtr hooks = getHooksKea(xpath + "/hooks-libraries");
+    if (hooks && !hooks->empty()) {
+        result->set("hooks-libraries", hooks);
     }
-    ConstElementPtr char_repl =
-        getItem(xpath + "/dhcp-ddns/hostname-char-replacement");
-    if (char_repl) {
-        ddns->set("hostname-char-replacement", char_repl);
+
+    ConstElementPtr expired = getExpiredKea(xpath + "/expired-leases-processing");
+    if (expired) {
+        result->set("expired-leases-processing", expired);
     }
-    ConstElementPtr context = getItem(xpath + "/dhcp-ddns/user-context");
-    if (context) {
-        ddns->set("user-context", Element::fromJSON(context->stringValue()));
+
+    getParam(result, xpath, "dhcp4o6-port");
+
+    ConstElementPtr socket = getControlSocket(xpath + "/control-socket");
+    if (socket) {
+        result->set("control-socket", socket);
     }
-    if (ddns->size() > 0) {
+
+    ConstElementPtr ddns = getDdnsKea(xpath + "/dhcp-ddns");
+    if (!ddns->empty()) {
         result->set("dhcp-ddns", ddns);
     }
-    context = getItem(xpath + "/user-context");
+
+    ConstElementPtr context = getItem(xpath + "/user-context");
     if (context) {
         result->set("user-context", Element::fromJSON(context->stringValue()));
     }
+
     ConstElementPtr checks = getItem(xpath + "/sanity-checks/lease-checks");
     if (checks) {
         ElementPtr sanity = Element::createMap();
         sanity->set("lease-checks", checks);
         result->set("sanity-checks", sanity);
     }
+
     ConstElementPtr hosts = getHosts(xpath + "/reservations");
     if (hosts && (hosts->size() > 0)) {
         result->set("reservations", hosts);
@@ -306,63 +274,41 @@ TranslatorConfig::getServerKeaDhcpCommon(const string& xpath) {
     return (result);
 }
 
+
 ElementPtr
 TranslatorConfig::getServerKeaDhcp4() {
     string xpath = "/kea-dhcp4-server:config";
     ElementPtr result = getServerKeaDhcpCommon(xpath);
     ConstElementPtr subnets = getSubnets(xpath + "/subnet4");
-    if (subnets && (subnets->size() > 0)) {
+    if (subnets && !subnets->empty()) {
         result->set("subnet4", subnets);
     }
+
+    // Handle interfaces
     ElementPtr if_config = Element::createMap();
     ConstElementPtr ifs = getItems(xpath + "/interfaces-config/interfaces");
-    if (ifs && (ifs->size() > 0)) {
+    if (ifs && !ifs->empty()) {
         if_config->set("interfaces", ifs);
     }
-    ConstElementPtr ds_type =
-        getItem(xpath + "/interfaces-config/dhcp-socket-type");
-    if (ds_type) {
-        if_config->set("dhcp-socket-type", ds_type);
-    }
-    ConstElementPtr out_if =
-        getItem(xpath + "/interfaces-config/outbound-interface");
-    if (out_if) {
-        if_config->set("outbound-interface", out_if);
-    }
-    ConstElementPtr redetect =
-        getItem(xpath + "/interfaces-config/re-detect");
-    if (redetect) {
-        if_config->set("re-detect", redetect);
-    }
+    getParam(if_config, xpath, "interfaces-config/dhcp-socket-type");
+    getParam(if_config, xpath, "interfaces-config/outbound-interface");
+    getParam(if_config, xpath, "interfaces-config/re-detect");
     ConstElementPtr context =
         getItem(xpath + "/interfaces-config/user-context");
     if (context) {
         if_config->set("user-context",
                        Element::fromJSON(context->stringValue()));
     }
-    if (if_config->size() > 0) {
+    if (!if_config->empty()) {
         result->set("interfaces-config", if_config);
     }
-    ConstElementPtr echo = getItem(xpath + "/echo-client-id");
-    if (echo) {
-        result->set("echo-client-id", echo);
-    }
-    ConstElementPtr match = getItem(xpath + "/match-client-id");
-    if (match) {
-        result->set("match-client-id", match);
-    }
-    ConstElementPtr next = getItem(xpath + "/next-server");
-    if (next) {
-        result->set("next-server", next);
-    }
-    ConstElementPtr hostname = getItem(xpath + "/server-hostname");
-    if (hostname) {
-        result->set("server-hostname", hostname);
-    }
-    ConstElementPtr boot = getItem(xpath + "/boot-file-name");
-    if (boot) {
-        result->set("boot-file-name", boot);
-    }
+
+    getParam(result, xpath, "echo-client-id");
+    getParam(result, xpath, "match-client-id");
+    getParam(result, xpath, "next-server");
+    getParam(result, xpath, "server-hostname");
+    getParam(result, xpath, "boot-file-name");
+
     return (result);
 }
 
@@ -370,72 +316,55 @@ ElementPtr
 TranslatorConfig::getServerKeaDhcp6() {
     string xpath = "/kea-dhcp6-server:config";
     ElementPtr result = getServerKeaDhcpCommon(xpath);
-    ConstElementPtr preferred = getItem(xpath + "/preferred-lifetime");
-    if (preferred) {
-        result->set("preferred-lifetime", preferred);
-    }
+
+    getParam(result, xpath, "preferred-lifetime");
+
     ConstElementPtr subnets = getSubnets(xpath + "/subnet6");
     if (subnets && (subnets->size() > 0)) {
         result->set("subnet6", subnets);
     }
+
     ElementPtr if_config = Element::createMap();
     ConstElementPtr ifs = getItems(xpath + "/interfaces-config/interfaces");
     if (ifs && (ifs->size() > 0)) {
         if_config->set("interfaces", ifs);
     }
-    ConstElementPtr redetect =
-        getItem(xpath + "/interfaces-config/re-detect");
-    if (redetect) {
-        if_config->set("re-detect", redetect);
-    }
+
+    getParam(if_config, xpath, "interfaces-config/re-detect");
+
     ConstElementPtr context =
         getItem(xpath + "/interfaces-config/user-context");
     if (context) {
         if_config->set("user-context",
                        Element::fromJSON(context->stringValue()));
     }
-    if (if_config->size() > 0) {
+    if (!if_config->empty()) {
         result->set("interfaces-config", if_config);
     }
+
     ConstElementPtr relay = getItems(xpath + "/relay-supplied-options");
     if (relay) {
         result->set("relay-supplied-options", relay);
     }
+
     ConstElementPtr macs = getItems(xpath + "/mac-sources");
     if (macs) {
         result->set("mac-sources", macs);
     }
+
     ElementPtr server_id = Element::createMap();
-    ConstElementPtr id_type = getItem(xpath + "/server-id/type");
-    if (id_type) {
-        server_id->set("type", id_type);
-    }
-    ConstElementPtr id_id = getItem(xpath + "/server-id/identifier");
-    if (id_id) {
-        server_id->set("identifier", id_id);
-    }
-    ConstElementPtr id_time = getItem(xpath + "/server-id/time");
-    if (id_time) {
-        server_id->set("time", id_time);
-    }
-    ConstElementPtr id_htype = getItem(xpath + "/server-id/htype");
-    if (id_htype) {
-        server_id->set("htype", id_htype);
-    }
-    ConstElementPtr id_ent_id = getItem(xpath + "/server-id/enterprise-id");
-    if (id_ent_id) {
-        server_id->set("enterprise-id", id_ent_id);
-    }
-    ConstElementPtr id_persist = getItem(xpath + "/server-id/persist");
-    if (id_persist) {
-        server_id->set("persist", id_persist);
-    }
+    getParam(server_id, xpath, "server-id/type");
+    getParam(server_id, xpath, "server-id/identifier");
+    getParam(server_id, xpath, "server-id/time");
+    getParam(server_id, xpath, "server-id/htype");
+    getParam(server_id, xpath, "server-id/enterprise-id");
+    getParam(server_id, xpath, "server-id/persist");
     context = getItem(xpath + "/server-id/user-context");
     if (context) {
         server_id->set("user-context",
                        Element::fromJSON(context->stringValue()));
     }
-    if (server_id->size() > 0) {
+    if (!server_id->empty()) {
         result->set("server-id", server_id);
     }
     return (result);
@@ -560,7 +489,7 @@ TranslatorConfig::setServerKeaDhcpCommon(const string& xpath,
         setSharedNetworks(xpath + "/shared-networks", networks);
     }
     ConstElementPtr classes = elem->get("client-classes");
-    if (classes && (classes->size() > 0)) {
+    if (classes && !classes->empty()) {
         setClasses(xpath + "/client-classes", classes);
     }
     ConstElementPtr database = elem->get("lease-database");
@@ -568,10 +497,8 @@ TranslatorConfig::setServerKeaDhcpCommon(const string& xpath,
         setDatabase(xpath + "/lease-database", database);
     }
     ConstElementPtr databases = elem->get("hosts-databases");
-    if (databases) {
-        if (databases->size() > 0) {
-            setDatabases(xpath + "/hosts-databases", databases);
-        }
+    if (databases && !databases->empty()) {
+        setDatabases(xpath + "/hosts-databases", databases);
     } else {
         database = elem->get("hosts-database");
         if (database) {
index f855bb4caa6c2c519debbda1ac745fac40ac4e63..5dfd111427d2e217736d03c55d1c08f352214cca 100644 (file)
 namespace isc {
 namespace yang {
 
-/// Configuration translation between YANG and JSON
+/// @brief DHCP configuration translation between YANG and JSON
 ///
-/// JSON syntax for kea-dhcp6 is:
+/// This translator supports kea-dhcp4-server and kea-dhcp6-server.
+///
+/// JSON syntax for kea-dhcp6-server is:
 /// @code
 /// "Dhcp6": {
 ///     "preferred-lifetime": <preferred lifetime>,
@@ -133,7 +135,7 @@ namespace yang {
 ///    +--rw loggers
 /// @endcode
 ///
-/// Example of kea-dhcp6 simple configuration:
+/// Example of kea-dhcp6-server simple configuration:
 /// @code
 /// {
 ///     "Dhcp6": {
@@ -232,8 +234,11 @@ namespace yang {
 /// @brief A translator class for converting the config between
 /// YANG and JSON.
 ///
-/// Currently supports kea-dhcp[46]-server, kea-logging and partially
-/// ietf-dhcpv6-server.
+/// Currently supports the following models:
+/// - kea-dhcp4-server
+/// - kea-dhcp6-server
+/// - kea-logging
+/// - ietf-dhcpv6-server (partial)
 class TranslatorConfig : virtual public TranslatorControlSocket,
     virtual public TranslatorDatabases,
     virtual public TranslatorClasses,
@@ -250,13 +255,13 @@ public:
     /// @brief Destructor.
     virtual ~TranslatorConfig();
 
-    /// @brief Get and translate a pool from YANG to JSON.
+    /// @brief Get and translate the whole DHCP server config from YANG to JSON.
     ///
     /// @return JSON representation of the config.
     /// @throw SysrepoError when sysrepo raises an error.
     isc::data::ElementPtr getConfig();
 
-    /// @brief Translate and set config from JSON to YANG.
+    /// @brief Translate and sets the DHCP server config from JSON to YANG.
     ///
     /// Null elem argument removes the config containers.
     ///
@@ -266,6 +271,9 @@ public:
 protected:
     /// @brief getConfig for ietf-dhcpv6-server.
     ///
+    /// This implementation is very preliminary. It handles network-ranges
+    /// only partially and nothing else.
+    ///
     /// @return JSON representation of the config.
     /// @throw SysrepoError when sysrepo raises an error.
     isc::data::ElementPtr getConfigIetf6();
@@ -275,6 +283,9 @@ protected:
 
     /// @brief setConfig for ietf-dhcpv6-server.
     ///
+    /// This implementation is very preliminary. It handles network-ranges
+    /// only partially and nothing else.
+    ///
     /// @param elem The JSON element.
     /// @throw BadValue on config without Dhcp6.
     void setConfigIetf6(isc::data::ConstElementPtr elem);
@@ -291,7 +302,7 @@ protected:
     /// @throw SysrepoError when sysrepo raises an error.
     isc::data::ElementPtr getConfigKea6();
 
-    /// @brief getServer common part for kea-dhcp[46]:config.
+    /// @brief getServer common part for kea-dhcp[46]-server:config.
     ///
     /// @param xpath The xpath of the server.
     /// @return JSON representation of the server.
@@ -318,7 +329,7 @@ protected:
     /// @brief delConfig for kea-dhcp[46]-server.
     void delConfigKea();
 
-    /// @brief setConfig for kea-dhcp4-server.
+    /// @brief setConfig for kea-dhcp[46]-server.
     ///
     /// @param elem The JSON element.
     void setConfigKea4(isc::data::ConstElementPtr elem);
@@ -328,13 +339,31 @@ protected:
     /// @param elem The JSON element.
     void setConfigKea6(isc::data::ConstElementPtr elem);
 
-    /// @brief setServer common part for kea-dhcp[46]:config.
+    /// @brief setServer common part for kea-dhcp[46]-server:config.
     ///
     /// @param xpath The xpath of the server.
     /// @param elem The JSON element.
     void setServerKeaDhcpCommon(const std::string& xpath,
                                 isc::data::ConstElementPtr elem);
 
+    /// @brief Retrieves hooks configuration from sysrepo
+    ///
+    /// @param xpath path to hooks configuration
+    /// @return ElementList with hooks configuration
+    isc::data::ElementPtr getHooksKea(std::string xpath);
+
+    /// @brief Retrieves expired leases processing parameters from sysrepo
+    ///
+    /// @param xpath path to expired leases configuration
+    /// @return ElementList with expired leases configuration
+    isc::data::ElementPtr getExpiredKea(std::string xpath);
+
+    /// @brief Retrieves DDNS configuration from sysrepo
+    ///
+    /// @param xpath path to dhcp-ddns configuration
+    /// @return ElementList with dhcp-ddns configuration
+    isc::data::ElementPtr getDdnsKea(std::string xpath);
+
     /// @brief setServer for kea-dhcp4-server:config.
     ///
     /// @param elem The JSON element.
@@ -350,6 +379,17 @@ protected:
     /// @param elem The JSON element.
     void setServerKeaLogging(isc::data::ConstElementPtr elem);
 
+    /// @brief Retrieves an item and stores in the specified storage.
+    ///
+    /// This will attempt to retrieve an item and, if exists, will
+    /// store it in the storage.
+    ///
+    /// @param storage ElementMap (result will be stored here)
+    /// @param xpath xpath location (data will be extracted from sysrepo)
+    /// @param name name of the parameter
+    void getParam(isc::data::ElementPtr& storage, const std::string& xpath,
+                  const std::string& name);
+
     /// @brief The model.
     std::string model_;
 };