Line data Source code
1 : /*
2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3 : */
4 :
5 : #include <cmn/agent_factory.h>
6 : #include <cmn/agent_cmn.h>
7 : #include <init/agent_param.h>
8 : #include <db/db.h>
9 : #include <base/task_trigger.h>
10 : #include <sandesh/sandesh_types.h>
11 : #include <sandesh/sandesh_constants.h>
12 : #include <sandesh/sandesh.h>
13 : #include <sandesh/sandesh_trace.h>
14 : #include <cfg/cfg_init.h>
15 : #include <oper/route_common.h>
16 : #include <oper/operdb_init.h>
17 : #include <oper/metadata_ip.h>
18 : #include <oper/interface_common.h>
19 : #include <oper/health_check.h>
20 : #include <oper/nexthop.h>
21 : #include <oper/vrf.h>
22 : #include <oper/mpls.h>
23 : #include <oper/vm.h>
24 : #include <oper/vn.h>
25 : #include <oper/sg.h>
26 : #include <oper/tag.h>
27 : #include <oper/mirror_table.h>
28 : #include <oper/vrf_assign.h>
29 : #include <oper/vxlan.h>
30 : #include <oper/multicast_policy.h>
31 : #include <oper/multicast.h>
32 : #include <oper/global_vrouter.h>
33 : #include <oper/path_preference.h>
34 : #include <oper/tsn_elector.h>
35 : #include <oper/vxlan_routing_manager.h>
36 : #include <filter/acl.h>
37 : #include <filter/policy_set.h>
38 : #include <oper/ifmap_dependency_manager.h>
39 : #include <base/task_trigger.h>
40 : #include <oper/instance_manager.h>
41 : #include <oper/physical_device.h>
42 : #include <oper/physical_device_vn.h>
43 : #include <oper/config_manager.h>
44 : #include <oper/agent_profile.h>
45 : #include <oper/agent_sandesh.h>
46 : #include <oper/vrouter.h>
47 : #include <oper/bgp_as_service.h>
48 : #include <oper/bgp_router.h>
49 : #include <oper/agent_route_walker.h>
50 : #include <nexthop_server/nexthop_manager.h>
51 : #include <oper/forwarding_class.h>
52 : #include <oper/qos_config.h>
53 : #include <oper/qos_queue.h>
54 : #include <oper/global_qos_config.h>
55 : #include <oper/global_system_config.h>
56 : #include <oper/bridge_domain.h>
57 : #include <oper/agent_route_walker.h>
58 : #include <oper/security_logging_object.h>
59 : #include <oper/route_leak.h>
60 : #include <oper/crypt_tunnel.h>
61 : #include <oper/hbf.h>
62 :
63 : using boost::assign::map_list_of;
64 : using boost::assign::list_of;
65 :
66 : SandeshTraceBufferPtr OperConfigTraceBuf(SandeshTraceBufferCreate("OperIfmap",
67 : 1000));
68 :
69 : template<typename T>
70 0 : T *DBTableCreate(DB *db, Agent *agent, OperDB *oper,
71 : const std::string &db_name) {
72 0 : DB::RegisterFactory(db_name, &T::CreateTable);
73 0 : T *table = static_cast<T *>(db->CreateTable(db_name));
74 0 : assert(table);
75 0 : table->set_agent(agent);
76 0 : return table;
77 : }
78 :
79 0 : void OperDB::CreateDBTables(DB *db) {
80 0 : DB::RegisterFactory("db.interface.0", &InterfaceTable::CreateTable);
81 0 : DB::RegisterFactory("db.nexthop.0", &NextHopTable::CreateTable);
82 0 : DB::RegisterFactory("db.crypttunnel.0",
83 : boost::bind(&CryptTunnelTable::CreateTable,
84 : agent_, _1, _2));
85 0 : DB::RegisterFactory("uc.route.0",
86 : &InetUnicastAgentRouteTable::CreateTable);
87 0 : DB::RegisterFactory("uc.route.3",
88 : &InetUnicastAgentRouteTable::CreateTable);
89 0 : DB::RegisterFactory("mc.route.0",
90 : &Inet4MulticastAgentRouteTable::CreateTable);
91 0 : DB::RegisterFactory("evpn.route.0", &EvpnAgentRouteTable::CreateTable);
92 0 : DB::RegisterFactory("l2.route.0", &BridgeAgentRouteTable::CreateTable);
93 0 : DB::RegisterFactory("uc.route6.0",
94 : &InetUnicastAgentRouteTable::CreateTable);
95 0 : DB::RegisterFactory("db.vrf.0", &VrfTable::CreateTable);
96 0 : DB::RegisterFactory("db.vn.0", &VnTable::CreateTable);
97 0 : DB::RegisterFactory("db.vm.0", &VmTable::CreateTable);
98 0 : DB::RegisterFactory("db.sg.0", &SgTable::CreateTable);
99 0 : DB::RegisterFactory("db.tag.0", &TagTable::CreateTable);
100 0 : DB::RegisterFactory("db.mpls.0", &MplsTable::CreateTable);
101 0 : DB::RegisterFactory("db.acl.0", &AclTable::CreateTable);
102 0 : DB::RegisterFactory("db.mirror_table.0", &MirrorTable::CreateTable);
103 0 : DB::RegisterFactory("db.vrf_assign.0", &VrfAssignTable::CreateTable);
104 0 : DB::RegisterFactory("db.vxlan.0", &VxLanTable::CreateTable);
105 0 : DB::RegisterFactory("db.service-instance.0",
106 : &ServiceInstanceTable::CreateTable);
107 0 : DB::RegisterFactory("db.physical_devices.0",
108 : &PhysicalDeviceTable::CreateTable);
109 0 : DB::RegisterFactory("db.healthcheck.0",
110 : boost::bind(&HealthCheckTable::CreateTable,
111 : agent_, _1, _2));
112 0 : DB::RegisterFactory("db.qos_queue.0",
113 : boost::bind(&QosQueueTable::CreateTable,
114 : agent_, _1, _2));
115 0 : DB::RegisterFactory("db.forwardingclass.0",
116 : boost::bind(&ForwardingClassTable::CreateTable,
117 : agent_, _1, _2));
118 0 : DB::RegisterFactory("db.qos_config.0",
119 : boost::bind(&AgentQosConfigTable::CreateTable,
120 : agent_, _1, _2));
121 0 : DB::RegisterFactory("db.bridge_domain.0",
122 : boost::bind(&BridgeDomainTable::CreateTable,
123 : agent_, _1, _2));
124 0 : DB::RegisterFactory("db.security_logging_object.0",
125 : boost::bind(&SecurityLoggingObjectTable::CreateTable,
126 : agent_, _1, _2));
127 0 : DB::RegisterFactory("db.policy_set.0", &PolicySetTable::CreateTable);
128 0 : DB::RegisterFactory("db.multicast_policy.0",
129 : &MulticastPolicyTable::CreateTable);
130 :
131 : InterfaceTable *intf_table;
132 0 : intf_table = static_cast<InterfaceTable *>(db->CreateTable("db.interface.0"));
133 0 : assert(intf_table);
134 0 : agent_->set_interface_table(intf_table);
135 0 : intf_table->Init(this);
136 0 : intf_table->set_agent(agent_);
137 :
138 : // Allocate Range to be used for MetaDataIPAllocator
139 0 : agent_->set_metadata_ip_allocator(
140 0 : new MetaDataIpAllocator(agent_, 1, max_linklocal_addresses - 1));
141 0 : agent_->set_metadata_ip6_allocator(
142 0 : new MetaDataIpAllocator(agent_, 1, max_linklocal_addresses - 1));
143 :
144 : HealthCheckTable *hc_table;
145 : hc_table =
146 0 : static_cast<HealthCheckTable *>(db->CreateTable("db.healthcheck.0"));
147 0 : assert(hc_table);
148 0 : agent_->set_health_check_table(hc_table);
149 :
150 : CryptTunnelTable *crypt_tunnel_table;
151 0 : crypt_tunnel_table = static_cast<CryptTunnelTable *>(db->CreateTable("db.crypttunnel.0"));
152 0 : assert(crypt_tunnel_table);
153 0 : agent_->set_crypt_tunnel_table(crypt_tunnel_table);
154 :
155 : NextHopTable *nh_table;
156 0 : nh_table = static_cast<NextHopTable *>(db->CreateTable("db.nexthop.0"));
157 0 : assert(nh_table);
158 0 : agent_->set_nexthop_table(nh_table);
159 0 : nh_table->set_agent(agent_);
160 :
161 : VrfTable *vrf_table;
162 0 : vrf_table = static_cast<VrfTable *>(db->CreateTable("db.vrf.0"));
163 0 : assert(vrf_table);
164 0 : agent_->set_vrf_table(vrf_table);
165 0 : vrf_table->set_agent(agent_);
166 :
167 : VmTable *vm_table;
168 0 : vm_table = static_cast<VmTable *>(db->CreateTable("db.vm.0"));
169 0 : assert(vm_table);
170 0 : agent_->set_vm_table(vm_table);
171 0 : vm_table->set_agent(agent_);
172 :
173 : SgTable *sg_table;
174 0 : sg_table = static_cast<SgTable *>(db->CreateTable("db.sg.0"));
175 0 : assert(sg_table);
176 0 : agent_->set_sg_table(sg_table);
177 0 : sg_table->set_agent(agent_);
178 :
179 : TagTable *tag_table;
180 0 : tag_table = static_cast<TagTable *>(db->CreateTable("db.tag.0"));
181 0 : assert(tag_table);
182 0 : agent_->set_tag_table(tag_table);
183 0 : tag_table->set_agent(agent_);
184 :
185 : VnTable *vn_table;
186 0 : vn_table = static_cast<VnTable *>(db->CreateTable("db.vn.0"));
187 0 : assert(vn_table);
188 0 : agent_->set_vn_table(vn_table);
189 0 : vn_table->set_agent(agent_);
190 :
191 : MplsTable *mpls_table;
192 0 : mpls_table = static_cast<MplsTable *>(db->CreateTable("db.mpls.0"));
193 0 : assert(mpls_table);
194 0 : agent_->set_mpls_table(mpls_table);
195 0 : mpls_table->set_agent(agent_);
196 0 : mpls_table->ReserveLabel(0, MplsTable::kStartLabel - 1);
197 :
198 : AclTable *acl_table;
199 0 : acl_table = static_cast<AclTable *>(db->CreateTable("db.acl.0"));
200 0 : assert(acl_table);
201 0 : agent_->set_acl_table(acl_table);
202 0 : acl_table->set_agent(agent_);
203 :
204 : MirrorTable *mirror_table;
205 : mirror_table = static_cast<MirrorTable *>
206 0 : (db->CreateTable("db.mirror_table.0"));
207 0 : assert(mirror_table);
208 0 : agent_->set_mirror_table(mirror_table);
209 0 : mirror_table->set_agent(agent_);
210 0 : mirror_table->Initialize();
211 :
212 : VrfAssignTable *vassign_table = static_cast<VrfAssignTable *>
213 0 : (db->CreateTable("db.vrf_assign.0"));
214 0 : assert(vassign_table);
215 0 : agent_->set_vrf_assign_table(vassign_table);
216 0 : vassign_table->set_agent(agent_);
217 :
218 : PolicySetTable *policy_set =
219 0 : static_cast<PolicySetTable *>(db->CreateTable("db.policy_set.0"));
220 0 : assert(policy_set);
221 0 : agent_->set_policy_set_table(policy_set);
222 0 : policy_set->set_agent(agent_);
223 :
224 0 : domain_config_.reset(new DomainConfig(agent_));
225 :
226 : VxLanTable *vxlan_table;
227 0 : vxlan_table = static_cast<VxLanTable *>(db->CreateTable("db.vxlan.0"));
228 0 : assert(vxlan_table);
229 0 : agent_->set_vxlan_table(vxlan_table);
230 0 : vxlan_table->set_agent(agent_);
231 0 : vxlan_table->Initialize();
232 :
233 : QosQueueTable *qos_queue_table;
234 : qos_queue_table =
235 0 : static_cast<QosQueueTable *>(db->CreateTable("db.qos_queue.0"));
236 0 : agent_->set_qos_queue_table(qos_queue_table);
237 :
238 : ForwardingClassTable *forwarding_class_table;
239 : forwarding_class_table = static_cast<ForwardingClassTable *>(
240 0 : db->CreateTable("db.forwardingclass.0"));
241 0 : agent_->set_forwarding_class_table(forwarding_class_table);
242 :
243 : SecurityLoggingObjectTable *slo_table;
244 : slo_table = static_cast<SecurityLoggingObjectTable *>(
245 0 : db->CreateTable("db.security_logging_object.0"));
246 0 : agent_->set_slo_table(slo_table);
247 :
248 : AgentQosConfigTable *qos_config_table;
249 : qos_config_table =
250 0 : static_cast<AgentQosConfigTable *>(db->CreateTable("db.qos_config.0"));
251 0 : agent_->set_qos_config_table(qos_config_table);
252 :
253 : BridgeDomainTable *bd_table;
254 : bd_table =
255 0 : static_cast<BridgeDomainTable *>(db->CreateTable("db.bridge_domain.0"));
256 0 : assert(bd_table);
257 0 : agent_->set_bridge_domain_table(bd_table);
258 :
259 : MulticastPolicyTable *mp_table;
260 : mp_table = static_cast<MulticastPolicyTable *>(
261 0 : db->CreateTable("db.multicast_policy.0"));
262 0 : assert(mp_table);
263 0 : agent_->set_mp_table(mp_table);
264 0 : mp_table->set_agent(agent_);
265 :
266 0 : acl_table->ListenerInit();
267 :
268 : route_walk_manager_ =
269 0 : std::unique_ptr<AgentRouteWalkerManager>(new AgentRouteWalkerManager(agent_));
270 0 : multicast_ = std::unique_ptr<MulticastHandler>(new MulticastHandler(agent_));
271 0 : global_vrouter_ = std::unique_ptr<GlobalVrouter> (new GlobalVrouter(agent_));
272 : route_preference_module_ =
273 0 : std::unique_ptr<PathPreferenceModule>(new PathPreferenceModule(agent_));
274 0 : route_preference_module_->Init();
275 :
276 : ServiceInstanceTable *si_table =
277 : static_cast<ServiceInstanceTable *>(
278 0 : db->CreateTable("db.service-instance.0"));
279 0 : agent_->set_service_instance_table(si_table);
280 0 : si_table->Initialize(agent_->cfg()->cfg_graph(), dependency_manager_.get());
281 0 : si_table->set_agent(agent_);
282 :
283 : PhysicalDeviceTable *dev_table =
284 0 : DBTableCreate<PhysicalDeviceTable>(db, agent_, this,
285 : "db.physical_devices.0");
286 0 : agent_->set_physical_device_table(dev_table);
287 :
288 : PhysicalDeviceVnTable *dev_vn_table =
289 0 : DBTableCreate<PhysicalDeviceVnTable>(db, agent_, this,
290 : "db.physical_device_vn.0");
291 0 : agent_->set_physical_device_vn_table(dev_vn_table);
292 0 : profile_.reset(new AgentProfile(agent_, true));
293 :
294 0 : bgp_as_a_service_ = std::unique_ptr<BgpAsAService>(new BgpAsAService(agent_));
295 : bgp_router_config_ =
296 0 : std::unique_ptr<BgpRouterConfig> (new BgpRouterConfig(agent_));
297 :
298 0 : vrouter_ = std::unique_ptr<VRouter> (new VRouter(agent_));
299 : global_qos_config_ =
300 0 : std::unique_ptr<GlobalQosConfig>(new GlobalQosConfig(agent_));
301 : global_system_config_ =
302 0 : std::unique_ptr<GlobalSystemConfig>(new GlobalSystemConfig(agent_));
303 0 : network_ipam_ = std::unique_ptr<OperNetworkIpam>
304 0 : (new OperNetworkIpam(agent_, domain_config_.get()));
305 0 : virtual_dns_ = std::unique_ptr<OperVirtualDns>
306 0 : (new OperVirtualDns(agent_, domain_config_.get()));
307 0 : tsn_elector_ = std::unique_ptr<TsnElector>(new TsnElector(agent_));
308 0 : vxlan_routing_manager_= std::unique_ptr<VxlanRoutingManager>
309 0 : (new VxlanRoutingManager(agent_));
310 0 : hbf_handler_= std::unique_ptr<HBFHandler>
311 0 : (new HBFHandler(agent_));
312 0 : }
313 :
314 0 : void OperDB::Init() {
315 0 : dependency_manager_->Initialize(agent());
316 :
317 : // Unit tests may not initialize the agent configuration parameters.
318 0 : std::string netns_cmd;
319 0 : std::string docker_cmd;
320 0 : int netns_workers = -1;
321 0 : int netns_timeout = -1;
322 0 : if (agent_->params()) {
323 0 : netns_cmd = agent_->params()->si_netns_command();
324 0 : docker_cmd = agent_->params()->si_docker_command();
325 0 : netns_workers = agent_->params()->si_netns_workers();
326 0 : netns_timeout = agent_->params()->si_netns_timeout();
327 : }
328 0 : instance_manager_->Initialize(agent_->db(), netns_cmd,
329 : docker_cmd, netns_workers, netns_timeout);
330 0 : if (nexthop_manager_.get()) {
331 0 : nexthop_manager_->Initialize(agent_->db());
332 : }
333 :
334 0 : if (agent_sandesh_manager_.get()) {
335 0 : agent_sandesh_manager_->Init();
336 : }
337 :
338 0 : agent_->config_manager()->Init();
339 0 : domain_config_->Init();
340 0 : }
341 :
342 0 : void OperDB::InitDone() {
343 0 : profile_->InitDone();
344 0 : }
345 :
346 0 : void OperDB::RegisterDBClients() {
347 0 : IFMapDependencyManager *mgr = agent_->oper_db()->dependency_manager();
348 0 : agent_->physical_device_table()->RegisterDBClients(mgr);
349 0 : agent_->interface_table()->RegisterDBClients(mgr);
350 :
351 0 : multicast_.get()->Register();
352 0 : global_vrouter_.get()->CreateDBClients();
353 0 : route_leak_manager_.reset(new RouteLeakManager(agent_));
354 0 : tsn_elector_.get()->Register();
355 0 : vxlan_routing_manager_.get()->Register();
356 0 : hbf_handler_.get()->Register();
357 0 : }
358 :
359 0 : OperDB::OperDB(Agent *agent)
360 0 : : agent_(agent),
361 0 : dependency_manager_(
362 : AgentStaticObjectFactory::Create<IFMapDependencyManager>(
363 : agent->db(), agent->cfg()->cfg_graph())),
364 0 : instance_manager_(
365 0 : AgentStaticObjectFactory::Create<InstanceManager>(agent)) {
366 0 : if (agent_->params() &&
367 0 : agent_->params()->nexthop_server_endpoint().length() > 0) {
368 0 : nexthop_manager_.reset(new NexthopManager(agent_->event_manager(),
369 0 : agent->params()->nexthop_server_endpoint()));
370 : }
371 :
372 0 : agent_sandesh_manager_.reset(new AgentSandeshManager(agent));
373 0 : }
374 :
375 0 : OperDB::~OperDB() {
376 0 : }
377 :
378 0 : void OperDB::Shutdown() {
379 0 : agent_->mpls_table()->FreeReserveLabel(0, MplsTable::kStartLabel - 1);
380 0 : instance_manager_->Terminate();
381 0 : if (nexthop_manager_.get()) {
382 0 : nexthop_manager_->Terminate();
383 : }
384 0 : dependency_manager_->Terminate();
385 0 : global_vrouter_.reset();
386 :
387 0 : bgp_router_config_.reset();
388 :
389 0 : global_qos_config_.reset();
390 0 : global_system_config_.reset();
391 :
392 0 : route_preference_module_->Shutdown();
393 0 : multicast_->Shutdown();
394 0 : multicast_->Terminate();
395 0 : route_walk_manager_->Shutdown();
396 0 : tsn_elector_->Shutdown();
397 0 : vxlan_routing_manager_->Shutdown();
398 0 : hbf_handler_->Terminate();
399 :
400 0 : if (agent_sandesh_manager_.get()) {
401 0 : agent_sandesh_manager_->Shutdown();
402 : }
403 : #if 0
404 : agent_->interface_table()->Clear();
405 : agent_->nexthop_table()->Clear();
406 : agent_->vrf_table()->Clear();
407 : agent_->vn_table()->Clear();
408 : agent_->sg_table()->Clear();
409 : agent_->vm_table()->Clear();
410 : agent_->mpls_table()->Clear();
411 : agent_->acl_table()->Clear();
412 : agent_->mirror_table()->Clear();
413 : agent_->vrf_assign_table()->Clear();
414 : agent_->vxlan_table()->Clear();
415 : agent_->service_instance_table()->Clear();
416 : agent_->mp_table()->Clear();
417 : #endif
418 :
419 0 : route_preference_module_->Shutdown();
420 0 : domain_config_->Terminate();
421 0 : if (vrouter_.get()) {
422 0 : vrouter_->Shutdown();
423 0 : vrouter_.reset();
424 : }
425 0 : if (agent()->mirror_table()) {
426 0 : agent()->mirror_table()->Shutdown();
427 : }
428 :
429 0 : if (agent()->vxlan_table()) {
430 0 : agent()->vxlan_table()->Shutdown();
431 : }
432 :
433 : //route_walk_manager_.reset();
434 0 : profile_.reset();
435 0 : route_leak_manager_.reset();
436 0 : vxlan_routing_manager_.reset();
437 0 : hbf_handler_.reset();
438 0 : }
439 :
440 0 : void OperDB::DeleteRoutes() {
441 0 : agent_->vrf_table()->DeleteRoutes();
442 0 : }
|