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
14using namespace std;
15using namespace isc::data;
16#ifndef HAVE_PRE_0_7_6_SYSREPO
17using namespace sysrepo;
18#endif
19
20namespace isc {
21namespace yang {
22
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) {
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
155void
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
175void
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 {
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
319void
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
338void
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
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
A generic exception that is thrown when a function is not implemented.
A generic exception that is thrown when an unexpected error condition occurs.
static ElementPtr create(const Position &pos=ZERO_POSITION())
Definition: data.cc:223
static ElementPtr fromJSON(const std::string &in, bool preproc=false)
These functions will parse the given string (JSON) representation of a compound element.
Definition: data.cc:750
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
Definition: data.cc:268
static ElementPtr createList(const Position &pos=ZERO_POSITION())
Creates an empty ListElement type ElementPtr.
Definition: data.cc:263
static isc::data::ConstElementPtr getContext(isc::data::ConstElementPtr parent)
Get user context.
Definition: adaptor.cc:25
Between YANG and JSON translator class for basic values.
Definition: translator.h:27
std::string getNext(sysrepo::S_Iter_Value iter)
Get xpath of the next YANG list item.
Definition: translator.cc:283
isc::data::ElementPtr getItem(const std::string &xpath)
Get and translate basic value from YANG to JSON.
Definition: translator.cc:104
sysrepo::S_Iter_Value getIter(const std::string &xpath)
List iterator methods keeping the session private.
Definition: translator.cc:278
std::string model_
The model.
Definition: translator.h:132
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::data::ElementPtr getItems(const std::string &xpath)
Get and translate a list of basic values from YANG to JSON.
Definition: translator.cc:119
Translation between YANG and JSON for a single host reservation.
A translator class for converting host reservations list between YANG and JSON.
A translator class for converting an option data list between YANG and JSON.
isc::data::ConstElementPtr getOptionDataList(const std::string &xpath)
Get and translate option data list from YANG to JSON.
void setOptionDataList(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set option data list from JSON to YANG.
Option data translation between YANG and JSON.
Prefix delegation pool translation between YANG and JSON.
A translator class for converting a pd-pool list 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.
Shared network translation between YANG and JSON.
isc::data::ElementPtr getSharedNetworkKea(const std::string &xpath, const std::string &subsel)
getSharedNetwork for kea-dhcp4-server and kea-dhcp6-server models
TranslatorSharedNetwork(sysrepo::S_Session session, const std::string &model)
Constructor.
void setSharedNetworkKea(const std::string &xpath, isc::data::ConstElementPtr elem, const std::string &subsel)
setSharedNetwork for kea-dhcp4-server and kea-dhcp6-server models
void setSharedNetwork(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set shared network from JSON to YANG.
isc::data::ElementPtr getSharedNetwork(const std::string &xpath)
Get and translate a shared network from YANG to JSON.
isc::data::ElementPtr getSharedNetworks(const std::string &xpath)
Get and translate shared networks from YANG to JSON.
void setSharedNetworksKea(const std::string &xpath, isc::data::ConstElementPtr elem)
setSharedNetworks for kea-dhcp4-server and kea-dhcp6-server
TranslatorSharedNetworks(sysrepo::S_Session session, const std::string &model)
Constructor.
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.
A translator class for converting a subnet list between YANG and JSON.
void setSubnets(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set subnets from JSON to YANG.
isc::data::ElementPtr getSubnets(const std::string &xpath)
Get and translate subnets from YANG to JSON.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:23
boost::shared_ptr< Element > ElementPtr
Definition: data.h:22
Defines the logger used by the top-level component of kea-dhcp-ddns.