10 #include <boost/assign.hpp>
11 #include <boost/bind.hpp>
12 #include <boost/foreach.hpp>
13 #include <boost/random.hpp>
15 #include <rapidjson/document.h>
16 #include <rapidjson/writer.h>
17 #include <rapidjson/stringbuffer.h>
38 const std::string& client_id = (*data.
match)[1];
44 const std::string& client_id = (*data.
match)[1];
50 const std::string& client_id = (*data.
match)[1];
51 boost::system::error_code ec;
52 boost::asio::ip::address ip =
58 const std::string& client_id = (*data.
match)[1];
59 boost::system::error_code ec;
60 boost::asio::ip::address ip =
67 const std::string& client_id = (*data.
match)[1];
73 boost::assign::list_of
79 regex(
"/Session/([[:digit:]]{1,9})"),
83 regex(
"/Session/([[:digit:]]{1,9})/IpConnection"),
87 regex(
"/Session/([[:digit:]]{1,9})/IpConnection/"
88 "([[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\."
89 "[[:digit:]]{1,3}\\.[[:digit:]]{1,3})"),
93 regex(
"/Session/([[:digit:]]{1,9})/IpConnection/"
94 "([[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\."
95 "[[:digit:]]{1,3}\\.[[:digit:]]{1,3})"),
99 regex(
"/Session/([[:digit:]]{1,9})/Monitor"),
104 bfd_server_(bfd_server) {
114 boost::lexical_cast<std::string>(client_id), 404);
125 contrail_rapidjson::Document document;
126 document.SetObject();
127 document.AddMember(
"client-id", client_id, document.GetAllocator());
128 contrail_rapidjson::StringBuffer strbuf;
129 contrail_rapidjson::Writer<contrail_rapidjson::StringBuffer> writer(strbuf);
130 document.Accept(writer);
138 if (client_session == NULL) {
139 LOG(DEBUG, __PRETTY_FUNCTION__ <<
": Couldn't get session.");
143 delete client_session;
151 if (client_session == NULL) {
152 LOG(DEBUG, __PRETTY_FUNCTION__ <<
": Couldn't get session.");
178 const boost::asio::ip::address& ip,
HttpSession* session,
181 if (client_session == NULL) {
182 LOG(DEBUG, __PRETTY_FUNCTION__ <<
": Couldn't get session.");
187 if (bfd_session == NULL) {
188 LOG(DEBUG, __PRETTY_FUNCTION__ <<
": Couldn't get session.");
212 const boost::asio::ip::address& ip,
HttpSession* session,
215 if (client_session == NULL) {
216 LOG(DEBUG, __PRETTY_FUNCTION__ <<
": Couldn't get session.");
231 if (client_session == NULL) {
232 LOG(DEBUG, __PRETTY_FUNCTION__ <<
": Couldn't get session.");
241 tbb::mutex::scoped_lock lock(
mutex_);
243 std::string path = request->
UrlPath();
254 LOG(INFO,
"Handling request: " << path);
263 LOG(ERROR,
"Couldn't handle request: " << path);
269 boost::random::uniform_int_distribution<> dist(0, 1e9);
IpAddress AddressFromString(const std::string &ip_address_str, boost::system::error_code *ec)
ResultCode AddBFDConnection(const SessionKey &key, const SessionConfig &config)
ResultCode DeleteBFDConnection(const SessionKey &key)
void AddMonitoringHttpSession(HttpSession *session)
Session * GetSession(const boost::asio::ip::address &ip, const SessionIndex &index=SessionIndex()) const
contrail::regex request_regex
void ClientIPAddressHandlerDelete(const struct RESTData &)
void DeleteRESTClientSession(ClientId client_id, HttpSession *session, const HttpRequest *request)
void HandleRequest(HttpSession *session, const HttpRequest *request)
static const std::vector< HandlerSpecifier > RESTHandlers_
void DeleteBFDConnection(ClientId client_id, const boost::asio::ip::address &ip, HttpSession *session, const HttpRequest *request)
void ClientIPConnectionHandler(const struct RESTData &)
void MonitorRESTClientSession(ClientId client_id, HttpSession *session, const HttpRequest *request)
RESTClientSession * GetClientSession(ClientId client_id, HttpSession *session)
void CreateBFDConnection(ClientId client_id, HttpSession *session, const HttpRequest *request)
void SessionHandler(const struct RESTData &)
void ClientHandler(const struct RESTData &)
RESTServer(Server *bfd_server)
void CreateRESTClientSession(HttpSession *session, const HttpRequest *request)
ClientMap client_sessions_
void ClientIPAddressHandlerGet(const struct RESTData &)
void GetBFDConnection(ClientId client_id, const boost::asio::ip::address &ip, HttpSession *session, const HttpRequest *request)
void ClientMonitorHandler(const struct RESTData &)
BFDState local_state() const
SessionConfig config() const
Discriminator local_discriminator() const
const SessionKey & key() const
BFDRemoteSessionState remote_state() const
const std::string & Body() const
http_method GetMethod() const
std::string UrlPath() const
#define LOG(_Level, _Msg)
void SendErrorResponse(HttpSession *session, const std::string &error_msg, int status_code)
void SendResponse(HttpSession *session, const std::string &msg, int status_code)
boost::random::taus88 randomGen
static bool regex_search(const std::string &input, const regex ®ex)
static bool regex_match(const std::string &input, const regex ®ex)
Discriminator discriminator
TimeInterval minRxInterval
const HttpRequest * request
const boost::smatch * match
TimeInterval desired_min_tx_interval
int detection_time_multiplier
TimeInterval required_min_rx_interval
boost::asio::ip::address address
bool ParseFromJsonString(const std::string &json)
void EncodeJsonString(std::string *json)
JsonConfig session_config
Discriminator remote_discriminator
BFDState bfd_remote_state
Discriminator local_discriminator
TimeInterval remote_min_rx_interval
TimeInterval desiredMinTxInterval
int detectionTimeMultiplier
TimeInterval requiredMinRxInterval
boost::asio::ip::address remote_address