Kea  1.9.9-git
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 
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 TranslatorOptionData::TranslatorOptionData(S_Session session,
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  }
56  ElementPtr result = Element::createMap();
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 
82 void
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 
101 void
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 
155  ElementPtr result = Element::createList();
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 
172 void
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 
191 void
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
isc::data::ElementPtr getOptionData(const std::string &xpath)
Get and translate an option data from YANG to JSON.
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
boost::shared_ptr< Element > ElementPtr
Definition: data.h:20
STL namespace.
void setOptionDataKea(const std::string &xpath, isc::data::ConstElementPtr elem)
setOptionData for kea-dhcp[46].
sysrepo::S_Iter_Value getIter(const std::string &xpath)
List iterator methods keeping the session private.
Definition: translator.cc:316
isc::data::ConstElementPtr getOptionDataListKea(const std::string &xpath)
getOptionDataList for kea-dhcp[46].
TranslatorOptionDataList(sysrepo::S_Session session, const std::string &model)
Constructor.
#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
void setOptionDataListKea(const std::string &xpath, isc::data::ConstElementPtr elem)
setOptionDataList for kea-dhcp[46].
virtual ~TranslatorOptionData()
Destructor.
void setOptionData(const std::string &xpath, isc::data::ConstElementPtr elem)
Translate and set option data from JSON to YANG.
A generic exception that is thrown when an unexpected error condition occurs.
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
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.
isc::data::ElementPtr getItem(const std::string &xpath)
Get and translate basic value from YANG to JSON.
Definition: translator.cc:111
isc::data::ElementPtr getOptionDataKea(const std::string &xpath)
getOptionData JSON for kea-dhcp[46].
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.
std::string format(const std::string &format, const std::vector< std::string > &args)
Apply Formatting.
Definition: strutil.cc:157