OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bfd_json_config.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 CodiLime, Inc. All rights reserved.
3  */
4 
5 #include <vector>
6 #include <boost/foreach.hpp>
7 #include <boost/assign/list_of.hpp>
8 #include "base/address_util.h"
9 
10 #include "rapidjson/document.h"
11 #include "rapidjson/writer.h"
12 #include "rapidjson/stringbuffer.h"
13 
15 
16 namespace BFD {
17 namespace REST {
18 
19 static bool IsIPAddressValid(const char* addr) {
20  boost::system::error_code ec;
21  AddressFromString(addr, &ec);
22  return !ec;
23 }
24 
25 bool JsonData::ParseFromJsonString(const std::string& json) {
26  contrail_rapidjson::Document document;
27  document.Parse<0>(json.c_str());
28  return ParseFromJsonDocument(document);
29 }
30 
31 void JsonData::EncodeJsonString(std::string* json) {
32  contrail_rapidjson::Document document;
33  EncodeJsonDocument(&document, &document.GetAllocator());
34  contrail_rapidjson::StringBuffer strbuf;
35  contrail_rapidjson::Writer<contrail_rapidjson::StringBuffer> writer(strbuf);
36  document.Accept(writer);
37  *json = strbuf.GetString();
38 }
39 
40 bool JsonData::AreConstraintsMet(const std::vector<Constraint>& constraints,
41  const contrail_rapidjson::Value& document) {
42  if (!document.IsObject())
43  return false;
44 
45  BOOST_FOREACH(const struct Constraint& constraint, constraints) {
46  if (!document.HasMember(constraint.member_name) ||
47  !(document[constraint.member_name].*(constraint.typecheck_func))())
48  return false;
49  }
50  return true;
51 }
52 
54 {}
55 
56 JsonConfig::JsonConfig(boost::asio::ip::address address,
57  TimeInterval desired_min_tx_interval,
58  TimeInterval required_min_rx_interval,
59  int detection_time_multiplier)
60  : address(address),
61  desired_min_tx_interval(desired_min_tx_interval),
62  required_min_rx_interval(required_min_rx_interval),
63  detection_time_multiplier(detection_time_multiplier)
64  {}
65 
66 bool JsonConfig::ValidateJsonDocument(const contrail_rapidjson::Value& document) {
67  static const std::vector<Constraint> constraints = boost::assign::list_of
68  (Constraint("Address", &contrail_rapidjson::Value::IsString) )
69  (Constraint("DesiredMinTxInterval", &contrail_rapidjson::Value::IsInt))
70  (Constraint("RequiredMinRxInterval", &contrail_rapidjson::Value::IsInt))
71  (Constraint("DetectionMultiplier", &contrail_rapidjson::Value::IsInt));
72  return AreConstraintsMet(constraints, document) &&
73  IsIPAddressValid(document["Address"].GetString());
74 }
75 
76 bool JsonConfig::ParseFromJsonDocument(const contrail_rapidjson::Value& document) {
77  if (ValidateJsonDocument(document)) {
78  using boost::posix_time::microseconds;
79 
80  boost::system::error_code ec;
81  address = AddressFromString(document["Address"].GetString(), &ec);
83  microseconds(document["DesiredMinTxInterval"].GetInt());
85  microseconds(document["RequiredMinRxInterval"].GetInt());
87  document["DetectionMultiplier"].GetInt();
88  return true;
89  }
90  return false;
91 }
92 
93 void JsonConfig::EncodeJsonDocument(contrail_rapidjson::Value* document,
94  contrail_rapidjson::Value::AllocatorType *allocator) {
95  document->SetObject();
96  std::string address_str = address.to_string();
97  contrail_rapidjson::Value address_val(address_str.c_str(), *allocator);
98  document->AddMember("Address", address_val, *allocator);
99 
100  document->AddMember("DesiredMinTxInterval",
101  desired_min_tx_interval.total_microseconds(), *allocator);
102  document->AddMember("RequiredMinRxInterval",
103  required_min_rx_interval.total_microseconds(), *allocator);
104  document->AddMember("DetectionMultiplier",
105  detection_time_multiplier, *allocator);
106 }
107 
108 bool JsonState::ValidateJsonDocument(const contrail_rapidjson::Value& document) {
109  const std::vector<Constraint> constraints = boost::assign::list_of
110  (Constraint("LocalSessionState", &contrail_rapidjson::Value::IsString))
111  (Constraint("RemoteSessionState", &contrail_rapidjson::Value::IsString))
112  (Constraint("RemoteMinRxInterval", &contrail_rapidjson::Value::IsInt))
113  (Constraint("LocalDiscriminator", &contrail_rapidjson::Value::IsInt))
114  (Constraint("RemoteDiscriminator", &contrail_rapidjson::Value::IsInt));
115  return AreConstraintsMet(constraints, document) &&
116  // Check whether these strings are convertible to BFD states.
117  BFDStateFromString(document["LocalSessionState"].GetString()) &&
118  BFDStateFromString(document["RemoteSessionState"].GetString());
119 }
120 
121 bool JsonState::ParseFromJsonDocument(const contrail_rapidjson::Value& document) {
122  if (!session_config.ParseFromJsonDocument(document))
123  return false;
124 
125  if (ValidateJsonDocument(document)) {
126  using boost::posix_time::microseconds;
127 
129  microseconds(document["RemoteMinRxInterval"].GetInt());
131  document["LocalDiscriminator"].GetInt();
133  document["RemoteDiscriminator"].GetInt();
135  *BFDStateFromString(document["LocalSessionState"].GetString());
137  *BFDStateFromString(document["RemoteSessionState"].GetString());
138  return true;
139  }
140  return false;
141 }
142 
143 void JsonState::EncodeJsonDocument(contrail_rapidjson::Value* document,
144  contrail_rapidjson::Value::AllocatorType *allocator) {
145  document->SetObject();
146  session_config.EncodeJsonDocument(document, allocator);
147 
148  std::string local_session_state_str
149  = boost::lexical_cast<std::string>(bfd_local_state);
150  contrail_rapidjson::Value local_session_state_val(local_session_state_str.c_str(),
151  *allocator);
152  document->AddMember("LocalSessionState", local_session_state_val,
153  *allocator);
154 
155  std::string remote_session_state_str =
156  boost::lexical_cast<std::string>(bfd_remote_state);
157  contrail_rapidjson::Value remote_session_state_val(remote_session_state_str.c_str(),
158  *allocator);
159  document->AddMember("RemoteSessionState", remote_session_state_val,
160  *allocator);
161  document->AddMember("LocalDiscriminator", local_discriminator,
162  *allocator);
163  document->AddMember("RemoteDiscriminator", remote_discriminator,
164  *allocator);
165  document->AddMember("RemoteMinRxInterval",
166  remote_min_rx_interval.total_microseconds(),
167  *allocator);
168 }
169 
171  const contrail_rapidjson::Value& document) {
172  const std::vector<Constraint> constraints = boost::assign::list_of
173  (Constraint("Address", &contrail_rapidjson::Value::IsString))
174  (Constraint("SessionState", &contrail_rapidjson::Value::IsString));
175  return AreConstraintsMet(constraints, document) &&
176  IsIPAddressValid(document["Address"].GetString()) &&
177  BFDStateFromString(document["SessionState"].GetString());
178 }
179 
180 bool JsonStateNotification::ParseFromJsonDocument(const contrail_rapidjson::Value
181  &document) {
182  if (ValidateJsonDocument(document)) {
183 
184  boost::system::error_code ec;
185  address = AddressFromString(document["Address"].GetString(), &ec);
186  state =
187  *BFDStateFromString(document["SessionState"].GetString());
188  return true;
189  }
190  return false;
191 }
192 
193 void JsonStateNotification::EncodeJsonDocument(contrail_rapidjson::Value* document,
194  contrail_rapidjson::Value::AllocatorType *allocator) {
195  document->SetObject();
196  std::string address_str = address.to_string();
197  contrail_rapidjson::Value address_val(address_str.c_str(), *allocator);
198  document->AddMember("Address", address_val, *allocator);
199 
200  std::string session_state_str = boost::lexical_cast<std::string>(state);
201  contrail_rapidjson::Value session_state_val(session_state_str.c_str(), *allocator);
202  document->AddMember("SessionState", session_state_val, *allocator);
203 }
204 
205 void JsonStateNotificationList::EncodeJsonDocument(contrail_rapidjson::Value* document,
206  contrail_rapidjson::Value::AllocatorType *allocator) {
207  document->SetArray();
208  for (std::vector<JsonStateNotification>::iterator it =
209  notifications.begin(); it != notifications.end(); ++it) {
210  contrail_rapidjson::Value notification;
211  it->EncodeJsonDocument(&notification, allocator);
212  document->PushBack(notification, *allocator);
213  }
214 }
215 
217  const contrail_rapidjson::Value& document) {
218  return true;
219 }
220 
222  const contrail_rapidjson::Value& document) {
223  return false;
224 }
225 
226 void JsonStateMap::EncodeJsonDocument(contrail_rapidjson::Value* document,
227  contrail_rapidjson::Value::AllocatorType* allocator) {
228  document->SetObject();
229 
230  for (StateMap::iterator it = states.begin(); it != states.end(); ++it) {
231  std::string address_str = it->first.to_string();
232  contrail_rapidjson::Value address_val(address_str.c_str(), *allocator);
233 
234  std::string session_state_str =
235  boost::lexical_cast<std::string>(it->second);
236  contrail_rapidjson::Value session_state_val(session_state_str.c_str(),
237  *allocator);
238 
239  document->AddMember(address_val, session_state_val, *allocator);
240  }
241 }
242 
243 bool JsonStateMap::ValidateJsonDocument(const contrail_rapidjson::Value& document) {
244  if (!document.IsObject())
245  return false;
246 
247  for (contrail_rapidjson::Value::ConstMemberIterator it = document.MemberBegin();
248  it != document.MemberEnd(); ++it) {
249  using boost::system::error_code;
250 
251  if (!it->name.IsString() || !it->value.IsString())
252  return false;
253 
254  error_code ec;
255  if (ec.failed())
256  return false;
257  if (!BFDStateFromString(it->value.GetString()))
258  return false;
259  }
260  return true;
261 }
262 
264  const contrail_rapidjson::Value& document) {
265  if (!ValidateJsonDocument(document))
266  return false;
267 
268  states.clear();
269 
270  for (contrail_rapidjson::Value::ConstMemberIterator
271  it = document.MemberBegin(); it != document.MemberEnd(); ++it) {
272  boost::system::error_code ec;
273  boost::asio::ip::address address =
274  AddressFromString(it->name.GetString(), &ec);
275  BFDState state = *BFDStateFromString(it->value.GetString());
276  states[address] = state;
277  }
278  return true;
279 }
280 
281 } // namespace REST
282 } // namespace BFD
283 
boost::asio::ip::address address
virtual bool ParseFromJsonDocument(const contrail_rapidjson::Value &document)=0
bool ParseFromJsonString(const std::string &json)
std::vector< JsonStateNotification > notifications
virtual bool ParseFromJsonDocument(const contrail_rapidjson::Value &document)
virtual bool ParseFromJsonDocument(const contrail_rapidjson::Value &document)
TimeInterval required_min_rx_interval
Discriminator local_discriminator
virtual bool ValidateJsonDocument(const contrail_rapidjson::Value &document)
bool ParseFromJsonDocument(const contrail_rapidjson::Value &document)
static bool IsIPAddressValid(const char *addr)
boost::optional< BFDState > BFDStateFromString(const std::string &str)
Definition: bfd_common.cc:33
void EncodeJsonDocument(contrail_rapidjson::Value *document, contrail_rapidjson::Value::AllocatorType *allocator)
void EncodeJsonDocument(contrail_rapidjson::Value *document, contrail_rapidjson::Value::AllocatorType *allocator)
virtual bool ValidateJsonDocument(const contrail_rapidjson::Value &document)
boost::posix_time::time_duration TimeInterval
Definition: bfd_common.h:18
void EncodeJsonDocument(contrail_rapidjson::Value *document, contrail_rapidjson::Value::AllocatorType *allocator)
virtual bool ValidateJsonDocument(const contrail_rapidjson::Value &document)
virtual void EncodeJsonDocument(contrail_rapidjson::Value *document, contrail_rapidjson::Value::AllocatorType *allocator)=0
bool ValidateJsonDocument(const contrail_rapidjson::Value &document)
void EncodeJsonDocument(contrail_rapidjson::Value *document, contrail_rapidjson::Value::AllocatorType *allocator)
IpAddress AddressFromString(const std::string &ip_address_str, boost::system::error_code *ec)
virtual bool ParseFromJsonDocument(const contrail_rapidjson::Value &document)
BFDState
Definition: bfd_common.h:21
TimeInterval remote_min_rx_interval
Discriminator remote_discriminator
void EncodeJsonDocument(contrail_rapidjson::Value *document, contrail_rapidjson::Value::AllocatorType *allocator)
void EncodeJsonString(std::string *json)
virtual bool ValidateJsonDocument(const contrail_rapidjson::Value &document)
TimeInterval desired_min_tx_interval
virtual bool ParseFromJsonDocument(const contrail_rapidjson::Value &document)
boost::asio::ip::address address
bool AreConstraintsMet(const std::vector< Constraint > &constraints, const contrail_rapidjson::Value &document)