8 #include <boost/asio/ip/address.hpp>
9 #include <rapidjson/document.h>
17 boost::asio::ip::address::from_string(
"0.0.0.0"),
18 boost::posix_time::milliseconds(100),
19 boost::posix_time::milliseconds(500),
25 http_client_(new
HttpClient(evm)), ep_(ep), long_poll_connection_(NULL),
26 error_(false), stopped_(false) {
40 tbb::interface5::unique_lock<tbb::mutex> lock(
mutex_);
45 const std::string url =
"Session";
46 const std::string request =
"{}";
48 tbb::interface5::unique_lock<tbb::mutex> lock(
mutex_);
62 tbb::interface5::unique_lock<tbb::mutex> lock(
mutex_);
66 LOG(DEBUG,
"Stopping bfd client: " <<
ep_);
78 tbb::interface5::unique_lock<tbb::mutex> lock(
mutex_);
82 std::string url =
"Session/" +
83 boost::lexical_cast<std::string>(
client_id_.get()) +
"/IpConnection";
85 config.
address = remote_address;
88 config.EncodeJsonString(&request);
89 connection->
HttpPut(request, url, boost::bind(
96 tbb::interface5::unique_lock<tbb::mutex> lock(
mutex_);
100 std::string url =
"Session/" +
101 boost::lexical_cast<std::string>(
client_id_.get()) +
"/IpConnection/" +
102 boost::lexical_cast<std::string>(remote_address);
112 tbb::interface5::unique_lock<tbb::mutex> lock(
mutex_);
116 std::string url =
"Session/" +
117 boost::lexical_cast<std::string>(
client_id_.get()) +
"/IpConnection/" +
118 boost::lexical_cast<std::string>(remote_address);
121 _1, _2, connection, cb));
126 tbb::interface5::unique_lock<tbb::mutex> lock(
mutex_);
131 std::string url =
"Session/" +
132 boost::lexical_cast<std::string>(
client_id_.get()) +
"/Monitor";
135 _1, _2, connection, cb));
140 const boost::system::error_code& ec,
144 LOG(DEBUG,
"CreateSession server response: " << response);
146 LOG(ERROR,
"CreateSession: Error: "
147 << ec.value() <<
" " << ec.message());
155 const boost::system::error_code& ec,
159 LOG(DEBUG,
"DeleteSession server response: " << response);
161 LOG(ERROR,
"DeleteSession: Error: "
162 << ec.value() <<
" " << ec.message());
170 const boost::system::error_code& ec,
174 boost::system::error_code return_ec = ec;
177 LOG(DEBUG,
"GetBFDConnection server response: " << response);
180 boost::system::error_code(boost::system::errc::protocol_error,
181 boost::system::system_category());
184 LOG(ERROR,
"GetBFDConnection Error: "
185 << ec.value() <<
" " << ec.message());
189 cb(state, return_ec);
193 const boost::system::error_code& ec) {
194 tbb::interface5::unique_lock<tbb::mutex> lock(
mutex_);
197 if (!response.empty()) {
198 LOG(DEBUG,
"Server response: " << response);
199 contrail_rapidjson::Document document;
200 document.Parse<0>(response.c_str());
201 if (document.HasParseError() ||
202 !document.IsObject() ||
203 !document.HasMember(
"client-id") ||
204 !document[
"client-id"].IsInt()) {
205 LOG(ERROR,
"Unable to parse server response");
212 LOG(ERROR,
"CreateRESTClientSessionCallback " <<
ep_ <<
" Error: "
213 << ec.value() <<
" " << ec.message());
221 const boost::system::error_code& ec,
225 boost::system::error_code return_ec = ec;
228 LOG(DEBUG,
"MonitorCallback server response: " << response);
231 boost::system::error_code(boost::system::errc::protocol_error,
232 boost::system::system_category());
235 LOG(ERROR,
"MonitorCallback Error: " << ec.value() <<
" "
240 cb(states, return_ec);
static void DeleteSessionCallback(const std::string &response, const boost::system::error_code &ec, HttpConnection *connection, DeleteBFDHostCb cb)
boost::function< void(boost::system::error_code)> DeleteBFDHostCb
boost::function< void(const REST::JsonState &state, boost::system::error_code)> GetSessionCb
bool AddBFDHost(const boost::asio::ip::address &remote_address, AddBFDHostCb cb)
int HttpGet(const std::string &path, HttpCb)
HttpConnection * CreateConnection(boost::asio::ip::tcp::endpoint)
bool ParseFromJsonString(const std::string &json)
static void GetBFDConnectionCallback(const std::string &response, const boost::system::error_code &ec, HttpConnection *connection, GetSessionCb cb)
bool is_initialized_non_locking()
static void MonitorCallback(const std::string &response, const boost::system::error_code &ec, HttpConnection *connection, MonitorCb cb)
bool GetSession(const boost::asio::ip::address &remote_address, GetSessionCb cb)
static void CreateSessionCallback(const std::string &response, const boost::system::error_code &ec, HttpConnection *connection, AddBFDHostCb cb)
tbb::interface5::condition_variable cond_var_
int HttpDelete(const std::string &path, HttpCb)
HttpConnection * long_poll_connection_
boost::asio::ip::tcp::endpoint ep_
RESTClient(const boost::asio::ip::tcp::endpoint &ep, EventManager *evm)
void RemoveConnection(HttpConnection *)
boost::function< void(const REST::JsonStateMap &new_states, boost::system::error_code)> MonitorCb
boost::function< void(boost::system::error_code)> AddBFDHostCb
static void DeleteServer(TcpServer *server)
bool Monitor(MonitorCb cb)
bool DeleteBFDHost(const boost::asio::ip::address &remote_address, DeleteBFDHostCb cb)
static const REST::JsonConfig kDefaultConfig
int HttpPut(const std::string &put_string, const std::string &path, HttpCb)
#define LOG(_Level, _Msg)
void CreateRESTClientSessionCallback(const std::string &response, const boost::system::error_code &ec)
HttpClient * http_client_
boost::asio::ip::address address
boost::optional< ClientId > client_id_