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 
14 using namespace std;
15 using namespace isc::data;
16 #ifndef HAVE_PRE_0_7_6_SYSREPO
17 using namespace sysrepo;
18 #endif
19 
20 namespace isc {
21 namespace yang {
22 
23 TranslatorConfig::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 
70  ElementPtr result = Element::createMap();
71  ElementPtr dhcp6 = Element::createMap();
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 
85  ElementPtr result = Element::createMap();
87  result->set("Dhcp4", dhcp);
88  ConstElementPtr loggers = dhcp->get("loggers");
89  if (loggers) {
90  dhcp->remove("loggers");
91 
92  ElementPtr logging = Element::createMap();
93  logging->set("loggers", loggers);
94  result->set("Logging", logging);
95  }
96  return (result);
97 }
98 
101  ElementPtr result = Element::createMap();
102  ElementPtr dhcp = getServerKeaDhcp6();
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 
115 void
116 TranslatorConfig::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 
125 TranslatorConfig::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 
157 TranslatorConfig::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 
175 TranslatorConfig::getDdnsKea(const std::string& xpath) {
176  ElementPtr ddns = Element::createMap();
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 
225  ElementPtr result = Element::createMap();
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) {
285  ElementPtr sanity = Element::createMap();
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 
405 void
407  try {
408  if (model_ == IETF_DHCPV6_SERVER) {
409  if (elem) {
411  setConfigIetf6(elem);
412  } else {
413  delConfigIetf6();
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 
440 void
442  delItem("/" + model_ + ":server");
443 }
444 
445 void
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 
459 void
461  delItem("/" + model_ + ":config");
462 }
463 
464 void
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 
476 void
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 
488 void
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) {
526  ElementPtr list = Element::createList();
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 {
561  ConstElementPtr list = Element::createList();
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 
722 void
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 
786 void
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 
865 void
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
isc::yang::TranslatorOptionDataList
A translator class for converting an option data list between YANG and JSON.
Definition: translator_option_data.h:126
isc::yang::TranslatorConfig::getServerKeaDhcp4
isc::data::ElementPtr getServerKeaDhcp4()
getServer for kea-dhcp4-server:config.
Definition: translator_config.cc:313
isc::yang::TranslatorLoggers
A translator class for converting a logger list between YANG and JSON.
Definition: translator_logger.h:172
isc::yang::TranslatorControlSocket::setControlSocket
void setControlSocket(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set control socket from JSON to YANG.
Definition: translator_control_socket.cc:68
isc::data::copy
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
Definition: data.cc:1114
isc::yang::TranslatorConfig::getServerKeaDhcp6
isc::data::ElementPtr getServerKeaDhcp6()
getServer for kea-dhcp6-server:config.
Definition: translator_config.cc:350
isc::yang::TranslatorConfig::setServerKeaDhcp6
void setServerKeaDhcp6(isc::data::ConstElementPtr elem)
setServer for kea-dhcp6-server:config.
Definition: translator_config.cc:787
isc::yang::TranslatorBasic::getIter
sysrepo::S_Iter_Value getIter(const std::string &xpath)
List iterator methods keeping the session private.
Definition: translator.cc:278
isc::yang::TranslatorConfig::setConfigIetf6
void setConfigIetf6(isc::data::ConstElementPtr elem)
setConfig for ietf-dhcpv6-server.
Definition: translator_config.cc:446
isc::yang::AdaptorConfig::preProcess4
static void preProcess4(isc::data::ConstElementPtr config)
Pre process a DHCPv4 configuration.
Definition: adaptor_config.cc:618
isc::yang::TranslatorOptionDataList::getOptionDataList
isc::data::ConstElementPtr getOptionDataList(const std::string &xpath)
Get and translate option data list from YANG to JSON.
Definition: translator_option_data.cc:138
isc::yang::AdaptorConfig::preProcess6
static void preProcess6(isc::data::ConstElementPtr config)
Pre process a DHCPv6 configuration.
Definition: adaptor_config.cc:634
isc::yang::TranslatorConfig::delConfigIetf6
void delConfigIetf6()
delConfig for ietf-dhcpv6-server.
Definition: translator_config.cc:441
isc::yang::TranslatorConfig::setServerKeaDhcp4
void setServerKeaDhcp4(isc::data::ConstElementPtr elem)
setServer for kea-dhcp4-server:config.
Definition: translator_config.cc:723
isc::yang::TranslatorHost
Translation between YANG and JSON for a single host reservation.
Definition: translator_host.h:112
isc::yang::TranslatorOptionDefList::setOptionDefList
void setOptionDefList(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set option definition list from JSON to YANG.
Definition: translator_option_def.cc:182
isc::yang::TranslatorSubnets
A translator class for converting a subnet list between YANG and JSON.
Definition: translator_subnet.h:299
isc::yang::TranslatorConfig::setConfigKea4
void setConfigKea4(isc::data::ConstElementPtr elem)
setConfig for kea-dhcp[46]-server.
Definition: translator_config.cc:465
isc::yang::TranslatorSharedNetworks
A translator class for converting a shared network list between YANG and JSON.
Definition: translator_shared_network.h:183
isc::yang::TranslatorPool
A translator class for converting a pool between YANG and JSON.
Definition: translator_pool.h:124
isc::yang::TranslatorConfig::getConfigKea6
isc::data::ElementPtr getConfigKea6()
getConfig for kea-dhcp6-server.
Definition: translator_config.cc:100
isc::yang::TranslatorConfig::setServerKeaDhcpCommon
void setServerKeaDhcpCommon(const std::string &xpath, isc::data::ConstElementPtr elem)
setServer common part for kea-dhcp[46]-server:config.
Definition: translator_config.cc:489
isc::yang::TranslatorSubnet
Subnet (aka network range) translation between YANG and JSON.
Definition: translator_subnet.h:236
isc::yang::TranslatorLoggers::setLoggers
void setLoggers(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set loggeres from JSON to YANG.
Definition: translator_logger.cc:246
isc::yang::TranslatorDatabase::getDatabase
isc::data::ElementPtr getDatabase(const std::string &xpath)
Get and translate a database access from YANG to JSON.
Definition: translator_database.cc:31
isc::yang::TranslatorBasic::getNext
std::string getNext(sysrepo::S_Iter_Value iter)
Get xpath of the next YANG list item.
Definition: translator.cc:283
isc::yang::TranslatorClasses
A translator class for converting a client class list between YANG and JSON.
Definition: translator_class.h:123
isc::yang::TranslatorConfig::~TranslatorConfig
virtual ~TranslatorConfig()
Destructor.
Definition: translator_config.cc:48
isc::yang::TranslatorSharedNetworks::setSharedNetworks
void setSharedNetworks(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set shared networks from JSON to YANG.
Definition: translator_shared_network.cc:320
isc::yang::TranslatorConfig::setConfigKea6
void setConfigKea6(isc::data::ConstElementPtr elem)
setConfig for kea-dhcp6-server.
Definition: translator_config.cc:477
isc::yang::TranslatorDatabases::getDatabases
isc::data::ConstElementPtr getDatabases(const std::string &xpath)
Get and translate database accesses from YANG to JSON.
Definition: translator_database.cc:241
isc::yang::TranslatorBasic::getItem
isc::data::ElementPtr getItem(const std::string &xpath)
Get and translate basic value from YANG to JSON.
Definition: translator.cc:104
isc::yang::TranslatorClasses::setClasses
void setClasses(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set client classes from JSON to YANG.
Definition: translator_class.cc:218
isc::data
Definition: cfg_to_element.h:25
isc::yang::TranslatorLogger
Logger translation between YANG and JSON.
Definition: translator_logger.h:94
isc::yang::TranslatorOptionDef
Option definition translation between YANG and JSON.
Definition: translator_option_def.h:78
isc::yang::TranslatorControlSocket
Control socket translation between YANG and JSON.
Definition: translator_control_socket.h:70
isc::yang::TranslatorBasic::getItems
isc::data::ElementPtr getItems(const std::string &xpath)
Get and translate a list of basic values from YANG to JSON.
Definition: translator.cc:119
isc::yang::TranslatorSharedNetwork
Shared network translation between YANG and JSON.
Definition: translator_shared_network.h:125
isc::yang::TranslatorConfig::getConfigControlKea
isc::data::ElementPtr getConfigControlKea(const std::string &xpath)
Retrieves configuration control from sysrepo.
Definition: translator_config.cc:208
isc::yang::TranslatorOptionData
Option data translation between YANG and JSON.
Definition: translator_option_data.h:75
isc
Defines the logger used by the top-level component of kea-dhcp-ddns.
Definition: agent_parser.cc:144
isc::Exception::what
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
Definition: exceptions/exceptions.cc:32
isc::yang::TranslatorPools
A translator class for converting pools between YANG and JSON.
Definition: translator_pool.h:198
yang_models.h
isc_throw
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
Definition: exceptions/exceptions.h:192
isc::BadValue
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
Definition: exceptions/exceptions.h:132
isc::yang::TranslatorHosts
A translator class for converting host reservations list between YANG and JSON.
Definition: translator_host.h:163
isc::util::str::format
std::string format(const std::string &format, const std::vector< std::string > &args)
Apply Formatting.
Definition: strutil.cc:157
isc::yang::TranslatorSubnets::setSubnets
void setSubnets(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set subnets from JSON to YANG.
Definition: translator_subnet.cc:447
isc::yang::TranslatorConfig::getDdnsKea
isc::data::ElementPtr getDdnsKea(const std::string &xpath)
Retrieves DDNS configuration from sysrepo.
Definition: translator_config.cc:175
isc::yang::TranslatorConfig::getConfig
isc::data::ElementPtr getConfig()
Get and translate the whole DHCP server configuration from YANG to JSON.
Definition: translator_config.cc:52
isc::yang::TranslatorOptionDataList::setOptionDataList
void setOptionDataList(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set option data list from JSON to YANG.
Definition: translator_option_data.cc:173
isc::yang::TranslatorClasses::getClasses
isc::data::ConstElementPtr getClasses(const std::string &xpath)
Get and translate client classes from YANG to JSON.
Definition: translator_class.cc:180
isc::yang::TranslatorBasic::delItem
void delItem(const std::string &xpath)
Delete basic value from YANG.
Definition: translator.cc:266
isc::yang::TranslatorBasic::setItem
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::yang::TranslatorDatabases::setDatabases
void setDatabases(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set database accesses from JSON to YANG.
Definition: translator_database.cc:279
isc::yang::TranslatorConfig::getServerKeaDhcpCommon
isc::data::ElementPtr getServerKeaDhcpCommon(const std::string &xpath)
getServer common part for kea-dhcp[46]-server:config.
Definition: translator_config.cc:224
isc::yang::TranslatorPdPools
A translator class for converting a pd-pool list between YANG and JSON.
Definition: translator_pd_pool.h:183
isc::yang::TranslatorConfig::getConfigIetf6
isc::data::ElementPtr getConfigIetf6()
getConfig for ietf-dhcpv6-server.
Definition: translator_config.cc:69
isc::yang::TranslatorConfig::getHooksKea
isc::data::ElementPtr getHooksKea(const std::string &xpath)
Retrieves hooks configuration from sysrepo.
Definition: translator_config.cc:125
isc::yang::TranslatorDatabase::setDatabase
void setDatabase(const std::string &xpath, isc::data::ConstElementPtr elem, bool skip=false)
Translate and set database access from JSON to YANG.
Definition: translator_database.cc:126
isc::yang::TranslatorSharedNetworks::getSharedNetworks
isc::data::ElementPtr getSharedNetworks(const std::string &xpath)
Get and translate shared networks from YANG to JSON.
Definition: translator_shared_network.cc:295
isc::yang::TranslatorSubnets::getSubnets
isc::data::ElementPtr getSubnets(const std::string &xpath)
Get and translate subnets from YANG to JSON.
Definition: translator_subnet.cc:409
isc::yang::TranslatorBasic
Between YANG and JSON translator class for basic values.
Definition: translator.h:27
isc::yang::TranslatorConfig::setServerKeaLogging
void setServerKeaLogging(isc::data::ConstElementPtr elem)
set Logging part for kea-*:config.
Definition: translator_config.cc:866
isc::yang::TranslatorDatabases
A translator class for converting a database access list between YANG and JSON.
Definition: translator_database.h:161
adaptor_config.h
isc::yang::TranslatorConfig::getParam
void getParam(isc::data::ElementPtr &storage, const std::string &xpath, const std::string &name)
Retrieves an item and stores in the specified storage.
Definition: translator_config.cc:116
translator_config.h
isc::yang::TranslatorLoggers::getLoggers
isc::data::ConstElementPtr getLoggers(const std::string &xpath)
Get and translate loggeres from YANG to JSON.
Definition: translator_logger.cc:210
isc::yang::TranslatorOptionDefList
Currently supports kea-dhcp[46]-server models.
Definition: translator_option_def.h:131
isc::yang::TranslatorHosts::setHosts
void setHosts(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set (address) host reservations from JSON to YANG.
Definition: translator_host.cc:219
isc::yang::TranslatorConfig::getExpiredKea
isc::data::ElementPtr getExpiredKea(const std::string &xpath)
Retrieves expired leases processing parameters from sysrepo.
Definition: translator_config.cc:157
isc::yang::TranslatorHosts::getHosts
isc::data::ElementPtr getHosts(const std::string &xpath)
Get and translate host reservations from YANG to JSON.
Definition: translator_host.cc:195
isc::yang::TranslatorPdPool
Prefix delegation pool translation between YANG and JSON.
Definition: translator_pd_pool.h:116
isc::data::ElementPtr
boost::shared_ptr< Element > ElementPtr
Definition: data.h:20
isc::NotImplemented
A generic exception that is thrown when a function is not implemented.
Definition: exceptions/exceptions.h:165
isc::yang::TranslatorControlSocket::getControlSocket
isc::data::ConstElementPtr getControlSocket(const std::string &xpath)
Get and translate a control socket from YANG to JSON.
Definition: translator_control_socket.cc:32
isc::yang::TranslatorClass
Client class translation between YANG and JSON.
Definition: translator_class.h:73
isc::data::ConstElementPtr
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:23
isc::yang::TranslatorConfig::delConfigKea
void delConfigKea()
delConfig for kea-dhcp[46]-server.
Definition: translator_config.cc:460
isc::yang::TranslatorBasic::model_
std::string model_
The model.
Definition: translator.h:132
isc::yang::Adaptor::getContext
static isc::data::ConstElementPtr getContext(isc::data::ConstElementPtr parent)
Get user context.
Definition: adaptor.cc:25
isc::yang::TranslatorOptionDefList::getOptionDefList
isc::data::ConstElementPtr getOptionDefList(const std::string &xpath)
Get and translate option definition list from YANG to JSON.
Definition: translator_option_def.cc:147
isc::yang::TranslatorConfig::getConfigKea4
isc::data::ElementPtr getConfigKea4()
getConfig for kea-dhcp4-server.
Definition: translator_config.cc:84
isc::yang::SysrepoError
Sysrepo error.
Definition: sysrepo_error.h:16
isc::yang::TranslatorDatabase
Database access translation between YANG and JSON.
Definition: translator_database.h:104
isc::yang::TranslatorConfig::setConfig
void setConfig(isc::data::ConstElementPtr elem)
Translate and sets the DHCP server configuration from JSON to YANG.
Definition: translator_config.cc:406