Kea  1.5.0
translator_shared_network.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.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  }
78  ConstElementPtr valid = getItem(xpath + "/valid-lifetime");
79  if (valid) {
80  result->set("valid-lifetime", valid);
81  }
82  ConstElementPtr renew = getItem(xpath + "/renew-timer");
83  if (renew) {
84  result->set("renew-timer", renew);
85  }
86  ConstElementPtr rebind = getItem(xpath + "/rebind-timer");
87  if (rebind) {
88  result->set("rebind-timer", rebind);
89  }
90  ConstElementPtr options = getOptionDataList(xpath);
91  if (options && (options->size() > 0)) {
92  result->set("option-data", options);
93  }
94  ConstElementPtr interface = getItem(xpath + "/interface");
95  if (interface) {
96  result->set("interface", interface);
97  }
98  if (subsel == "subnet6") {
99  ConstElementPtr interface_id = getItem(xpath + "/interface-id");
100  if (interface_id) {
101  result->set("interface-id", interface_id);
102  }
103  ConstElementPtr rapid_commit = getItem(xpath + "/rapid-commit");
104  if (rapid_commit) {
105  result->set("rapid-commit", rapid_commit);
106  }
107  }
108  ConstElementPtr guard = getItem(xpath + "/client-class");
109  if (guard) {
110  result->set("client-class", guard);
111  }
112  ConstElementPtr required = getItems(xpath + "/require-client-classes");
113  if (required && (required->size() > 0)) {
114  result->set("require-client-classes", required);
115  }
116  ConstElementPtr mode = getItem(xpath + "/reservation-mode");
117  if (mode) {
118  result->set("reservation-mode", mode);
119  }
120  ConstElementPtr relay = getItems(xpath + "/relay/ip-addresses");
121  if (relay && (relay->size() > 0)) {
122  ElementPtr relay_map = Element::createMap();
123  relay_map->set("ip-addresses", relay);
124  result->set("relay", relay_map);
125  }
126  if (subsel == "subnet4") {
127  ConstElementPtr match = getItem(xpath + "/match-client-id");
128  if (match) {
129  result->set("match-client-id", match);
130  }
131  ConstElementPtr auth = getItem(xpath + "/authoritative");
132  if (auth) {
133  result->set("authoritative", auth);
134  }
135  ConstElementPtr next = getItem(xpath + "/next-server");
136  if (next) {
137  result->set("next-server", next);
138  }
139  ConstElementPtr hostname = getItem(xpath + "/server-hostname");
140  if (hostname) {
141  result->set("server-hostname", hostname);
142  }
143  ConstElementPtr boot = getItem(xpath + "/boot-file-name");
144  if (boot) {
145  result->set("boot-file-name", boot);
146  }
147  }
148  ConstElementPtr context = getItem(xpath + "/user-context");
149  if (context) {
150  result->set("user-context", Element::fromJSON(context->stringValue()));
151  }
152  return (result);
153 }
154 
155 void
157  ConstElementPtr elem) {
158  try {
159  if (model_ == KEA_DHCP4_SERVER) {
160  setSharedNetworkKea(xpath, elem, "subnet4");
161  } else if (model_ == KEA_DHCP6_SERVER) {
162  setSharedNetworkKea(xpath, elem, "subnet6");
163  } else {
165  "setSharedNetwork not implemented for the model: "
166  << model_);
167  }
168  } catch (const sysrepo_exception& ex) {
170  "sysrepo error setting shared network '" << elem->str()
171  << "' at '" << xpath << "': " << ex.what());
172  }
173 }
174 
175 void
177  ConstElementPtr elem,
178  const std::string& subsel) {
179  // Skip name which is the key.
180  ConstElementPtr subnets = elem->get(subsel);
181  if (subnets && (subnets->size() > 0)) {
182  setSubnets(xpath, subnets);
183  }
184  if (subsel == "subnet6") {
185  ConstElementPtr preferred = elem->get("preferred-lifetime");
186  if (preferred) {
187  setItem(xpath + "/preferred-lifetime", preferred, SR_UINT32_T);
188  }
189  }
190  ConstElementPtr valid = elem->get("valid-lifetime");
191  if (valid) {
192  setItem(xpath + "/valid-lifetime", valid, SR_UINT32_T);
193  }
194  ConstElementPtr renew = elem->get("renew-timer");
195  if (renew) {
196  setItem(xpath + "/renew-timer", renew, SR_UINT32_T);
197  }
198  ConstElementPtr rebind = elem->get("rebind-timer");
199  if (rebind) {
200  setItem(xpath + "/rebind-timer", rebind, SR_UINT32_T);
201  }
202  ConstElementPtr options = elem->get("option-data");
203  if (options && (options->size() > 0)) {
204  setOptionDataList(xpath, options);
205  }
206  ConstElementPtr interface = elem->get("interface");
207  if (interface) {
208  setItem(xpath + "/interface", interface, SR_STRING_T);
209  }
210  if (subsel == "subnet6") {
211  ConstElementPtr interface_id = elem->get("interface-id");
212  if (interface_id) {
213  setItem(xpath + "/interface-id", interface_id, SR_STRING_T);
214  }
215  ConstElementPtr rapid_commit = elem->get("rapid-commit");
216  if (rapid_commit) {
217  setItem(xpath + "/rapid-commit", rapid_commit, SR_BOOL_T);
218  }
219  }
220  ConstElementPtr guard = elem->get("client-class");
221  if (guard) {
222  setItem(xpath + "/client-class", guard, SR_STRING_T);
223  }
224  ConstElementPtr required = elem->get("require-client-classes");
225  if (required && (required->size() > 0)) {
226  for (ConstElementPtr rclass : required->listValue()) {
227  setItem(xpath + "/require-client-classes", rclass, SR_STRING_T);
228  }
229  }
230  ConstElementPtr mode = elem->get("reservation-mode");
231  if (mode) {
232  setItem(xpath + "/reservation-mode", mode, SR_ENUM_T);
233  }
234  ConstElementPtr relay = elem->get("relay");
235  if (relay) {
236  ConstElementPtr address = relay->get("ip-address");
237  ConstElementPtr addresses = relay->get("ip-addresses");
238  if (address) {
239  setItem(xpath + "/relay/ip-addresses", address, SR_STRING_T);
240  } else if (addresses && (addresses->size() > 0)) {
241  for (ConstElementPtr addr : addresses->listValue()) {
242  setItem(xpath + "/relay/ip-addresses", addr, SR_STRING_T);
243  }
244  }
245  }
246  if (subsel == "subnet4") {
247  ConstElementPtr match = elem->get("match-client-id");
248  if (match) {
249  setItem(xpath + "/match-client-id", match, SR_BOOL_T);
250  }
251  ConstElementPtr auth = elem->get("authoritative");
252  if (auth) {
253  setItem(xpath + "/authoritative", auth, SR_BOOL_T);
254  }
255  ConstElementPtr next = elem->get("next-server");
256  if (next) {
257  setItem(xpath + "/next-server", next, SR_STRING_T);
258  }
259  ConstElementPtr hostname = elem->get("server-hostname");
260  if (hostname) {
261  setItem(xpath + "/server-hostname", hostname, SR_STRING_T);
262  }
263  ConstElementPtr boot = elem->get("boot-file-name");
264  if (boot) {
265  setItem(xpath + "/boot-file-name", boot, SR_STRING_T);
266  }
267  }
268  ConstElementPtr context = Adaptor::getContext(elem);
269  if (context) {
270  ConstElementPtr repr = Element::create(context->str());
271  setItem(xpath + "/user-context", repr, SR_STRING_T);
272  }
273 }
274 
276  const string& model)
277  : TranslatorBasic(session, model),
278  TranslatorOptionData(session, model),
279  TranslatorOptionDataList(session, model),
280  TranslatorPool(session, model),
281  TranslatorPools(session, model),
282  TranslatorPdPool(session, model),
283  TranslatorPdPools(session, model),
284  TranslatorHost(session, model),
285  TranslatorHosts(session, model),
286  TranslatorSubnet(session, model),
287  TranslatorSubnets(session, model),
288  TranslatorSharedNetwork(session, model) {
289 }
290 
292 }
293 
296  try {
297  ElementPtr result = Element::createList();
298  S_Iter_Value iter = getIter(xpath + "/shared-network");
299  if (!iter) {
300  // Can't happen.
301  isc_throw(Unexpected, "getSharedNetworks: can't get iterator: "
302  << xpath);
303  }
304  for (;;) {
305  const string& network = getNext(iter);
306  if (network.empty()) {
307  break;
308  }
309  result->add(getSharedNetwork(network));
310  }
311  return (result);
312  } catch (const sysrepo_exception& ex) {
314  "sysrepo error getting shared networks at '" << xpath
315  << "': " << ex.what());
316  }
317 }
318 
319 void
321  ConstElementPtr elem) {
322  try {
323  if ((model_ == KEA_DHCP4_SERVER) ||
324  (model_ == KEA_DHCP6_SERVER)) {
325  setSharedNetworksKea(xpath, elem);
326  } else {
328  "setSharedNetworks not implemented for the model: "
329  << model_);
330  }
331  } catch (const sysrepo_exception& ex) {
333  "sysrepo error setting shared networks '" << elem->str()
334  << "' at '" << xpath << "': " << ex.what());
335  }
336 }
337 
338 void
340  ConstElementPtr elem) {
341  for (size_t i = 0; i < elem->size(); ++i) {
342  ConstElementPtr network = elem->get(i);
343  if (!network->contains("name")) {
344  isc_throw(BadValue, "setSharedNetworksKea requires name: "
345  << network->str());
346  }
347  string name = network->get("name")->stringValue();
348  ostringstream key;
349  key<< xpath << "/shared-network[name='" << name << "']";
350  setSharedNetwork(key.str(), network);
351  }
352 }
353 
354 }; // end of namespace isc::yang
355 }; // 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.
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
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.
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 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:250
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:283
static isc::data::ConstElementPtr getContext(isc::data::ConstElementPtr parent)
Get user context.
Definition: adaptor.cc:25
A translator class for converting a subnet list between YANG and JSON.
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:104
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.