6 #include <boost/system/error_code.hpp>
7 #include <boost/asio/ip/tcp.hpp>
8 #include <boost/asio/ip/address.hpp>
9 #include <boost/tuple/tuple_comparison.hpp>
10 #include <boost/foreach.hpp>
13 #include "base/sandesh/process_info_constants.h"
26 send_uve_cb_(send_uve_cb) {
54 const vector<Endpoint> &servers,
string message) {
60 g_process_info_constants.ConnectionTypeNames.find(ctype)->second);
62 vector<string> server_addrs;
63 BOOST_FOREACH(
const Endpoint &server, servers) {
64 boost::system::error_code ec;
65 string saddr(server.address().to_string(ec));
66 int sport(server.port());
68 server_addrs.push_back(server_address);
70 info.set_server_addrs(server_addrs);
72 g_process_info_constants.ConnectionStatusNames.find(status)->second);
73 info.set_description(message);
75 tbb::mutex::scoped_lock lock(
mutex_);
79 if (it->second.server_addrs == info.server_addrs &&
80 it->second.status == info.status &&
81 it->second.description == info.description) {
98 const vector<Endpoint> &servers,
string message) {
105 UpdateInternal(ctype, name, status, boost::assign::list_of(server),
110 const string &name) {
114 tbb::mutex::scoped_lock lock(
mutex_);
122 vector<ConnectionInfo> infos;
125 infos.push_back(it->second);
131 tbb::mutex::scoped_lock lock(
mutex_);
137 const vector<ConnectionTypeName> &expected_connections) {
139 size_t num_connections(cinfos.size());
140 if (num_connections != expected_connections.size()) {
142 state = ProcessState::NON_FUNCTIONAL;
145 string cup(g_process_info_constants.ConnectionStatusNames.
146 find(ConnectionStatus::UP)->second);
149 for (vector<ConnectionInfo>::const_iterator it = cinfos.begin();
150 it != cinfos.end(); it++) {
151 const ConnectionInfo &cinfo(*it);
152 const string &conn_status(cinfo.get_status());
153 if (conn_status != cup) {
155 if (message.empty()) {
156 message = cinfo.get_type();
158 message +=
", " + cinfo.get_type();
160 const string &name(cinfo.get_name());
162 message +=
":" + name;
168 state = ProcessState::FUNCTIONAL;
170 state = ProcessState::NON_FUNCTIONAL;
171 message +=
" connection down";
194 const vector<ConnectionTypeName> &expected_connections,
196 size_t num_connections(cinfos.size());
197 message =
"Number of connections:" +
integerToString(num_connections) +
199 if (num_connections > expected_connections.size()) {
201 message +=
" Extra: ";
203 for (vector<ConnectionInfo>::const_iterator it = cinfos.begin();
204 it != cinfos.end(); it++) {
205 const ConnectionInfo &cinfo(*it);
207 vector<ConnectionTypeName>::const_iterator position;
208 position = std::find(expected_connections.begin(),
209 expected_connections.end(), con_info);
210 if (position == expected_connections.end()) {
212 message += con_info.first;
213 if (!con_info.second.empty()) {
214 message +=
":" + con_info.second;
216 if (i != num_connections-expected_connections.size()) {
224 message +=
" Missing: ";
225 for (vector<ConnectionTypeName>::const_iterator it =
226 expected_connections.begin(); it != expected_connections.end();
228 vector<ConnectionInfo>::const_iterator position;
229 position = std::find_if(cinfos.begin(), cinfos.end(),
233 if (position == cinfos.end()) {
235 message += it->first;
236 if (!it->second.empty()) {
237 message +=
":" + it->second;
239 if (i != expected_connections.size() - cinfos.size()) {
250 vector<FlagInfo> infos;
252 vector<ContextInfo> c_infos;
256 for (
flag_cfg_itr it = flag_infos.begin(); it != flag_infos.end(); it++) {
257 info.set_name(it->name());
258 info.set_version(it->version());
259 info.set_enabled(it->enabled());
260 info.set_state(state.
ToString(it->state()));
261 c_vec = it->context_infos();
262 for (c_itr = c_vec.begin(); c_itr != c_vec.end(); c_itr++) {
263 c_info.desc = c_itr->desc;
264 c_info.value = c_itr->value;
265 c_infos.push_back(c_info);
267 info.set_context_infos(c_infos);
268 infos.push_back(info);
void UpdateInternal(ConnectionType::type ctype, const std::string &name, ConnectionStatus::type status, const std::vector< Endpoint > &servers, std::string message)
static void CreateInstance(SendUveCb send_uve_cb)
boost::asio::ip::tcp::endpoint Endpoint
static std::string ToString(Type state)
bool operator()(const ConnectionInfo cinfo)
ConnectionState(SendUveCb send_uve_cb)
void GetConnectionInfoMessage(const vector< ConnectionInfo > &cinfos, const vector< ConnectionTypeName > &expected_connections, string &message)
void Delete(ConnectionType::type ctype, const std::string &name)
static boost::scoped_ptr< ConnectionState > instance_
static const std::string integerToString(const NumberType &num)
void GetProcessStateCb(const vector< ConnectionInfo > &cinfos, ProcessState::type &state, string &message, const vector< ConnectionTypeName > &expected_connections)
std::vector< ConnectionInfo > GetInfosUnlocked() const
std::vector< FlagConfig > FlagConfigVec
std::pair< std::string, std::string > ConnectionTypeName
CompareConnections(const ConnectionTypeName exp_connection)
std::vector< FlagInfo > GetFlagInfos(const FlagConfigVec &flag_infos)
ConnectionTypeName expected_connection_
std::vector< FlagContext > ContextVec
std::vector< FlagContext >::const_iterator context_iterator
static ConnectionState * GetInstance()
std::vector< FlagConfig >::const_iterator flag_cfg_itr
ConnectionInfoMap connection_map_
boost::function< void(void)> SendUveCb
static boost::scoped_ptr< ConnectionStateManager > instance_
boost::tuple< ConnectionType::type, std::string > ConnectionInfoKey
std::vector< ConnectionInfo > GetInfos() const