From: Tomek Mrugalski Date: Thu, 25 Oct 2018 10:29:17 +0000 (+0200) Subject: [#65,!96] TranslatorConfig reworked X-Git-Tag: 65-libyang-finish-doc_base~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=df53eb47f417195b6f725bc2828be562bc85f602;p=thirdparty%2Fkea.git [#65,!96] TranslatorConfig reworked - getParam added - many larger functions refactored --- diff --git a/src/lib/yang/translator_config.cc b/src/lib/yang/translator_config.cc index 04a7ae8c8e..7ea51fb080 100644 --- a/src/lib/yang/translator_config.cc +++ b/src/lib/yang/translator_config.cc @@ -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) { diff --git a/src/lib/yang/translator_config.h b/src/lib/yang/translator_config.h index f855bb4caa..5dfd111427 100644 --- a/src/lib/yang/translator_config.h +++ b/src/lib/yang/translator_config.h @@ -18,9 +18,11 @@ 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": , @@ -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_; };