Kea 1.5.0
translator_option_data.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}
27
29}
30
33 try {
34 if ((model_ == KEA_DHCP4_SERVER) ||
35 (model_ == KEA_DHCP6_SERVER)) {
36 return (getOptionDataKea(xpath));
37 }
38 } catch (const sysrepo_exception& ex) {
40 "sysrepo error getting option data at '" << xpath
41 << "': " << ex.what());
42 }
44 "getOptionData not implemented for the model: " << model_);
45}
46
49 ConstElementPtr code = getItem(xpath + "/code");
50 ConstElementPtr space = getItem(xpath + "/space");
51 if (!code || !space) {
52 // Can't happen as code and space are the keys.
53 isc_throw(Unexpected, "getOptionDataKea requires code and space: "
54 << xpath);
55 }
57 result->set("code", code);
58 result->set("space", space);
59 ConstElementPtr name = getItem(xpath + "/name");
60 if (name) {
61 result->set("name", name);
62 }
63 ConstElementPtr data = getItem(xpath + "/data");
64 if (data) {
65 result->set("data", data);
66 }
67 ConstElementPtr format = getItem(xpath + "/csv-format");
68 if (format) {
69 result->set("csv-format", format);
70 }
71 ConstElementPtr send = getItem(xpath + "/always-send");
72 if (send) {
73 result->set("always-send", send);
74 }
75 ConstElementPtr context = getItem(xpath + "/user-context");
76 if (context) {
77 result->set("user-context", Element::fromJSON(context->stringValue()));
78 }
79 return (result);
80}
81
82void
84 ConstElementPtr elem) {
85 try {
86 if ((model_ == KEA_DHCP4_SERVER) ||
87 (model_ == KEA_DHCP6_SERVER)) {
88 setOptionDataKea(xpath, elem);
89 } else {
91 "setOptionData not implemented for the model: "
92 << model_);
93 }
94 } catch (const sysrepo_exception& ex) {
96 "sysrepo error setting option data '" << elem->str()
97 << "' at '" << xpath << "': " << ex.what());
98 }
99}
100
101void
103 ConstElementPtr elem) {
104 // Skip keys code and space.
105 ConstElementPtr name = elem->get("name");
106 if (name) {
107 setItem(xpath + "/name", name, SR_STRING_T);
108 }
109 ConstElementPtr data = elem->get("data");
110 if (data) {
111 setItem(xpath + "/data", data, SR_STRING_T);
112 }
113 ConstElementPtr format = elem->get("csv-format");
114 if (format) {
115 setItem(xpath + "/csv-format", format, SR_BOOL_T);
116 }
117 ConstElementPtr send = elem->get("always-send");
118 if (send) {
119 setItem(xpath + "/always-send", send, SR_BOOL_T);
120 }
121 ConstElementPtr context = Adaptor::getContext(elem);
122 if (context) {
123 setItem(xpath + "/user-context", Element::create(context->str()),
124 SR_STRING_T);
125 }
126}
127
129 const string& model)
130 : TranslatorBasic(session, model),
131 TranslatorOptionData(session, model) {
132}
133
135}
136
139 try {
140 if ((model_ == KEA_DHCP4_SERVER) ||
141 (model_ == KEA_DHCP6_SERVER)) {
142 return (getOptionDataListKea(xpath));
143 }
144 } catch (const sysrepo_exception& ex) {
146 "sysrepo error getting option data list at '" << xpath
147 << "': " << ex.what());
148 }
150 "getOptionDataList not implemented for the model: " << model_);
151}
152
156 S_Iter_Value iter = getIter(xpath + "/option-data");
157 if (!iter) {
158 // Can't happen.
159 isc_throw(Unexpected, "getOptionDataListKea: can't get iterator: "
160 << xpath);
161 }
162 for (;;) {
163 const string& option = getNext(iter);
164 if (option.empty()) {
165 break;
166 }
167 result->add(getOptionData(option));
168 }
169 return (result);
170}
171
172void
174 ConstElementPtr elem) {
175 try {
176 if ((model_ == KEA_DHCP4_SERVER) ||
177 (model_ == KEA_DHCP6_SERVER)) {
178 setOptionDataListKea(xpath, elem);
179 } else {
181 "setOptionDataList not implemented for the model: "
182 << model_);
183 }
184 } catch (const sysrepo_exception& ex) {
186 "sysrepo error setting option data list '" << elem->str()
187 << "' at '" << xpath << "': " << ex.what());
188 }
189}
190
191void
193 ConstElementPtr elem) {
194 for (size_t i = 0; i < elem->size(); ++i) {
195 ConstElementPtr option = elem->get(i);
196 if (!option->contains("code")) {
197 isc_throw(BadValue, "option data without code: " << option->str());
198 }
199 unsigned code = static_cast<unsigned>(option->get("code")->intValue());
200 if (!option->contains("space")) {
201 isc_throw(BadValue, "option data without space: " <<option->str());
202 }
203 string space = option->get("space")->stringValue();
204 ostringstream keys;
205 keys << xpath << "/option-data[code='" << code
206 << "'][space='" << space << "']";
207 setOptionData(keys.str(), option);
208 }
209}
210
211}; // end of namespace isc::yang
212}; // 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::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.
isc::data::ConstElementPtr getOptionDataListKea(const std::string &xpath)
getOptionDataList for kea-dhcp[46].
TranslatorOptionDataList(sysrepo::S_Session session, const std::string &model)
Constructor.
void setOptionDataListKea(const std::string &xpath, isc::data::ConstElementPtr elem)
setOptionDataList for kea-dhcp[46].
Option data translation between YANG and JSON.
TranslatorOptionData(sysrepo::S_Session session, const std::string &model)
Constructor.
isc::data::ElementPtr getOptionDataKea(const std::string &xpath)
getOptionData JSON for kea-dhcp[46].
isc::data::ElementPtr getOptionData(const std::string &xpath)
Get and translate an option data from YANG to JSON.
void setOptionData(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set option data from JSON to YANG.
void setOptionDataKea(const std::string &xpath, isc::data::ConstElementPtr elem)
setOptionData for kea-dhcp[46].
#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.