OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
connection_info.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef __CONNECTION_INFO_H__
6 #define __CONNECTION_INFO_H__
7 
8 #include <map>
9 #include <vector>
10 
11 #include <boost/tuple/tuple.hpp>
12 #include <boost/asio/ip/tcp.hpp>
13 #include <boost/bind.hpp>
14 #include <boost/assign/list_of.hpp>
15 #include <boost/scoped_ptr.hpp>
16 
17 #include <tbb/mutex.h>
18 
19 #include <base/feature_flags.h>
20 #include <base/sandesh/process_info_constants.h>
21 #include <base/sandesh/process_info_types.h>
22 #include <base/sandesh/cpuinfo_constants.h>
23 #include <base/sandesh/cpuinfo_types.h>
24 #include <base/sandesh/nodeinfo_constants.h>
25 #include <base/sandesh/nodeinfo_types.h>
26 
27 class ConnectionInfoTest;
28 
29 namespace process {
30 
31 typedef boost::asio::ip::tcp::endpoint Endpoint;
32 typedef boost::function<void (const std::vector<ConnectionInfo> &,
33  ProcessState::type &, std::string &)> ProcessStateFn;
34 
35 typedef std::pair<std::string, std::string> ConnectionTypeName;
36 void GetProcessStateCb(const std::vector<ConnectionInfo> &cinfos,
37  ProcessState::type &state, std::string &message,
38  const std::vector<ConnectionTypeName> &expected_connections);
39 void GetConnectionInfoMessage(const std::vector<ConnectionInfo> &cinfos,
40  const std::vector<ConnectionTypeName> &expected_connections,
41  std::string &message);
42 
43 // ConnectionState
45 public:
46  static ConnectionState* GetInstance();
47  void Update();
48  void Update(ConnectionType::type ctype, const std::string &name,
49  ConnectionStatus::type status, Endpoint server,
50  std::string message);
51  void Update(ConnectionType::type ctype, const std::string &name,
52  ConnectionStatus::type status, const std::vector<Endpoint> &servers,
53  std::string message);
54  void Delete(ConnectionType::type ctype, const std::string &name);
55  std::vector<ConnectionInfo> GetInfos() const;
56 
57 private:
59  const std::string &name, ConnectionStatus::type status,
60  const std::vector<Endpoint> &servers, std::string message);
61 
62  friend class
64 
65  typedef boost::tuple<ConnectionType::type, std::string> ConnectionInfoKey;
66  typedef std::map<ConnectionInfoKey, ConnectionInfo> ConnectionInfoMap;
67  typedef boost::function<void (void)> SendUveCb;
68 
69  std::vector<ConnectionInfo> GetInfosUnlocked() const;
70  // Singleton
71  ConnectionState(SendUveCb send_uve_cb);
72  static void CreateInstance(SendUveCb send_uve_cb);
73 
74  static boost::scoped_ptr<ConnectionState> instance_;
75  mutable tbb::mutex mutex_;
78 };
79 
80 // ConnectionStateManager
82 public:
84  if (instance_ == NULL) {
85  instance_.reset(
87  // Create ConnectionState instance and bind the send UVE function
88  assert(ConnectionState::instance_ == NULL);
91  SendProcessStateUve, instance_.get(), false));
93  boost::bind(&ConnectionStateManager::
94  SendProcessStateUve, instance_.get(), false));
95  }
96  return instance_.get();
97  }
98 
99  void Init(boost::asio::io_context &service, const std::string &hostname,
100  const std::string &module, const std::string &instance_id,
101  ProcessStateFn status_cb, std::string table) {
102  data_.set_name(hostname);
103  process_status_.set_module_id(module);
104  process_status_.set_instance_id(instance_id);
105  status_cb_ = status_cb;
106  data_.table_ = table;
107  }
108 
109  void Shutdown() {
110  }
111 
112 private:
113  friend class ConnectionState;
114  friend class FlagUveManager;
115  friend class ::ConnectionInfoTest;
116 
117  // Singleton
119  status_cb_(NULL) {
120  }
121 
123  status_cb_ = status_cb;
124  }
125 
126  // Convert flag_infos to sandesh type
127  std::vector<FlagInfo> GetFlagInfos(const FlagConfigVec &flag_infos);
128 
129  bool SendProcessStateUve(bool lock) {
130  if (status_cb_.empty()) {
131  return false;
132  }
133  // Update
134  // Add connection_info
135  process_status_.set_connection_infos(lock ?
136  ConnectionState::GetInstance()->GetInfos() :
137  ConnectionState::GetInstance()->GetInfosUnlocked());
138  // Add flag_info
139  process_status_.set_flag_infos(GetFlagInfos(
141  ProcessState::type pstate;
142  std::string message;
143  status_cb_(process_status_.get_connection_infos(), pstate, message);
144  process_status_.set_state(g_process_info_constants.
145  ProcessStateNames.find(pstate)->second);
146  process_status_.set_description(message);
147  // Send
148  std::vector<ProcessStatus> vps = boost::assign::list_of
149  (process_status_);
150  data_.set_process_status(vps);
151  NodeStatusUVE::Send(data_);
152  return true;
153  }
154 
155  static boost::scoped_ptr<ConnectionStateManager> instance_;
156 
158  ProcessStatus process_status_;
159  NodeStatus data_;
160 };
161 
162 } // namespace process
163 
164 #endif // __CONNECTION_INFO_H__
void Init(boost::asio::io_context &service, const std::string &hostname, const std::string &module, const std::string &instance_id, ProcessStateFn status_cb, std::string table)
void UpdateInternal(ConnectionType::type ctype, const std::string &name, ConnectionStatus::type status, const std::vector< Endpoint > &servers, std::string message)
static FlagUveManager * GetInstance()
static void CreateInstance(SendUveCb send_uve_cb)
boost::asio::ip::tcp::endpoint Endpoint
ConnectionState(SendUveCb send_uve_cb)
void GetConnectionInfoMessage(const vector< ConnectionInfo > &cinfos, const vector< ConnectionTypeName > &expected_connections, string &message)
std::map< ConnectionInfoKey, ConnectionInfo > ConnectionInfoMap
void Delete(ConnectionType::type ctype, const std::string &name)
static boost::scoped_ptr< ConnectionState > instance_
uint8_t type
Definition: load_balance.h:109
friend class ConnectionStateManager
void GetProcessStateCb(const vector< ConnectionInfo > &cinfos, ProcessState::type &state, string &message, const vector< ConnectionTypeName > &expected_connections)
static FlagManager * GetInstance()
std::vector< ConnectionInfo > GetInfosUnlocked() const
std::vector< FlagConfig > FlagConfigVec
std::pair< std::string, std::string > ConnectionTypeName
static void CreateInstance(FlagManager *mgr, FlagUveCb send_uve_cb)
boost::function< void(const std::vector< ConnectionInfo > &, ProcessState::type &, std::string &)> ProcessStateFn
std::vector< FlagInfo > GetFlagInfos(const FlagConfigVec &flag_infos)
static ConnectionStateManager * GetInstance()
static ConnectionState * GetInstance()
ConnectionInfoMap connection_map_
boost::function< void(void)> SendUveCb
void SetProcessStateCb(ProcessStateFn status_cb)
static boost::scoped_ptr< ConnectionStateManager > instance_
boost::tuple< ConnectionType::type, std::string > ConnectionInfoKey
std::vector< ConnectionInfo > GetInfos() const