Kea  1.9.9-git
translator_shared_network.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.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 TranslatorSharedNetwork::TranslatorSharedNetwork(S_Session session,
24  const string& model)
25  : TranslatorBasic(session, model),
26  TranslatorOptionData(session, model),
27  TranslatorOptionDataList(session, model),
28  TranslatorPool(session, model),
29  TranslatorPools(session, model),
30  TranslatorPdPool(session, model),
31  TranslatorPdPools(session, model),
32  TranslatorHost(session, model),
33  TranslatorHosts(session, model),
34  TranslatorSubnet(session, model),
35  TranslatorSubnets(session, model) {
36 }
37 
39 }
40 
43  try {
44  if (model_ == KEA_DHCP4_SERVER) {
45  return (getSharedNetworkKea(xpath, "subnet4"));
46  } else if (model_ == KEA_DHCP6_SERVER) {
47  return (getSharedNetworkKea(xpath, "subnet6"));
48  }
49  } catch (const sysrepo_exception& ex) {
51  "sysrepo error getting shared network at '" << xpath
52  << "': " << ex.what());
53  }
55  "getSharedNetwork not implemented for the model: " << model_);
56 }
57 
60  const std::string& subsel) {
61  ElementPtr result = Element::createMap();
62  ConstElementPtr name = getItem(xpath + "/name");
63  if (!name) {
64  // Can't happen as the name is the key.
65  isc_throw(Unexpected, "getSharedNetworkKea requires name: " << xpath);
66  }
67  result->set("name", name);
68  ConstElementPtr subnets = getSubnets(xpath);
69  if (subnets && (subnets->size() > 0)) {
70  result->set(subsel, subnets);
71  }
72  if (subsel == "subnet6") {
73  ConstElementPtr preferred = getItem(xpath + "/preferred-lifetime");
74  if (preferred) {
75  result->set("preferred-lifetime", preferred);
76  }
77  ConstElementPtr min_pref = getItem(xpath + "/min-preferred-lifetime");
78  if (min_pref) {
79  result->set("min-preferred-lifetime", min_pref);
80  }
81  ConstElementPtr max_pref = getItem(xpath + "/max-preferred-lifetime");
82  if (max_pref) {
83  result->set("max-preferred-lifetime", max_pref);
84  }
85  }
86  ConstElementPtr valid = getItem(xpath + "/valid-lifetime");
87  if (valid) {
88  result->set("valid-lifetime", valid);
89  }
90  ConstElementPtr min_valid = getItem(xpath + "/min-valid-lifetime");
91  if (min_valid) {
92  result->set("min-valid-lifetime", min_valid);
93  }
94  ConstElementPtr max_valid = getItem(xpath + "/max-valid-lifetime");
95  if (max_valid) {
96  result->set("max-valid-lifetime", max_valid);
97  }
98  ConstElementPtr renew = getItem(xpath + "/renew-timer");
99  if (renew) {
100  result->set("renew-timer", renew);
101  }
102  ConstElementPtr rebind = getItem(xpath + "/rebind-timer");
103  if (rebind) {
104  result->set("rebind-timer", rebind);
105  }
106  ConstElementPtr calculate = getItem(xpath + "/calculate-tee-times");
107  if (calculate) {
108  result->set("calculate-tee-times", calculate);
109  }
110  ConstElementPtr t1_percent = getItem(xpath + "/t1-percent");
111  if (t1_percent) {
112  result->set("t1-percent", t1_percent);
113  }
114  ConstElementPtr t2_percent = getItem(xpath + "/t2-percent");
115  if (t2_percent) {
116  result->set("t2-percent", t2_percent);
117  }
118  ConstElementPtr options = getOptionDataList(xpath);
119  if (options && (options->size() > 0)) {
120  result->set("option-data", options);
121  }
122  ConstElementPtr interface = getItem(xpath + "/interface");
123  if (interface) {
124  result->set("interface", interface);
125  }
126  if (subsel == "subnet6") {
127  ConstElementPtr interface_id = getItem(xpath + "/interface-id");
128  if (interface_id) {
129  result->set("interface-id", interface_id);
130  }
131  ConstElementPtr rapid_commit = getItem(xpath + "/rapid-commit");
132  if (rapid_commit) {
133  result->set("rapid-commit", rapid_commit);
134  }
135  }
136  ConstElementPtr guard = getItem(xpath + "/client-class");
137  if (guard) {
138  result->set("client-class", guard);
139  }
140  ConstElementPtr required = getItems(xpath + "/require-client-classes");
141  if (required && (required->size() > 0)) {
142  result->set("require-client-classes", required);
143  }
144  ConstElementPtr mode = getItem(xpath + "/reservation-mode");
145  if (mode) {
146  result->set("reservation-mode", mode);
147  }
148  ConstElementPtr relay = getItems(xpath + "/relay/ip-addresses");
149  if (relay && (relay->size() > 0)) {
150  ElementPtr relay_map = Element::createMap();
151  relay_map->set("ip-addresses", relay);
152  result->set("relay", relay_map);
153  }
154  if (subsel == "subnet4") {
155  ConstElementPtr match = getItem(xpath + "/match-client-id");
156  if (match) {
157  result->set("match-client-id", match);
158  }
159  ConstElementPtr auth = getItem(xpath + "/authoritative");
160  if (auth) {
161  result->set("authoritative", auth);
162  }
163  ConstElementPtr next = getItem(xpath + "/next-server");
164  if (next) {
165  result->set("next-server", next);
166  }
167  ConstElementPtr hostname = getItem(xpath + "/server-hostname");
168  if (hostname) {
169  result->set("server-hostname", hostname);
170  }
171  ConstElementPtr boot = getItem(xpath + "/boot-file-name");
172  if (boot) {
173  result->set("boot-file-name", boot);
174  }
175  }
176  ConstElementPtr context = getItem(xpath + "/user-context");
177  if (context) {
178  result->set("user-context", Element::fromJSON(context->stringValue()));
179  }
180  return (result);
181 }
182 
183 void
185  ConstElementPtr elem) {
186  try {
187  if (model_ == KEA_DHCP4_SERVER) {
188  setSharedNetworkKea(xpath, elem, "subnet4");
189  } else if (model_ == KEA_DHCP6_SERVER) {
190  setSharedNetworkKea(xpath, elem, "subnet6");
191  } else {
193  "setSharedNetwork not implemented for the model: "
194  << model_);
195  }
196  } catch (const sysrepo_exception& ex) {
198  "sysrepo error setting shared network '" << elem->str()
199  << "' at '" << xpath << "': " << ex.what());
200  }
201 }
202 
203 void
205  ConstElementPtr elem,
206  const std::string& subsel) {
207  // Skip name which is the key.
208  ConstElementPtr subnets = elem->get(subsel);
209  if (subnets && (subnets->size() > 0)) {
210  setSubnets(xpath, subnets);
211  }
212  if (subsel == "subnet6") {
213  ConstElementPtr preferred = elem->get("preferred-lifetime");
214  if (preferred) {
215  setItem(xpath + "/preferred-lifetime", preferred, SR_UINT32_T);
216  }
217  ConstElementPtr min_pref = elem->get("min-preferred-lifetime");
218  if (min_pref) {
219  setItem(xpath + "/min-preferred-lifetime", min_pref, SR_UINT32_T);
220  }
221  ConstElementPtr max_pref = elem->get("max-preferred-lifetime");
222  if (max_pref) {
223  setItem(xpath + "/max-preferred-lifetime", max_pref, SR_UINT32_T);
224  }
225  }
226  ConstElementPtr valid = elem->get("valid-lifetime");
227  if (valid) {
228  setItem(xpath + "/valid-lifetime", valid, SR_UINT32_T);
229  }
230  ConstElementPtr min_valid = elem->get("min-valid-lifetime");
231  if (min_valid) {
232  setItem(xpath + "/min-valid-lifetime", min_valid, SR_UINT32_T);
233  }
234  ConstElementPtr max_valid = elem->get("max-valid-lifetime");
235  if (max_valid) {
236  setItem(xpath + "/max-valid-lifetime", max_valid, SR_UINT32_T);
237  }
238  ConstElementPtr renew = elem->get("renew-timer");
239  if (renew) {
240  setItem(xpath + "/renew-timer", renew, SR_UINT32_T);
241  }
242  ConstElementPtr rebind = elem->get("rebind-timer");
243  if (rebind) {
244  setItem(xpath + "/rebind-timer", rebind, SR_UINT32_T);
245  }
246  ConstElementPtr calculate = elem->get("calculate-tee-times");
247  if (calculate) {
248  setItem(xpath + "/calculate-tee-times", calculate, SR_BOOL_T);
249  }
250  ConstElementPtr t1_percent = elem->get("t1-percent");
251  if (t1_percent) {
252  setItem(xpath + "/t1-percent", t1_percent, SR_DECIMAL64_T);
253  }
254  ConstElementPtr t2_percent = elem->get("t2-percent");
255  if (t2_percent) {
256  setItem(xpath + "/t2-percent", t2_percent, SR_DECIMAL64_T);
257  }
258  ConstElementPtr options = elem->get("option-data");
259  if (options && (options->size() > 0)) {
260  setOptionDataList(xpath, options);
261  }
262  ConstElementPtr interface = elem->get("interface");
263  if (interface) {
264  setItem(xpath + "/interface", interface, SR_STRING_T);
265  }
266  if (subsel == "subnet6") {
267  ConstElementPtr interface_id = elem->get("interface-id");
268  if (interface_id) {
269  setItem(xpath + "/interface-id", interface_id, SR_STRING_T);
270  }
271  ConstElementPtr rapid_commit = elem->get("rapid-commit");
272  if (rapid_commit) {
273  setItem(xpath + "/rapid-commit", rapid_commit, SR_BOOL_T);
274  }
275  }
276  ConstElementPtr guard = elem->get("client-class");
277  if (guard) {
278  setItem(xpath + "/client-class", guard, SR_STRING_T);
279  }
280  ConstElementPtr required = elem->get("require-client-classes");
281  if (required && (required->size() > 0)) {
282  for (ConstElementPtr rclass : required->listValue()) {
283  setItem(xpath + "/require-client-classes", rclass, SR_STRING_T);
284  }
285  }
286  ConstElementPtr mode = elem->get("reservation-mode");
287  if (mode) {
288  setItem(xpath + "/reservation-mode", mode, SR_ENUM_T);
289  }
290  ConstElementPtr relay = elem->get("relay");
291  if (relay) {
292  ConstElementPtr address = relay->get("ip-address");
293  ConstElementPtr addresses = relay->get("ip-addresses");
294  if (address) {
295  setItem(xpath + "/relay/ip-addresses", address, SR_STRING_T);
296  } else if (addresses && (addresses->size() > 0)) {
297  for (ConstElementPtr addr : addresses->listValue()) {
298  setItem(xpath + "/relay/ip-addresses", addr, SR_STRING_T);
299  }
300  }
301  }
302  if (subsel == "subnet4") {
303  ConstElementPtr match = elem->get("match-client-id");
304  if (match) {
305  setItem(xpath + "/match-client-id", match, SR_BOOL_T);
306  }
307  ConstElementPtr auth = elem->get("authoritative");
308  if (auth) {
309  setItem(xpath + "/authoritative", auth, SR_BOOL_T);
310  }
311  ConstElementPtr next = elem->get("next-server");
312  if (next) {
313  setItem(xpath + "/next-server", next, SR_STRING_T);
314  }
315  ConstElementPtr hostname = elem->get("server-hostname");
316  if (hostname) {
317  setItem(xpath + "/server-hostname", hostname, SR_STRING_T);
318  }
319  ConstElementPtr boot = elem->get("boot-file-name");
320  if (boot) {
321  setItem(xpath + "/boot-file-name", boot, SR_STRING_T);
322  }
323  }
324  ConstElementPtr context = Adaptor::getContext(elem);
325  if (context) {
326  ConstElementPtr repr = Element::create(context->str());
327  setItem(xpath + "/user-context", repr, SR_STRING_T);
328  }
329 }
330 
332  const string& model)
333  : TranslatorBasic(session, model),
334  TranslatorOptionData(session, model),
335  TranslatorOptionDataList(session, model),
336  TranslatorPool(session, model),
337  TranslatorPools(session, model),
338  TranslatorPdPool(session, model),
339  TranslatorPdPools(session, model),
340  TranslatorHost(session, model),
341  TranslatorHosts(session, model),
342  TranslatorSubnet(session, model),
343  TranslatorSubnets(session, model),
344  TranslatorSharedNetwork(session, model) {
345 }
346 
348 }
349 
352  try {
353  ElementPtr result = Element::createList();
354  S_Iter_Value iter = getIter(xpath + "/shared-network");
355  if (!iter) {
356  // Can't happen.
357  isc_throw(Unexpected, "getSharedNetworks: can't get iterator: "
358  << xpath);
359  }
360  for (;;) {
361  const string& network = getNext(iter);
362  if (network.empty()) {
363  break;
364  }
365  result->add(getSharedNetwork(network));
366  }
367  return (result);
368  } catch (const sysrepo_exception& ex) {
370  "sysrepo error getting shared networks at '" << xpath
371  << "': " << ex.what());
372  }
373 }
374 
375 void
377  ConstElementPtr elem) {
378  try {
379  if ((model_ == KEA_DHCP4_SERVER) ||
380  (model_ == KEA_DHCP6_SERVER)) {
381  setSharedNetworksKea(xpath, elem);
382  } else {
384  "setSharedNetworks not implemented for the model: "
385  << model_);
386  }
387  } catch (const sysrepo_exception& ex) {
389  "sysrepo error setting shared networks '" << elem->str()
390  << "' at '" << xpath << "': " << ex.what());
391  }
392 }
393 
394 void
396  ConstElementPtr elem) {
397  for (size_t i = 0; i < elem->size(); ++i) {
398  ConstElementPtr network = elem->get(i);
399  if (!network->contains("name")) {
400  isc_throw(BadValue, "setSharedNetworksKea requires name: "
401  << network->str());
402  }
403  string name = network->get("name")->stringValue();
404  ostringstream key;
405  key<< xpath << "/shared-network[name='" << name << "']";
406  setSharedNetwork(key.str(), network);
407  }
408 }
409 
410 }; // end of namespace isc::yang
411 }; // 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.
Subnet (aka network range) translation between YANG and JSON.
void setSharedNetworkKea(const std::string &xpath, isc::data::ConstElementPtr elem, const std::string &subsel)
setSharedNetwork for kea-dhcp4-server and kea-dhcp6-server models
A generic exception that is thrown when a function is not implemented.
Between YANG and JSON translator class for basic values.
Definition: translator.h:27
isc::data::ElementPtr getSharedNetwork(const std::string &xpath)
Get and translate a shared network from YANG to JSON.
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::ElementPtr getSharedNetworks(const std::string &xpath)
Get and translate shared networks from YANG to JSON.
TranslatorSharedNetworks(sysrepo::S_Session session, const std::string &model)
Constructor.
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 setSharedNetworksKea(const std::string &xpath, isc::data::ConstElementPtr elem)
setSharedNetworks for kea-dhcp4-server and kea-dhcp6-server
#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...
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.
A generic exception that is thrown when an unexpected error condition occurs.
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
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:23
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 subnet list between YANG and JSON.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
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 setSharedNetwork(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set shared network from JSON to YANG.
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.
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 getSharedNetworkKea(const std::string &xpath, const std::string &subsel)
getSharedNetwork for kea-dhcp4-server and kea-dhcp6-server models
A translator class for converting host reservations list between YANG and JSON.