10 #include <boost/assign.hpp>
11 #include <boost/bind/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>
27 using namespace boost::placeholders;
35 void RESTServer::SessionHandler(
const struct RESTData& data) {
39 void RESTServer::ClientHandler(
const struct RESTData& data) {
40 const std::string& client_id = (*data.
match)[1];
41 DeleteRESTClientSession(atoi(client_id.c_str()), data.
session,
45 void RESTServer::ClientIPConnectionHandler(
const struct RESTData& data) {
46 const std::string& client_id = (*data.
match)[1];
47 CreateBFDConnection(atoi(client_id.c_str()), data.
session,
51 void RESTServer::ClientIPAddressHandlerGet(
const struct RESTData& data) {
52 const std::string& client_id = (*data.
match)[1];
53 boost::system::error_code ec;
54 boost::asio::ip::address ip =
56 GetBFDConnection(atoi(client_id.c_str()), ip, data.
session, data.
request);
59 void RESTServer::ClientIPAddressHandlerDelete(
const struct RESTData& data) {
60 const std::string& client_id = (*data.
match)[1];
61 boost::system::error_code ec;
62 boost::asio::ip::address ip =
64 DeleteBFDConnection(atoi(client_id.c_str()), ip,
68 void RESTServer::ClientMonitorHandler(
const struct RESTData& data) {
69 const std::string& client_id = (*data.
match)[1];
70 MonitorRESTClientSession(atoi(client_id.c_str()), data.
session,
74 const std::vector<RESTServer::HandlerSpecifier> RESTServer::RESTHandlers_ =
75 boost::assign::list_of
79 &RESTServer::SessionHandler))
81 regex(
"/Session/([[:digit:]]{1,9})"),
83 &RESTServer::ClientHandler))
85 regex(
"/Session/([[:digit:]]{1,9})/IpConnection"),
87 &RESTServer::ClientIPConnectionHandler))
89 regex(
"/Session/([[:digit:]]{1,9})/IpConnection/"
90 "([[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\."
91 "[[:digit:]]{1,3}\\.[[:digit:]]{1,3})"),
93 &RESTServer::ClientIPAddressHandlerGet))
95 regex(
"/Session/([[:digit:]]{1,9})/IpConnection/"
96 "([[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\."
97 "[[:digit:]]{1,3}\\.[[:digit:]]{1,3})"),
99 &RESTServer::ClientIPAddressHandlerDelete))
101 regex(
"/Session/([[:digit:]]{1,9})/Monitor"),
103 &RESTServer::ClientMonitorHandler));
105 RESTServer::RESTServer(
Server* bfd_server) :
106 bfd_server_(bfd_server) {
116 boost::lexical_cast<std::string>(client_id), 404);
127 contrail_rapidjson::Document document;
128 document.SetObject();
129 document.AddMember(
"client-id", client_id, document.GetAllocator());
130 contrail_rapidjson::StringBuffer strbuf;
131 contrail_rapidjson::Writer<contrail_rapidjson::StringBuffer> writer(strbuf);
132 document.Accept(writer);
140 if (client_session == NULL) {
141 LOG(DEBUG, __PRETTY_FUNCTION__ <<
": Couldn't get session.");
145 delete client_session;
153 if (client_session == NULL) {
154 LOG(DEBUG, __PRETTY_FUNCTION__ <<
": Couldn't get session.");
180 const boost::asio::ip::address& ip,
HttpSession* session,
183 if (client_session == NULL) {
184 LOG(DEBUG, __PRETTY_FUNCTION__ <<
": Couldn't get session.");
189 if (bfd_session == NULL) {
190 LOG(DEBUG, __PRETTY_FUNCTION__ <<
": Couldn't get session.");
214 const boost::asio::ip::address& ip,
HttpSession* session,
217 if (client_session == NULL) {
218 LOG(DEBUG, __PRETTY_FUNCTION__ <<
": Couldn't get session.");
233 if (client_session == NULL) {
234 LOG(DEBUG, __PRETTY_FUNCTION__ <<
": Couldn't get session.");
243 std::scoped_lock lock(
mutex_);
245 std::string path = request->
UrlPath();
256 LOG(INFO,
"Handling request: " << path);
265 LOG(ERROR,
"Couldn't handle request: " << path);
271 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 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 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 CreateRESTClientSession(HttpSession *session, const HttpRequest *request)
ClientMap client_sessions_
void GetBFDConnection(ClientId client_id, const boost::asio::ip::address &ip, HttpSession *session, const HttpRequest *request)
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