Kea  1.9.9-git
translator_config.cc
Go to the documentation of this file.
1 // Copyright (C) 2018-2019 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  return (result);
89 }
90 
93  ElementPtr result = Element::createMap();
95  result->set("Dhcp6", dhcp);
96  return (result);
97 }
98 
99 void
100 TranslatorConfig::getParam(ElementPtr& storage, const std::string& xpath,
101  const std::string& name) {
102  ConstElementPtr x = getItem(xpath + "/" + name);
103  if (x) {
104  storage->set(name, x);
105  }
106 }
107 
109 TranslatorConfig::getHooksKea(const std::string& xpath) {
110  S_Iter_Value iter = getIter(xpath + "/hook-library");
111  if (iter) {
112  ElementPtr hook_libs = Element::createList();
113  for (;;) {
114  const string& lib = getNext(iter);
115  if (lib.empty()) {
116  break;
117  }
118  ElementPtr hook_lib = Element::createMap();
119  ConstElementPtr name = getItem(lib + "/library");
120  if (name) {
121  hook_lib->set("library", name);
122  ConstElementPtr params = getItem(lib + "/parameters");
123  if (params) {
124  string parameters = params->stringValue();
125  if (!parameters.empty()) {
126  hook_lib->set("parameters",
127  Element::fromJSON(parameters));
128  }
129  }
130  hook_libs->add(hook_lib);
131  }
132  }
133  if (!hook_libs->empty()) {
134  return (hook_libs);
135  }
136  }
137  return (ElementPtr());
138 }
139 
141 TranslatorConfig::getExpiredKea(const std::string& xpath) {
142  ElementPtr expired = Element::createMap();
143 
144  getParam(expired, xpath, "reclaim-timer-wait-time");
145  getParam(expired, xpath, "flush-reclaimed-timer-wait-time");
146  getParam(expired, xpath, "hold-reclaimed-time");
147  getParam(expired, xpath, "max-reclaim-leases");
148  getParam(expired, xpath, "max-reclaim-time");
149  getParam(expired, xpath, "unwarned-reclaim-cycles");
150 
151  if (!expired->empty()) {
152  return (expired);
153  }
154 
155  return (ElementPtr());
156 }
157 
159 TranslatorConfig::getDdnsKea(const std::string& xpath) {
160  ElementPtr ddns = Element::createMap();
161  getParam(ddns, xpath, "enable-updates");
162  getParam(ddns, xpath, "qualifying-suffix");
163  getParam(ddns, xpath, "server-ip");
164  getParam(ddns, xpath, "server-port");
165  getParam(ddns, xpath, "sender-ip");
166  getParam(ddns, xpath, "sender-port");
167  getParam(ddns, xpath, "max-queue-size");
168  getParam(ddns, xpath, "ncr-protocol");
169  getParam(ddns, xpath, "ncr-format");
170  getParam(ddns, xpath, "override-no-update");
171  getParam(ddns, xpath, "override-client-update");
172  getParam(ddns, xpath, "replace-client-name");
173  getParam(ddns, xpath, "generated-prefix");
174  getParam(ddns, xpath, "hostname-char-set");
175  getParam(ddns, xpath, "hostname-char-replacement");
176 
177  ConstElementPtr context = getItem(xpath + "/user-context");
178  if (context) {
179  ddns->set("user-context", Element::fromJSON(context->stringValue()));
180  }
181 
182  if (!ddns->empty()) {
183  // If there's something to return, use it.
184  return (ddns);
185  }
186 
187  // If not, return null.
188  return (ElementPtr());
189 }
190 
193  ElementPtr config_ctrl = Element::createMap();
194  getParam(config_ctrl, xpath, "config-fetch-wait-time");
195  ConstElementPtr databases = getDatabases(xpath + "/config-database");
196  if (databases && !databases->empty()) {
197  config_ctrl->set("config-databases", databases);
198  }
199  if (!config_ctrl->empty()) {
200  // If there's something to return, use it.
201  return (config_ctrl);
202  }
203 
204  // If not, return null.
205  return (ElementPtr());
206 }
207 
210  ElementPtr result = Element::createMap();
211 
212  getParam(result, xpath, "valid-lifetime");
213  getParam(result, xpath, "min-valid-lifetime");
214  getParam(result, xpath, "max-valid-lifetime");
215  getParam(result, xpath, "renew-timer");
216  getParam(result, xpath, "rebind-timer");
217  getParam(result, xpath, "calculate-tee-times");
218  getParam(result, xpath, "t1-percent");
219  getParam(result, xpath, "t2-percent");
220  getParam(result, xpath, "decline-probation-period");
221  getParam(result, xpath, "hostname-char-set");
222  getParam(result, xpath, "hostname-char-replacement");
223 
224  ConstElementPtr networks = getSharedNetworks(xpath);
225  if (networks && !networks->empty()) {
226  result->set("shared-networks", networks);
227  }
228  ConstElementPtr classes = getClasses(xpath);
229  if (classes && !classes->empty()) {
230  result->set("client-classes", classes);
231  }
232  ConstElementPtr database = getDatabase(xpath + "/lease-database");
233  if (database) {
234  result->set("lease-database", database);
235  }
236  ConstElementPtr databases = getDatabases(xpath + "/hosts-database");
237  if (databases && !databases->empty()) {
238  result->set("hosts-databases", databases);
239  }
240  ConstElementPtr host_ids =
241  getItems(xpath + "/host-reservation-identifiers");
242  if (host_ids) {
243  result->set("host-reservation-identifiers", host_ids);
244  }
245  ConstElementPtr defs = getOptionDefList(xpath);
246  if (defs && !defs->empty()) {
247  result->set("option-def", defs);
248  }
249  ConstElementPtr options = getOptionDataList(xpath);
250  if (options && !options->empty()) {
251  result->set("option-data", options);
252  }
253  ConstElementPtr hooks = getHooksKea(xpath);
254  if (hooks && !hooks->empty()) {
255  result->set("hooks-libraries", hooks);
256  }
257  ConstElementPtr expired =
258  getExpiredKea(xpath + "/expired-leases-processing");
259  if (expired) {
260  result->set("expired-leases-processing", expired);
261  }
262  getParam(result, xpath, "dhcp4o6-port");
263  ConstElementPtr socket = getControlSocket(xpath + "/control-socket");
264  if (socket) {
265  result->set("control-socket", socket);
266  }
267  ConstElementPtr ddns = getDdnsKea(xpath + "/dhcp-ddns");
268  if (ddns) {
269  result->set("dhcp-ddns", ddns);
270  }
271  ConstElementPtr context = getItem(xpath + "/user-context");
272  if (context) {
273  result->set("user-context", Element::fromJSON(context->stringValue()));
274  }
275  ConstElementPtr checks = getItem(xpath + "/sanity-checks/lease-checks");
276  if (checks) {
277  ElementPtr sanity = Element::createMap();
278  sanity->set("lease-checks", checks);
279  result->set("sanity-checks", sanity);
280  }
281  getParam(result, xpath, "reservation-mode");
282  ConstElementPtr hosts = getHosts(xpath);
283  if (hosts && !hosts->empty()) {
284  result->set("reservations", hosts);
285  }
286  ConstElementPtr config_ctrl =
287  getConfigControlKea(xpath + "/config-control");
288  if (config_ctrl) {
289  result->set("config-control", config_ctrl);
290  }
291  getParam(result, xpath, "server-tag");
292  ConstElementPtr queue_ctrl = getItem(xpath + "/dhcp-queue-control");
293  if (queue_ctrl) {
294  result->set("dhcp-queue-control",
295  Element::fromJSON(queue_ctrl->stringValue()));
296  }
297  ConstElementPtr loggers = getLoggers(xpath);
298  if (loggers && !loggers->empty()) {
299  result->set("loggers", loggers);
300  }
301  return (result);
302 }
303 
306  string xpath = "/kea-dhcp4-server:config";
307  ElementPtr result = getServerKeaDhcpCommon(xpath);
308  // Handle subnets.
309  ConstElementPtr subnets = getSubnets(xpath);
310  if (subnets && !subnets->empty()) {
311  result->set("subnet4", subnets);
312  }
313  // Handle interfaces.
314  ElementPtr if_config = Element::createMap();
315  ConstElementPtr ifs = getItems(xpath + "/interfaces-config/interfaces");
316  if (ifs && !ifs->empty()) {
317  if_config->set("interfaces", ifs);
318  }
319  getParam(if_config, xpath + "/interfaces-config", "dhcp-socket-type");
320  getParam(if_config, xpath + "/interfaces-config", "outbound-interface");
321  getParam(if_config, xpath + "/interfaces-config", "re-detect");
322  ConstElementPtr context =
323  getItem(xpath + "/interfaces-config/user-context");
324  if (context) {
325  if_config->set("user-context",
326  Element::fromJSON(context->stringValue()));
327  }
328  if (!if_config->empty()) {
329  result->set("interfaces-config", if_config);
330  }
331  // Handle DHCPv4 specific global parameters.
332  getParam(result, xpath, "echo-client-id");
333  getParam(result, xpath, "match-client-id");
334  getParam(result, xpath, "next-server");
335  getParam(result, xpath, "server-hostname");
336  getParam(result, xpath, "boot-file-name");
337  getParam(result, xpath, "authoritative");
338  return (result);
339 }
340 
343  string xpath = "/kea-dhcp6-server:config";
344  ElementPtr result = getServerKeaDhcpCommon(xpath);
345  // Handle DHCPv6 specific global parameters.
346  getParam(result, xpath, "data-directory");
347  getParam(result, xpath, "preferred-lifetime");
348  getParam(result, xpath, "min-preferred-lifetime");
349  getParam(result, xpath, "max-preferred-lifetime");
350  // Handle subnets.
351  ConstElementPtr subnets = getSubnets(xpath);
352  if (subnets && !subnets->empty()) {
353  result->set("subnet6", subnets);
354  }
355  // Handle interfaces.
356  ElementPtr if_config = Element::createMap();
357  ConstElementPtr ifs = getItems(xpath + "/interfaces-config/interfaces");
358  if (ifs && !ifs->empty()) {
359  if_config->set("interfaces", ifs);
360  }
361  getParam(if_config, xpath + "/interfaces-config", "re-detect");
362  ConstElementPtr context =
363  getItem(xpath + "/interfaces-config/user-context");
364  if (context) {
365  if_config->set("user-context",
366  Element::fromJSON(context->stringValue()));
367  }
368  if (!if_config->empty()) {
369  result->set("interfaces-config", if_config);
370  }
371  // Handle DHCPv6 specific global entries.
372  ConstElementPtr relay = getItems(xpath + "/relay-supplied-options");
373  if (relay) {
374  result->set("relay-supplied-options", relay);
375  }
376  ConstElementPtr macs = getItems(xpath + "/mac-sources");
377  if (macs) {
378  result->set("mac-sources", macs);
379  }
380  // Handle server-id.
381  // @todo: move to a DUID translator.
382  ElementPtr server_id = Element::createMap();
383  getParam(server_id, xpath + "/server-id", "type");
384  getParam(server_id, xpath + "/server-id", "identifier");
385  getParam(server_id, xpath + "/server-id", "time");
386  getParam(server_id, xpath + "/server-id", "htype");
387  getParam(server_id, xpath + "/server-id", "enterprise-id");
388  getParam(server_id, xpath + "/server-id", "persist");
389  context = getItem(xpath + "/server-id/user-context");
390  if (context) {
391  server_id->set("user-context",
392  Element::fromJSON(context->stringValue()));
393  }
394  if (!server_id->empty()) {
395  result->set("server-id", server_id);
396  }
397  return (result);
398 }
399 
400 void
402  try {
403  if (model_ == IETF_DHCPV6_SERVER) {
404  if (elem) {
406  setConfigIetf6(elem);
407  } else {
408  delConfigIetf6();
409  }
410  } else if (model_ == KEA_DHCP4_SERVER) {
411  if (elem) {
413  setConfigKea4(elem);
414  } else {
415  delConfigKea();
416  }
417  } else if (model_ == KEA_DHCP6_SERVER) {
418  if (elem) {
420  setConfigKea6(elem);
421  } else {
422  delConfigKea();
423  }
424  } else {
426  "setConfig not implemented for the model: " << model_);
427  }
428  } catch (const sysrepo_exception& ex) {
430  "sysrepo error setting config '" << elem->str()
431  << "': " << ex.what());
432  }
433 }
434 
435 void
437  delItem("/" + model_ + ":server");
438 }
439 
440 void
442  string xpath = "/" + model_ + ":server/server-config";
443  ConstElementPtr dhcp6 = elem->get("Dhcp6");
444  if (!dhcp6) {
445  isc_throw(BadValue, "no Dhcp6 entry in " << elem->str());
446  }
447  ConstElementPtr ranges = dhcp6->get("subnet6");
448  if (ranges && !ranges->empty()) {
449  setSubnets(xpath + "/network-ranges", ranges);
450  }
451  // Skip everything else.
452 }
453 
454 void
456  delItem("/" + model_ + ":config");
457 }
458 
459 void
461  ConstElementPtr dhcp = elem->get("Dhcp4");
462  if (dhcp) {
463  setServerKeaDhcp4(dhcp);
464  }
465 }
466 
467 void
469  ConstElementPtr dhcp = elem->get("Dhcp6");
470  if (dhcp) {
471  setServerKeaDhcp6(dhcp);
472  }
473 }
474 
475 void
477  ConstElementPtr elem) {
478  ConstElementPtr valid = elem->get("valid-lifetime");
479  if (valid) {
480  setItem(xpath + "/valid-lifetime", valid, SR_UINT32_T);
481  }
482  ConstElementPtr min_valid = elem->get("min-valid-lifetime");
483  if (min_valid) {
484  setItem(xpath + "/min-valid-lifetime", min_valid, SR_UINT32_T);
485  }
486  ConstElementPtr max_valid = elem->get("max-valid-lifetime");
487  if (max_valid) {
488  setItem(xpath + "/max-valid-lifetime", max_valid, SR_UINT32_T);
489  }
490  ConstElementPtr renew = elem->get("renew-timer");
491  if (renew) {
492  setItem(xpath + "/renew-timer", renew, SR_UINT32_T);
493  }
494  ConstElementPtr rebind = elem->get("rebind-timer");
495  if (rebind) {
496  setItem(xpath + "/rebind-timer", rebind, SR_UINT32_T);
497  }
498  ConstElementPtr calculate = elem->get("calculate-tee-times");
499  if (calculate) {
500  setItem(xpath + "/calculate-tee-times", calculate, SR_BOOL_T);
501  }
502  ConstElementPtr t1_percent = elem->get("t1-percent");
503  if (t1_percent) {
504  setItem(xpath + "/t1-percent", t1_percent, SR_DECIMAL64_T);
505  }
506  ConstElementPtr t2_percent = elem->get("t2-percent");
507  if (t2_percent) {
508  setItem(xpath + "/t2-percent", t2_percent, SR_DECIMAL64_T);
509  }
510  ConstElementPtr period = elem->get("decline-probation-period");
511  if (period) {
512  setItem(xpath + "/decline-probation-period", period, SR_UINT32_T);
513  }
514  ConstElementPtr networks = elem->get("shared-networks");
515  if (networks) {
516  setSharedNetworks(xpath, networks);
517  }
518  ConstElementPtr classes = elem->get("client-classes");
519  if (classes && !classes->empty()) {
520  setClasses(xpath, classes);
521  }
522  ConstElementPtr database = elem->get("lease-database");
523  if (database) {
524  setDatabase(xpath + "/lease-database", database);
525  }
526  ConstElementPtr databases = elem->get("hosts-databases");
527  if (databases && !databases->empty()) {
528  setDatabases(xpath + "/hosts-database", databases);
529  } else {
530  // Reuse of database from lease-database.
531  database = elem->get("hosts-database");
532  if (database) {
533  ElementPtr list = Element::createList();
534  list->add(copy(database));
535  setDatabases(xpath + "/hosts-database", list);
536  }
537  }
538  ConstElementPtr host_ids = elem->get("host-reservation-identifiers");
539  if (host_ids) {
540  for (ConstElementPtr id : host_ids->listValue()) {
541  setItem(xpath + "/host-reservation-identifiers", id, SR_ENUM_T);
542  }
543  }
544  ConstElementPtr defs = elem->get("option-def");
545  if (defs && !defs->empty()) {
546  setOptionDefList(xpath, defs);
547  }
548  ConstElementPtr options = elem->get("option-data");
549  if (options && !options->empty()) {
550  setOptionDataList(xpath, options);
551  }
552  ConstElementPtr hook_libs = elem->get("hooks-libraries");
553  if (hook_libs) {
554  for (ConstElementPtr lib : hook_libs->listValue()) {
555  ConstElementPtr name = lib->get("library");
556  if (!name) {
557  continue;
558  }
559  ostringstream hook_lib;
560  hook_lib << xpath << "/hook-library[library='"
561  << name->stringValue() << "']";
562  ConstElementPtr params = lib->get("parameters");
563  if (params) {
564  hook_lib << "/parameters";
565  setItem(hook_lib.str(), Element::create(params->str()),
566  SR_STRING_T);
567  } else {
568  ConstElementPtr list = Element::createList();
569  setItem(hook_lib.str(), list, SR_LIST_T);
570  }
571  }
572  }
573  ConstElementPtr expired = elem->get("expired-leases-processing");
574  if (expired) {
575  ConstElementPtr reclaim = expired->get("reclaim-timer-wait-time");
576  if (reclaim) {
577  setItem(xpath + "/expired-leases-processing/reclaim-timer-wait-time",
578  reclaim, SR_UINT32_T);
579  }
580  ConstElementPtr flush =
581  expired->get("flush-reclaimed-timer-wait-time");
582  if (flush) {
583  setItem(xpath + "/expired-leases-processing/flush-reclaimed-timer-wait-time",
584  flush, SR_UINT32_T);
585  }
586  ConstElementPtr hold = expired->get("hold-reclaimed-time");
587  if (hold) {
588  setItem(xpath + "/expired-leases-processing/hold-reclaimed-time",
589  hold, SR_UINT32_T);
590  }
591  ConstElementPtr max_leases = expired->get("max-reclaim-leases");
592  if (max_leases) {
593  setItem(xpath + "/expired-leases-processing/max-reclaim-leases",
594  max_leases, SR_UINT32_T);
595  }
596  ConstElementPtr max_time = expired->get("max-reclaim-time");
597  if (max_time) {
598  setItem(xpath + "/expired-leases-processing/max-reclaim-time",
599  max_time, SR_UINT32_T);
600  }
601  ConstElementPtr unwarned = expired->get("unwarned-reclaim-cycles");
602  if (unwarned) {
603  setItem(xpath + "/expired-leases-processing/unwarned-reclaim-cycles",
604  unwarned, SR_UINT32_T);
605  }
606  }
607  ConstElementPtr port = elem->get("dhcp4o6-port");
608  if (port) {
609  setItem(xpath + "/dhcp4o6-port", port, SR_UINT16_T);
610  }
611  ConstElementPtr socket = elem->get("control-socket");
612  if (socket) {
613  setControlSocket(xpath + "/control-socket", socket);
614  }
615  ConstElementPtr char_set = elem->get("hostname-char-set");
616  if (char_set) {
617  setItem(xpath + "/hostname-char-set", char_set, SR_STRING_T);
618  }
619  ConstElementPtr char_repl = elem->get("hostname-char-replacement");
620  if (char_repl) {
621  setItem(xpath + "/hostname-char-replacement", char_repl, SR_STRING_T);
622  }
623  ConstElementPtr ddns = elem->get("dhcp-ddns");
624  if (ddns) {
625  ConstElementPtr enable = ddns->get("enable-updates");
626  if (enable) {
627  setItem(xpath + "/dhcp-ddns/enable-updates", enable, SR_BOOL_T);
628  }
629  ConstElementPtr suffix = ddns->get("qualifying-suffix");
630  if (suffix) {
631  setItem(xpath + "/dhcp-ddns/qualifying-suffix", suffix,
632  SR_STRING_T);
633  }
634  ConstElementPtr server_ip = ddns->get("server-ip");
635  if (server_ip) {
636  setItem(xpath + "/dhcp-ddns/server-ip", server_ip, SR_STRING_T);
637  }
638  ConstElementPtr server_port = ddns->get("server-port");
639  if (server_port) {
640  setItem(xpath + "/dhcp-ddns/server-port", server_port,
641  SR_UINT16_T);
642  }
643  ConstElementPtr sender_ip = ddns->get("sender-ip");
644  if (sender_ip) {
645  setItem(xpath + "/dhcp-ddns/sender-ip", sender_ip, SR_STRING_T);
646  }
647  ConstElementPtr sender_port = ddns->get("sender-port");
648  if (sender_port) {
649  setItem(xpath + "/dhcp-ddns/sender-port", sender_port,
650  SR_UINT16_T);
651  }
652  ConstElementPtr queue = ddns->get("max-queue-size");
653  if (queue) {
654  setItem(xpath + "/dhcp-ddns/max-queue-size", queue, SR_UINT32_T);
655  }
656  ConstElementPtr protocol = ddns->get("ncr-protocol");
657  if (protocol) {
658  setItem(xpath + "/dhcp-ddns/ncr-protocol", protocol, SR_ENUM_T);
659  }
660  ConstElementPtr format = ddns->get("ncr-format");
661  if (format) {
662  setItem(xpath + "/dhcp-ddns/ncr-format", format, SR_ENUM_T);
663  }
664  ConstElementPtr no_up = ddns->get("override-no-update");
665  if (no_up) {
666  setItem(xpath + "/dhcp-ddns/override-no-update", no_up, SR_BOOL_T);
667  }
668  ConstElementPtr client = ddns->get("override-client-update");
669  if (client) {
670  setItem(xpath + "/dhcp-ddns/override-client-update", client,
671  SR_BOOL_T);
672  }
673  ConstElementPtr replace = ddns->get("replace-client-name");
674  if (replace) {
675  setItem(xpath + "/dhcp-ddns/replace-client-name", replace,
676  SR_ENUM_T);
677  }
678  ConstElementPtr generated = ddns->get("generated-prefix");
679  if (generated) {
680  setItem(xpath + "/dhcp-ddns/generated-prefix", generated,
681  SR_STRING_T);
682  }
683  ConstElementPtr char_set = ddns->get("hostname-char-set");
684  if (char_set) {
685  setItem(xpath + "/dhcp-ddns/hostname-char-set", char_set,
686  SR_STRING_T);
687  }
688  ConstElementPtr char_repl = ddns->get("hostname-char-replacement");
689  if (char_repl) {
690  setItem(xpath + "/dhcp-ddns/hostname-char-replacement", char_repl,
691  SR_STRING_T);
692  }
693  ConstElementPtr context = Adaptor::getContext(ddns);
694  if (context) {
695  ConstElementPtr repr = Element::create(context->str());
696  setItem(xpath + "/dhcp-ddns/user-context", repr, SR_STRING_T);
697  }
698  }
699  ConstElementPtr context = Adaptor::getContext(elem);
700  if (context) {
701  ConstElementPtr repr = Element::create(context->str());
702  setItem(xpath + "/user-context", repr, SR_STRING_T);
703  }
704  ConstElementPtr sanity = elem->get("sanity-checks");
705  if (sanity) {
706  ConstElementPtr checks = sanity->get("lease-checks");
707  if (checks) {
708  setItem(xpath + "/sanity-checks/lease-checks", checks, SR_ENUM_T);
709  }
710  }
711  ConstElementPtr hr_mode = elem->get("reservation-mode");
712  if (hr_mode) {
713  setItem(xpath + "/reservation-mode", hr_mode, SR_ENUM_T);
714  }
715  ConstElementPtr hosts = elem->get("reservations");
716  if (hosts && !hosts->empty()) {
717  setHosts(xpath, hosts);
718  }
719  ConstElementPtr config_ctrl = elem->get("config-control");
720  if (config_ctrl && !config_ctrl->empty()) {
721  ConstElementPtr cfwt = config_ctrl->get("config-fetch-wait-time");
722  if (cfwt) {
723  setItem(xpath + "/config-control/config-fetch-wait-time", cfwt,
724  SR_UINT32_T);
725  }
726  databases = config_ctrl->get("config-databases");
727  if (databases && !databases->empty()) {
728  setDatabases(xpath + "/config-control/config-database", databases);
729  }
730  }
731  ConstElementPtr server_tag = elem->get("server-tag");
732  if (server_tag) {
733  setItem(xpath + "/server-tag", server_tag, SR_STRING_T);
734  }
735  ConstElementPtr queue_ctrl = elem->get("dhcp-queue-control");
736  if (queue_ctrl) {
737  ConstElementPtr repr = Element::create(queue_ctrl->str());
738  setItem(xpath + "/dhcp-queue-control", repr, SR_STRING_T);
739  }
740  ConstElementPtr loggers = elem->get("loggers");
741  if (loggers) {
742  setLoggers(xpath, loggers);
743  }
744 }
745 
746 void
748  string xpath = "/kea-dhcp4-server:config";
749  setServerKeaDhcpCommon(xpath, elem);
750  ConstElementPtr subnets = elem->get("subnet4");
751  if (subnets) {
752  setSubnets(xpath, subnets);
753  }
754  ConstElementPtr if_config = elem->get("interfaces-config");
755  if (if_config) {
756  ConstElementPtr ifs = if_config->get("interfaces");
757  if (ifs && !ifs->empty()) {
758  for (ConstElementPtr intf : ifs->listValue()) {
759  setItem(xpath + "/interfaces-config/interfaces",
760  intf, SR_STRING_T);
761  }
762  }
763  ConstElementPtr ds_type = if_config->get("dhcp-socket-type");
764  if (ds_type) {
765  setItem(xpath + "/interfaces-config/dhcp-socket-type",
766  ds_type, SR_ENUM_T);
767  }
768  ConstElementPtr out_if = if_config->get("outbound-interface");
769  if (out_if) {
770  setItem(xpath + "/interfaces-config/outbound-interface",
771  out_if, SR_ENUM_T);
772  }
773  ConstElementPtr redetect = if_config->get("re-detect");
774  if (redetect) {
775  setItem(xpath + "/interfaces-config/re-detect",
776  redetect, SR_BOOL_T);
777  }
778  ConstElementPtr context = Adaptor::getContext(if_config);
779  if (context) {
780  setItem(xpath + "/interfaces-config/user-context",
781  Element::create(context->str()), SR_STRING_T);
782  }
783  }
784  ConstElementPtr echo = elem->get("echo-client-id");
785  if (echo) {
786  setItem(xpath + "/echo-client-id", echo, SR_BOOL_T);
787  }
788  ConstElementPtr match = elem->get("match-client-id");
789  if (match) {
790  setItem(xpath + "/match-client-id", match, SR_BOOL_T);
791  }
792  ConstElementPtr next = elem->get("next-server");
793  if (next) {
794  setItem(xpath + "/next-server", next, SR_STRING_T);
795  }
796  ConstElementPtr hostname = elem->get("server-hostname");
797  if (hostname) {
798  setItem(xpath + "/server-hostname", hostname, SR_STRING_T);
799  }
800  ConstElementPtr boot = elem->get("boot-file-name");
801  if (boot) {
802  setItem(xpath + "/boot-file-name", boot, SR_STRING_T);
803  }
804  ConstElementPtr auth = elem->get("authoritative");
805  if (auth) {
806  setItem(xpath + "/authoritative", auth, SR_BOOL_T);
807  }
808 }
809 
810 void
812  string xpath = "/kea-dhcp6-server:config";
813  setServerKeaDhcpCommon(xpath, elem);
814  ConstElementPtr data_dir = elem->get("data-directory");
815  if (data_dir) {
816  setItem(xpath + "/data-directory", data_dir, SR_STRING_T);
817  }
818  ConstElementPtr preferred = elem->get("preferred-lifetime");
819  if (preferred) {
820  setItem(xpath + "/preferred-lifetime", preferred, SR_UINT32_T);
821  }
822  ConstElementPtr min_pref = elem->get("min-preferred-lifetime");
823  if (min_pref) {
824  setItem(xpath + "/min-preferred-lifetime", min_pref, SR_UINT32_T);
825  }
826  ConstElementPtr max_pref = elem->get("max-preferred-lifetime");
827  if (max_pref) {
828  setItem(xpath + "/max-preferred-lifetime", max_pref, SR_UINT32_T);
829  }
830  ConstElementPtr subnets = elem->get("subnet6");
831  if (subnets) {
832  setSubnets(xpath, subnets);
833  }
834  ConstElementPtr if_config = elem->get("interfaces-config");
835  if (if_config) {
836  ConstElementPtr ifs = if_config->get("interfaces");
837  if (ifs && !ifs->empty()) {
838  for (ConstElementPtr intf : ifs->listValue()) {
839  setItem(xpath + "/interfaces-config/interfaces",
840  intf, SR_STRING_T);
841  }
842  }
843  ConstElementPtr redetect = if_config->get("re-detect");
844  if (redetect) {
845  setItem(xpath + "/interfaces-config/re-detect",
846  redetect, SR_BOOL_T);
847  }
848  ConstElementPtr context = Adaptor::getContext(if_config);
849  if (context) {
850  setItem(xpath + "/interfaces-config/user-context",
851  Element::create(context->str()), SR_STRING_T);
852  }
853  }
854  ConstElementPtr relay = elem->get("relay-supplied-options");
855  if (relay) {
856  for (ConstElementPtr addr : relay->listValue()) {
857  setItem(xpath + "/relay-supplied-options", addr, SR_STRING_T);
858  }
859  }
860  ConstElementPtr macs = elem->get("mac-sources");
861  if (macs) {
862  for (ConstElementPtr source : macs->listValue()) {
863  setItem(xpath + "/mac-sources", source, SR_STRING_T);
864  }
865  }
866  ConstElementPtr server_id = elem->get("server-id");
867  if (server_id) {
868  ConstElementPtr id_type = server_id->get("type");
869  if (id_type) {
870  setItem(xpath + "/server-id/type", id_type, SR_ENUM_T);
871  }
872  ConstElementPtr id_id = server_id->get("identifier");
873  if (id_id) {
874  setItem(xpath + "/server-id/identifier", id_id, SR_STRING_T);
875  }
876  ConstElementPtr id_time = server_id->get("time");
877  if (id_time) {
878  setItem(xpath + "/server-id/time", id_time, SR_UINT32_T);
879  }
880  ConstElementPtr id_htype = server_id->get("htype");
881  if (id_htype) {
882  setItem(xpath + "/server-id/htype", id_htype, SR_UINT16_T);
883  }
884  ConstElementPtr id_ent_id = server_id->get("enterprise-id");
885  if (id_ent_id) {
886  setItem(xpath + "/server-id/enterprise-id", id_ent_id,
887  SR_UINT32_T);
888  }
889  ConstElementPtr id_persist = server_id->get("persist");
890  if (id_persist) {
891  setItem(xpath + "/server-id/persist", id_persist, SR_BOOL_T);
892  }
893  ConstElementPtr context = Adaptor::getContext(server_id);
894  if (context) {
895  ConstElementPtr repr = Element::create(context->str());
896  setItem(xpath + "/server-id/user-context", repr, SR_STRING_T);
897  }
898  }
899 }
900 
901 }; // end of namespace isc::yang
902 }; // 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:126
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
STL namespace.
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.
sysrepo::S_Iter_Value getIter(const std::string &xpath)
List iterator methods keeping the session private.
Definition: translator.cc:316
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:1097
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:288
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:321
static isc::data::ConstElementPtr getContext(isc::data::ConstElementPtr parent)
Get user context.
Definition: adaptor.cc:27
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.
A translator class for converting a subnet list between YANG and JSON.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
void delConfigIetf6()
delConfig for ietf-dhcpv6-server.
void delItem(const std::string &xpath)
Delete basic value from YANG.
Definition: translator.cc:304
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:111
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.