diff --git a/src/bgp/SConscript b/src/bgp/SConscript index f0f9b5d107d..487dfeff68b 100644 --- a/src/bgp/SConscript +++ b/src/bgp/SConscript @@ -18,7 +18,6 @@ SandeshGenFiles += env.SandeshGenOnlyCpp('bgp_peer_internal.sandesh') SandeshGenFiles += env.SandeshGenCpp('bgp_log.sandesh') SandeshGenFiles += env.SandeshGenCpp('virtual_network.sandesh') SandeshGenFiles += env.SandeshGenCpp('vrouter.sandesh') -SandeshGenFiles += env.SandeshGenCpp('bgp_table.sandesh') SandeshGenSrcs = env.ExtractCpp(SandeshGenFiles) env.Append(CPPPATH = env['TOP']) @@ -33,10 +32,6 @@ SandeshPeerFiles = env.SandeshGenCpp('peer_info.sandesh') SandeshPeerGenSrcs = env.ExtractCpp(SandeshPeerFiles) libpeer_sandesh = env.Library('peer_sandesh', SandeshPeerGenSrcs); -SandeshTableFiles = env.SandeshGenCpp('table_info.sandesh') -SandeshTableGenSrcs = env.ExtractCpp(SandeshTableFiles) -libtable_sandesh = env.Library('table_sandesh', SandeshTableGenSrcs); - SandeshTableFiles = env.SandeshGenCpp('sandesh_info.sandesh') SandeshTableGenSrcs = env.ExtractCpp(SandeshTableFiles) libsandesh_sandesh = env.Library('sandesh_sandesh', SandeshTableGenSrcs); diff --git a/src/bgp/bgp_server.cc b/src/bgp/bgp_server.cc index b0bb719e050..b3ba97e81c4 100644 --- a/src/bgp/bgp_server.cc +++ b/src/bgp/bgp_server.cc @@ -16,7 +16,6 @@ #include "bgp/bgp_peer.h" #include "bgp/bgp_ribout_updates.h" #include "bgp/bgp_session_manager.h" -#include "bgp/bgp_table_types.h" #include "bgp/bgp_update_sender.h" #include "bgp/peer_stats.h" #include "bgp/routing-instance/iservice_chain_mgr.h" @@ -35,6 +34,7 @@ using boost::tie; using process::ConnectionState; using std::boolalpha; using std::make_pair; +using std::map; using std::noboolalpha; using std::string; @@ -780,70 +780,6 @@ uint32_t BgpServer::GetDownStaticRouteCount() const { return count; } -uint32_t BgpServer::SendTableStatsUve(bool first) const { - uint32_t out_q_depth = 0; - for (RoutingInstanceMgr::RoutingInstanceIterator rit = inst_mgr_->begin(); - rit != inst_mgr_->end(); ++rit) { - RoutingInstanceStatsData instance_info; - RoutingInstance::RouteTableList const rt_list = rit->GetTables(); - std::map tables_stats; - - for (RoutingInstance::RouteTableList::const_iterator it = - rt_list.begin(); it != rt_list.end(); ++it) { - BgpTable *table = it->second; - - size_t markers; - out_q_depth += table->GetPendingRiboutsCount(&markers); - string family = Address::FamilyToString(table->family()); - - bool changed = false; - - if (first || table->stats()->get_prefixes() != table->Size()) { - changed = true; - table->stats()->set_prefixes(table->Size()); - } - - if (first || table->stats()->get_primary_paths() != - table->GetPrimaryPathCount()) { - changed = true; - table->stats()->set_primary_paths(table->GetPrimaryPathCount()); - } - - if (first || table->stats()->get_secondary_paths() != - table->GetSecondaryPathCount()) { - changed = true; - table->stats()->set_secondary_paths( - table->GetSecondaryPathCount()); - } - - uint64_t total_paths = table->stats()->get_primary_paths() + - table->stats()->get_secondary_paths() + - table->stats()->get_infeasible_paths(); - if (first || table->stats()->get_total_paths() != total_paths) { - changed = true; - table->stats()->set_total_paths(total_paths); - } - - if (changed) { - tables_stats.insert(make_pair(family, *table->stats())); - - // Reset changed flags in the uve structure. - memset(&(table->stats()->__isset), 0, - sizeof(table->stats()->__isset)); - } - } - - // Set the key and send out the uve. - if (!tables_stats.empty()) { - instance_info.set_name(rit->name()); - instance_info.set_table_stats(tables_stats); - RoutingInstanceStats::Send(instance_info); - } - } - - return out_q_depth; -} - void BgpServer::FillPeerStats(const BgpPeer *peer) const { PeerStatsInfo stats; PeerStats::FillPeerDebugStats(peer->peer_stats(), &stats); @@ -970,7 +906,7 @@ bool BgpServer::CollectStats(BgpRouterState *state, bool first) const { change = true; } - uint32_t out_load = SendTableStatsUve(first); + uint32_t out_load = inst_mgr_->SendTableStatsUve(); if (first || out_load != state->get_output_queue_depth()) { state->set_output_queue_depth(out_load); change = true; diff --git a/src/bgp/bgp_server.h b/src/bgp/bgp_server.h index 24b30e1163d..373a39c0d8d 100644 --- a/src/bgp/bgp_server.h +++ b/src/bgp/bgp_server.h @@ -266,7 +266,6 @@ class BgpServer { typedef std::map EndpointToBgpPeerList; void RoutingInstanceMgrDeletionComplete(RoutingInstanceMgr *mgr); - uint32_t SendTableStatsUve(bool first) const; void FillPeerStats(const BgpPeer *peer) const; // base config variables diff --git a/src/bgp/bgp_show_routing_instance.cc b/src/bgp/bgp_show_routing_instance.cc index 55473aaed17..41d34919304 100644 --- a/src/bgp/bgp_show_routing_instance.cc +++ b/src/bgp/bgp_show_routing_instance.cc @@ -45,7 +45,7 @@ static void FillRoutingInstanceInfo(ShowRoutingInstance *sri, const BgpSandeshContext *bsc, const RoutingInstance *rtinstance, bool summary) { sri->set_name(rtinstance->name()); - sri->set_virtual_network(rtinstance->virtual_network()); + sri->set_virtual_network(rtinstance->GetVirtualNetworkName()); sri->set_vn_index(rtinstance->virtual_network_index()); sri->set_vxlan_id(rtinstance->vxlan_id()); sri->set_deleted(rtinstance->deleted()); diff --git a/src/bgp/bgp_table.cc b/src/bgp/bgp_table.cc index b477697f336..5b1c124ced4 100644 --- a/src/bgp/bgp_table.cc +++ b/src/bgp/bgp_table.cc @@ -17,7 +17,6 @@ #include "bgp/bgp_ribout_updates.h" #include "bgp/bgp_route.h" #include "bgp/bgp_server.h" -#include "bgp/bgp_table_types.h" #include "bgp/bgp_update.h" #include "bgp/routing-instance/iroute_aggregator.h" #include "bgp/routing-instance/path_resolver.h" @@ -61,7 +60,6 @@ BgpTable::BgpTable(DB *db, const string &name) : RouteTable(db, name), rtinstance_(NULL), path_resolver_(NULL), - stats_(new BgpTableStats()), instance_delete_ref_(this, NULL) { primary_path_count_ = 0; secondary_path_count_ = 0; diff --git a/src/bgp/bgp_table.h b/src/bgp/bgp_table.h index 5a73f0d9436..a2bc87b4a79 100644 --- a/src/bgp/bgp_table.h +++ b/src/bgp/bgp_table.h @@ -17,7 +17,6 @@ #include "route/table.h" class BgpServer; -class BgpTableStats; class BgpRoute; class BgpPath; class BgpUpdateSender; @@ -145,7 +144,6 @@ class BgpTable : public RouteTable { // Check whether the route is contributing route to aggregate route bool IsContributingRoute(const BgpRoute *route) const; - BgpTableStats *stats() { return stats_.get(); } bool DeletePath(DBTablePartBase *root, BgpRoute *rt, BgpPath *path); virtual void Input(DBTablePartition *root, DBClient *client, @@ -174,7 +172,6 @@ class BgpTable : public RouteTable { RoutingInstance *rtinstance_; PathResolver *path_resolver_; RibOutMap ribout_map_; - boost::scoped_ptr stats_; boost::scoped_ptr deleter_; LifetimeRef instance_delete_ref_; diff --git a/src/bgp/bgp_table.sandesh b/src/bgp/bgp_table.sandesh deleted file mode 100644 index 1d0b4ebca0b..00000000000 --- a/src/bgp/bgp_table.sandesh +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2016 Juniper Networks, Inc. All rights reserved. - */ - -include "bgp/table_info.sandesh" - -/** - * BGP Routing Instance Information - */ - -struct RoutingInstanceStatsData { - 1: string name (key="ObjectRoutingInstance"); - 2: optional bool deleted - /** @display_name:Routung Instance Information*/ - 3: optional map table_stats (tags=".__key"); -} - -/** - * @description: RoutingInstance related statistics - * @severity: DEBUG - * @cause: Normal operation - */ -uve sandesh RoutingInstanceStats { - 1: RoutingInstanceStatsData data; -} diff --git a/src/bgp/daemon/SConscript b/src/bgp/daemon/SConscript index db9540ee679..213738e93e1 100644 --- a/src/bgp/daemon/SConscript +++ b/src/bgp/daemon/SConscript @@ -15,7 +15,6 @@ libs = [ 'tunnel_encap', 'origin_vn', 'peer_sandesh', - 'table_sandesh', 'route', 'net', 'db', diff --git a/src/bgp/ermvpn/test/SConscript b/src/bgp/ermvpn/test/SConscript index 40cd3683f65..5c8c45c7144 100644 --- a/src/bgp/ermvpn/test/SConscript +++ b/src/bgp/ermvpn/test/SConscript @@ -47,7 +47,6 @@ env.Prepend(LIBS = [ 'bgp_ifmap_config', 'extended_community', 'peer_sandesh', - 'table_sandesh', 'control_node', 'origin_vn', 'routing_instance', diff --git a/src/bgp/evpn/test/SConscript b/src/bgp/evpn/test/SConscript index b348c49910d..4ff319c4e3a 100644 --- a/src/bgp/evpn/test/SConscript +++ b/src/bgp/evpn/test/SConscript @@ -49,7 +49,6 @@ env.Prepend(LIBS = [ 'control_node', 'extended_community', 'peer_sandesh', - 'table_sandesh', 'origin_vn', 'routing_instance', 'routing_policy', diff --git a/src/bgp/inet/test/SConscript b/src/bgp/inet/test/SConscript index deb1f874d33..f7023f1ffbb 100644 --- a/src/bgp/inet/test/SConscript +++ b/src/bgp/inet/test/SConscript @@ -48,7 +48,6 @@ env.Prepend(LIBS = [ 'bgp', 'bgp_ifmap_config', 'peer_sandesh', - 'table_sandesh', 'control_node', 'origin_vn', 'routing_instance', diff --git a/src/bgp/inet6/test/SConscript b/src/bgp/inet6/test/SConscript index 3eae35b1510..3fb9c02f86e 100644 --- a/src/bgp/inet6/test/SConscript +++ b/src/bgp/inet6/test/SConscript @@ -48,7 +48,6 @@ env.Prepend(LIBS = [ 'bgp', 'bgp_ifmap_config', 'peer_sandesh', - 'table_sandesh', 'control_node', 'origin_vn', 'routing_instance', diff --git a/src/bgp/inet6vpn/test/SConscript b/src/bgp/inet6vpn/test/SConscript index cea88dfc808..8e6873dda7e 100644 --- a/src/bgp/inet6vpn/test/SConscript +++ b/src/bgp/inet6vpn/test/SConscript @@ -47,7 +47,6 @@ env.Prepend(LIBS = [ 'bgp', 'bgp_ifmap_config', 'peer_sandesh', - 'table_sandesh', 'control_node', 'origin_vn', 'routing_instance', diff --git a/src/bgp/l3vpn/test/SConscript b/src/bgp/l3vpn/test/SConscript index a6c29e1bbe2..5c447e4c0ab 100644 --- a/src/bgp/l3vpn/test/SConscript +++ b/src/bgp/l3vpn/test/SConscript @@ -50,7 +50,6 @@ env.Prepend(LIBS = [ 'bgp_ifmap_config', 'extended_community', 'peer_sandesh', - 'table_sandesh', 'control_node', 'origin_vn', 'routing_instance', diff --git a/src/bgp/routing-instance/SConscript b/src/bgp/routing-instance/SConscript index 1a4b265c1f9..9601637e9d1 100644 --- a/src/bgp/routing-instance/SConscript +++ b/src/bgp/routing-instance/SConscript @@ -22,6 +22,7 @@ SandeshGenFiles += env.SandeshGenOnlyCpp('service_chaining_internal.sandesh') SandeshGenFiles += env.SandeshGenCpp('static_route.sandesh') SandeshGenFiles += env.SandeshGenOnlyCpp('static_route_internal.sandesh') SandeshGenFiles += env.SandeshGenCpp('route_aggregate.sandesh') +SandeshGenFiles += env.SandeshGenCpp('routing_table.sandesh') SandeshGenFiles += env.SandeshGenOnlyCpp('route_aggregate_internal.sandesh') SandeshGenSrcs = env.ExtractCpp(SandeshGenFiles) diff --git a/src/bgp/routing-instance/route_aggregate.sandesh b/src/bgp/routing-instance/route_aggregate.sandesh index 913f76d53d7..461d31c18bd 100644 --- a/src/bgp/routing-instance/route_aggregate.sandesh +++ b/src/bgp/routing-instance/route_aggregate.sandesh @@ -14,8 +14,11 @@ struct AggregateRouteInfo { } struct AggregateRouteEntriesInfo { - 1: string name (link="ShowRouteAggregateReq"); - 2: list aggregate_route_list; + 1: "VirtualNetwork"; + 2: string name (link="ShowRouteAggregateReq"); + 3: "Routing Instance"; + 4: string instance_name; + 5: list aggregate_route_list; } response sandesh ShowRouteAggregateSummaryResp { diff --git a/src/bgp/routing-instance/route_aggregator.cc b/src/bgp/routing-instance/route_aggregator.cc index 4197929af98..9835e41f951 100644 --- a/src/bgp/routing-instance/route_aggregator.cc +++ b/src/bgp/routing-instance/route_aggregator.cc @@ -742,7 +742,8 @@ bool RouteAggregator::FillAggregateRouteInfo(AggregateRouteEntriesInfo *info, if (aggregate_route_map().empty()) return false; - info->set_name(rtinstance_->name()); + info->set_name(rtinstance_->GetVirtualNetworkName()); + info->set_instance_name(rtinstance_->name()); for (typename AggregateRouteMap::const_iterator it = aggregate_route_map_.begin(); it != aggregate_route_map_.end(); it++) { AggregateRouteT *aggregate = diff --git a/src/bgp/routing-instance/routing_instance.cc b/src/bgp/routing-instance/routing_instance.cc index 8e0f1bf866d..a6f9a6dcedf 100644 --- a/src/bgp/routing-instance/routing_instance.cc +++ b/src/bgp/routing-instance/routing_instance.cc @@ -21,12 +21,14 @@ #include "bgp/routing-instance/peer_manager.h" #include "bgp/routing-instance/routepath_replicator.h" #include "bgp/routing-instance/routing_instance_log.h" +#include "bgp/routing-instance/routing_table_types.h" #include "bgp/routing-policy/routing_policy.h" #include "bgp/routing-instance/rtarget_group_mgr.h" #include "bgp/rtarget/rtarget_route.h" using boost::assign::list_of; using boost::system::error_code; +using boost::tie; using std::make_pair; using std::set; using std::string; @@ -81,6 +83,7 @@ RoutingInstanceMgr::RoutingInstanceMgr(BgpServer *server) : } RoutingInstanceMgr::~RoutingInstanceMgr() { + assert(virtual_networks_.empty()); assert(deleted_count_ == 0); server_->UnregisterASNUpdateCallback(asn_listener_id_); server_->UnregisterIdentifierUpdateCallback(identifier_listener_id_); @@ -368,7 +371,8 @@ void RoutingInstanceMgr::LocateRoutingInstance( if (rtinstance) { if (rtinstance->deleted()) { RTINSTANCE_LOG_WARNING_MESSAGE(server_, - RTINSTANCE_LOG_FLAG_ALL, config->name(), + RTINSTANCE_LOG_FLAG_ALL, rtinstance->GetVirtualNetworkName(), + config->name(), "Instance recreated before pending deletion is complete"); } else { UpdateRoutingInstance(rtinstance, config); @@ -393,6 +397,148 @@ void RoutingInstanceMgr::LocateRoutingInstance(const string &name) { } } +// Update VirtualNetwork to RoutingInstance name mapping. +bool RoutingInstanceMgr::CreateVirtualNetworkMapping( + const string &virtual_network, const string &instance_name) { + tbb::mutex::scoped_lock lock(mutex_); + + VirtualNetworksMap::iterator iter; + bool inserted; + tie(iter, inserted) = virtual_networks_.insert(make_pair(virtual_network, + set())); + assert(iter->second.insert(instance_name).second); + return true; +} + +bool RoutingInstanceMgr::DeleteVirtualNetworkMapping( + const string &virtual_network, const string &instance_name) { + tbb::mutex::scoped_lock lock(mutex_); + + VirtualNetworksMap::iterator iter = virtual_networks_.find(virtual_network); + assert(iter != virtual_networks_.end()); + + // Delete this instance from the set of virtual-network to instances map. + assert(iter->second.erase(instance_name) == 1); + + RoutingInstanceStatsData instance_info; + bool mapping_deleted = iter->second.empty(); + + // Delete the mapping if the member set is empty. + if (mapping_deleted) { + virtual_networks_.erase(iter); + + // Delete the virtual-network specific UVE. + instance_info.set_deleted(true); + } else { + + // Delete this instance's uve, by deleting all table stats. + map stats_map; + stats_map.insert(make_pair(instance_name, RoutingTableStats())); + stats_map[instance_name].set_deleted(true); + + // Delete all uve stats across all address families. + for (Address::Family i = Address::UNSPEC; i < Address::NUM_FAMILIES; + i = static_cast(i + 1)) { + SetTableStatsUve(i, stats_map, &instance_info); + } + } + + // Send delete uve. + RoutingInstanceStats::Send(instance_info); + + return mapping_deleted; +} + +void RoutingInstanceMgr::SetTableStatsUve(Address::Family family, + const map &stats_map, + RoutingInstanceStatsData *instance_info) const { + // By switching over all families, we get compiler to tell us in future, + // when ever familiy enum list gets modified. + switch (family) { + case Address::UNSPEC: + break; + case Address::INET: + instance_info->set_raw_ipv4_stats(stats_map); + break; + case Address::INET6: + instance_info->set_raw_ipv6_stats(stats_map); + break; + case Address::INETVPN: + instance_info->set_raw_inetvpn_stats(stats_map); + break; + case Address::INET6VPN: + instance_info->set_raw_inet6vpn_stats(stats_map); + break; + case Address::RTARGET: + instance_info->set_raw_rtarget_stats(stats_map); + break; + case Address::INETFLOW: + instance_info->set_raw_inetflow_stats(stats_map); + break; + case Address::INETVPNFLOW: + instance_info->set_raw_inetvpnflow_stats(stats_map); + break; + case Address::INETMCAST: + instance_info->set_raw_inetmcast_stats(stats_map); + break; + case Address::INET6MCAST: + instance_info->set_raw_inet6mcast_stats(stats_map); + break; + case Address::ENET: + instance_info->set_raw_enet_stats(stats_map); + break; + case Address::EVPN: + instance_info->set_raw_evpn_stats(stats_map); + break; + case Address::ERMVPN: + instance_info->set_raw_ermvpn_stats(stats_map); + break; + case Address::NUM_FAMILIES: + break; + } +} + +uint32_t RoutingInstanceMgr::SendTableStatsUve() { + uint32_t out_q_depth = 0; + + for (RoutingInstanceIterator rit = begin(); rit != end(); ++rit) { + RoutingInstanceStatsData instance_info; + map stats_map; + + stats_map.insert(make_pair(rit->name(), RoutingTableStats())); + RoutingInstance::RouteTableList const rt_list = rit->GetTables(); + + // Prepare and send Statistics UVE for each routing-instance. + for (RoutingInstance::RouteTableList::const_iterator it = + rt_list.begin(); it != rt_list.end(); ++it) { + BgpTable *table = it->second; + + size_t markers; + out_q_depth += table->GetPendingRiboutsCount(&markers); + + stats_map[rit->name()].set_prefixes(table->Size()); + stats_map[rit->name()].set_primary_paths( + table->GetPrimaryPathCount()); + stats_map[rit->name()].set_secondary_paths( + table->GetSecondaryPathCount()); + stats_map[rit->name()].set_infeasible_paths( + table->GetInfeasiblePathCount()); + + uint64_t total_paths = table->GetPrimaryPathCount() + + table->GetSecondaryPathCount() + + table->GetInfeasiblePathCount(); + stats_map[rit->name()].set_total_paths(total_paths); + SetTableStatsUve(table->family(), stats_map, &instance_info); + } + + // Set the primary key and trigger uve send. + instance_info.set_name(rit->GetVirtualNetworkName()); + RoutingInstanceStats::Send(instance_info); + } + + return out_q_depth; +} + RoutingInstance *RoutingInstanceMgr::CreateRoutingInstance( const BgpInstanceConfig *config) { RoutingInstance *rtinstance = BgpObjectFactory::Create( @@ -415,12 +561,14 @@ RoutingInstance *RoutingInstanceMgr::CreateRoutingInstance( config->export_list().end()); RTINSTANCE_LOG(Create, rtinstance, SandeshLevel::SYS_DEBUG, RTINSTANCE_LOG_FLAG_ALL, - import_rt, export_rt, - rtinstance->virtual_network(), rtinstance->virtual_network_index()); + import_rt, export_rt, rtinstance->virtual_network_index()); // Schedule creation of neighbors for this instance. CreateRoutingInstanceNeighbors(config); + // Update instance to virtual-network mapping structures. + CreateVirtualNetworkMapping(rtinstance->GetVirtualNetworkName(), + rtinstance->name()); return rtinstance; } @@ -450,7 +598,7 @@ void RoutingInstanceMgr::UpdateRoutingInstance(RoutingInstance *rtinstance, config->export_list().end()); RTINSTANCE_LOG(Update, rtinstance, SandeshLevel::SYS_DEBUG, RTINSTANCE_LOG_FLAG_ALL, import_rt, export_rt, - rtinstance->virtual_network(), rtinstance->virtual_network_index()); + rtinstance->virtual_network_index()); } // @@ -468,12 +616,13 @@ void RoutingInstanceMgr::DeleteRoutingInstance(const string &name) { // Ignore if instance is not found as it might already have been deleted. if (rtinstance && rtinstance->deleted()) { - RTINSTANCE_LOG_WARNING_MESSAGE(server_, RTINSTANCE_LOG_FLAG_ALL, name, + RTINSTANCE_LOG_WARNING_MESSAGE(server_, RTINSTANCE_LOG_FLAG_ALL, + rtinstance->GetVirtualNetworkName(), name, "Duplicate instance delete while pending deletion"); return; } else if (!rtinstance) { - RTINSTANCE_LOG_WARNING_MESSAGE(server_, RTINSTANCE_LOG_FLAG_ALL, name, - "Instance not found during delete"); + RTINSTANCE_LOG_WARNING_MESSAGE(server_, RTINSTANCE_LOG_FLAG_ALL, + name, name, "Instance not found during delete"); return; } @@ -503,6 +652,9 @@ void RoutingInstanceMgr::DestroyRoutingInstance(RoutingInstance *rtinstance) { RTINSTANCE_LOG(Destroy, rtinstance, SandeshLevel::SYS_DEBUG, RTINSTANCE_LOG_FLAG_ALL); + DeleteVirtualNetworkMapping(rtinstance->GetVirtualNetworkName(), + rtinstance->name()); + // Remove call here also deletes the instance. const string name = rtinstance->name(); instances_.Remove(rtinstance->name(), rtinstance->index()); @@ -893,8 +1045,17 @@ void RoutingInstance::UpdateConfig(const BgpInstanceConfig *cfg) { if (virtual_network_index_ != cfg->virtual_network_index()) UpdateAllStaticRoutes(); + string prev_vn_name = GetVirtualNetworkName(); + // Update virtual network info. virtual_network_ = cfg->virtual_network(); + + // Recreate instance stats' UVE, if its key: virtual_network is modified. + if (prev_vn_name != GetVirtualNetworkName()) { + mgr_->DeleteVirtualNetworkMapping(prev_vn_name, name_); + mgr_->CreateVirtualNetworkMapping(GetVirtualNetworkName(), name_); + } + virtual_network_index_ = cfg->virtual_network_index(); virtual_network_allow_transit_ = cfg->virtual_network_allow_transit(); vxlan_id_ = cfg->vxlan_id(); @@ -1337,7 +1498,8 @@ void RoutingInstance::set_index(int index) { RoutingInstanceInfo RoutingInstance::GetDataCollection(const char *operation) { RoutingInstanceInfo info; - info.set_name(name_); + info.set_name(virtual_network_); + info.set_instance_name(name_); info.set_hostname(server_->localname()); if (rd_.get()) info.set_route_distinguisher(rd_->ToString()); if (operation) info.set_operation(operation); diff --git a/src/bgp/routing-instance/routing_instance.h b/src/bgp/routing-instance/routing_instance.h index c78203cf64a..57c20d5ad61 100644 --- a/src/bgp/routing-instance/routing_instance.h +++ b/src/bgp/routing-instance/routing_instance.h @@ -39,6 +39,8 @@ class IStaticRouteMgr; class RouteDistinguisher; class RoutingInstanceMgr; class RoutingInstanceInfo; +class RoutingInstanceStatsData; +class RoutingTableStats; class BgpNeighborResp; class ExtCommunity; class LifetimeActor; @@ -362,6 +364,12 @@ class RoutingInstanceMgr { void increment_deleted_count() { deleted_count_++; } void decrement_deleted_count() { deleted_count_--; } + bool CreateVirtualNetworkMapping(const std::string &virtual_network, + const std::string &instance_name); + bool DeleteVirtualNetworkMapping(const std::string &virtual_network, + const std::string &instance_name); + uint32_t SendTableStatsUve(); + private: friend class BgpConfigTest; friend class RoutingInstanceMgrTest; @@ -385,6 +393,9 @@ class RoutingInstanceMgr { void EnableInstanceConfigListProcessing(); void DisableNeighborConfigListProcessing(); void EnableNeighborConfigListProcessing(); + void SetTableStatsUve(Address::Family family, + const std::map &stats_map, + RoutingInstanceStatsData *instance_info) const; BgpServer *server_; mutable tbb::mutex mutex_; @@ -403,6 +414,10 @@ class RoutingInstanceMgr { LifetimeRef server_delete_ref_; boost::dynamic_bitset<> bmap_; // free list. InstanceOpListenersList callbacks_; + + // Map of virtual-network names to routing-instance names. + typedef std::map > VirtualNetworksMap; + VirtualNetworksMap virtual_networks_; }; #endif // SRC_BGP_ROUTING_INSTANCE_ROUTING_INSTANCE_H_ diff --git a/src/bgp/routing-instance/routing_instance_analytics.sandesh b/src/bgp/routing-instance/routing_instance_analytics.sandesh index 397bd5e3261..6740f10759f 100644 --- a/src/bgp/routing-instance/routing_instance_analytics.sandesh +++ b/src/bgp/routing-instance/routing_instance_analytics.sandesh @@ -7,16 +7,17 @@ */ struct RoutingInstanceInfo { - 1: string name (key="ObjectRoutingInstance"); - 2: optional string route_distinguisher; - 3: optional string operation; - 4: optional string peer; - 5: optional string family; - 6: optional list add_import_rt; - 7: optional list remove_import_rt; - 8: optional list add_export_rt; - 9: optional list remove_export_rt; - 10: string hostname; + 1 : string name (key="ObjectVNTable"); + 2 : string instance_name; + 3 : optional string route_distinguisher; + 4 : optional string operation; + 5 : optional string peer; + 6 : optional string family; + 7 : optional list add_import_rt; + 8 : optional list remove_import_rt; + 9 : optional list add_export_rt; + 10: optional list remove_export_rt; + 11: string hostname; } objectlog sandesh RoutingInstanceCollector { @@ -28,10 +29,12 @@ objectlog sandesh RoutingInstanceCollector { * @severity: DEBUG */ traceobject sandesh RoutingInstanceMessage { - 1: "RoutingInstance"; - 2: string name (key="ObjectRoutingInstance"); - 3: ":"; - 4: string Message; + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "RoutingInstance"; + 4: string instance_name; + 5: ":"; + 6: string Message; } /** @@ -41,10 +44,12 @@ traceobject sandesh RoutingInstanceMessage { * @action: None */ systemlog sandesh RoutingInstanceMessageLog { - 1: "RoutingInstance"; - 2: string name (key="ObjectRoutingInstance"); - 3: ":"; - 4: string Message; + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "RoutingInstance"; + 4: string instance_name; + 5: ":"; + 6: string Message; } /** @@ -52,10 +57,12 @@ systemlog sandesh RoutingInstanceMessageLog { * @severity: ERROR */ traceobject sandesh RoutingInstanceWarningMessage { - 1: "RoutingInstance"; - 2: string name (key="ObjectRoutingInstance"); - 3: ":"; - 4: string Message; + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "RoutingInstance"; + 4: string instance_name; + 5: ":"; + 6: string Message; } /** @@ -65,10 +72,12 @@ traceobject sandesh RoutingInstanceWarningMessage { * @action: Contact your technical support representative */ systemlog sandesh RoutingInstanceWarningMessageLog { - 1: "RoutingInstance"; - 2: string name (key="ObjectRoutingInstance"); - 3: ":"; - 4: string Message; + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "RoutingInstance"; + 4: string instance_name; + 6: ":"; + 7: string Message; } /** @@ -76,16 +85,16 @@ systemlog sandesh RoutingInstanceWarningMessageLog { * @severity: DEBUG / ERROR */ traceobject sandesh RoutingInstanceCreate { - 6: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); - 7: "Import Targets"; - 2: list import_rt; - 8: "Export Targets"; - 3: list export_rt; - 9: "Virtual Network"; - 4: string virtual_network; - 10: "VN Index"; - 5: i32 index; + 1 : "VirtualNetwork"; + 2 : string name (key="ObjectVNTable"); + 3 : "Routing Instance"; + 4 : string instance_name; + 5 : "Import Targets"; + 6 : list import_rt; + 7 : "Export Targets"; + 8 : list export_rt; + 9 : "VN Index"; + 10: i32 index; } /** @@ -95,16 +104,16 @@ traceobject sandesh RoutingInstanceCreate { * @action: Contact your technical support representative in case of Error */ systemlog sandesh RoutingInstanceCreateLog { - 6: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); - 7: "Import Targets"; - 2: list import_rt; - 8: "Export Targets"; - 3: list export_rt; - 9: "Virtual Network"; - 4: string virtual_network; - 10: "VN Index"; - 5: i32 index; + 1 : "VirtualNetwork"; + 2 : string name (key="ObjectVNTable"); + 3 : "Routing Instance"; + 4 : string instance_name; + 5 : "Import Targets"; + 6 : list import_rt; + 7 : "Export Targets"; + 8 : list export_rt; + 9 : "VN Index"; + 10: i32 index; } /** @@ -112,8 +121,10 @@ systemlog sandesh RoutingInstanceCreateLog { * @severity: DEBUG / ERROR */ traceobject sandesh RoutingInstanceDelete { - 2: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "Routing Instance"; + 4: string instance_name; } /** @@ -123,8 +134,10 @@ traceobject sandesh RoutingInstanceDelete { * @action: Contact your technical support representative in case of Error */ systemlog sandesh RoutingInstanceDeleteLog { - 2: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "Routing Instance"; + 4: string instance_name; } /** @@ -132,16 +145,16 @@ systemlog sandesh RoutingInstanceDeleteLog { * @severity: DEBUG / ERROR */ traceobject sandesh RoutingInstanceUpdate { - 6: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); - 7: "Import Targets"; - 2: list import_rt; - 8: "Export Targets"; - 3: list export_rt; - 9: "Virtual Network"; - 4: string virtual_network; - 10: "VN Index"; - 5: i32 index; + 1 : "VirtualNetwork"; + 2 : string name (key="ObjectVNTable"); + 3 : "Routing Instance"; + 4 : string instance_name; + 5 : "Import Targets"; + 6 : list import_rt; + 7 : "Export Targets"; + 8 : list export_rt; + 9 : "VN Index"; + 10: i32 index; } /** @@ -151,16 +164,16 @@ traceobject sandesh RoutingInstanceUpdate { * @action: Contact your technical support representative in case of Error */ systemlog sandesh RoutingInstanceUpdateLog { - 6: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); - 7: "Import Targets"; - 2: list import_rt; - 8: "Export Targets"; - 3: list export_rt; - 9: "Virtual Network"; - 4: string virtual_network; - 10: "VN Index"; - 5: i32 index; + 1 : "VirtualNetwork"; + 2 : string name (key="ObjectVNTable"); + 3 : "Routing Instance"; + 4 : string instance_name; + 5 : "Import Targets"; + 6 : list import_rt; + 7 : "Export Targets"; + 8 : list export_rt; + 9 : "VN Index"; + 10: i32 index; } /** @@ -168,8 +181,10 @@ systemlog sandesh RoutingInstanceUpdateLog { * @severity: DEBUG / ERROR */ traceobject sandesh RoutingInstanceDestroy { - 2: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "Routing Instance"; + 4: string instance_name; } /** @@ -179,8 +194,10 @@ traceobject sandesh RoutingInstanceDestroy { * @action: Contact your technical support representative in case of Error */ systemlog sandesh RoutingInstanceDestroyLog { - 2: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "Routing Instance"; + 4: string instance_name; } /** @@ -188,8 +205,10 @@ systemlog sandesh RoutingInstanceDestroyLog { * @severity: DEBUG / ERROR */ traceobject sandesh RoutingInstanceShutdown { - 2: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "Routing Instance"; + 4: string instance_name; } /** @@ -199,8 +218,10 @@ traceobject sandesh RoutingInstanceShutdown { * @action: Contact your technical support representative in case of Error */ systemlog sandesh RoutingInstanceShutdownLog { - 2: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "Routing Instance"; + 4: string instance_name; } /** @@ -208,10 +229,12 @@ systemlog sandesh RoutingInstanceShutdownLog { * @severity: DEBUG / ERROR */ traceobject sandesh RoutingInstancePeerCreate { + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); 3: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); - 4: "Peer"; - 2: string peer; + 4: string instance_name; + 5: "Peer"; + 6: string peer; } /** @@ -221,10 +244,12 @@ traceobject sandesh RoutingInstancePeerCreate { * @action: Contact your technical support representative in case of Error */ systemlog sandesh RoutingInstancePeerCreateLog { + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); 3: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); - 4: "Peer"; - 2: string peer; + 4: string instance_name; + 5: "Peer"; + 6: string peer; } /** @@ -232,10 +257,12 @@ systemlog sandesh RoutingInstancePeerCreateLog { * @severity: DEBUG / ERROR */ traceobject sandesh RoutingInstancePeerClear { + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); 3: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); - 4: "Peer"; - 2: string peer; + 4: string instance_name; + 5: "Peer"; + 6: string peer; } /** @@ -245,10 +272,12 @@ traceobject sandesh RoutingInstancePeerClear { * @action: Contact your technical support representative in case of Error */ systemlog sandesh RoutingInstancePeerClearLog { + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); 3: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); - 4: "Peer"; - 2: string peer; + 4: string instance_name; + 5: "Peer"; + 6: string peer; } /** @@ -256,10 +285,12 @@ systemlog sandesh RoutingInstancePeerClearLog { * @severity: DEBUG / ERROR */ traceobject sandesh RoutingInstancePeerDelete { + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); 3: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); - 4: "Peer"; - 2: string peer; + 4: string instance_name; + 5: "Peer"; + 6: string peer; } /** @@ -269,10 +300,12 @@ traceobject sandesh RoutingInstancePeerDelete { * @action: Contact your technical support representative in case of Error */ systemlog sandesh RoutingInstancePeerDeleteLog { + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); 3: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); - 4: "Peer"; - 2: string peer; + 4: string instance_name; + 5: "Peer"; + 6: string peer; } /** @@ -280,10 +313,12 @@ systemlog sandesh RoutingInstancePeerDeleteLog { * @severity: DEBUG / ERROR */ traceobject sandesh RoutingInstancePeerDestroy { + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); 3: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); - 4: "Peer"; - 2: string peer; + 4: string instance_name; + 5: "Peer"; + 6: string peer; } /** @@ -293,10 +328,12 @@ traceobject sandesh RoutingInstancePeerDestroy { * @action: Contact your technical support representative in case of Error */ systemlog sandesh RoutingInstancePeerDestroyLog { + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); 3: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); - 4: "Peer"; - 2: string peer; + 4: string instance_name; + 5: "Peer"; + 6: string peer; } /** @@ -304,12 +341,14 @@ systemlog sandesh RoutingInstancePeerDestroyLog { * @severity: DEBUG / ERROR */ traceobject sandesh RoutingInstanceTableCreate { - 4: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "Routing Instance"; + 4: string instance_name; 5: "Table"; - 2: string table; - 6: "Family"; - 3: string family; + 6: string table; + 7: "Family"; + 8: string family; } /** @@ -319,12 +358,14 @@ traceobject sandesh RoutingInstanceTableCreate { * @action: Contact your technical support representative in case of Error */ systemlog sandesh RoutingInstanceTableCreateLog { - 4: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "Routing Instance"; + 4: string instance_name; 5: "Table"; - 2: string table; - 6: "Family"; - 3: string family; + 6: string table; + 7: "Family"; + 8: string family; } /** @@ -332,12 +373,14 @@ systemlog sandesh RoutingInstanceTableCreateLog { * @severity: DEBUG / ERROR */ traceobject sandesh RoutingInstanceTableDestroy { - 4: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "Routing Instance"; + 4: string instance_name; 5: "Table"; - 2: string table; - 6: "Family"; - 3: string family; + 6: string table; + 7: "Family"; + 8: string family; } /** @@ -347,12 +390,14 @@ traceobject sandesh RoutingInstanceTableDestroy { * @action: Contact your technical support representative in case of Error */ systemlog sandesh RoutingInstanceTableDestroyLog { - 4: "Routing Instance"; - 1: string name (key="ObjectRoutingInstance"); + 1: "VirtualNetwork"; + 2: string name (key="ObjectVNTable"); + 3: "Routing Instance"; + 4: string instance_name; 5: "Table"; - 2: string table; - 6: "Family"; - 3: string family; + 6: string table; + 7: "Family"; + 8: string family; } /** @@ -363,9 +408,9 @@ traceobject sandesh RprReplicate { 1: string primary_table; 2: string primary_rt; 3: string peer; - 6: string path_id; - 4: string secondary_table; - 5: string secondary_rt; + 4: string path_id; + 5: string secondary_table; + 6: string secondary_rt; } /** diff --git a/src/bgp/routing-instance/routing_instance_log.h b/src/bgp/routing-instance/routing_instance_log.h index 45cebbeddff..6812df654b6 100644 --- a/src/bgp/routing-instance/routing_instance_log.h +++ b/src/bgp/routing-instance/routing_instance_log.h @@ -45,6 +45,7 @@ do { \ #define RTINSTANCE_LOG(type, rtinstance, level, flags, ...) \ RTINSTANCE_LOG_INTERNAL(type, (rtinstance)->server(), level, flags, \ + (rtinstance)->GetVirtualNetworkName(), \ (rtinstance)->name(), ##__VA_ARGS__); \ #define RTINSTANCE_LOG_MESSAGE(server, level, flags, ...) \ @@ -56,12 +57,14 @@ do { \ #define RTINSTANCE_LOG_PEER(type, rtinstance, peer, level, flags, ...) \ RTINSTANCE_LOG_INTERNAL(Peer##type, (rtinstance)->server(), level, flags, \ + (rtinstance)->GetVirtualNetworkName(), \ (rtinstance)->name(), \ (peer)->peer_key().endpoint.address().to_string(), \ ##__VA_ARGS__); \ #define RTINSTANCE_LOG_TABLE(type, rtinstance, table, level, flags, ...) \ RTINSTANCE_LOG_INTERNAL(Table##type, (rtinstance)->server(), level, flags, \ + (rtinstance)->GetVirtualNetworkName(), \ (rtinstance)->name(), (table)->name(), \ Address::FamilyToString((table)->family()), \ ##__VA_ARGS__); \ diff --git a/src/bgp/routing-instance/routing_table.sandesh b/src/bgp/routing-instance/routing_table.sandesh new file mode 100644 index 00000000000..015de672827 --- /dev/null +++ b/src/bgp/routing-instance/routing_table.sandesh @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2016 Juniper Networks, Inc. All rights reserved. + */ + +struct RoutingTableStats { + 1: optional bool deleted; + 2: optional u64 prefixes; + 3: optional u64 primary_paths; + 4: optional u64 secondary_paths; + 5: optional u64 infeasible_paths; + 6: optional u64 total_paths; +} + +/** + * Routing Table Statistics + */ + +struct RoutingInstanceStatsData { + 1: string name (key="ObjectVNTable"); + 2: optional bool deleted + + 3: optional map raw_ipv4_stats (hidden="yes"); + + /** @display_name:Routing Instance IPv4 Information*/ + 4: optional map ipv4_stats (mstats="raw_ipv4_stats:DSChange", tags=".__key", aggtype="union"); + + + 5: optional map raw_ipv6_stats (hidden="yes"); + + /** @display_name:Routing Instance IPv6 Information*/ + 6: optional map ipv6_stats (mstats="raw_ipv6_stats:DSChange", tags=".__key", aggtype="union"); + + + 7: optional map raw_inetvpn_stats (hidden="yes"); + + /** @display_name:Routing Instance IPv4 Vpn Information*/ + 8: optional map inetvpn_stats (mstats="raw_inetvpn_stats:DSChange", tags=".__key", aggtype="union"); + + + 9: optional map raw_inet6vpn_stats (hidden="yes"); + + /** @display_name:Routing Instance IPv6 Vpn Information*/ + 10: optional map inet6vpn_stats (mstats="raw_inet6vpn_stats:DSChange", tags=".__key", aggtype="union"); + + + 11: optional map raw_rtarget_stats (hidden="yes"); + + /** @display_name:Routing Instance Route Target Information*/ + 12: optional map rtarget_stats (mstats="raw_rtarget_stats:DSChange", tags=".__key", aggtype="union"); + + + 13: optional map raw_inetflow_stats (hidden="yes"); + + /** @display_name:Routing Instance IPv4 Flow Information*/ + 14: optional map inetflow_stats (mstats="raw_inetflow_stats:DSChange", tags=".__key", aggtype="union"); + + 15: optional map raw_inetvpnflow_stats (hidden="yes"); + + /** @display_name:Routing Instance IPv4 Vpn Flow Information*/ + 16: optional map inetvpnflow_stats (mstats="raw_inetvpnflow_stats:DSChange", tags=".__key", aggtype="union"); + + + 17: optional map raw_inetmcast_stats (hidden="yes"); + + /** @display_name:Routing Instance IPv4 Multicast Information*/ + 18: optional map inetmcast_stats (mstats="raw_inetmcast_stats:DSChange", tags=".__key", aggtype="union"); + + + 19: optional map raw_inet6mcast_stats (hidden="yes"); + + /** @display_name:Routing Instance IPv6 Multicast Information*/ + 20: optional map inet6mcast_stats (mstats="raw_inet6mcast_stats:DSChange", tags=".__key", aggtype="union"); + + + 21: optional map raw_enet_stats (hidden="yes"); + + /** @display_name:Routing Instance Enet Information*/ + 22: optional map enet_stats (mstats="raw_enet_stats:DSChange", tags=".__key", aggtype="union"); + + + 23: optional map raw_evpn_stats (hidden="yes"); + + /** @display_name:Routing Instance EVpn Information*/ + 24: optional map evpn_stats (mstats="raw_evpn_stats:DSChange", tags=".__key", aggtype="union"); + + 25: optional map raw_ermvpn_stats (hidden="yes"); + + /** @display_name:Routing Instance ErmVpn Information*/ + 26: optional map ermvpn_stats (mstats="raw_ermvpn_stats:DSChange", tags=".__key", aggtype="union"); +} + +/** + * @description: RoutingInstance related statistics + * @severity: DEBUG + * @cause: Normal operation + */ +uve sandesh RoutingInstanceStats { + 1: RoutingInstanceStatsData data; +} diff --git a/src/bgp/rtarget/test/SConscript b/src/bgp/rtarget/test/SConscript index fd5e7425b25..0e6156c915c 100644 --- a/src/bgp/rtarget/test/SConscript +++ b/src/bgp/rtarget/test/SConscript @@ -31,7 +31,7 @@ env.Append(LIBPATH = [env['TOP'] + '/base', env['TOP'] + '/base/test', env['TOP'] + '/schema', env['TOP'] + '/xmpp', env['TOP'] + '/xml']) env.Prepend(LIBS = ['control_test', 'bgptest', 'bgp', 'peer_sandesh', - 'table_sandesh', 'bgp_test_factory', 'bgp_schema', + 'bgp_test_factory', 'bgp_schema', 'control_node', 'dbtest', 'ifmap_vnc', 'task_test', 'ifmap_test_util', 'ifmap_test_util_server', 'ifmap_server', 'ifmap_common', 'ifmapio', 'ds', diff --git a/src/bgp/table_info.sandesh b/src/bgp/table_info.sandesh deleted file mode 100644 index f10cca1a256..00000000000 --- a/src/bgp/table_info.sandesh +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2016 Juniper Networks, Inc. All rights reserved. - */ - -/** - * BGP Table Information - */ - -struct BgpTableStats { - 2: optional u64 prefixes; - 3: optional u64 primary_paths; - 4: optional u64 secondary_paths; - 5: optional u64 infeasible_paths; - 6: optional u64 total_paths; -} diff --git a/src/bgp/test/SConscript b/src/bgp/test/SConscript index 8367012660e..37375ff61cf 100644 --- a/src/bgp/test/SConscript +++ b/src/bgp/test/SConscript @@ -68,7 +68,6 @@ env.Prepend(LIBS = ['control_test', 'bgp_ifmap_config', 'bgp_xmpp', 'peer_sandesh', - 'table_sandesh', 'bgp_schema', 'control_node', 'dbtest', 'ifmap_vnc', 'task_test', 'ifmap_test_util', 'ifmap_test_util_server', diff --git a/src/bgp/test/route_aggregator_test.cc b/src/bgp/test/route_aggregator_test.cc index 9ca008ab569..0317aa06681 100644 --- a/src/bgp/test/route_aggregator_test.cc +++ b/src/bgp/test/route_aggregator_test.cc @@ -397,7 +397,7 @@ class RouteAggregatorTest : public ::testing::Test { int i = 0; BOOST_FOREACH(const AggregateRouteEntriesInfo &info, resp->get_aggregate_route_entries()) { - TASK_UTIL_EXPECT_EQ(info.get_name(), result); + TASK_UTIL_EXPECT_EQ(info.get_instance_name(), result); i++; } validate_done_ = true; diff --git a/src/bgp/test/routing_instance_test.cc b/src/bgp/test/routing_instance_test.cc index 1b5db961772..ce262107103 100644 --- a/src/bgp/test/routing_instance_test.cc +++ b/src/bgp/test/routing_instance_test.cc @@ -542,6 +542,66 @@ TEST_F(RoutingInstanceModuleTest, Connection) { } } +class RoutingInstanceMappingTest : public ::testing::Test { +protected: + RoutingInstanceMappingTest() : server_(&evm_) { } + + EventManager evm_; + BgpServer server_; +}; + +TEST_F(RoutingInstanceMappingTest, VirtualNetworkMappingSingle) { + RoutingInstanceMgr *mgr = server_.routing_instance_mgr(); + + // Delete a mapping which does not exists. + TASK_UTIL_EXPECT_DEATH(mgr->DeleteVirtualNetworkMapping("vn1", "instance1"), + ".*"); + + // Create a new mapping. + EXPECT_TRUE(mgr->CreateVirtualNetworkMapping("vn1", "instance1")); + + // Recreate an existing mapping. + TASK_UTIL_EXPECT_DEATH(mgr->CreateVirtualNetworkMapping("vn1", + "instance1"), ".*"); + + // Create another mapping + EXPECT_TRUE(mgr->CreateVirtualNetworkMapping("vn1", "instance2")); + + // Delete instance2. Mapping should remain as instance1 still maps to vn1. + EXPECT_FALSE(mgr->DeleteVirtualNetworkMapping("vn1", "instance1")); + + // Delete instance1. Entire mapping should go away. + EXPECT_TRUE(mgr->DeleteVirtualNetworkMapping("vn1", "instance2")); +} + +// Add mappings for multiple virtual-networks. +TEST_F(RoutingInstanceMappingTest, VirtualNetworkMappingMultiple) { + RoutingInstanceMgr *mgr = server_.routing_instance_mgr(); + + EXPECT_TRUE(mgr->CreateVirtualNetworkMapping("vn1", "instance1")); + EXPECT_TRUE(mgr->CreateVirtualNetworkMapping("vn1", "instance2")); + EXPECT_TRUE(mgr->CreateVirtualNetworkMapping("vn2", "instance1")); + EXPECT_TRUE(mgr->CreateVirtualNetworkMapping("vn2", "instance2")); + EXPECT_TRUE(mgr->CreateVirtualNetworkMapping("vn3", "instance1")); + EXPECT_TRUE(mgr->CreateVirtualNetworkMapping("vn3", "instance2")); + EXPECT_TRUE(mgr->CreateVirtualNetworkMapping("vn3", "instance3")); + + TASK_UTIL_EXPECT_DEATH(mgr->DeleteVirtualNetworkMapping("vn1", + "instance10"), ".*"); + + EXPECT_FALSE(mgr->DeleteVirtualNetworkMapping("vn1", "instance1")); + EXPECT_FALSE(mgr->DeleteVirtualNetworkMapping("vn2", "instance1")); + EXPECT_FALSE(mgr->DeleteVirtualNetworkMapping("vn3", "instance1")); + + EXPECT_TRUE(mgr->DeleteVirtualNetworkMapping("vn1", "instance2")); + EXPECT_TRUE(mgr->DeleteVirtualNetworkMapping("vn2", "instance2")); + EXPECT_FALSE(mgr->DeleteVirtualNetworkMapping("vn3", "instance2")); + + EXPECT_TRUE(mgr->DeleteVirtualNetworkMapping("vn3", "instance3")); + TASK_UTIL_EXPECT_DEATH(mgr->DeleteVirtualNetworkMapping("vn3", + "instance3"), ".*"); +} + class TestEnvironment : public ::testing::Environment { virtual ~TestEnvironment() { } }; @@ -559,6 +619,7 @@ int main(int argc, char **argv) { bgp_log_test::init(); ::testing::InitGoogleTest(&argc, argv); ::testing::AddGlobalTestEnvironment(new TestEnvironment()); + ::testing::FLAGS_gtest_death_test_style = "threadsafe"; SetUp(); int result = RUN_ALL_TESTS(); TearDown(); diff --git a/src/control-node/SConscript b/src/control-node/SConscript index 32a1d2b3b11..60a89912134 100644 --- a/src/control-node/SConscript +++ b/src/control-node/SConscript @@ -75,7 +75,6 @@ env.Prepend(LIBS=['bgp', 'xmpp_enet', 'control_node', 'peer_sandesh', - 'table_sandesh', 'origin_vn', 'routing_instance', 'routing_policy', @@ -107,7 +106,7 @@ env.Prepend(LIBS=['bgp', 'pugixml', 'libxml2', 'boost_regex', - 'boost_chrono', + 'boost_chrono', 'boost_program_options', 'boost_filesystem', 'crypto', 'ssl']) diff --git a/src/dns/SConscript b/src/dns/SConscript index 0505fdaaa95..5824a5097a9 100644 --- a/src/dns/SConscript +++ b/src/dns/SConscript @@ -22,7 +22,7 @@ env.Prepend(CPPPATH = env['TOP'] + '/discovery/client') env.Prepend(CPPPATH = env['TOP'] + '/http/client') env.Prepend(LIBS=['ifmap_vnc', 'ifmap_server', 'ifmap_common', 'net', 'ifmapio', - 'xmpp', 'ds', 'sandeshvns', 'peer_sandesh', 'table_sandesh', + 'xmpp', 'ds', 'sandeshvns', 'peer_sandesh', 'httpc', 'curl', 'process_info', 'db', 'io', 'base', 'xml', 'pugixml', 'libxml2', 'boost_regex', 'boost_chrono', 'boost_program_options', diff --git a/src/ifmap/client/test/SConscript b/src/ifmap/client/test/SConscript index 6a780599210..9e66d269edb 100644 --- a/src/ifmap/client/test/SConscript +++ b/src/ifmap/client/test/SConscript @@ -33,7 +33,7 @@ env.Install(env['TOP_LIB'], libboostssltest) env.Prepend(LIBS = [ 'boostssl', 'ifmapio', 'ifmap_server', 'ds', 'xmpp', 'peer_sandesh', - 'table_sandesh', 'sandesh', 'http', 'http_parser', 'httpc', + 'sandesh', 'http', 'http_parser', 'httpc', 'curl', 'sandeshvns', 'process_info', 'io', 'ifmap_common', 'ifmap_vnc', 'pugixml', 'xml', 'task_test', 'db', 'curl', 'base', 'gunit', 'crypto', 'ssl', 'boost_regex' diff --git a/src/ifmap/test/SConscript b/src/ifmap/test/SConscript index 3372c029d21..3674bcdc759 100644 --- a/src/ifmap/test/SConscript +++ b/src/ifmap/test/SConscript @@ -21,7 +21,7 @@ env.Append(LIBPATH = env['TOP'] + '/discovery/client') env.Append(LIBPATH = env['TOP'] + '/http/client') env.Prepend(LIBS = ['ifmap_server', 'ifmapio', 'ds', 'xmpp', 'peer_sandesh', - 'table_sandesh', 'sandesh', 'http', 'http_parser', 'httpc', + 'sandesh', 'http', 'http_parser', 'httpc', 'curl', 'sandeshvns', 'process_info', 'io', 'control_node', 'ifmap_common', 'pugixml', 'xml', 'db', 'base', 'gunit', 'crypto', 'ssl', 'boost_regex', 'boost_chrono', diff --git a/src/ksync/test/SConscript b/src/ksync/test/SConscript index f2a4345da2c..a9829744021 100644 --- a/src/ksync/test/SConscript +++ b/src/ksync/test/SConscript @@ -18,7 +18,7 @@ env.Prepend(CPPPATH = '#/third_party/thrift-0.8.0/lib/cpp/src/') env.Prepend(CPPPATH = env['TOP'] + '/discovery/client') env.Prepend(CPPPATH = env['TOP'] + '/http/client') -env.Prepend(LIBS=['thrift','xmpp', 'peer_sandesh', 'table_sandesh', +env.Prepend(LIBS=['thrift','xmpp', 'peer_sandesh', 'xmpp_unicast', 'xmpp_multicast', 'ds', 'services', 'xml', 'pugixml', 'route', 'bgp_schema', 'ifmap_vnc', 'ifmap_agent', 'ifmap_common', diff --git a/src/vnsw/agent/SConscript b/src/vnsw/agent/SConscript index 037f099083a..86beb1848f0 100644 --- a/src/vnsw/agent/SConscript +++ b/src/vnsw/agent/SConscript @@ -108,7 +108,6 @@ env.Append(LIBPATH = MapBuildDir([ env.Prepend(LIBS = [ 'xmpp', 'peer_sandesh', - 'table_sandesh', 'xmpp_multicast', 'xmpp_enet', 'xmpp_unicast', diff --git a/src/xmpp/test/SConscript b/src/xmpp/test/SConscript index 740f2c4c35d..0c5d3896be2 100644 --- a/src/xmpp/test/SConscript +++ b/src/xmpp/test/SConscript @@ -29,8 +29,7 @@ libxmpptest = env.Library('xmpptest', env.Prepend(LIBS = ['task_test', 'gunit', 'xmpp', 'xml', 'pugixml', 'sandesh', 'http', 'http_parser', 'curl', 'process_info', 'io', 'ssl', 'crypto', 'sandeshvns', 'base', 'peer_sandesh', - 'table_sandesh', 'boost_regex', 'xmpptest', 'control_node', - 'sandesh']) + 'boost_regex', 'xmpptest', 'control_node', 'sandesh']) if sys.platform != 'darwin': env.Append(LIBS = ['rt'])