OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bgp_show_mvpn_manager.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include "bgp/bgp_show_handler.h"
6 
7 #include "base/regex.h"
8 #include "bgp/bgp_peer_internal_types.h"
9 #include "bgp/bgp_mvpn.h"
10 #include "bgp/bgp_server.h"
11 #include "bgp/mvpn/mvpn_table.h"
13 
14 using contrail::regex;
17 using std::string;
18 using std::vector;
19 
20 //
21 // Fill in information for an mvpn table.
22 //
23 static void FillMvpnManagerInfo(ShowMvpnManager *smm,
24  const BgpSandeshContext *bsc, const MvpnTable *table) {
25  smm->set_name(table->name());
26  const MvpnManager *manager = table->manager();
27  if (!manager)
28  return;
29 
30  smm->set_project_manager(
32  smm->set_deleted(manager->deleted());
33  smm->set_deleted_at(
35 }
36 
37 //
38 // Specialization of BgpShowHandler<>::CallbackCommon.
39 //
40 template <>
41 bool BgpShowHandler<ShowMvpnManagerReq, ShowMvpnManagerReqIterate,
42  ShowMvpnManagerResp, ShowMvpnManager>::CallbackCommon(
43  const BgpSandeshContext *bsc, Data *data) {
44  uint32_t page_limit = bsc->page_limit() ? bsc->page_limit() : kPageLimit;
45  uint32_t iter_limit = bsc->iter_limit() ? bsc->iter_limit() : kIterLimit;
47 
48  regex search_expr(data->search_string);
50  rim->name_clower_bound(data->next_entry);
51  for (uint32_t iter_count = 0; it != rim->name_cend(); ++it, ++iter_count) {
52  const RoutingInstance *rtinstance = it->second;
53  const MvpnTable *table = static_cast<const MvpnTable *>(
54  rtinstance->GetTable(Address::MVPN));
55  if (!table)
56  continue;
57  if ((!regex_search(table->name(), search_expr)) &&
58  (data->search_string != "deleted" || !table->IsDeleted())) {
59  continue;
60  }
61  ShowMvpnManager smm;
62  FillMvpnManagerInfo(&smm, bsc, table);
63  data->show_list.push_back(smm);
64  if (data->show_list.size() >= page_limit)
65  break;
66  if (iter_count >= iter_limit)
67  break;
68  }
69 
70  // All done if we've looked at all instances.
71  if (it == rim->name_cend() || ++it == rim->name_cend())
72  return true;
73 
74  // Return true if we've reached the page limit, false if we've reached the
75  // iteration limit.
76  bool done = data->show_list.size() >= page_limit;
77  SaveContextToData(it->second->name(), done, data);
78  return done;
79 }
80 
81 //
82 // Specialization of BgpShowHandler<>::FillShowList.
83 //
84 template <>
85 void BgpShowHandler<ShowMvpnManagerReq, ShowMvpnManagerReqIterate,
86  ShowMvpnManagerResp, ShowMvpnManager>::FillShowList(
87  ShowMvpnManagerResp *resp,
88  const vector<ShowMvpnManager> &show_list) {
89  resp->set_managers(show_list);
90 }
91 
92 //
93 // Handler for ShowMvpnManagerReq.
94 //
95 void ShowMvpnManagerReq::HandleRequest() const {
99 
100  s1.taskId_ = scheduler->GetTaskId("bgp::ShowCommand");
101  s1.cbFn_ = boost::bind(&BgpShowHandler<
102  ShowMvpnManagerReq,
103  ShowMvpnManagerReqIterate,
104  ShowMvpnManagerResp,
105  ShowMvpnManager>::Callback, _1, _2, _3, _4, _5);
107  ShowMvpnManagerReq,
108  ShowMvpnManagerReqIterate,
109  ShowMvpnManagerResp,
110  ShowMvpnManager>::CreateData;
111  s1.instances_.push_back(0);
112  ps.stages_.push_back(s1);
113  RequestPipeline rp(ps);
114 }
115 
116 //
117 // Handler for ShowMvpnManagerReqIterate.
118 //
119 void ShowMvpnManagerReqIterate::HandleRequest() const {
120  RequestPipeline::PipeSpec ps(this);
123 
124  s1.taskId_ = scheduler->GetTaskId("bgp::ShowCommand");
125  s1.cbFn_ = boost::bind(&BgpShowHandler<
126  ShowMvpnManagerReq,
127  ShowMvpnManagerReqIterate,
128  ShowMvpnManagerResp,
129  ShowMvpnManager>::CallbackIterate, _1, _2, _3, _4, _5);
131  ShowMvpnManagerReq,
132  ShowMvpnManagerReqIterate,
133  ShowMvpnManagerResp,
134  ShowMvpnManager>::CreateData;
135  s1.instances_.push_back(0);
136  ps.stages_.push_back(s1);
137  RequestPipeline rp(ps);
138 }
std::vector< int > instances_
BgpTable * GetTable(Address::Family fmly)
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
Definition: task.h:178
BgpServer * bgp_server
Definition: bgp_sandesh.h:46
RoutingInstance * routing_instance()
Definition: bgp_table.h:148
const_name_iterator name_cend()
RoutingInstanceMgr * routing_instance_mgr()
Definition: bgp_server.h:102
const std::string & mvpn_project_manager_network() const
int GetTaskId(const std::string &name)
Definition: task.cc:856
const MvpnManager * manager() const
Definition: mvpn_table.h:64
static bool regex_match(const std::string &input, const regex &regex)
Definition: regex.h:34
bool IsDeleted() const
Definition: bgp_table.h:143
const LifetimeActor * deleter() const
Definition: bgp_mvpn.cc:427
static TaskScheduler * GetInstance()
Definition: task.cc:547
uint32_t iter_limit() const
Definition: bgp_sandesh.h:65
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
bool deleted() const
Definition: bgp_mvpn.cc:423
uint32_t page_limit() const
Definition: bgp_sandesh.h:63
static void FillMvpnManagerInfo(ShowMvpnManager *smm, const BgpSandeshContext *bsc, const MvpnTable *table)
const uint64_t delete_time_stamp_usecs() const
Definition: lifetime.h:138
static std::string UTCUsecToString(uint64_t tstamp)
Definition: time_util.h:54