Kea 1.5.0
translator_config.cc
Go to the documentation of this file.
1// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#include <config.h>
8
10#include <yang/adaptor_config.h>
11#include <yang/yang_models.h>
12#include <sstream>
13
14using namespace std;
15using namespace isc::data;
16#ifndef HAVE_PRE_0_7_6_SYSREPO
17using namespace sysrepo;
18#endif
19
20namespace isc {
21namespace yang {
22
23TranslatorConfig::TranslatorConfig(S_Session session, const string& model)
24 : TranslatorBasic(session, model),
25 TranslatorControlSocket(session, model),
26 TranslatorDatabase(session, model),
27 TranslatorDatabases(session, model),
28 TranslatorOptionData(session, model),
29 TranslatorOptionDataList(session, model),
30 TranslatorOptionDef(session, model),
31 TranslatorOptionDefList(session, model),
32 TranslatorClass(session, model),
33 TranslatorClasses(session, model),
34 TranslatorPool(session, model),
35 TranslatorPools(session, model),
36 TranslatorPdPool(session, model),
37 TranslatorPdPools(session, model),
38 TranslatorHost(session, model),
39 TranslatorHosts(session, model),
40 TranslatorSubnet(session, model),
41 TranslatorSubnets(session, model),
42 TranslatorSharedNetwork(session, model),
43 TranslatorSharedNetworks(session, model),
44 TranslatorLogger(session, model),
45 TranslatorLoggers(session, model) {
46}
47
49}
50
53 try {
54 if (model_ == IETF_DHCPV6_SERVER) {
55 return (getConfigIetf6());
56 } else if (model_ == KEA_DHCP4_SERVER) {
57 return (getConfigKea4());
58 } else if (model_ == KEA_DHCP6_SERVER) {
59 return (getConfigKea6());
60 }
61 } catch (const sysrepo_exception& ex) {
62 isc_throw(SysrepoError, "sysrepo error getting config: " << ex.what());
63 }
65 "getConfig not implemented for the model: " << model_);
66}
67
72 result->set("Dhcp6", dhcp6);
73 string xpath = "/" + model_ + ":server/server-config";
74 ConstElementPtr ranges =
75 getSubnets(xpath + "/network-ranges");
76 if (ranges && !ranges->empty()) {
77 dhcp6->set("subnet6", ranges);
78 }
79 // Skip everything else.
80 return (result);
81}
82
87 result->set("Dhcp4", dhcp);
88 ConstElementPtr loggers = dhcp->get("loggers");
89 if (loggers) {
90 dhcp->remove("loggers");
91
93 logging->set("loggers", loggers);
94 result->set("Logging", logging);
95 }
96 return (result);
97}
98
103 result->set("Dhcp6", dhcp);
104 ConstElementPtr loggers = dhcp->get("loggers");
105 if (loggers) {
106 dhcp->remove("loggers");
107
108 ElementPtr logging = Element::createMap();
109 logging->set("loggers", loggers);
110 result->set("Logging", logging);
111 }
112 return (result);
113}
114
115void
116TranslatorConfig::getParam(ElementPtr& storage, const std::string& xpath,
117 const std::string& name) {
118 ConstElementPtr x = getItem(xpath + "/" + name);
119 if (x) {
120 storage->set(name, x);
121 }
122}
123
125TranslatorConfig::getHooksKea(const std::string& xpath) {
126 S_Iter_Value iter = getIter(xpath + "/hook-library");
127 if (iter) {
128 ElementPtr hook_libs = Element::createList();
129 for (;;) {
130 const string& lib = getNext(iter);
131 if (lib.empty()) {
132 break;
133 }
134 ElementPtr hook_lib = Element::createMap();
135 ConstElementPtr name = getItem(lib + "/library");
136 if (name) {
137 hook_lib->set("library", name);
138 ConstElementPtr params = getItem(lib + "/parameters");
139 if (params) {
140 string parameters = params->stringValue();
141 if (!parameters.empty()) {
142 hook_lib->set("parameters",
143 Element::fromJSON(parameters));
144 }
145 }
146 hook_libs->add(hook_lib);
147 }
148 }
149 if (!hook_libs->empty()) {
150 return (hook_libs);
151 }
152 }
153 return (ElementPtr());
154}
155
157TranslatorConfig::getExpiredKea(const std::string& xpath) {
158 ElementPtr expired = Element::createMap();
159
160 getParam(expired, xpath, "reclaim-timer-wait-time");
161 getParam(expired, xpath, "flush-reclaimed-timer-wait-time");
162 getParam(expired, xpath, "hold-reclaimed-time");
163 getParam(expired, xpath, "max-reclaim-leases");
164 getParam(expired, xpath, "max-reclaim-time");
165 getParam(expired, xpath, "unwarned-reclaim-cycles");
166
167 if (!expired->empty()) {
168 return (expired);
169 }
170
171 return (ElementPtr());
172}
173
175TranslatorConfig::getDdnsKea(const std::string& xpath) {
177 getParam(ddns, xpath, "enable-updates");
178 getParam(ddns, xpath, "qualifying-suffix");
179 getParam(ddns, xpath, "server-ip");
180 getParam(ddns, xpath, "server-port");
181 getParam(ddns, xpath, "sender-ip");
182 getParam(ddns, xpath, "sender-port");
183 getParam(ddns, xpath, "max-queue-size");
184 getParam(ddns, xpath, "ncr-protocol");
185 getParam(ddns, xpath, "ncr-format");
186 getParam(ddns, xpath, "override-no-update");
187 getParam(ddns, xpath, "override-client-update");
188 getParam(ddns, xpath, "replace-client-name");
189 getParam(ddns, xpath, "generated-prefix");
190 getParam(ddns, xpath, "hostname-char-set");
191 getParam(ddns, xpath, "hostname-char-replacement");
192
193 ConstElementPtr context = getItem(xpath + "/user-context");
194 if (context) {
195 ddns->set("user-context", Element::fromJSON(context->stringValue()));
196 }
197
198 if (!ddns->empty()) {
199 // If there's something to return, use it.
200 return (ddns);
201 }
202
203 // If not, return null.
204 return (ElementPtr());
205}
206
209 ElementPtr config_ctrl = Element::createMap();
210 ConstElementPtr databases = getDatabases(xpath + "/config-database");
211 if (databases && !databases->empty()) {
212 config_ctrl->set("config-databases", databases);
213 }
214 if (!config_ctrl->empty()) {
215 // If there's something to return, use it.
216 return (config_ctrl);
217 }
218
219 // If not, return null.
220 return (ElementPtr());
221}
222
226
227 getParam(result, xpath, "valid-lifetime");
228 getParam(result, xpath, "renew-timer");
229 getParam(result, xpath, "rebind-timer");
230 getParam(result, xpath, "decline-probation-period");
231
232 ConstElementPtr networks = getSharedNetworks(xpath);
233 if (networks && !networks->empty()) {
234 result->set("shared-networks", networks);
235 }
236 ConstElementPtr classes = getClasses(xpath);
237 if (classes && !classes->empty()) {
238 result->set("client-classes", classes);
239 }
240 ConstElementPtr database = getDatabase(xpath + "/lease-database");
241 if (database) {
242 result->set("lease-database", database);
243 }
244 ConstElementPtr databases = getDatabases(xpath + "/hosts-database");
245 if (databases && !databases->empty()) {
246 result->set("hosts-databases", databases);
247 }
248 ConstElementPtr host_ids =
249 getItems(xpath + "/host-reservation-identifiers");
250 if (host_ids) {
251 result->set("host-reservation-identifiers", host_ids);
252 }
253 ConstElementPtr defs = getOptionDefList(xpath);
254 if (defs && !defs->empty()) {
255 result->set("option-def", defs);
256 }
257 ConstElementPtr options = getOptionDataList(xpath);
258 if (options && !options->empty()) {
259 result->set("option-data", options);
260 }
261 ConstElementPtr hooks = getHooksKea(xpath);
262 if (hooks && !hooks->empty()) {
263 result->set("hooks-libraries", hooks);
264 }
265 ConstElementPtr expired =
266 getExpiredKea(xpath + "/expired-leases-processing");
267 if (expired) {
268 result->set("expired-leases-processing", expired);
269 }
270 getParam(result, xpath, "dhcp4o6-port");
271 ConstElementPtr socket = getControlSocket(xpath + "/control-socket");
272 if (socket) {
273 result->set("control-socket", socket);
274 }
275 ConstElementPtr ddns = getDdnsKea(xpath + "/dhcp-ddns");
276 if (ddns) {
277 result->set("dhcp-ddns", ddns);
278 }
279 ConstElementPtr context = getItem(xpath + "/user-context");
280 if (context) {
281 result->set("user-context", Element::fromJSON(context->stringValue()));
282 }
283 ConstElementPtr checks = getItem(xpath + "/sanity-checks/lease-checks");
284 if (checks) {
286 sanity->set("lease-checks", checks);
287 result->set("sanity-checks", sanity);
288 }
289 getParam(result, xpath, "reservation-mode");
290 ConstElementPtr hosts = getHosts(xpath);
291 if (hosts && !hosts->empty()) {
292 result->set("reservations", hosts);
293 }
294 ConstElementPtr config_ctrl =
295 getConfigControlKea(xpath + "/config-control");
296 if (config_ctrl) {
297 result->set("config-control", config_ctrl);
298 }
299 getParam(result, xpath, "server-tag");
300 ConstElementPtr queue_ctrl = getItem(xpath + "/dhcp-queue-control");
301 if (queue_ctrl) {
302 result->set("dhcp-queue-control",
303 Element::fromJSON(queue_ctrl->stringValue()));
304 }
305 ConstElementPtr loggers = getLoggers(xpath);
306 if (loggers && !loggers->empty()) {
307 result->set("loggers", loggers);
308 }
309 return (result);
310}
311
314 string xpath = "/kea-dhcp4-server:config";
315 ElementPtr result = getServerKeaDhcpCommon(xpath);
316 // Handle subnets.
317 ConstElementPtr subnets = getSubnets(xpath);
318 if (subnets && !subnets->empty()) {
319 result->set("subnet4", subnets);
320 }
321 // Handle interfaces.
322 ElementPtr if_config = Element::createMap();
323 ConstElementPtr ifs = getItems(xpath + "/interfaces-config/interfaces");
324 if (ifs && !ifs->empty()) {
325 if_config->set("interfaces", ifs);
326 }
327 getParam(if_config, xpath + "/interfaces-config", "dhcp-socket-type");
328 getParam(if_config, xpath + "/interfaces-config", "outbound-interface");
329 getParam(if_config, xpath + "/interfaces-config", "re-detect");
330 ConstElementPtr context =
331 getItem(xpath + "/interfaces-config/user-context");
332 if (context) {
333 if_config->set("user-context",
334 Element::fromJSON(context->stringValue()));
335 }
336 if (!if_config->empty()) {
337 result->set("interfaces-config", if_config);
338 }
339 // Handle DHCPv4 specific global parameters.
340 getParam(result, xpath, "echo-client-id");
341 getParam(result, xpath, "match-client-id");
342 getParam(result, xpath, "next-server");
343 getParam(result, xpath, "server-hostname");
344 getParam(result, xpath, "boot-file-name");
345 getParam(result, xpath, "authoritative");
346 return (result);
347}
348
351 string xpath = "/kea-dhcp6-server:config";
352 ElementPtr result = getServerKeaDhcpCommon(xpath);
353 // Handle DHCPv6 specific global parameters.
354 getParam(result, xpath, "preferred-lifetime");
355 // Handle subnets.
356 ConstElementPtr subnets = getSubnets(xpath);
357 if (subnets && !subnets->empty()) {
358 result->set("subnet6", subnets);
359 }
360 // Handle interfaces.
361 ElementPtr if_config = Element::createMap();
362 ConstElementPtr ifs = getItems(xpath + "/interfaces-config/interfaces");
363 if (ifs && !ifs->empty()) {
364 if_config->set("interfaces", ifs);
365 }
366 getParam(if_config, xpath + "/interfaces-config", "re-detect");
367 ConstElementPtr context =
368 getItem(xpath + "/interfaces-config/user-context");
369 if (context) {
370 if_config->set("user-context",
371 Element::fromJSON(context->stringValue()));
372 }
373 if (!if_config->empty()) {
374 result->set("interfaces-config", if_config);
375 }
376 // Handle DHCPv6 specific global entries.
377 ConstElementPtr relay = getItems(xpath + "/relay-supplied-options");
378 if (relay) {
379 result->set("relay-supplied-options", relay);
380 }
381 ConstElementPtr macs = getItems(xpath + "/mac-sources");
382 if (macs) {
383 result->set("mac-sources", macs);
384 }
385 // Handle server-id.
386 // @todo: move to a DUID translator.
387 ElementPtr server_id = Element::createMap();
388 getParam(server_id, xpath + "/server-id", "type");
389 getParam(server_id, xpath + "/server-id", "identifier");
390 getParam(server_id, xpath + "/server-id", "time");
391 getParam(server_id, xpath + "/server-id", "htype");
392 getParam(server_id, xpath + "/server-id", "enterprise-id");
393 getParam(server_id, xpath + "/server-id", "persist");
394 context = getItem(xpath + "/server-id/user-context");
395 if (context) {
396 server_id->set("user-context",
397 Element::fromJSON(context->stringValue()));
398 }
399 if (!server_id->empty()) {
400 result->set("server-id", server_id);
401 }
402 return (result);
403}
404
405void
407 try {
408 if (model_ == IETF_DHCPV6_SERVER) {
409 if (elem) {
411 setConfigIetf6(elem);
412 } else {
414 }
415 } else if (model_ == KEA_DHCP4_SERVER) {
416 if (elem) {
418 setConfigKea4(elem);
419 } else {
420 delConfigKea();
421 }
422 } else if (model_ == KEA_DHCP6_SERVER) {
423 if (elem) {
425 setConfigKea6(elem);
426 } else {
427 delConfigKea();
428 }
429 } else {
431 "setConfig not implemented for the model: " << model_);
432 }
433 } catch (const sysrepo_exception& ex) {
435 "sysrepo error setting config '" << elem->str()
436 << "': " << ex.what());
437 }
438}
439
440void
442 delItem("/" + model_ + ":server");
443}
444
445void
447 string xpath = "/" + model_ + ":server/server-config";
448 ConstElementPtr dhcp6 = elem->get("Dhcp6");
449 if (!dhcp6) {
450 isc_throw(BadValue, "no Dhcp6 entry in " << elem->str());
451 }
452 ConstElementPtr ranges = dhcp6->get("subnet6");
453 if (ranges && !ranges->empty()) {
454 setSubnets(xpath + "/network-ranges", ranges);
455 }
456 // Skip everything else.
457}
458
459void
461 delItem("/" + model_ + ":config");
462}
463
464void
466 ConstElementPtr dhcp = elem->get("Dhcp4");
467 if (dhcp) {
468 setServerKeaDhcp4(dhcp);
469 }
470 ConstElementPtr logging = elem->get("Logging");
471 if (logging) {
472 setServerKeaLogging(logging);
473 }
474}
475
476void
478 ConstElementPtr dhcp = elem->get("Dhcp6");
479 if (dhcp) {
480 setServerKeaDhcp6(dhcp);
481 }
482 ConstElementPtr logging = elem->get("Logging");
483 if (logging) {
484 setServerKeaLogging(logging);
485 }
486}
487
488void
490 ConstElementPtr elem) {
491 ConstElementPtr valid = elem->get("valid-lifetime");
492 if (valid) {
493 setItem(xpath + "/valid-lifetime", valid, SR_UINT32_T);
494 }
495 ConstElementPtr renew = elem->get("renew-timer");
496 if (renew) {
497 setItem(xpath + "/renew-timer", renew, SR_UINT32_T);
498 }
499 ConstElementPtr rebind = elem->get("rebind-timer");
500 if (rebind) {
501 setItem(xpath + "/rebind-timer", rebind, SR_UINT32_T);
502 }
503 ConstElementPtr period = elem->get("decline-probation-period");
504 if (period) {
505 setItem(xpath + "/decline-probation-period", period, SR_UINT32_T);
506 }
507 ConstElementPtr networks = elem->get("shared-networks");
508 if (networks) {
509 setSharedNetworks(xpath, networks);
510 }
511 ConstElementPtr classes = elem->get("client-classes");
512 if (classes && !classes->empty()) {
513 setClasses(xpath, classes);
514 }
515 ConstElementPtr database = elem->get("lease-database");
516 if (database) {
517 setDatabase(xpath + "/lease-database", database);
518 }
519 ConstElementPtr databases = elem->get("hosts-databases");
520 if (databases && !databases->empty()) {
521 setDatabases(xpath + "/hosts-database", databases);
522 } else {
523 // Reuse of database from lease-database.
524 database = elem->get("hosts-database");
525 if (database) {
527 list->add(copy(database));
528 setDatabases(xpath + "/hosts-database", list);
529 }
530 }
531 ConstElementPtr host_ids = elem->get("host-reservation-identifiers");
532 if (host_ids) {
533 for (ConstElementPtr id : host_ids->listValue()) {
534 setItem(xpath + "/host-reservation-identifiers", id, SR_ENUM_T);
535 }
536 }
537 ConstElementPtr defs = elem->get("option-def");
538 if (defs && !defs->empty()) {
539 setOptionDefList(xpath, defs);
540 }
541 ConstElementPtr options = elem->get("option-data");
542 if (options && !options->empty()) {
543 setOptionDataList(xpath, options);
544 }
545 ConstElementPtr hook_libs = elem->get("hooks-libraries");
546 if (hook_libs) {
547 for (ConstElementPtr lib : hook_libs->listValue()) {
548 ConstElementPtr name = lib->get("library");
549 if (!name) {
550 continue;
551 }
552 ostringstream hook_lib;
553 hook_lib << xpath << "/hook-library[library='"
554 << name->stringValue() << "']";
555 ConstElementPtr params = lib->get("parameters");
556 if (params) {
557 hook_lib << "/parameters";
558 setItem(hook_lib.str(), Element::create(params->str()),
559 SR_STRING_T);
560 } else {
562 setItem(hook_lib.str(), list, SR_LIST_T);
563 }
564 }
565 }
566 ConstElementPtr expired = elem->get("expired-leases-processing");
567 if (expired) {
568 ConstElementPtr reclaim = expired->get("reclaim-timer-wait-time");
569 if (reclaim) {
570 setItem(xpath + "/expired-leases-processing/reclaim-timer-wait-time",
571 reclaim, SR_UINT32_T);
572 }
573 ConstElementPtr flush =
574 expired->get("flush-reclaimed-timer-wait-time");
575 if (flush) {
576 setItem(xpath + "/expired-leases-processing/flush-reclaimed-timer-wait-time",
577 flush, SR_UINT32_T);
578 }
579 ConstElementPtr hold = expired->get("hold-reclaimed-time");
580 if (hold) {
581 setItem(xpath + "/expired-leases-processing/hold-reclaimed-time",
582 hold, SR_UINT32_T);
583 }
584 ConstElementPtr max_leases = expired->get("max-reclaim-leases");
585 if (max_leases) {
586 setItem(xpath + "/expired-leases-processing/max-reclaim-leases",
587 max_leases, SR_UINT32_T);
588 }
589 ConstElementPtr max_time = expired->get("max-reclaim-time");
590 if (max_time) {
591 setItem(xpath + "/expired-leases-processing/max-reclaim-time",
592 max_time, SR_UINT32_T);
593 }
594 ConstElementPtr unwarned = expired->get("unwarned-reclaim-cycles");
595 if (unwarned) {
596 setItem(xpath + "/expired-leases-processing/unwarned-reclaim-cycles",
597 unwarned, SR_UINT32_T);
598 }
599 }
600 ConstElementPtr port = elem->get("dhcp4o6-port");
601 if (port) {
602 setItem(xpath + "/dhcp4o6-port", port, SR_UINT16_T);
603 }
604 ConstElementPtr socket = elem->get("control-socket");
605 if (socket) {
606 setControlSocket(xpath + "/control-socket", socket);
607 }
608 ConstElementPtr ddns = elem->get("dhcp-ddns");
609 if (ddns) {
610 ConstElementPtr enable = ddns->get("enable-updates");
611 if (enable) {
612 setItem(xpath + "/dhcp-ddns/enable-updates", enable, SR_BOOL_T);
613 }
614 ConstElementPtr suffix = ddns->get("qualifying-suffix");
615 if (suffix) {
616 setItem(xpath + "/dhcp-ddns/qualifying-suffix", suffix,
617 SR_STRING_T);
618 }
619 ConstElementPtr server_ip = ddns->get("server-ip");
620 if (server_ip) {
621 setItem(xpath + "/dhcp-ddns/server-ip", server_ip, SR_STRING_T);
622 }
623 ConstElementPtr server_port = ddns->get("server-port");
624 if (server_port) {
625 setItem(xpath + "/dhcp-ddns/server-port", server_port,
626 SR_UINT16_T);
627 }
628 ConstElementPtr sender_ip = ddns->get("sender-ip");
629 if (sender_ip) {
630 setItem(xpath + "/dhcp-ddns/sender-ip", sender_ip, SR_STRING_T);
631 }
632 ConstElementPtr sender_port = ddns->get("sender-port");
633 if (sender_port) {
634 setItem(xpath + "/dhcp-ddns/sender-port", sender_port,
635 SR_UINT16_T);
636 }
637 ConstElementPtr queue = ddns->get("max-queue-size");
638 if (queue) {
639 setItem(xpath + "/dhcp-ddns/max-queue-size", queue, SR_UINT32_T);
640 }
641 ConstElementPtr protocol = ddns->get("ncr-protocol");
642 if (protocol) {
643 setItem(xpath + "/dhcp-ddns/ncr-protocol", protocol, SR_ENUM_T);
644 }
645 ConstElementPtr format = ddns->get("ncr-format");
646 if (format) {
647 setItem(xpath + "/dhcp-ddns/ncr-format", format, SR_ENUM_T);
648 }
649 ConstElementPtr no_up = ddns->get("override-no-update");
650 if (no_up) {
651 setItem(xpath + "/dhcp-ddns/override-no-update", no_up, SR_BOOL_T);
652 }
653 ConstElementPtr client = ddns->get("override-client-update");
654 if (client) {
655 setItem(xpath + "/dhcp-ddns/override-client-update", client,
656 SR_BOOL_T);
657 }
658 ConstElementPtr replace = ddns->get("replace-client-name");
659 if (replace) {
660 setItem(xpath + "/dhcp-ddns/replace-client-name", replace,
661 SR_ENUM_T);
662 }
663 ConstElementPtr generated = ddns->get("generated-prefix");
664 if (generated) {
665 setItem(xpath + "/dhcp-ddns/generated-prefix", generated,
666 SR_STRING_T);
667 }
668 ConstElementPtr char_set = ddns->get("hostname-char-set");
669 if (char_set) {
670 setItem(xpath + "/dhcp-ddns/hostname-char-set", char_set,
671 SR_STRING_T);
672 }
673 ConstElementPtr char_repl = ddns->get("hostname-char-replacement");
674 if (char_repl) {
675 setItem(xpath + "/dhcp-ddns/hostname-char-replacement", char_repl,
676 SR_STRING_T);
677 }
678 ConstElementPtr context = Adaptor::getContext(ddns);
679 if (context) {
680 ConstElementPtr repr = Element::create(context->str());
681 setItem(xpath + "/dhcp-ddns/user-context", repr, SR_STRING_T);
682 }
683 }
684 ConstElementPtr context = Adaptor::getContext(elem);
685 if (context) {
686 ConstElementPtr repr = Element::create(context->str());
687 setItem(xpath + "/user-context", repr, SR_STRING_T);
688 }
689 ConstElementPtr sanity = elem->get("sanity-checks");
690 if (sanity) {
691 ConstElementPtr checks = sanity->get("lease-checks");
692 if (checks) {
693 setItem(xpath + "/sanity-checks/lease-checks", checks, SR_ENUM_T);
694 }
695 }
696 ConstElementPtr hr_mode = elem->get("reservation-mode");
697 if (hr_mode) {
698 setItem(xpath + "/reservation-mode", hr_mode, SR_ENUM_T);
699 }
700 ConstElementPtr hosts = elem->get("reservations");
701 if (hosts && !hosts->empty()) {
702 setHosts(xpath, hosts);
703 }
704 ConstElementPtr config_ctrl = elem->get("config-control");
705 if (config_ctrl && !config_ctrl->empty()) {
706 databases = config_ctrl->get("config-databases");
707 if (databases && !databases->empty()) {
708 setDatabases(xpath + "/config-control/config-database", databases);
709 }
710 }
711 ConstElementPtr server_tag = elem->get("server-tag");
712 if (server_tag) {
713 setItem(xpath + "/server-tag", server_tag, SR_STRING_T);
714 }
715 ConstElementPtr queue_ctrl = elem->get("dhcp-queue-control");
716 if (queue_ctrl) {
717 ConstElementPtr repr = Element::create(queue_ctrl->str());
718 setItem(xpath + "/dhcp-queue-control", repr, SR_STRING_T);
719 }
720}
721
722void
724 string xpath = "/kea-dhcp4-server:config";
725 setServerKeaDhcpCommon(xpath, elem);
726 ConstElementPtr subnets = elem->get("subnet4");
727 if (subnets) {
728 setSubnets(xpath, subnets);
729 }
730 ConstElementPtr if_config = elem->get("interfaces-config");
731 if (if_config) {
732 ConstElementPtr ifs = if_config->get("interfaces");
733 if (ifs && !ifs->empty()) {
734 for (ConstElementPtr intf : ifs->listValue()) {
735 setItem(xpath + "/interfaces-config/interfaces",
736 intf, SR_STRING_T);
737 }
738 }
739 ConstElementPtr ds_type = if_config->get("dhcp-socket-type");
740 if (ds_type) {
741 setItem(xpath + "/interfaces-config/dhcp-socket-type",
742 ds_type, SR_ENUM_T);
743 }
744 ConstElementPtr out_if = if_config->get("outbound-interface");
745 if (out_if) {
746 setItem(xpath + "/interfaces-config/outbound-interface",
747 out_if, SR_ENUM_T);
748 }
749 ConstElementPtr redetect = if_config->get("re-detect");
750 if (redetect) {
751 setItem(xpath + "/interfaces-config/re-detect",
752 redetect, SR_BOOL_T);
753 }
754 ConstElementPtr context = Adaptor::getContext(if_config);
755 if (context) {
756 setItem(xpath + "/interfaces-config/user-context",
757 Element::create(context->str()), SR_STRING_T);
758 }
759 }
760 ConstElementPtr echo = elem->get("echo-client-id");
761 if (echo) {
762 setItem(xpath + "/echo-client-id", echo, SR_BOOL_T);
763 }
764 ConstElementPtr match = elem->get("match-client-id");
765 if (match) {
766 setItem(xpath + "/match-client-id", match, SR_BOOL_T);
767 }
768 ConstElementPtr next = elem->get("next-server");
769 if (next) {
770 setItem(xpath + "/next-server", next, SR_STRING_T);
771 }
772 ConstElementPtr hostname = elem->get("server-hostname");
773 if (hostname) {
774 setItem(xpath + "/server-hostname", hostname, SR_STRING_T);
775 }
776 ConstElementPtr boot = elem->get("boot-file-name");
777 if (boot) {
778 setItem(xpath + "/boot-file-name", boot, SR_STRING_T);
779 }
780 ConstElementPtr auth = elem->get("authoritative");
781 if (auth) {
782 setItem(xpath + "/authoritative", auth, SR_BOOL_T);
783 }
784}
785
786void
788 string xpath = "/kea-dhcp6-server:config";
789 setServerKeaDhcpCommon(xpath, elem);
790 ConstElementPtr preferred = elem->get("preferred-lifetime");
791 if (preferred) {
792 setItem(xpath + "/preferred-lifetime", preferred, SR_UINT32_T);
793 }
794 ConstElementPtr subnets = elem->get("subnet6");
795 if (subnets) {
796 setSubnets(xpath, subnets);
797 }
798 ConstElementPtr if_config = elem->get("interfaces-config");
799 if (if_config) {
800 ConstElementPtr ifs = if_config->get("interfaces");
801 if (ifs && !ifs->empty()) {
802 for (ConstElementPtr intf : ifs->listValue()) {
803 setItem(xpath + "/interfaces-config/interfaces",
804 intf, SR_STRING_T);
805 }
806 }
807 ConstElementPtr redetect = if_config->get("re-detect");
808 if (redetect) {
809 setItem(xpath + "/interfaces-config/re-detect",
810 redetect, SR_BOOL_T);
811 }
812 ConstElementPtr context = Adaptor::getContext(if_config);
813 if (context) {
814 setItem(xpath + "/interfaces-config/user-context",
815 Element::create(context->str()), SR_STRING_T);
816 }
817 }
818 ConstElementPtr relay = elem->get("relay-supplied-options");
819 if (relay) {
820 for (ConstElementPtr addr : relay->listValue()) {
821 setItem(xpath + "/relay-supplied-options", addr, SR_STRING_T);
822 }
823 }
824 ConstElementPtr macs = elem->get("mac-sources");
825 if (macs) {
826 for (ConstElementPtr source : macs->listValue()) {
827 setItem(xpath + "/mac-sources", source, SR_STRING_T);
828 }
829 }
830 ConstElementPtr server_id = elem->get("server-id");
831 if (server_id) {
832 ConstElementPtr id_type = server_id->get("type");
833 if (id_type) {
834 setItem(xpath + "/server-id/type", id_type, SR_ENUM_T);
835 }
836 ConstElementPtr id_id = server_id->get("identifier");
837 if (id_id) {
838 setItem(xpath + "/server-id/identifier", id_id, SR_STRING_T);
839 }
840 ConstElementPtr id_time = server_id->get("time");
841 if (id_time) {
842 setItem(xpath + "/server-id/time", id_time, SR_UINT32_T);
843 }
844 ConstElementPtr id_htype = server_id->get("htype");
845 if (id_htype) {
846 setItem(xpath + "/server-id/htype", id_htype, SR_UINT16_T);
847 }
848 ConstElementPtr id_ent_id = server_id->get("enterprise-id");
849 if (id_ent_id) {
850 setItem(xpath + "/server-id/enterprise-id", id_ent_id,
851 SR_UINT32_T);
852 }
853 ConstElementPtr id_persist = server_id->get("persist");
854 if (id_persist) {
855 setItem(xpath + "/server-id/persist", id_persist, SR_BOOL_T);
856 }
857 ConstElementPtr context = Adaptor::getContext(server_id);
858 if (context) {
859 ConstElementPtr repr = Element::create(context->str());
860 setItem(xpath + "/server-id/user-context", repr, SR_STRING_T);
861 }
862 }
863}
864
865void
867 string xpath = "/" + model_ + ":config";
868 ConstElementPtr loggers = elem->get("loggers");
869 if (loggers) {
870 setLoggers(xpath, loggers);
871 }
872}
873
874}; // end of namespace isc::yang
875}; // end of namespace isc
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
A generic exception that is thrown when a function is not implemented.
static ElementPtr create(const Position &pos=ZERO_POSITION())
Definition: data.cc:223
static ElementPtr fromJSON(const std::string &in, bool preproc=false)
These functions will parse the given string (JSON) representation of a compound element.
Definition: data.cc:750
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
Definition: data.cc:268
static ElementPtr createList(const Position &pos=ZERO_POSITION())
Creates an empty ListElement type ElementPtr.
Definition: data.cc:263
static void preProcess4(isc::data::ConstElementPtr config)
Pre process a DHCPv4 configuration.
static void preProcess6(isc::data::ConstElementPtr config)
Pre process a DHCPv6 configuration.
static isc::data::ConstElementPtr getContext(isc::data::ConstElementPtr parent)
Get user context.
Definition: adaptor.cc:25
Between YANG and JSON translator class for basic values.
Definition: translator.h:27
std::string getNext(sysrepo::S_Iter_Value iter)
Get xpath of the next YANG list item.
Definition: translator.cc:283
isc::data::ElementPtr getItem(const std::string &xpath)
Get and translate basic value from YANG to JSON.
Definition: translator.cc:104
sysrepo::S_Iter_Value getIter(const std::string &xpath)
List iterator methods keeping the session private.
Definition: translator.cc:278
std::string model_
The model.
Definition: translator.h:132
void delItem(const std::string &xpath)
Delete basic value from YANG.
Definition: translator.cc:266
void setItem(const std::string &xpath, isc::data::ConstElementPtr elem, sr_type_t type)
Translate and set basic value from JSON to YANG.
Definition: translator.cc:250
isc::data::ElementPtr getItems(const std::string &xpath)
Get and translate a list of basic values from YANG to JSON.
Definition: translator.cc:119
Client class translation between YANG and JSON.
A translator class for converting a client class list between YANG and JSON.
isc::data::ConstElementPtr getClasses(const std::string &xpath)
Get and translate client classes from YANG to JSON.
void setClasses(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set client classes from JSON to YANG.
isc::data::ElementPtr getConfigKea4()
getConfig for kea-dhcp4-server.
isc::data::ElementPtr getExpiredKea(const std::string &xpath)
Retrieves expired leases processing parameters from sysrepo.
void setServerKeaDhcpCommon(const std::string &xpath, isc::data::ConstElementPtr elem)
setServer common part for kea-dhcp[46]-server:config.
void delConfigKea()
delConfig for kea-dhcp[46]-server.
isc::data::ElementPtr getServerKeaDhcp4()
getServer for kea-dhcp4-server:config.
void setConfigKea6(isc::data::ConstElementPtr elem)
setConfig for kea-dhcp6-server.
isc::data::ElementPtr getHooksKea(const std::string &xpath)
Retrieves hooks configuration from sysrepo.
isc::data::ElementPtr getServerKeaDhcpCommon(const std::string &xpath)
getServer common part for kea-dhcp[46]-server:config.
void setConfigIetf6(isc::data::ConstElementPtr elem)
setConfig for ietf-dhcpv6-server.
isc::data::ElementPtr getDdnsKea(const std::string &xpath)
Retrieves DDNS configuration from sysrepo.
void getParam(isc::data::ElementPtr &storage, const std::string &xpath, const std::string &name)
Retrieves an item and stores in the specified storage.
void setConfigKea4(isc::data::ConstElementPtr elem)
setConfig for kea-dhcp[46]-server.
isc::data::ElementPtr getConfigControlKea(const std::string &xpath)
Retrieves configuration control from sysrepo.
void setServerKeaDhcp6(isc::data::ConstElementPtr elem)
setServer for kea-dhcp6-server:config.
void setConfig(isc::data::ConstElementPtr elem)
Translate and sets the DHCP server configuration from JSON to YANG.
isc::data::ElementPtr getConfigKea6()
getConfig for kea-dhcp6-server.
void setServerKeaLogging(isc::data::ConstElementPtr elem)
set Logging part for kea-*:config.
isc::data::ElementPtr getConfigIetf6()
getConfig for ietf-dhcpv6-server.
void setServerKeaDhcp4(isc::data::ConstElementPtr elem)
setServer for kea-dhcp4-server:config.
TranslatorConfig(sysrepo::S_Session session, const std::string &model)
Constructor.
isc::data::ElementPtr getServerKeaDhcp6()
getServer for kea-dhcp6-server:config.
void delConfigIetf6()
delConfig for ietf-dhcpv6-server.
virtual ~TranslatorConfig()
Destructor.
isc::data::ElementPtr getConfig()
Get and translate the whole DHCP server configuration from YANG to JSON.
Control socket translation between YANG and JSON.
void setControlSocket(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set control socket from JSON to YANG.
isc::data::ConstElementPtr getControlSocket(const std::string &xpath)
Get and translate a control socket from YANG to JSON.
Database access translation between YANG and JSON.
void setDatabase(const std::string &xpath, isc::data::ConstElementPtr elem, bool skip=false)
Translate and set database access from JSON to YANG.
isc::data::ElementPtr getDatabase(const std::string &xpath)
Get and translate a database access from YANG to JSON.
A translator class for converting a database access list between YANG and JSON.
void setDatabases(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set database accesses from JSON to YANG.
isc::data::ConstElementPtr getDatabases(const std::string &xpath)
Get and translate database accesses from YANG to JSON.
Translation between YANG and JSON for a single host reservation.
A translator class for converting host reservations list between YANG and JSON.
isc::data::ElementPtr getHosts(const std::string &xpath)
Get and translate host reservations from YANG to JSON.
void setHosts(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set (address) host reservations from JSON to YANG.
Logger translation between YANG and JSON.
A translator class for converting a logger list between YANG and JSON.
void setLoggers(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set loggeres from JSON to YANG.
isc::data::ConstElementPtr getLoggers(const std::string &xpath)
Get and translate loggeres from YANG to JSON.
A translator class for converting an option data list between YANG and JSON.
isc::data::ConstElementPtr getOptionDataList(const std::string &xpath)
Get and translate option data list from YANG to JSON.
void setOptionDataList(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set option data list from JSON to YANG.
Option data translation between YANG and JSON.
Currently supports kea-dhcp[46]-server models.
void setOptionDefList(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set option definition list from JSON to YANG.
isc::data::ConstElementPtr getOptionDefList(const std::string &xpath)
Get and translate option definition list from YANG to JSON.
Option definition translation between YANG and JSON.
Prefix delegation pool translation between YANG and JSON.
A translator class for converting a pd-pool list between YANG and JSON.
A translator class for converting a pool between YANG and JSON.
A translator class for converting pools between YANG and JSON.
Shared network translation between YANG and JSON.
A translator class for converting a shared network list between YANG and JSON.
isc::data::ElementPtr getSharedNetworks(const std::string &xpath)
Get and translate shared networks from YANG to JSON.
void setSharedNetworks(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set shared networks from JSON to YANG.
Subnet (aka network range) translation between YANG and JSON.
A translator class for converting a subnet list between YANG and JSON.
void setSubnets(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set subnets from JSON to YANG.
isc::data::ElementPtr getSubnets(const std::string &xpath)
Get and translate subnets from YANG to JSON.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
Definition: data.cc:1114
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:23
boost::shared_ptr< Element > ElementPtr
Definition: data.h:22
Defines the logger used by the top-level component of kea-dhcp-ddns.