summaryrefslogtreecommitdiffstats
path: root/src/lib/yang/translator_config.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/yang/translator_config.cc')
-rw-r--r--src/lib/yang/translator_config.cc770
1 files changed, 770 insertions, 0 deletions
diff --git a/src/lib/yang/translator_config.cc b/src/lib/yang/translator_config.cc
new file mode 100644
index 0000000..fcb6054
--- /dev/null
+++ b/src/lib/yang/translator_config.cc
@@ -0,0 +1,770 @@
+// Copyright (C) 2018-2022 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <config.h>
+
+#include <yang/translator_config.h>
+#include <yang/adaptor_config.h>
+#include <yang/yang_models.h>
+#include <sstream>
+
+using namespace std;
+using namespace isc::data;
+using namespace sysrepo;
+
+namespace isc {
+namespace yang {
+
+TranslatorConfig::TranslatorConfig(S_Session session, const string& model)
+ : TranslatorBasic(session, model),
+ TranslatorControlSocket(session, model),
+ TranslatorDatabase(session, model),
+ TranslatorDatabases(session, model),
+ TranslatorOptionData(session, model),
+ TranslatorOptionDataList(session, model),
+ TranslatorOptionDef(session, model),
+ TranslatorOptionDefList(session, model),
+ TranslatorClass(session, model),
+ TranslatorClasses(session, model),
+ TranslatorPool(session, model),
+ TranslatorPools(session, model),
+ TranslatorPdPool(session, model),
+ TranslatorPdPools(session, model),
+ TranslatorHost(session, model),
+ TranslatorHosts(session, model),
+ TranslatorSubnet(session, model),
+ TranslatorSubnets(session, model),
+ TranslatorSharedNetwork(session, model),
+ TranslatorSharedNetworks(session, model),
+ TranslatorLogger(session, model),
+ TranslatorLoggers(session, model) {
+}
+
+TranslatorConfig::~TranslatorConfig() {
+}
+
+ElementPtr
+TranslatorConfig::getConfig() {
+ try {
+ if (model_ == IETF_DHCPV6_SERVER) {
+ return (getConfigIetf6());
+ } else if (model_ == KEA_DHCP4_SERVER) {
+ return (getConfigKea4());
+ } else if (model_ == KEA_DHCP6_SERVER) {
+ return (getConfigKea6());
+ }
+ } catch (const sysrepo_exception& ex) {
+ isc_throw(SysrepoError, "sysrepo error getting config: " << ex.what());
+ }
+ isc_throw(NotImplemented,
+ "getConfig not implemented for the model: " << model_);
+}
+
+ElementPtr
+TranslatorConfig::getConfigIetf6() {
+ ElementPtr result = Element::createMap();
+ ElementPtr dhcp6 = Element::createMap();
+ result->set("Dhcp6", dhcp6);
+ string xpath = "/" + model_ + ":server/server-config";
+ ConstElementPtr ranges =
+ getSubnets(xpath + "/network-ranges");
+ if (ranges && !ranges->empty()) {
+ dhcp6->set("subnet6", ranges);
+ }
+ // Skip everything else.
+ return (result);
+}
+
+ElementPtr
+TranslatorConfig::getConfigKea4() {
+ ElementPtr result = Element::createMap();
+ ElementPtr dhcp = getServerKeaDhcp4();
+ result->set("Dhcp4", dhcp);
+ return (result);
+}
+
+ElementPtr
+TranslatorConfig::getConfigKea6() {
+ ElementPtr result = Element::createMap();
+ ElementPtr dhcp = getServerKeaDhcp6();
+ result->set("Dhcp6", dhcp);
+ return (result);
+}
+
+ElementPtr TranslatorConfig::getHook(string const& xpath) {
+ ElementPtr const& hook_library(Element::createMap());
+ ElementPtr const& name(getItem(xpath + "/library"));
+ if (name) {
+ hook_library->set("library", name);
+ ElementPtr const& parameters(getItem(xpath + "/parameters"));
+ if (parameters) {
+ hook_library->set("parameters",
+ Element::fromJSON(parameters->stringValue()));
+ }
+ }
+ return hook_library;
+}
+
+ElementPtr
+TranslatorConfig::getHooksKea(const std::string& xpath) {
+ return getList(xpath + "/hook-library", *this, &TranslatorConfig::getHook);
+}
+
+isc::data::ElementPtr
+TranslatorConfig::getExpiredKea(const std::string& xpath) {
+ ElementPtr expired = Element::createMap();
+
+ checkAndGetLeaf(expired, xpath, "reclaim-timer-wait-time");
+ checkAndGetLeaf(expired, xpath, "flush-reclaimed-timer-wait-time");
+ checkAndGetLeaf(expired, xpath, "hold-reclaimed-time");
+ checkAndGetLeaf(expired, xpath, "max-reclaim-leases");
+ checkAndGetLeaf(expired, xpath, "max-reclaim-time");
+ checkAndGetLeaf(expired, xpath, "unwarned-reclaim-cycles");
+
+ if (!expired->empty()) {
+ return (expired);
+ }
+
+ return (ElementPtr());
+}
+
+isc::data::ElementPtr
+TranslatorConfig::getDdnsKea(const std::string& xpath) {
+ ElementPtr ddns = Element::createMap();
+ checkAndGetLeaf(ddns, xpath, "enable-updates");
+ checkAndGetLeaf(ddns, xpath, "qualifying-suffix");
+ checkAndGetLeaf(ddns, xpath, "server-ip");
+ checkAndGetLeaf(ddns, xpath, "server-port");
+ checkAndGetLeaf(ddns, xpath, "sender-ip");
+ checkAndGetLeaf(ddns, xpath, "sender-port");
+ checkAndGetLeaf(ddns, xpath, "max-queue-size");
+ checkAndGetLeaf(ddns, xpath, "ncr-protocol");
+ checkAndGetLeaf(ddns, xpath, "ncr-format");
+ checkAndGetLeaf(ddns, xpath, "override-no-update");
+ checkAndGetLeaf(ddns, xpath, "override-client-update");
+ checkAndGetLeaf(ddns, xpath, "replace-client-name");
+ checkAndGetLeaf(ddns, xpath, "generated-prefix");
+ checkAndGetLeaf(ddns, xpath, "hostname-char-set");
+ checkAndGetLeaf(ddns, xpath, "hostname-char-replacement");
+
+ ConstElementPtr context = getItem(xpath + "/user-context");
+ if (context) {
+ ddns->set("user-context", Element::fromJSON(context->stringValue()));
+ }
+
+ if (!ddns->empty()) {
+ // If there's something to return, use it.
+ return (ddns);
+ }
+
+ // If not, return null.
+ return (ElementPtr());
+}
+
+ElementPtr
+TranslatorConfig::getConfigControlKea(const string& xpath) {
+ ElementPtr config_ctrl = Element::createMap();
+ checkAndGetLeaf(config_ctrl, xpath, "config-fetch-wait-time");
+ ConstElementPtr databases = getDatabases(xpath + "/config-database");
+ if (databases && !databases->empty()) {
+ config_ctrl->set("config-databases", databases);
+ }
+ if (!config_ctrl->empty()) {
+ // If there's something to return, use it.
+ return (config_ctrl);
+ }
+
+ // If not, return null.
+ return (ElementPtr());
+}
+
+ElementPtr
+TranslatorConfig::getServerKeaDhcpCommon(const string& xpath) {
+ ElementPtr result = Element::createMap();
+
+ checkAndGetLeaf(result, xpath, "valid-lifetime");
+ checkAndGetLeaf(result, xpath, "min-valid-lifetime");
+ checkAndGetLeaf(result, xpath, "max-valid-lifetime");
+ checkAndGetLeaf(result, xpath, "renew-timer");
+ checkAndGetLeaf(result, xpath, "rebind-timer");
+ checkAndGetLeaf(result, xpath, "calculate-tee-times");
+ checkAndGetLeaf(result, xpath, "t1-percent");
+ checkAndGetLeaf(result, xpath, "t2-percent");
+ checkAndGetLeaf(result, xpath, "decline-probation-period");
+ checkAndGetLeaf(result, xpath, "hostname-char-set");
+ checkAndGetLeaf(result, xpath, "hostname-char-replacement");
+
+ ConstElementPtr networks = getSharedNetworks(xpath);
+ if (networks && !networks->empty()) {
+ result->set("shared-networks", networks);
+ }
+ ConstElementPtr classes = getClasses(xpath);
+ if (classes && !classes->empty()) {
+ result->set("client-classes", classes);
+ }
+ ConstElementPtr database = getDatabase(xpath + "/lease-database");
+ if (database) {
+ result->set("lease-database", database);
+ }
+ ConstElementPtr databases = getDatabases(xpath + "/hosts-database");
+ if (databases && !databases->empty()) {
+ 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);
+ if (defs && !defs->empty()) {
+ result->set("option-def", defs);
+ }
+ ConstElementPtr options = getOptionDataList(xpath);
+ if (options && !options->empty()) {
+ result->set("option-data", options);
+ }
+ ConstElementPtr hooks = getHooksKea(xpath);
+ if (hooks && !hooks->empty()) {
+ result->set("hooks-libraries", hooks);
+ }
+ ConstElementPtr expired =
+ getExpiredKea(xpath + "/expired-leases-processing");
+ if (expired) {
+ result->set("expired-leases-processing", expired);
+ }
+ checkAndGetLeaf(result, xpath, "dhcp4o6-port");
+ ConstElementPtr socket = getControlSocket(xpath + "/control-socket");
+ if (socket) {
+ result->set("control-socket", socket);
+ }
+ ConstElementPtr ddns = getDdnsKea(xpath + "/dhcp-ddns");
+ if (ddns) {
+ result->set("dhcp-ddns", ddns);
+ }
+ 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);
+ }
+ checkAndGetLeaf(result, xpath, "reservation-mode");
+ ConstElementPtr hosts = getHosts(xpath);
+ if (hosts && !hosts->empty()) {
+ result->set("reservations", hosts);
+ }
+ ConstElementPtr config_ctrl =
+ getConfigControlKea(xpath + "/config-control");
+ if (config_ctrl) {
+ result->set("config-control", config_ctrl);
+ }
+ checkAndGetLeaf(result, xpath, "server-tag");
+ ConstElementPtr queue_ctrl = getItem(xpath + "/dhcp-queue-control");
+ if (queue_ctrl) {
+ result->set("dhcp-queue-control",
+ Element::fromJSON(queue_ctrl->stringValue()));
+ }
+ ConstElementPtr loggers = getLoggers(xpath);
+ if (loggers && !loggers->empty()) {
+ result->set("loggers", loggers);
+ }
+ checkAndGetLeaf(result, xpath, "cache-max-age");
+ checkAndGetLeaf(result, xpath, "cache-threshold");
+ ElementPtr compatibility = Element::createMap();
+ checkAndGetLeaf(compatibility, xpath + "/compatibility", "lenient-option-parsing");
+ if (!compatibility->empty()) {
+ result->set("compatibility", compatibility);
+ }
+ checkAndGetLeaf(result, xpath, "ddns-generated-prefix");
+ checkAndGetLeaf(result, xpath, "ddns-override-client-update");
+ checkAndGetLeaf(result, xpath, "ddns-override-no-update");
+ checkAndGetLeaf(result, xpath, "ddns-qualifying-suffix");
+ checkAndGetLeaf(result, xpath, "ddns-replace-client-name");
+ checkAndGetLeaf(result, xpath, "ddns-send-updates");
+ checkAndGetLeaf(result, xpath, "ddns-update-on-renew");
+ checkAndGetLeaf(result, xpath, "ddns-use-conflict-resolution");
+ checkAndGetLeaf(result, xpath, "ip-reservations-unique");
+ checkAndGetLeaf(result, xpath, "early-global-reservations-lookup");
+ checkAndGetLeaf(result, xpath, "reservations-lookup-first");
+ ElementPtr multi_threading = Element::createMap();
+ string mt_xpath = xpath + "/multi-threading";
+ checkAndGetLeaf(multi_threading, mt_xpath, "enable-multi-threading");
+ checkAndGetLeaf(multi_threading, mt_xpath, "packet-queue-size");
+ checkAndGetLeaf(multi_threading, mt_xpath, "thread-pool-size");
+ if (!multi_threading->empty()) {
+ result->set("multi-threading", multi_threading);
+ }
+ checkAndGetLeaf(result, xpath, "parked-packet-limit");
+ checkAndGetLeaf(result, xpath, "reservations-global");
+ checkAndGetLeaf(result, xpath, "reservations-in-subnet");
+ checkAndGetLeaf(result, xpath, "reservations-out-of-pool");
+ checkAndGetLeaf(result, xpath, "statistic-default-sample-age");
+ checkAndGetLeaf(result, xpath, "statistic-default-sample-count");
+ checkAndGetLeaf(result, xpath, "store-extended-info");
+ return (result);
+}
+
+ElementPtr
+TranslatorConfig::getServerKeaDhcp4() {
+ string xpath = "/kea-dhcp4-server:config";
+ ElementPtr result = getServerKeaDhcpCommon(xpath);
+ // Handle subnets.
+ ConstElementPtr subnets = getSubnets(xpath);
+ 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->empty()) {
+ if_config->set("interfaces", ifs);
+ }
+ string if_cfg_xpath = xpath + "/interfaces-config";
+ checkAndGetLeaf(if_config, if_cfg_xpath, "dhcp-socket-type");
+ checkAndGetLeaf(if_config, if_cfg_xpath, "outbound-interface");
+ checkAndGetLeaf(if_config, if_cfg_xpath, "service-sockets-require-all");
+ checkAndGetLeaf(if_config, if_cfg_xpath, "service-sockets-max-retries");
+ checkAndGetLeaf(if_config, if_cfg_xpath, "service-sockets-retry-wait-time");
+ checkAndGetLeaf(if_config, if_cfg_xpath, "re-detect");
+ ConstElementPtr context =
+ getItem(xpath + "/interfaces-config/user-context");
+ if (context) {
+ if_config->set("user-context",
+ Element::fromJSON(context->stringValue()));
+ }
+ if (!if_config->empty()) {
+ result->set("interfaces-config", if_config);
+ }
+ // Handle DHCPv4 specific global parameters.
+ checkAndGetLeaf(result, xpath, "echo-client-id");
+ checkAndGetLeaf(result, xpath, "match-client-id");
+ checkAndGetLeaf(result, xpath, "next-server");
+ checkAndGetLeaf(result, xpath, "server-hostname");
+ checkAndGetLeaf(result, xpath, "boot-file-name");
+ checkAndGetLeaf(result, xpath, "authoritative");
+ return (result);
+}
+
+ElementPtr
+TranslatorConfig::getServerKeaDhcp6() {
+ string xpath = "/kea-dhcp6-server:config";
+ ElementPtr result = getServerKeaDhcpCommon(xpath);
+ // Handle DHCPv6 specific global parameters.
+ checkAndGetLeaf(result, xpath, "data-directory");
+ checkAndGetLeaf(result, xpath, "preferred-lifetime");
+ checkAndGetLeaf(result, xpath, "min-preferred-lifetime");
+ checkAndGetLeaf(result, xpath, "max-preferred-lifetime");
+ // Handle subnets.
+ ConstElementPtr subnets = getSubnets(xpath);
+ if (subnets && !subnets->empty()) {
+ result->set("subnet6", subnets);
+ }
+ // Handle interfaces.
+ ElementPtr if_config = Element::createMap();
+ ConstElementPtr ifs = getItems(xpath + "/interfaces-config/interfaces");
+ if (ifs && !ifs->empty()) {
+ if_config->set("interfaces", ifs);
+ }
+ string if_cfg_xpath = xpath + "/interfaces-config";
+ checkAndGetLeaf(if_config, if_cfg_xpath, "service-sockets-require-all");
+ checkAndGetLeaf(if_config, if_cfg_xpath, "service-sockets-max-retries");
+ checkAndGetLeaf(if_config, if_cfg_xpath, "service-sockets-retry-wait-time");
+ checkAndGetLeaf(if_config, if_cfg_xpath, "re-detect");
+ ConstElementPtr context =
+ getItem(xpath + "/interfaces-config/user-context");
+ if (context) {
+ if_config->set("user-context",
+ Element::fromJSON(context->stringValue()));
+ }
+ if (!if_config->empty()) {
+ result->set("interfaces-config", if_config);
+ }
+ // Handle DHCPv6 specific global entries.
+ 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);
+ }
+ // Handle server-id.
+ // @todo: move to a DUID translator.
+ ElementPtr server_id = Element::createMap();
+ string srv_id_xpath = xpath + "/server-id";
+ checkAndGetLeaf(server_id, srv_id_xpath, "type");
+ checkAndGetLeaf(server_id, srv_id_xpath, "identifier");
+ checkAndGetLeaf(server_id, srv_id_xpath, "time");
+ checkAndGetLeaf(server_id, srv_id_xpath, "htype");
+ checkAndGetLeaf(server_id, srv_id_xpath, "enterprise-id");
+ checkAndGetLeaf(server_id, srv_id_xpath, "persist");
+ context = getItem(xpath + "/server-id/user-context");
+ if (context) {
+ server_id->set("user-context",
+ Element::fromJSON(context->stringValue()));
+ }
+ if (!server_id->empty()) {
+ result->set("server-id", server_id);
+ }
+ return (result);
+}
+
+void
+TranslatorConfig::setConfig(ConstElementPtr elem) {
+ try {
+ if (model_ == IETF_DHCPV6_SERVER) {
+ if (elem) {
+ AdaptorConfig::preProcess6(elem);
+ setConfigIetf6(elem);
+ } else {
+ delConfigIetf6();
+ }
+ } else if (model_ == KEA_DHCP4_SERVER) {
+ if (elem) {
+ AdaptorConfig::preProcess4(elem);
+ setConfigKea4(elem);
+ } else {
+ delConfigKea();
+ }
+ } else if (model_ == KEA_DHCP6_SERVER) {
+ if (elem) {
+ AdaptorConfig::preProcess6(elem);
+ setConfigKea6(elem);
+ } else {
+ delConfigKea();
+ }
+ } else {
+ isc_throw(NotImplemented,
+ "setConfig not implemented for the model: " << model_);
+ }
+ } catch (const sysrepo_exception& ex) {
+ isc_throw(SysrepoError,
+ "sysrepo error setting config '" << elem->str()
+ << "': " << ex.what());
+ }
+}
+
+void
+TranslatorConfig::delConfigIetf6() {
+ delItem("/" + model_ + ":server");
+}
+
+void
+TranslatorConfig::setConfigIetf6(ConstElementPtr elem) {
+ string xpath = "/" + model_ + ":server/server-config";
+ ConstElementPtr dhcp6 = elem->get("Dhcp6");
+ if (!dhcp6) {
+ isc_throw(BadValue, "no Dhcp6 entry in " << elem->str());
+ }
+ ConstElementPtr ranges = dhcp6->get("subnet6");
+ if (ranges && !ranges->empty()) {
+ setSubnets(xpath + "/network-ranges", ranges);
+ }
+ // Skip everything else.
+}
+
+void
+TranslatorConfig::delConfigKea() {
+ delItem("/" + model_ + ":config");
+}
+
+void
+TranslatorConfig::setConfigKea4(ConstElementPtr elem) {
+ ConstElementPtr dhcp = elem->get("Dhcp4");
+ if (dhcp) {
+ setServerKeaDhcp4(dhcp);
+ }
+}
+
+void
+TranslatorConfig::setConfigKea6(ConstElementPtr elem) {
+ ConstElementPtr dhcp = elem->get("Dhcp6");
+ if (dhcp) {
+ setServerKeaDhcp6(dhcp);
+ }
+}
+
+void
+TranslatorConfig::setServerKeaDhcpCommon(const string& xpath,
+ ConstElementPtr elem) {
+ checkAndSetLeaf(elem, xpath, "valid-lifetime", SR_UINT32_T);
+ checkAndSetLeaf(elem, xpath, "min-valid-lifetime", SR_UINT32_T);
+ checkAndSetLeaf(elem, xpath, "max-valid-lifetime", SR_UINT32_T);
+ checkAndSetLeaf(elem, xpath, "renew-timer", SR_UINT32_T);
+ checkAndSetLeaf(elem, xpath, "rebind-timer", SR_UINT32_T);
+ checkAndSetLeaf(elem, xpath, "calculate-tee-times", SR_BOOL_T);
+ checkAndSetLeaf(elem, xpath, "t1-percent", SR_DECIMAL64_T);
+ checkAndSetLeaf(elem, xpath, "t2-percent", SR_DECIMAL64_T);
+ checkAndSetLeaf(elem, xpath, "decline-probation-period", SR_UINT32_T);
+ ConstElementPtr networks = elem->get("shared-networks");
+ if (networks) {
+ setSharedNetworks(xpath, networks);
+ }
+ ConstElementPtr classes = elem->get("client-classes");
+ if (classes && !classes->empty()) {
+ setClasses(xpath, classes);
+ }
+ ConstElementPtr database = elem->get("lease-database");
+ if (database) {
+ setDatabase(xpath + "/lease-database", database);
+ }
+ ConstElementPtr databases = elem->get("hosts-databases");
+ if (databases && !databases->empty()) {
+ setDatabases(xpath + "/hosts-database", databases);
+ } else {
+ // Reuse of database from lease-database.
+ database = elem->get("hosts-database");
+ if (database) {
+ ElementPtr list = Element::createList();
+ list->add(copy(database));
+ setDatabases(xpath + "/hosts-database", list);
+ }
+ }
+ ConstElementPtr host_ids = elem->get("host-reservation-identifiers");
+ if (host_ids) {
+ for (ConstElementPtr id : host_ids->listValue()) {
+ setItem(xpath + "/host-reservation-identifiers", id, SR_ENUM_T);
+ }
+ }
+ ConstElementPtr defs = elem->get("option-def");
+ if (defs && !defs->empty()) {
+ setOptionDefList(xpath, defs);
+ }
+ ConstElementPtr options = elem->get("option-data");
+ if (options && !options->empty()) {
+ setOptionDataList(xpath, options);
+ }
+ ConstElementPtr hook_libs = elem->get("hooks-libraries");
+ if (hook_libs) {
+ for (ConstElementPtr lib : hook_libs->listValue()) {
+ ConstElementPtr name = lib->get("library");
+ if (!name) {
+ continue;
+ }
+ ostringstream hook_lib;
+ hook_lib << xpath << "/hook-library[library='"
+ << name->stringValue() << "']";
+ ConstElementPtr params = lib->get("parameters");
+ if (params) {
+ hook_lib << "/parameters";
+ setItem(hook_lib.str(), Element::create(params->str()),
+ SR_STRING_T);
+ } else {
+ ConstElementPtr list = Element::createList();
+ setItem(hook_lib.str(), list, SR_LIST_T);
+ }
+ }
+ }
+ ConstElementPtr expired = elem->get("expired-leases-processing");
+ if (expired) {
+ string expired_xpath = xpath + "/expired-leases-processing";
+ checkAndSetLeaf(expired, expired_xpath, "reclaim-timer-wait-time", SR_UINT32_T);
+ checkAndSetLeaf(expired, expired_xpath, "flush-reclaimed-timer-wait-time", SR_UINT32_T);
+ checkAndSetLeaf(expired, expired_xpath, "hold-reclaimed-time", SR_UINT32_T);
+ checkAndSetLeaf(expired, expired_xpath, "max-reclaim-leases", SR_UINT32_T);
+ checkAndSetLeaf(expired, expired_xpath, "max-reclaim-time", SR_UINT32_T);
+ checkAndSetLeaf(expired, expired_xpath, "unwarned-reclaim-cycles", SR_UINT32_T);
+ }
+ checkAndSetLeaf(elem, xpath, "dhcp4o6-port", SR_UINT16_T);
+ ConstElementPtr socket = elem->get("control-socket");
+ if (socket) {
+ setControlSocket(xpath + "/control-socket", socket);
+ }
+ checkAndSetLeaf(elem, xpath, "hostname-char-set", SR_STRING_T);
+ checkAndSetLeaf(elem, xpath, "hostname-char-replacement", SR_STRING_T);
+ ConstElementPtr ddns = elem->get("dhcp-ddns");
+ if (ddns) {
+ string ddns_xpath = xpath + "/dhcp-ddns";
+ checkAndSetLeaf(ddns, ddns_xpath, "enable-updates", SR_BOOL_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "qualifying-suffix", SR_STRING_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "server-ip", SR_STRING_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "server-port", SR_UINT16_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "sender-ip", SR_STRING_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "sender-port", SR_UINT16_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "max-queue-size", SR_UINT32_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "ncr-protocol", SR_ENUM_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "ncr-format", SR_ENUM_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "override-no-update", SR_BOOL_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "override-client-update", SR_BOOL_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "replace-client-name", SR_ENUM_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "generated-prefix", SR_STRING_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "hostname-char-set", SR_STRING_T);
+ checkAndSetLeaf(ddns, ddns_xpath, "hostname-char-replacement", SR_STRING_T);
+ ConstElementPtr context = Adaptor::getContext(ddns);
+ if (context) {
+ ConstElementPtr repr = Element::create(context->str());
+ setItem(xpath + "/dhcp-ddns/user-context", repr, SR_STRING_T);
+ }
+ }
+ ConstElementPtr context = Adaptor::getContext(elem);
+ if (context) {
+ ConstElementPtr repr = Element::create(context->str());
+ setItem(xpath + "/user-context", repr, SR_STRING_T);
+ }
+ ConstElementPtr sanity = elem->get("sanity-checks");
+ if (sanity) {
+ checkAndSetLeaf(sanity, xpath + "/sanity-checks", "lease-checks", SR_ENUM_T);
+ }
+ checkAndSetLeaf(elem, xpath, "reservation-mode", SR_ENUM_T);
+ ConstElementPtr hosts = elem->get("reservations");
+ if (hosts && !hosts->empty()) {
+ setHosts(xpath, hosts);
+ }
+ ConstElementPtr config_ctrl = elem->get("config-control");
+ if (config_ctrl && !config_ctrl->empty()) {
+ checkAndSetLeaf(config_ctrl, xpath + "/config-control", "config-fetch-wait-time", SR_UINT32_T);
+ databases = config_ctrl->get("config-databases");
+ if (databases && !databases->empty()) {
+ setDatabases(xpath + "/config-control/config-database", databases);
+ }
+ }
+ checkAndSetLeaf(elem, xpath, "server-tag", SR_STRING_T);
+ ConstElementPtr queue_ctrl = elem->get("dhcp-queue-control");
+ if (queue_ctrl) {
+ ConstElementPtr repr = Element::create(queue_ctrl->str());
+ setItem(xpath + "/dhcp-queue-control", repr, SR_STRING_T);
+ }
+ ConstElementPtr loggers = elem->get("loggers");
+ if (loggers) {
+ setLoggers(xpath, loggers);
+ }
+ checkAndSetLeaf(elem, xpath, "cache-max-age", SR_UINT32_T);
+ checkAndSetLeaf(elem, xpath, "cache-threshold", SR_DECIMAL64_T);
+ ConstElementPtr compatibility(elem->get("compatibility"));
+ if (compatibility) {
+ checkAndSetLeaf(compatibility, xpath + "/compatibility", "lenient-option-parsing", SR_BOOL_T);
+ }
+ checkAndSetLeaf(elem, xpath, "ddns-generated-prefix", SR_STRING_T);
+ checkAndSetLeaf(elem, xpath, "ddns-override-client-update", SR_BOOL_T);
+ checkAndSetLeaf(elem, xpath, "ddns-override-no-update", SR_BOOL_T);
+ checkAndSetLeaf(elem, xpath, "ddns-qualifying-suffix", SR_STRING_T);
+ checkAndSetLeaf(elem, xpath, "ddns-replace-client-name", SR_STRING_T);
+ checkAndSetLeaf(elem, xpath, "ddns-send-updates", SR_BOOL_T);
+ checkAndSetLeaf(elem, xpath, "ddns-update-on-renew", SR_BOOL_T);
+ checkAndSetLeaf(elem, xpath, "ddns-use-conflict-resolution", SR_BOOL_T);
+ checkAndSetLeaf(elem, xpath, "ip-reservations-unique", SR_BOOL_T);
+ checkAndSetLeaf(elem, xpath, "early-global-reservations-lookup", SR_BOOL_T);
+ checkAndSetLeaf(elem, xpath, "reservations-lookup-first", SR_BOOL_T);
+ ConstElementPtr multi_threading(elem->get("multi-threading"));
+ if (multi_threading) {
+ string mt_xpath = xpath + "/multi-threading";
+ checkAndSetLeaf(multi_threading, mt_xpath, "enable-multi-threading", SR_BOOL_T);
+ checkAndSetLeaf(multi_threading, mt_xpath, "packet-queue-size", SR_UINT32_T);
+ checkAndSetLeaf(multi_threading, mt_xpath, "thread-pool-size", SR_UINT32_T);
+ }
+ checkAndSetLeaf(elem, xpath, "parked-packet-limit", SR_UINT32_T);
+ checkAndSetLeaf(elem, xpath, "reservations-global", SR_BOOL_T);
+ checkAndSetLeaf(elem, xpath, "reservations-in-subnet", SR_BOOL_T);
+ checkAndSetLeaf(elem, xpath, "reservations-out-of-pool", SR_BOOL_T);
+ checkAndSetLeaf(elem, xpath, "statistic-default-sample-age", SR_UINT32_T);
+ checkAndSetLeaf(elem, xpath, "statistic-default-sample-count", SR_UINT32_T);
+ checkAndSetLeaf(elem, xpath, "store-extended-info", SR_BOOL_T);
+}
+
+void
+TranslatorConfig::setServerKeaDhcp4(ConstElementPtr elem) {
+ string xpath = "/kea-dhcp4-server:config";
+ setServerKeaDhcpCommon(xpath, elem);
+ ConstElementPtr subnets = elem->get("subnet4");
+ if (subnets) {
+ setSubnets(xpath, subnets);
+ }
+ ConstElementPtr if_config = elem->get("interfaces-config");
+ if (if_config) {
+ ConstElementPtr ifs = if_config->get("interfaces");
+ if (ifs && !ifs->empty()) {
+ for (ConstElementPtr intf : ifs->listValue()) {
+ setItem(xpath + "/interfaces-config/interfaces",
+ intf, SR_STRING_T);
+ }
+ }
+ string if_cfg_xpath = xpath + "/interfaces-config";
+ checkAndSetLeaf(if_config, if_cfg_xpath, "dhcp-socket-type", SR_ENUM_T);
+ checkAndSetLeaf(if_config, if_cfg_xpath, "outbound-interface", SR_ENUM_T);
+ checkAndSetLeaf(if_config, if_cfg_xpath, "service-sockets-require-all", SR_BOOL_T);
+ checkAndSetLeaf(if_config, if_cfg_xpath, "service-sockets-max-retries", SR_UINT32_T);
+ checkAndSetLeaf(if_config, if_cfg_xpath, "service-sockets-retry-wait-time", SR_UINT32_T);
+ checkAndSetLeaf(if_config, if_cfg_xpath, "re-detect", SR_BOOL_T);
+ ConstElementPtr context = Adaptor::getContext(if_config);
+ if (context) {
+ setItem(xpath + "/interfaces-config/user-context",
+ Element::create(context->str()), SR_STRING_T);
+ }
+ }
+ checkAndSetLeaf(elem, xpath, "echo-client-id", SR_BOOL_T);
+ checkAndSetLeaf(elem, xpath, "match-client-id", SR_BOOL_T);
+ checkAndSetLeaf(elem, xpath, "next-server", SR_STRING_T);
+ checkAndSetLeaf(elem, xpath, "server-hostname", SR_STRING_T);
+ checkAndSetLeaf(elem, xpath, "boot-file-name", SR_STRING_T);
+ checkAndSetLeaf(elem, xpath, "authoritative", SR_BOOL_T);
+}
+
+void
+TranslatorConfig::setServerKeaDhcp6(ConstElementPtr elem) {
+ string xpath = "/kea-dhcp6-server:config";
+ setServerKeaDhcpCommon(xpath, elem);
+ checkAndSetLeaf(elem, xpath, "data-directory", SR_STRING_T);
+ checkAndSetLeaf(elem, xpath, "preferred-lifetime", SR_UINT32_T);
+ checkAndSetLeaf(elem, xpath, "min-preferred-lifetime", SR_UINT32_T);
+ checkAndSetLeaf(elem, xpath, "max-preferred-lifetime", SR_UINT32_T);
+ ConstElementPtr subnets = elem->get("subnet6");
+ if (subnets) {
+ setSubnets(xpath, subnets);
+ }
+ ConstElementPtr if_config = elem->get("interfaces-config");
+ if (if_config) {
+ ConstElementPtr ifs = if_config->get("interfaces");
+ if (ifs && !ifs->empty()) {
+ for (ConstElementPtr intf : ifs->listValue()) {
+ setItem(xpath + "/interfaces-config/interfaces",
+ intf, SR_STRING_T);
+ }
+ }
+ string if_cfg_xpath = xpath + "/interfaces-config";
+ checkAndSetLeaf(if_config, if_cfg_xpath, "service-sockets-require-all", SR_BOOL_T);
+ checkAndSetLeaf(if_config, if_cfg_xpath, "service-sockets-max-retries", SR_UINT32_T);
+ checkAndSetLeaf(if_config, if_cfg_xpath, "service-sockets-retry-wait-time", SR_UINT32_T);
+ checkAndSetLeaf(if_config, if_cfg_xpath, "re-detect", SR_BOOL_T);
+ ConstElementPtr context = Adaptor::getContext(if_config);
+ if (context) {
+ setItem(xpath + "/interfaces-config/user-context",
+ Element::create(context->str()), SR_STRING_T);
+ }
+ }
+ ConstElementPtr relay = elem->get("relay-supplied-options");
+ if (relay) {
+ for (ConstElementPtr addr : relay->listValue()) {
+ setItem(xpath + "/relay-supplied-options", addr, SR_STRING_T);
+ }
+ }
+ ConstElementPtr macs = elem->get("mac-sources");
+ if (macs) {
+ for (ConstElementPtr source : macs->listValue()) {
+ setItem(xpath + "/mac-sources", source, SR_STRING_T);
+ }
+ }
+ ConstElementPtr server_id = elem->get("server-id");
+ if (server_id) {
+ string srv_id_xpath = xpath + "/server-id";
+ checkAndSetLeaf(server_id, srv_id_xpath, "type", SR_ENUM_T);
+ checkAndSetLeaf(server_id, srv_id_xpath, "identifier", SR_STRING_T);
+ checkAndSetLeaf(server_id, srv_id_xpath, "time", SR_UINT32_T);
+ checkAndSetLeaf(server_id, srv_id_xpath, "htype", SR_UINT16_T);
+ checkAndSetLeaf(server_id, srv_id_xpath, "enterprise-id", SR_UINT32_T);
+ checkAndSetLeaf(server_id, srv_id_xpath, "persist", SR_BOOL_T);
+ ConstElementPtr context = Adaptor::getContext(server_id);
+ if (context) {
+ ConstElementPtr repr = Element::create(context->str());
+ setItem(xpath + "/server-id/user-context", repr, SR_STRING_T);
+ }
+ }
+}
+
+} // namespace yang
+} // namespace isc