OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
show_service_chaining.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include "base/regex.h"
6 #include "bgp/bgp_config.h"
7 #include "bgp/bgp_server.h"
8 #include "bgp/bgp_show_handler.h"
9 #include "bgp/bgp_table.h"
12 #include "bgp/routing-instance/service_chaining_types.h"
13 #include "base/address_util.h"
14 
15 using contrail::regex;
18 using std::string;
19 using std::vector;
20 
22  const string &search_string,
23  const regex &search_expr,
24  ShowServicechainInfo &info,
25  RoutingInstance *rtinstance) {
26  SCAddress sc_addr;
27  Address::Family family = sc_addr.SCFamilyToAddressFamily(sc_family);
28  const BgpTable *table =
29  static_cast<const BgpTable *>(rtinstance->GetTable(family));
30  if (!table)
31  return false;
32  IServiceChainMgr *service_chain_mgr =
33  rtinstance->server()->service_chain_mgr(sc_family);
34  if (!service_chain_mgr)
35  return false;
36 
37  if ((!regex_search(table->name(), search_expr)) &&
38  (search_string != "pending" ||
39  !service_chain_mgr->ServiceChainIsPending(rtinstance)) &&
40  (search_string != "down" ||
41  service_chain_mgr->ServiceChainIsUp(rtinstance)) &&
42  (search_string != "deleted" || !table->IsDeleted())) {
43  return false;
44  }
45  const BgpInstanceConfig *rt_config = rtinstance->config();
46  if (!rt_config)
47  return false;
48 
49  const ServiceChainConfig *sc_config =
50  rt_config->service_chain_info(sc_family);
51  if (!sc_config)
52  return false;
53 
54  info.set_family(Address::FamilyToString(family));
55  info.set_src_virtual_network(rtinstance->GetVirtualNetworkName());
56  info.set_dest_virtual_network(GetVNFromRoutingInstance(
57  sc_config->routing_instance));
58  info.set_service_instance(sc_config->service_instance);
59  info.set_src_rt_instance(rtinstance->name());
60  info.set_dest_rt_instance(sc_config->routing_instance);
61  if (sc_config->source_routing_instance.empty()) {
62  info.set_connected_rt_instance(rtinstance->name());
63  } else {
64  info.set_connected_rt_instance(sc_config->source_routing_instance);
65  }
66  info.set_service_chain_addr(sc_config->service_chain_address);
67  info.set_service_chain_id(sc_config->service_chain_id);
68 
69  return service_chain_mgr->FillServiceChainInfo(rtinstance, &info);
70 }
71 
72 // Specialization of BgpShowHandler<>::CallbackCommon.
73 template <>
74 bool BgpShowHandler<ShowServiceChainReq, ShowServiceChainReqIterate,
75  ShowServiceChainResp, ShowServicechainInfo>::CallbackCommon(
76  const BgpSandeshContext *bsc, Data *data) {
77  uint32_t page_limit = bsc->page_limit() ? bsc->page_limit() : kPageLimit;
78  uint32_t iter_limit = bsc->iter_limit() ? bsc->iter_limit() : kIterLimit;
80 
81  regex search_expr(data->search_string);
83  rim->name_clower_bound(data->next_entry);
84  for (uint32_t iter_count = 0; it != rim->name_cend(); ++it, ++iter_count) {
85  RoutingInstance *rinstance = it->second;
86  ShowServicechainInfo inet_info;
88  search_expr, inet_info, rinstance)) {
89  data->show_list.push_back(inet_info);
90  }
91  ShowServicechainInfo inet6_info;
93  search_expr, inet6_info, rinstance)) {
94  data->show_list.push_back(inet6_info);
95  }
96  ShowServicechainInfo evpn_info;
98  search_expr, evpn_info, rinstance)) {
99  data->show_list.push_back(evpn_info);
100  }
101  ShowServicechainInfo evpn6_info;
103  search_expr, evpn6_info, rinstance)) {
104  data->show_list.push_back(evpn6_info);
105  }
106 
107  if (data->show_list.size() >= page_limit)
108  break;
109  if (iter_count >= iter_limit)
110  break;
111  }
112 
113  // All done if we've looked at all instances.
114  if (it == rim->name_cend() || ++it == rim->name_cend())
115  return true;
116 
117  // Return true if we've reached the page limit, false if we've reached the
118  // iteration limit.
119  bool done = data->show_list.size() >= page_limit;
120  SaveContextToData(it->second->name(), done, data);
121  return done;
122 }
123 
124 // Specialization of BgpShowHandler<>::FillShowList.
125 template <>
126 void BgpShowHandler<ShowServiceChainReq, ShowServiceChainReqIterate,
127  ShowServiceChainResp, ShowServicechainInfo>::FillShowList(
128  ShowServiceChainResp *resp,
129  const vector<ShowServicechainInfo> &show_list) {
130  resp->set_service_chain_list(show_list);
131 }
132 
133 // Handler for ShowServiceChainReq.
134 void ShowServiceChainReq::HandleRequest() const {
135  RequestPipeline::PipeSpec ps(this);
138 
139  s1.taskId_ = scheduler->GetTaskId("bgp::ServiceChain");
140  s1.cbFn_ = boost::bind(&BgpShowHandler<
141  ShowServiceChainReq,
142  ShowServiceChainReqIterate,
143  ShowServiceChainResp,
144  ShowServicechainInfo>::Callback, _1, _2, _3, _4, _5);
146  ShowServiceChainReq,
147  ShowServiceChainReqIterate,
148  ShowServiceChainResp,
149  ShowServicechainInfo>::CreateData;
150  s1.instances_.push_back(0);
151  ps.stages_.push_back(s1);
152  RequestPipeline rp(ps);
153 }
154 
155 //
156 // Handler for ShowServiceChainReqIterate.
157 //
158 void ShowServiceChainReqIterate::HandleRequest() const {
159  RequestPipeline::PipeSpec ps(this);
162 
163  s1.taskId_ = scheduler->GetTaskId("bgp::ServiceChain");
164  s1.cbFn_ = boost::bind(&BgpShowHandler<
165  ShowServiceChainReq,
166  ShowServiceChainReqIterate,
167  ShowServiceChainResp,
168  ShowServicechainInfo>::CallbackIterate, _1, _2, _3, _4, _5);
170  ShowServiceChainReq,
171  ShowServiceChainReqIterate,
172  ShowServiceChainResp,
173  ShowServicechainInfo>::CreateData;
174  s1.instances_.push_back(0);
175  ps.stages_.push_back(s1);
176  RequestPipeline rp(ps);
177 }
std::vector< int > instances_
static Address::Family SCFamilyToAddressFamily(Family family)
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
static bool FillServiceChainInfo(SCAddress::Family sc_family, const string &search_string, const regex &search_expr, ShowServicechainInfo &info, RoutingInstance *rtinstance)
BgpServer * server()
BgpServer * bgp_server
Definition: bgp_sandesh.h:46
Family
Definition: address.h:24
const_name_iterator name_cend()
std::string GetVNFromRoutingInstance(const std::string &vn)
RoutingInstanceMgr * routing_instance_mgr()
Definition: bgp_server.h:102
const std::string & name() const
int GetTaskId(const std::string &name)
Definition: task.cc:856
static bool regex_match(const std::string &input, const regex &regex)
Definition: regex.h:34
bool IsDeleted() const
Definition: bgp_table.h:143
const ServiceChainConfig * service_chain_info(SCAddress::Family family) const
Definition: bgp_config.cc:379
static TaskScheduler * GetInstance()
Definition: task.cc:547
virtual bool FillServiceChainInfo(RoutingInstance *rtinstance, ShowServicechainInfo *info) const =0
uint32_t iter_limit() const
Definition: bgp_sandesh.h:65
IServiceChainMgr * service_chain_mgr(SCAddress::Family family)
Definition: bgp_server.h:134
std::string routing_instance
Definition: bgp_config.h:327
RoutingInstanceList::const_iterator const_name_iterator
const_name_iterator name_clower_bound(const std::string &name)
std::vector< ShowT > show_list
const BgpInstanceConfig * config() const
const std::string & name() const
Definition: db_table.h:110
std::string source_routing_instance
Definition: bgp_config.h:331
virtual bool ServiceChainIsPending(RoutingInstance *rtinstance, std::string *reason=NULL) const =0
static bool regex_search(const std::string &input, const regex &regex)
Definition: regex.h:25
std::string service_instance
Definition: bgp_config.h:330
static std::string FamilyToString(Family fmly)
Definition: address.cc:63
uint32_t page_limit() const
Definition: bgp_sandesh.h:63
const std::string GetVirtualNetworkName() const
virtual bool ServiceChainIsUp(RoutingInstance *rtinstance) const =0
std::string service_chain_address
Definition: bgp_config.h:329
std::string service_chain_id
Definition: bgp_config.h:332