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::yang::TranslatorOptionDataList
A translator class for converting an option data list between YANG and JSON.
Definition: translator_option_data.h:126
isc::Unexpected
A generic exception that is thrown when an unexpected error condition occurs.
Definition: exceptions/exceptions.h:153
isc::yang::TranslatorBasic::getIter
sysrepo::S_Iter_Value getIter(const std::string &xpath)
List iterator methods keeping the session private.
Definition: translator.cc:278
isc::yang::TranslatorOptionDataList::getOptionDataList
isc::data::ConstElementPtr getOptionDataList(const std::string &xpath)
Get and translate option data list from YANG to JSON.
Definition: translator_option_data.cc:138
isc::yang::TranslatorHost
Translation between YANG and JSON for a single host reservation.
Definition: translator_host.h:112
isc::yang::TranslatorSubnets
A translator class for converting a subnet list between YANG and JSON.
Definition: translator_subnet.h:299
isc::yang::TranslatorPool
A translator class for converting a pool between YANG and JSON.
Definition: translator_pool.h:124
isc::yang::TranslatorSubnet
Subnet (aka network range) translation between YANG and JSON.
Definition: translator_subnet.h:236
isc::yang::TranslatorBasic::getNext
std::string getNext(sysrepo::S_Iter_Value iter)
Get xpath of the next YANG list item.
Definition: translator.cc:283
isc::yang::TranslatorSharedNetwork::setSharedNetwork
void setSharedNetwork(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set shared network from JSON to YANG.
Definition: translator_shared_network.cc:156
isc::yang::TranslatorSharedNetworks::setSharedNetworks
void setSharedNetworks(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set shared networks from JSON to YANG.
Definition: translator_shared_network.cc:320
isc::yang::TranslatorBasic::getItem
isc::data::ElementPtr getItem(const std::string &xpath)
Get and translate basic value from YANG to JSON.
Definition: translator.cc:104
isc::data
Definition: cfg_to_element.h:25
isc::yang::TranslatorBasic::getItems
isc::data::ElementPtr getItems(const std::string &xpath)
Get and translate a list of basic values from YANG to JSON.
Definition: translator.cc:119
isc::yang::TranslatorSharedNetwork::getSharedNetworkKea
isc::data::ElementPtr getSharedNetworkKea(const std::string &xpath, const std::string &subsel)
getSharedNetwork for kea-dhcp4-server and kea-dhcp6-server models
Definition: translator_shared_network.cc:59
isc::yang::TranslatorSharedNetwork
Shared network translation between YANG and JSON.
Definition: translator_shared_network.h:125
adaptor.h
isc::yang::TranslatorOptionData
Option data translation between YANG and JSON.
Definition: translator_option_data.h:75
isc
Defines the logger used by the top-level component of kea-dhcp-ddns.
Definition: agent_parser.cc:144
isc::Exception::what
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
Definition: exceptions/exceptions.cc:32
isc::yang::TranslatorPools
A translator class for converting pools between YANG and JSON.
Definition: translator_pool.h:198
yang_models.h
isc_throw
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
Definition: exceptions/exceptions.h:192
isc::BadValue
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
Definition: exceptions/exceptions.h:132
isc::yang::TranslatorSharedNetwork::getSharedNetwork
isc::data::ElementPtr getSharedNetwork(const std::string &xpath)
Get and translate a shared network from YANG to JSON.
Definition: translator_shared_network.cc:42
isc::yang::TranslatorHosts
A translator class for converting host reservations list between YANG and JSON.
Definition: translator_host.h:163
isc::yang::TranslatorSubnets::setSubnets
void setSubnets(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set subnets from JSON to YANG.
Definition: translator_subnet.cc:447
isc::yang::TranslatorOptionDataList::setOptionDataList
void setOptionDataList(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set option data list from JSON to YANG.
Definition: translator_option_data.cc:173
isc::yang::TranslatorBasic::setItem
void setItem(const std::string &xpath, isc::data::ConstElementPtr elem, sr_type_t type)
Translate and set basic value from JSON to YANG.
Definition: translator.cc:250
isc::yang::TranslatorSharedNetwork::~TranslatorSharedNetwork
virtual ~TranslatorSharedNetwork()
Destructor.
Definition: translator_shared_network.cc:38
isc::yang::TranslatorPdPools
A translator class for converting a pd-pool list between YANG and JSON.
Definition: translator_pd_pool.h:183
isc::yang::TranslatorSharedNetworks::TranslatorSharedNetworks
TranslatorSharedNetworks(sysrepo::S_Session session, const std::string &model)
Constructor.
Definition: translator_shared_network.cc:275
isc::yang::TranslatorSharedNetworks::getSharedNetworks
isc::data::ElementPtr getSharedNetworks(const std::string &xpath)
Get and translate shared networks from YANG to JSON.
Definition: translator_shared_network.cc:295
isc::yang::TranslatorSubnets::getSubnets
isc::data::ElementPtr getSubnets(const std::string &xpath)
Get and translate subnets from YANG to JSON.
Definition: translator_subnet.cc:409
isc::yang::TranslatorBasic
Between YANG and JSON translator class for basic values.
Definition: translator.h:27
isc::yang::TranslatorSharedNetworks::~TranslatorSharedNetworks
virtual ~TranslatorSharedNetworks()
Destructor.
Definition: translator_shared_network.cc:291
translator_shared_network.h
isc::yang::TranslatorSharedNetwork::setSharedNetworkKea
void setSharedNetworkKea(const std::string &xpath, isc::data::ConstElementPtr elem, const std::string &subsel)
setSharedNetwork for kea-dhcp4-server and kea-dhcp6-server models
Definition: translator_shared_network.cc:176
isc::yang::TranslatorPdPool
Prefix delegation pool translation between YANG and JSON.
Definition: translator_pd_pool.h:116
isc::data::ElementPtr
boost::shared_ptr< Element > ElementPtr
Definition: data.h:20
isc::NotImplemented
A generic exception that is thrown when a function is not implemented.
Definition: exceptions/exceptions.h:165
isc::data::ConstElementPtr
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:23
isc::yang::TranslatorBasic::model_
std::string model_
The model.
Definition: translator.h:132
isc::yang::Adaptor::getContext
static isc::data::ConstElementPtr getContext(isc::data::ConstElementPtr parent)
Get user context.
Definition: adaptor.cc:25
isc::yang::TranslatorSharedNetworks::setSharedNetworksKea
void setSharedNetworksKea(const std::string &xpath, isc::data::ConstElementPtr elem)
setSharedNetworks for kea-dhcp4-server and kea-dhcp6-server
Definition: translator_shared_network.cc:339
isc::yang::SysrepoError
Sysrepo error.
Definition: sysrepo_error.h:16