OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bgp_show_routing_instance.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include "bgp/bgp_show_handler.h"
6 
7 #include <boost/foreach.hpp>
8 
9 #include "base/regex.h"
10 #include "bgp/bgp_membership.h"
11 #include "bgp/bgp_peer.h"
12 #include "bgp/bgp_peer_internal_types.h"
13 #include "bgp/bgp_server.h"
14 #include "bgp/bgp_table.h"
18 
19 using contrail::regex;
22 using std::string;
23 using std::vector;
24 
25 //
26 // Fill in information for a table.
27 //
28 static void FillRoutingInstanceTableInfo(ShowRoutingInstanceTable *srit,
29  const BgpSandeshContext *bsc, const BgpTable *table) {
30  srit->set_name(table->name());
31  srit->set_deleted(table->IsDeleted());
32  srit->set_walk_requests(table->walk_request_count());
33  srit->set_walk_completes(table->walk_complete_count());
34  srit->set_walk_cancels(table->walk_cancel_count());
35  size_t markers = 0;
36  srit->set_pending_updates(table->GetPendingRiboutsCount(&markers));
37  srit->set_markers(markers);
38  srit->set_listeners(table->GetListenerCount());
39  srit->set_walkers(table->walker_count());
40  srit->set_prefixes(table->Size());
41  srit->set_primary_paths(table->GetPrimaryPathCount());
42  srit->set_secondary_paths(table->GetSecondaryPathCount());
43  srit->set_infeasible_paths(table->GetInfeasiblePathCount());
44  srit->set_stale_paths(table->GetStalePathCount());
45  srit->set_llgr_stale_paths(table->GetLlgrStalePathCount());
46  srit->set_paths(srit->get_primary_paths() + srit->get_secondary_paths());
47 }
48 
49 //
50 // Fill in information for an instance.
51 //
52 static void FillRoutingInstanceInfo(ShowRoutingInstance *sri,
53  const BgpSandeshContext *bsc, const RoutingInstance *rtinstance,
54  bool summary) {
55  sri->set_name(rtinstance->name());
56  sri->set_virtual_network(rtinstance->GetVirtualNetworkName());
57  sri->set_vn_index(rtinstance->virtual_network_index());
58  sri->set_vxlan_id(rtinstance->vxlan_id());
59  sri->set_deleted(rtinstance->deleted());
60  sri->set_deleted_at(
62  vector<string> import_rt;
63  for (auto rt : rtinstance->GetImportList()) {
64  import_rt.push_back(rt.ToString());
65  }
66  sri->set_import_target(import_rt);
67  vector<string> export_rt;
68  for (auto rt : rtinstance->GetExportList()) {
69  export_rt.push_back(rt.ToString());
70  }
71  sri->set_export_target(export_rt);
72  sri->set_always_subscribe(rtinstance->always_subscribe());
73  sri->set_allow_transit(rtinstance->virtual_network_allow_transit());
74  sri->set_pbb_evpn_enable(rtinstance->virtual_network_pbb_evpn_enable());
75 
76  if (summary)
77  return;
78 
79  const BgpMembershipManager *bmm = bsc->bgp_server->membership_mgr();
80  vector<ShowRoutingInstanceTable> srit_list;
81  const RoutingInstance::RouteTableList &tables = rtinstance->GetTables();
82  for (RoutingInstance::RouteTableList::const_iterator it =
83  tables.begin(); it != tables.end(); ++it) {
84  ShowRoutingInstanceTable srit;
85  FillRoutingInstanceTableInfo(&srit, bsc, it->second);
86  bmm->FillRoutingInstanceTableInfo(&srit, it->second);
87  srit_list.push_back(srit);
88  }
89  sri->set_tables(srit_list);
90 
91  vector<ShowInstanceRoutingPolicyInfo> policy_list;
92  for (auto info : rtinstance->routing_policies()) {
93  ShowInstanceRoutingPolicyInfo show_policy_info;
94  RoutingPolicyPtr policy = info.first;
95  show_policy_info.set_policy_name(policy->name());
96  show_policy_info.set_generation(info.second);
97  policy_list.push_back(show_policy_info);
98  }
99  sri->set_routing_policies(policy_list);
100 
101  const PeerManager *peer_manager = rtinstance->peer_manager();
102  if (peer_manager) {
103  vector<string> neighbors;
104  for (const BgpPeer *peer = peer_manager->NextPeer(BgpPeerKey());
105  peer != NULL; peer = peer_manager->NextPeer(peer->peer_key())) {
106  neighbors.push_back(peer->peer_name());
107  }
108  sri->set_neighbors(neighbors);
109  }
110 }
111 
112 //
113 // Fill in information for list of instances.
114 //
115 // Allows regular and summary introspect to share code.
116 //
118  bool summary, uint32_t page_limit, uint32_t iter_limit,
119  const string &start_instance, const string &search_string,
120  vector<ShowRoutingInstance> *sri_list, string *next_instance) {
121  regex search_expr(search_string);
124  rim->name_clower_bound(start_instance);
125  for (uint32_t iter_count = 0; it != rim->name_cend(); ++it, ++iter_count) {
126  const RoutingInstance *rtinstance = it->second;
127  if (!search_string.empty() &&
128  (!regex_search(rtinstance->name(), search_expr)) &&
129  (search_string != "deleted" || !rtinstance->deleted())) {
130  continue;
131  }
132  ShowRoutingInstance sri;
133  FillRoutingInstanceInfo(&sri, bsc, rtinstance, summary);
134  sri_list->push_back(sri);
135  if (sri_list->size() >= page_limit)
136  break;
137  if (iter_count >= iter_limit)
138  break;
139  }
140 
141  // All done if we've looked at all instances.
142  if (it == rim->name_cend() || ++it == rim->name_end())
143  return true;
144 
145  // Return true if we've reached the page limit, false if we've reached the
146  // iteration limit.
147  bool done = sri_list->size() >= page_limit;
148  *next_instance = it->second->name();
149  return done;
150 }
151 
152 //
153 // Specialization of BgpShowHandler<>::CallbackCommon for regular introspect.
154 //
155 template <>
156 bool BgpShowHandler<ShowRoutingInstanceReq, ShowRoutingInstanceReqIterate,
157  ShowRoutingInstanceResp, ShowRoutingInstance>::CallbackCommon(
158  const BgpSandeshContext *bsc, Data *data) {
159  uint32_t page_limit = bsc->page_limit() ? bsc->page_limit() : kPageLimit;
160  uint32_t iter_limit = bsc->iter_limit() ? bsc->iter_limit() : kIterLimit;
161  string next_instance;
162  bool done = FillRoutingInstanceInfoList(bsc, false, page_limit, iter_limit,
163  data->next_entry, data->search_string, &data->show_list,
164  &next_instance);
165  if (!next_instance.empty())
166  SaveContextToData(next_instance, done, data);
167  return done;
168 }
169 
170 //
171 // Specialization of BgpShowHandler<>::FillShowList for regular introspect.
172 //
173 template <>
174 void BgpShowHandler<ShowRoutingInstanceReq, ShowRoutingInstanceReqIterate,
175  ShowRoutingInstanceResp, ShowRoutingInstance>::FillShowList(
176  ShowRoutingInstanceResp *resp,
177  const vector<ShowRoutingInstance> &show_list) {
178  resp->set_instances(show_list);
179 }
180 
181 //
182 // Specialization of BgpShowHandler<>::CallbackCommon for summary introspect.
183 //
184 template <>
185 bool BgpShowHandler<ShowRoutingInstanceSummaryReq,
186  ShowRoutingInstanceSummaryReqIterate,
187  ShowRoutingInstanceSummaryResp, ShowRoutingInstance>::CallbackCommon(
188  const BgpSandeshContext *bsc, Data *data) {
189  uint32_t page_limit = bsc->page_limit() ? bsc->page_limit() : kPageLimit;
190  uint32_t iter_limit = bsc->iter_limit() ? bsc->iter_limit() : kIterLimit;
191  string next_instance;
192  bool done = FillRoutingInstanceInfoList(bsc, true, page_limit, iter_limit,
193  data->next_entry, data->search_string, &data->show_list,
194  &next_instance);
195  if (!next_instance.empty())
196  SaveContextToData(next_instance, done, data);
197  return done;
198 }
199 
200 //
201 // Specialization of BgpShowHandler<>::FillShowList for summary introspect.
202 //
203 template <>
204 void BgpShowHandler<ShowRoutingInstanceSummaryReq,
205  ShowRoutingInstanceSummaryReqIterate,
206  ShowRoutingInstanceSummaryResp, ShowRoutingInstance>::FillShowList(
207  ShowRoutingInstanceSummaryResp *resp,
208  const vector<ShowRoutingInstance> &show_list) {
209  resp->set_instances(show_list);
210 }
211 
212 //
213 // Handler for ShowRoutingInstanceReq.
214 //
215 void ShowRoutingInstanceReq::HandleRequest() const {
216  RequestPipeline::PipeSpec ps(this);
219 
220  s1.taskId_ = scheduler->GetTaskId("bgp::ShowCommand");
221  s1.cbFn_ = boost::bind(&BgpShowHandler<
222  ShowRoutingInstanceReq,
223  ShowRoutingInstanceReqIterate,
224  ShowRoutingInstanceResp,
225  ShowRoutingInstance>::Callback, _1, _2, _3, _4, _5);
227  ShowRoutingInstanceReq,
228  ShowRoutingInstanceReqIterate,
229  ShowRoutingInstanceResp,
230  ShowRoutingInstance>::CreateData;
231  s1.instances_.push_back(0);
232  ps.stages_.push_back(s1);
233  RequestPipeline rp(ps);
234 }
235 
236 //
237 // Handler for ShowRoutingInstanceReqIterate.
238 //
239 void ShowRoutingInstanceReqIterate::HandleRequest() const {
240  RequestPipeline::PipeSpec ps(this);
243 
244  s1.taskId_ = scheduler->GetTaskId("bgp::ShowCommand");
245  s1.cbFn_ = boost::bind(&BgpShowHandler<
246  ShowRoutingInstanceReq,
247  ShowRoutingInstanceReqIterate,
248  ShowRoutingInstanceResp,
249  ShowRoutingInstance>::CallbackIterate, _1, _2, _3, _4, _5);
251  ShowRoutingInstanceReq,
252  ShowRoutingInstanceReqIterate,
253  ShowRoutingInstanceResp,
254  ShowRoutingInstance>::CreateData;
255  s1.instances_.push_back(0);
256  ps.stages_.push_back(s1);
257  RequestPipeline rp(ps);
258 }
259 
260 //
261 // Handler for ShowRoutingInstanceSummaryReq.
262 //
263 void ShowRoutingInstanceSummaryReq::HandleRequest() const {
264  RequestPipeline::PipeSpec ps(this);
267 
268  s1.taskId_ = scheduler->GetTaskId("bgp::ShowCommand");
269  s1.cbFn_ = boost::bind(&BgpShowHandler<
270  ShowRoutingInstanceSummaryReq,
271  ShowRoutingInstanceSummaryReqIterate,
272  ShowRoutingInstanceSummaryResp,
273  ShowRoutingInstance>::Callback, _1, _2, _3, _4, _5);
275  ShowRoutingInstanceSummaryReq,
276  ShowRoutingInstanceSummaryReqIterate,
277  ShowRoutingInstanceSummaryResp,
278  ShowRoutingInstance>::CreateData;
279  s1.instances_.push_back(0);
280  ps.stages_.push_back(s1);
281  RequestPipeline rp(ps);
282 }
283 
284 //
285 // Handler for ShowRoutingInstanceSummaryReqIterate.
286 //
287 void ShowRoutingInstanceSummaryReqIterate::HandleRequest() const {
288  RequestPipeline::PipeSpec ps(this);
291 
292  s1.taskId_ = scheduler->GetTaskId("bgp::ShowCommand");
293  s1.cbFn_ = boost::bind(&BgpShowHandler<
294  ShowRoutingInstanceSummaryReq,
295  ShowRoutingInstanceSummaryReqIterate,
296  ShowRoutingInstanceSummaryResp,
297  ShowRoutingInstance>::CallbackIterate, _1, _2, _3, _4, _5);
299  ShowRoutingInstanceSummaryReq,
300  ShowRoutingInstanceSummaryReqIterate,
301  ShowRoutingInstanceSummaryResp,
302  ShowRoutingInstance>::CreateData;
303  s1.instances_.push_back(0);
304  ps.stages_.push_back(s1);
305  RequestPipeline rp(ps);
306 }
std::vector< int > instances_
static bool FillRoutingInstanceInfoList(const BgpSandeshContext *bsc, bool summary, uint32_t page_limit, uint32_t iter_limit, const string &start_instance, const string &search_string, vector< ShowRoutingInstance > *sri_list, string *next_instance)
const RouteTargetList & GetImportList() const
uint64_t walk_request_count() const
Definition: db_table.h:133
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
Definition: task.h:178
const RouteTargetList & GetExportList() const
PeerManager * peer_manager()
int virtual_network_index() const
BgpServer * bgp_server
Definition: bgp_sandesh.h:46
const uint64_t GetLlgrStalePathCount() const
Definition: bgp_table.h:169
const_name_iterator name_cend()
RoutingInstanceMgr * routing_instance_mgr()
Definition: bgp_server.h:102
const std::string & name() const
int vxlan_id() const
RoutingPolicyAttachList * routing_policies()
int GetTaskId(const std::string &name)
Definition: task.cc:856
RouteTableList & GetTables()
static bool regex_match(const std::string &input, const regex &regex)
Definition: regex.h:34
bool virtual_network_allow_transit() const
bool IsDeleted() const
Definition: bgp_table.h:143
const BgpPeer * NextPeer(const BgpPeerKey &key) const
uint64_t walk_complete_count() const
Definition: db_table.h:134
virtual size_t Size() const
Definition: db_table.cc:507
const uint64_t GetInfeasiblePathCount() const
Definition: bgp_table.h:165
static TaskScheduler * GetInstance()
Definition: task.cc:547
uint32_t iter_limit() const
Definition: bgp_sandesh.h:65
static void FillRoutingInstanceTableInfo(ShowRoutingInstanceTable *srit, const BgpSandeshContext *bsc, const BgpTable *table)
uint64_t walk_cancel_count() const
Definition: db_table.h:135
RoutingInstanceList::const_iterator const_name_iterator
const_name_iterator name_clower_bound(const std::string &name)
std::vector< ShowT > show_list
const std::string & name() const
Definition: db_table.h:110
static bool regex_search(const std::string &input, const regex &regex)
Definition: regex.h:25
void FillRoutingInstanceTableInfo(ShowRoutingInstanceTable *srit, const BgpTable *table) const
LifetimeActor * deleter()
std::map< std::string, BgpTable * > RouteTableList
size_t GetPendingRiboutsCount(size_t *markers) const
Definition: bgp_table.cc:1088
bool virtual_network_pbb_evpn_enable() const
const uint64_t GetPrimaryPathCount() const
Definition: bgp_table.h:161
uint32_t page_limit() const
Definition: bgp_sandesh.h:63
size_t GetListenerCount() const
Definition: db_table.cc:238
const std::string GetVirtualNetworkName() const
name_iterator name_end()
uint64_t walker_count() const
Definition: db_table.h:129
BgpMembershipManager * membership_mgr()
Definition: bgp_server.h:173
boost::intrusive_ptr< RoutingPolicy > RoutingPolicyPtr
Definition: bgp_common.h:28
const uint64_t delete_time_stamp_usecs() const
Definition: lifetime.h:138
bool deleted() const
const uint64_t GetStalePathCount() const
Definition: bgp_table.h:168
bool always_subscribe() const
const uint64_t GetSecondaryPathCount() const
Definition: bgp_table.h:162
static std::string UTCUsecToString(uint64_t tstamp)
Definition: time_util.h:54
static void FillRoutingInstanceInfo(ShowRoutingInstance *sri, const BgpSandeshContext *bsc, const RoutingInstance *rtinstance, bool summary)