13 #include <sandesh/sandesh_trace.h>
17 #include <pugixml/pugixml.hpp>
24 #include <controller/controller_types.h>
32 using namespace boost::asio;
35 "ControllerConnections", 5000));
37 "ControllerInfo", 5000));
39 "ControllerTxConfig_1", 5000));
41 "ControllerTxConfig_2", 5000));
43 "ControllerRouteWalker", 5000));
47 "ControllerRxRouteXmppMessage1", 5000));
49 "ControllerRxConfigXmppMessage1", 5000));
51 "ControllerRxRouteXmppMessage2", 5000));
53 "ControllerRxConfigXmppMessage2", 5000));
55 "ControllerTxXmppMessage_1", 5000));
57 "ControllerTxXmppMessage_2", 5000));
60 std::vector<string>server_list) :
62 server_list_(server_list) {
70 : agent_(agent), multicast_sequence_number_(0),
71 work_queue_(agent->task_scheduler()->GetTaskId(
"Agent::ControllerXmpp"), 0,
72 boost::bind(&
VNController::ControllerWorkQueueProcess, this,
74 fabric_multicast_label_range_(), xmpp_channel_down_cb_(),
94 uint32_t mc_label_count = 0;
103 *start_idx = vrouter_max_labels - ((idx + 1) * mc_label_count);
104 *end_idx = (vrouter_max_labels - ((idx) * mc_label_count) - 1);
110 std::stringstream str;
122 str << 0 <<
"-" << 0;
131 str << start <<
"-" << end;
175 "XMPP Server is already present, ignore reconfig response",
181 boost::system::error_code ec;
201 local_endpoint.to_string(), &ec));
204 local_endpoint = Ip4Address::from_string(
"127.0.0.1", ec);
206 local_endpoint.to_string(), &ec));
210 assert(ec.value() == 0);
226 xmpp->AddXmppChannelConfig(xmpp_cfg);
231 fabric_multicast_label_range_str,
236 xmpp->InitClient(client);
244 _1, _2, _3, _4, _5));
248 _1, _2, _3, _4, _5));
291 "DNS Server is already present, ignore reconfig response",
298 boost::system::error_code ec;
313 local_endpoint.to_string(), &ec));
316 local_endpoint = Ip4Address::from_string(
"127.0.0.1", ec);
318 local_endpoint.to_string(), &ec));
322 assert(ec.value() == 0);
349 xmpp_dns->AddXmppChannelConfig(xmpp_cfg_dns);
350 xmpp_dns->InitClient(client_dns);
444 ptr.get()->bgp_peer_id()->DelPeerRoutes(
446 ptr.get()->sequence_number());
460 if (bgp_peer != NULL) {
502 const std::string &server_ip) {
528 boost::asio::ip::tcp::endpoint ep;
529 boost::system::error_code ec;
531 const string name = ep.address().to_string();
548 if ((*it).get() == channel) {
601 const std::string &server_ip,
602 std::vector<std::string> resp) {
604 std::vector<std::string>::iterator iter;
606 int8_t min_iter = std::min(static_cast<int>(resp.size()),
MAX_XMPP_SERVERS);
607 for (iter = resp.begin(); ++count < min_iter; iter++) {
608 std::vector<string> servers;
609 boost::split(servers, *iter, boost::is_any_of(
":"));
610 if (servers[0].
compare(server_ip) == 0) {
620 std::vector<string> controller_list =
624 g_vns_constants.XMPP_SERVER_DISCOVERY_SERVICE_NAME,
633 std::vector<string> dns_list =
637 g_vns_constants.DNS_SERVER_DISCOVERY_SERVICE_NAME,
667 std::vector<string>::iterator iter;
671 int8_t min_iter = std::min(static_cast<int>(resp.size()),
MAX_XMPP_SERVERS);
672 for (iter = resp.begin(); ++count < min_iter; iter++) {
673 std::string server_ip;
674 uint16_t server_port;
675 addressParser.
ParseAddress(*iter, &server_ip, &server_port);
679 count, server_ip, str_port);
686 " XMPP ReConfig Server is READY and running, ignore", count,
691 " XMPP ReConfig Server is NOT_READY, ignore", count,
703 "Set Xmpp ReConfig Channel",
704 xs_idx, server_ip, str_port);
716 "Retain Xmpp ReConfig Channel ", xs_idx,
722 "ReSet Xmpp ReConfig Channel ", xs_idx,
740 const std::string &server_ip) {
778 std::vector<string>::iterator iter;
782 int8_t min_iter = std::min(static_cast<int>(resp.size()),
MAX_XMPP_SERVERS);
783 for (iter = resp.begin(); ++count < min_iter; iter++) {
784 std::string server_ip;
785 uint16_t server_port;
786 addressParser.
ParseAddress(*iter, &server_ip, &server_port);
790 "DNS Server ReConfig Apply Server Ip",
791 count, server_ip, str_port);
798 "DNS Server is READY and running, ignore", count,
803 "DNS Server is NOT_READY, ignore", count,
814 "Set Dns Xmpp Channel ",
815 xs_idx, server_ip, str_port);
827 "Retain Dns Xmpp Channel ", xs_idx,
833 "ReSet Dns ReConfigChannel ", xs_idx,
855 uint8_t active_xmpps = 0;
896 end_of_rib_tx_timer()->Cancel();
908 if (derived_xmpp_data) {
924 if (reconfig_data->service_name_.compare(
925 g_vns_constants.XMPP_SERVER_DISCOVERY_SERVICE_NAME) == 0) {
927 }
else if (reconfig_data->service_name_.compare(
928 g_vns_constants.DNS_SERVER_DISCOVERY_SERVICE_NAME) == 0) {
931 LOG(ERROR,
"Unknown Service Name %s" << reconfig_data->service_name_);
945 if (end_of_config_data &&
947 end_of_config_data->channel())) {
955 if (connect_retry_data) {
956 if (connect_retry_data->connect_xmpp_server()) {
960 if (connect_retry_data->connect_dns_xmpp_server()) {
971 if (data->config()) {
991 }
else if (data->peer_id() ==
xmps::DNS) {
994 if (data->config()) {
1001 data->peer_state());
1014 const std::string &to_address,
1016 const std::string &msg,
1018 const std::string &to = xmppmsg->
to;
1032 const std::string &to_address,
1034 const std::string &msg,
1054 (
const autogen::EnetTunnelEncapsulationListType &encap) {
1056 for (autogen::EnetTunnelEncapsulationListType::const_iterator iter =
1057 encap.begin(); iter != encap.end(); iter++) {
1076 (
const autogen::TunnelEncapsulationListType &encap) {
1078 for (autogen::TunnelEncapsulationListType::const_iterator iter =
1079 encap.begin(); iter != encap.end(); iter++) {
1096 (
const autogen::McastTunnelEncapsulationListType &encap) {
1098 for (autogen::McastTunnelEncapsulationListType::const_iterator iter =
1099 encap.begin(); iter != encap.end(); iter++) {
1113 gres_parameters().IsEnabled();
1118 GresEnabled(enable);
1122 GresEnabled(enable);
1124 GresEnabled(enable);
boost::asio::ip::tcp::endpoint endpoint
SandeshTraceBufferPtr ControllerConnectionsTraceBuf(SandeshTraceBufferCreate("ControllerConnections", 5000))
#define CONTROLLER_TX_MESSAGE_TRACE(obj, index,...)
XmppChannel * GetXmppChannel()
boost::shared_ptr< ControllerDelPeerData > ControllerDelPeerDataType
const std::string & subcluster_name() const
static void HandleXmppClientChannelEvent(AgentDnsXmppChannel *peer, xmps::PeerState state)
void set_controller_xmpp_channel(AgentXmppChannel *channel, uint8_t idx)
bool IsQueueEmpty() const
SandeshTraceBufferPtr ControllerInfoTraceBuf
GracefulRestartParameters & gres_parameters()
static Agent * GetInstance()
void set_controller_ifmap_xmpp_client(XmppClient *client, uint8_t idx)
void set_dns_server_port(uint16_t port, uint8_t idx)
static const uint8_t kInvalidDscp
#define CONTROLLER_RX_ROUTE_MESSAGE_TRACE(obj, index,...)
void Shutdown(bool delete_entries=true)
const uint16_t controller_ifmap_xmpp_port(uint8_t idx) const
Ip4Address compute_node_ip() const
bool tor_agent_enabled() const
void Reset(bool keep_config=false)
virtual void RegisterTxMessageTraceCallback(TxMessageTraceCb cb)=0
FastConvergenceParameters & fc_params()
void DelPeerWalkDoneProcess(AgentXmppChannel *ch)
std::vector< string > & GetDnslist()
void set_dns_xmpp_init(XmppInit *xmpp, uint8_t idx)
boost::asio::ip::tcp::endpoint local_endpoint
SandeshTraceBufferPtr ControllerTxConfigTraceBuf1
void reset_controller_xmpp_channel(uint8_t idx)
bool xmpp_dns_test_mode() const
bool VerifyXmppServerTimeout(uint32_t to)
const std::string & dns_server(uint8_t idx) const
void SetAgentMcastLabelRange(uint8_t idx)
uint8_t ActiveXmppConnectionCount()
SandeshTraceBufferPtr ControllerRxConfigMessageTraceBuf1
VNController(Agent *agent)
#define XMPP_DNS_SERVER_PORT
GlobalQosConfig * global_qos_config() const
EndOfRibTxTimer * end_of_rib_tx_timer()
boost::shared_ptr< ControllerReConfigData > ControllerReConfigDataType
void DnsXmppServerConnect()
EndOfRibRxTimer * end_of_rib_rx_timer()
uint8_t control_dscp() const
uint32_t XmppTimeOut(const char *conn_id)
const FabricMulticastLabelRange & fabric_multicast_label_range(uint8_t idx) const
void set_controller_ifmap_xmpp_server(const std::string &addr, uint8_t idx)
boost::shared_ptr< ControllerXmppData > ControllerXmppDataType
uint32_t GetControllerlistChksum()
SandeshTraceBufferPtr ControllerTxMessageTraceBuf1
boost::shared_ptr< EndOfConfigData > EndOfConfigDataPtr
void SetDscpConfig(XmppChannelConfig *xmpp_cfg) const
void UpdateConnectionInfo(xmps::PeerState state)
boost::shared_ptr< AgentXmppChannel > controller_xmpp_channel_ref(uint8_t idx)
uint32_t vrouter_max_vrfs() const
WorkQueue< ControllerWorkQueueDataType > work_queue_
AgentXmppChannel * controller_xmpp_channel(uint8_t idx) const
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
void StartDelPeerWalk(AgentXmppChannelPtr ch)
MplsTable * mpls_table() const
void Enqueue(ControllerWorkQueueDataType data)
#define CONTROLLER_CONNECTIONS_TRACE(obj,...)
static void HandleAgentXmppClientChannelEvent(AgentXmppChannel *peer, xmps::PeerState state)
void reset_dns_server(uint8_t idx)
virtual xmps::PeerState GetPeerState() const =0
AgentIfMapXmppChannel * channel()
void StopEndOfRibTxWalker()
void UpdateConnectionInfo(xmps::PeerState state)
AgentIfMapXmppChannel * ifmap_xmpp_channel(uint8_t idx) const
EndOfConfigTimer * end_of_config_timer()
void RegisterXmppChannel(XmppChannel *channel)
void StartEndOfRibTxTimer()
void DisConnectDnsServer(uint8_t idx)
#define MIN_UNICAST_LABEL_RANGE
void Delete(ConnectionType::type ctype, const std::string &name)
void DeleteAgentXmppChannel(uint8_t idx)
AgentDnsXmppChannel * dns_xmpp_channel(uint8_t idx) const
std::string path_to_ca_cert
void ReceiveBgpMessage(std::unique_ptr< XmlBase > impl)
void set_dns_server(const std::string &addr, uint8_t idx)
void ReserveMulticastLabel(uint32_t start, uint32_t end, uint8_t idx)
SandeshTraceBufferPtr ControllerTraceBuf
void set_dns_xmpp_channel(AgentDnsXmppChannel *chnl, uint8_t idx)
void DeleteConnectionInfo(const std::string &addr, bool is_dns) const
XmppClient * controller_ifmap_xmpp_client(uint8_t idx)
MacAddress GetTunnelMac(const autogen::EnetNextHopType &nh)
static const std::string integerToString(const NumberType &num)
void set_controller_ifmap_xmpp_port(uint16_t port, uint8_t idx)
TunnelType::TypeBmap GetTypeBitmap(const autogen::EnetTunnelEncapsulationListType &encap)
AgentXmppChannelList delpeer_walks_
std::string GetXmppServer()
virtual void RegisterRxMessageTraceCallback(RxMessageTraceCb cb)=0
ControllerDelPeerData(AgentXmppChannel *ch)
XmppClient * dns_xmpp_client(uint8_t idx) const
void DelPeerWalkDone(AgentXmppChannel *ch)
VNController * controller() const
EventManager * event_manager() const
std::string fabric_multicast_label_range_str
void ProcessEndOfConfig()
SandeshTraceBufferPtr ControllerTxMessageTraceBuf2
bool ApplyControllerReConfigInternal(std::vector< string >service_list)
FabricMulticastLabelRange fabric_multicast_label_range_[MAX_XMPP_SERVERS]
void UnRegisterConnectionEvent(xmps::PeerId)
XmppInit * dns_xmpp_init(uint8_t idx) const
const std::string MakeConnectionPrefix(bool is_dns) const
std::string path_to_server_cert
void GracefulRestartConfigListener()
SandeshTraceBufferPtr ControllerRxRouteMessageTraceBuf2
boost::scoped_ptr< AgentIfMapVmExport > agent_ifmap_vm_export_
static const std::string & xmpp_dns_server_prefix()
uint32_t vrouter_max_labels() const
bool RxXmppMessageTrace(uint8_t peer_index, const std::string &to_address, int port, int size, const std::string &msg, const XmppStanza::XmppMessage *xmpp_msg)
const bool xmpp_auth_enabled() const
uint8_t GetXmppServerIdx()
static void XmppClientChannelEvent(AgentXmppChannel *peer, xmps::PeerState state)
const std::string & controller_ifmap_xmpp_server(uint8_t idx) const
std::vector< string > & GetControllerlist()
SandeshTraceBufferPtr ControllerTxConfigTraceBuf2
bool IsWorkQueueEmpty() const
uint32_t controller_list_chksum_
boost::shared_ptr< ControllerConnectRetryData > ControllerConnectRetryDataType
const std::string & agent_name() const
AgentXmppChannelList timed_out_channels_[MAX_XMPP_SERVERS]
XmppChannel * FindChannel(const std::string &address)
boost::asio::ip::address_v4 Ip4Address
const uint16_t dns_server_port(uint8_t idx) const
void set_disable(bool disabled)
std::string GetXmppServer()
static const char * kPubSubNS
boost::shared_ptr< ControllerWorkQueueData > ControllerWorkQueueDataType
const std::string & xmpp_ca_cert() const
IpAddress AddressFromString(const std::string &ip_address_str, boost::system::error_code *ec)
void DisConnectControllerIfmapServer(uint8_t idx)
bool is_vhost_interface_up() const
static const char * kDnsNodeJID
AgentXmppChannel * GetActiveXmppChannel()
boost::shared_ptr< AgentXmppChannel > AgentXmppChannelPtr
void FlushTimedOutChannels(uint8_t index)
void set_dns_xmpp_client(XmppClient *client, uint8_t idx)
const bool dns_auth_enabled() const
void XmppServerDisConnect()
void set_cn_mcast_builder(AgentXmppChannel *peer)
DnsProto * GetDnsProto() const
AgentXmppChannelList::iterator AgentXmppChannelListIter
SandeshTraceBufferPtr ControllerRxRouteMessageTraceBuf1
XmppChannelDownCb xmpp_channel_down_cb_
static int compare(const Type &lhs, const Type &rhs)
bool TxXmppMessageTrace(uint8_t peer_index, const std::string &to_address, int port, int size, const std::string &msg, const XmppStanza::XmppMessage *xmpp_msg)
void ParseAddress(const std::string &address, std::string *out_ip, uint16_t *out_port) const
void RegisterXmppChannel(XmppChannel *channel)
void RegisterConnectionEvent(xmps::PeerId, ConnectionEventCb)
static const std::string & xmpp_control_node_prefix()
void XmppServerUpdate(uint8_t time_out)
uint32_t GetDnslistChksum()
#define LOG(_Level, _Msg)
void ReceiveConfigMessage(std::unique_ptr< XmlBase > impl)
void set_controller_ifmap_xmpp_init(XmppInit *init, uint8_t idx)
static const char * kConfigPeer
static TunnelEncapType::Encap TunnelEncapFromString(const std::string &encap)
uint32_t dns_list_chksum_
ControllerReConfigData(std::string service_name, std::vector< string > server_list)
void set_ifmap_xmpp_channel(AgentIfMapXmppChannel *channel, uint8_t idx)
void reset_controller_ifmap_xmpp_server(uint8_t idx)
const std::string & xmpp_server_cert() const
void DnsXmppServerDisConnect()
SandeshTraceBufferPtr ControllerRouteWalkerTraceBuf
static void ProcessDelete(DynamicPeer *p)
bool AgentReConfigXmppServerConnectedExists(const std::string &server_ip, std::vector< std::string > resp)
XmppChannel * GetXmppChannel()
static void XmppClientChannelEvent(AgentDnsXmppChannel *peer, xmps::PeerState state)
XmppInit * controller_ifmap_xmpp_init(uint8_t idx) const
const std::string & xmpp_server_key() const
#define CONTROLLER_RX_CONFIG_MESSAGE_TRACE(obj, index,...)
bool ControllerWorkQueueProcess(ControllerWorkQueueDataType data)
void UpdateTimeOut(uint8_t time_out, const char *conn_id)
void increment_multicast_sequence_number()
bool Enqueue(QueueEntryT entry)
static const uint16_t DnsXmpp()
process::ConnectionState * connection_state() const
GlobalSystemConfig * global_system_config() const
void ReceiveDnsMessage(std::unique_ptr< XmlBase > impl)
static const char * kBgpPeer
AgentXmppChannel * FindAgentXmppChannel(const std::string &server_ip)
void ReConnectDnsServer()
void set_name(const std::string &name)
void ReConnectXmppServer()
bool XmppMessageProcess(ControllerXmppDataType data)
static const char * kControlNodeJID
const int8_t & ifmap_active_xmpp_server_index() const
void FillMcastLabelRange(uint32_t *star_idx, uint32_t *end_idx, uint8_t idx) const
std::string path_to_server_priv_key
AgentDnsXmppChannel * FindAgentDnsXmppChannel(const std::string &server_ip)
SandeshTraceBufferPtr SandeshTraceBufferCreate(const std::string &buf_name, size_t buf_size, bool trace_enable=true)
bool ApplyDnsReConfigInternal(std::vector< string >service_list)
SandeshTraceBufferPtr ControllerRxConfigMessageTraceBuf2