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::data::ElementPtr getItems(const std::string &xpath)
Get and translate a list of basic values from YANG to JSON.
Definition: translator.cc:119
void setSharedNetworks(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set shared networks from JSON to YANG.
void setConfigKea4(isc::data::ConstElementPtr elem)
setConfig for kea-dhcp[46]-server.
isc::data::ElementPtr getHosts(const std::string &xpath)
Get and translate host reservations from YANG to JSON.
Subnet (aka network range) translation between YANG and JSON.
isc::data::ElementPtr getConfigKea6()
getConfig for kea-dhcp6-server.
A generic exception that is thrown when a function is not implemented.
isc::data::ConstElementPtr getDatabases(const std::string &xpath)
Get and translate database accesses from YANG to JSON.
void setDatabases(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set database accesses from JSON to YANG.
isc::data::ElementPtr getDatabase(const std::string &xpath)
Get and translate a database access from YANG to JSON.
Between YANG and JSON translator class for basic values.
Definition: translator.h:27
void setConfigIetf6(isc::data::ConstElementPtr elem)
setConfig for ietf-dhcpv6-server.
Currently supports kea-dhcp[46]-server models.
void setServerKeaDhcp4(isc::data::ConstElementPtr elem)
setServer for kea-dhcp4-server:config.
isc::data::ElementPtr getConfigKea4()
getConfig for kea-dhcp4-server.
boost::shared_ptr< Element > ElementPtr
Definition: data.h:20
A translator class for converting a pd-pool list between YANG and JSON.
isc::data::ConstElementPtr getLoggers(const std::string &xpath)
Get and translate loggeres from YANG to JSON.
isc::data::ElementPtr getSharedNetworks(const std::string &xpath)
Get and translate shared networks from YANG to JSON.
isc::data::ConstElementPtr getOptionDefList(const std::string &xpath)
Get and translate option definition list from YANG to JSON.
void setConfig(isc::data::ConstElementPtr elem)
Translate and sets the DHCP server configuration from JSON to YANG.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
sysrepo::S_Iter_Value getIter(const std::string &xpath)
List iterator methods keeping the session private.
Definition: translator.cc:278
Shared network translation between YANG and JSON.
void getParam(isc::data::ElementPtr &storage, const std::string &xpath, const std::string &name)
Retrieves an item and stores in the specified storage.
void setControlSocket(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set control socket from JSON to YANG.
void setConfigKea6(isc::data::ConstElementPtr elem)
setConfig for kea-dhcp6-server.
void setClasses(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set client classes from JSON to YANG.
isc::data::ElementPtr getConfig()
Get and translate the whole DHCP server configuration from YANG to JSON.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
Control socket translation between YANG and JSON.
Client class translation between YANG and JSON.
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
Definition: data.cc:1114
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
Translation between YANG and JSON for a single host reservation.
A translator class for converting an option data list between YANG and JSON.
isc::data::ElementPtr getSubnets(const std::string &xpath)
Get and translate subnets from YANG to JSON.
std::string model_
The model.
Definition: translator.h:132
isc::data::ElementPtr getConfigIetf6()
getConfig for ietf-dhcpv6-server.
Database access translation between YANG and JSON.
A translator class for converting a logger list between YANG and JSON.
isc::data::ElementPtr getExpiredKea(const std::string &xpath)
Retrieves expired leases processing parameters from sysrepo.
virtual ~TranslatorConfig()
Destructor.
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:23
static void preProcess4(isc::data::ConstElementPtr config)
Pre process a DHCPv4 configuration.
std::string getNext(sysrepo::S_Iter_Value iter)
Get xpath of the next YANG list item.
Definition: translator.cc:283
static isc::data::ConstElementPtr getContext(isc::data::ConstElementPtr parent)
Get user context.
Definition: adaptor.cc:25
A translator class for converting a shared network 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::ElementPtr getDdnsKea(const std::string &xpath)
Retrieves DDNS configuration from sysrepo.
void setServerKeaDhcp6(isc::data::ConstElementPtr elem)
setServer for kea-dhcp6-server:config.
void setServerKeaLogging(isc::data::ConstElementPtr elem)
set Logging part for kea-*:config.
A translator class for converting a subnet list between YANG and JSON.
void delConfigIetf6()
delConfig for ietf-dhcpv6-server.
void delItem(const std::string &xpath)
Delete basic value from YANG.
Definition: translator.cc:266
Logger translation between YANG and JSON.
isc::data::ConstElementPtr getClasses(const std::string &xpath)
Get and translate client classes from YANG to JSON.
void setOptionDefList(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set option definition list from JSON to YANG.
Defines the logger used by the top-level component of kea-dhcp-ddns.
isc::data::ConstElementPtr getOptionDataList(const std::string &xpath)
Get and translate option data list from YANG to JSON.
void setServerKeaDhcpCommon(const std::string &xpath, isc::data::ConstElementPtr elem)
setServer common part for kea-dhcp[46]-server:config.
isc::data::ElementPtr getItem(const std::string &xpath)
Get and translate basic value from YANG to JSON.
Definition: translator.cc:104
Prefix delegation pool translation between YANG and JSON.
A translator class for converting a pool between YANG and JSON.
isc::data::ElementPtr getServerKeaDhcp4()
getServer for kea-dhcp4-server:config.
A translator class for converting a database access list between YANG and JSON.
A translator class for converting a client class list between YANG and JSON.
void delConfigKea()
delConfig for kea-dhcp[46]-server.
static void preProcess6(isc::data::ConstElementPtr config)
Pre process a DHCPv6 configuration.
A translator class for converting pools between YANG and JSON.
void setSubnets(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set subnets from JSON to YANG.
Option data translation between YANG and JSON.
void setOptionDataList(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set option data list from JSON to YANG.
isc::data::ElementPtr getConfigControlKea(const std::string &xpath)
Retrieves configuration control from sysrepo.
isc::data::ConstElementPtr getControlSocket(const std::string &xpath)
Get and translate a control socket from YANG to JSON.
isc::data::ElementPtr getServerKeaDhcpCommon(const std::string &xpath)
getServer common part for kea-dhcp[46]-server:config.
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 getHooksKea(const std::string &xpath)
Retrieves hooks configuration from sysrepo.
A translator class for converting host reservations list between YANG and JSON.
Option definition translation between YANG and JSON.
isc::data::ElementPtr getServerKeaDhcp6()
getServer for kea-dhcp6-server:config.
std::string format(const std::string &format, const std::vector< std::string > &args)
Apply Formatting.
Definition: strutil.cc:157
void setHosts(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set (address) host reservations from JSON to YANG.