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 4 : T *DBTableCreate(DB *db, Agent *agent, OperDB *oper,
71 : const std::string &db_name) {
72 4 : DB::RegisterFactory(db_name, &T::CreateTable);
73 4 : T *table = static_cast<T *>(db->CreateTable(db_name));
74 4 : assert(table);
75 4 : table->set_agent(agent);
76 4 : return table;
77 : }
78 :
79 2 : void OperDB::CreateDBTables(DB *db) {
80 2 : DB::RegisterFactory("db.interface.0", &InterfaceTable::CreateTable);
81 2 : DB::RegisterFactory("db.nexthop.0", &NextHopTable::CreateTable);
82 2 : DB::RegisterFactory("db.crypttunnel.0",
83 : boost::bind(&CryptTunnelTable::CreateTable,
84 : agent_, _1, _2));
85 2 : DB::RegisterFactory("uc.route.0",
86 : &InetUnicastAgentRouteTable::CreateTable);
87 2 : DB::RegisterFactory("uc.route.3",
88 : &InetUnicastAgentRouteTable::CreateTable);
89 2 : DB::RegisterFactory("mc.route.0",
90 : &Inet4MulticastAgentRouteTable::CreateTable);
91 2 : DB::RegisterFactory("evpn.route.0", &EvpnAgentRouteTable::CreateTable);
92 2 : DB::RegisterFactory("l2.route.0", &BridgeAgentRouteTable::CreateTable);
93 2 : DB::RegisterFactory("uc.route6.0",
94 : &InetUnicastAgentRouteTable::CreateTable);
95 2 : DB::RegisterFactory("db.vrf.0", &VrfTable::CreateTable);
96 2 : DB::RegisterFactory("db.vn.0", &VnTable::CreateTable);
97 2 : DB::RegisterFactory("db.vm.0", &VmTable::CreateTable);
98 2 : DB::RegisterFactory("db.sg.0", &SgTable::CreateTable);
99 2 : DB::RegisterFactory("db.tag.0", &TagTable::CreateTable);
100 2 : DB::RegisterFactory("db.mpls.0", &MplsTable::CreateTable);
101 2 : DB::RegisterFactory("db.acl.0", &AclTable::CreateTable);
102 2 : DB::RegisterFactory("db.mirror_table.0", &MirrorTable::CreateTable);
103 2 : DB::RegisterFactory("db.vrf_assign.0", &VrfAssignTable::CreateTable);
104 2 : DB::RegisterFactory("db.vxlan.0", &VxLanTable::CreateTable);
105 2 : DB::RegisterFactory("db.service-instance.0",
106 : &ServiceInstanceTable::CreateTable);
107 2 : DB::RegisterFactory("db.physical_devices.0",
108 : &PhysicalDeviceTable::CreateTable);
109 2 : DB::RegisterFactory("db.healthcheck.0",
110 : boost::bind(&HealthCheckTable::CreateTable,
111 : agent_, _1, _2));
112 2 : DB::RegisterFactory("db.qos_queue.0",
113 : boost::bind(&QosQueueTable::CreateTable,
114 : agent_, _1, _2));
115 2 : DB::RegisterFactory("db.forwardingclass.0",
116 : boost::bind(&ForwardingClassTable::CreateTable,
117 : agent_, _1, _2));
118 2 : DB::RegisterFactory("db.qos_config.0",
119 : boost::bind(&AgentQosConfigTable::CreateTable,
120 : agent_, _1, _2));
121 2 : DB::RegisterFactory("db.bridge_domain.0",
122 : boost::bind(&BridgeDomainTable::CreateTable,
123 : agent_, _1, _2));
124 2 : DB::RegisterFactory("db.security_logging_object.0",
125 : boost::bind(&SecurityLoggingObjectTable::CreateTable,
126 : agent_, _1, _2));
127 2 : DB::RegisterFactory("db.policy_set.0", &PolicySetTable::CreateTable);
128 2 : DB::RegisterFactory("db.multicast_policy.0",
129 : &MulticastPolicyTable::CreateTable);
130 :
131 : InterfaceTable *intf_table;
132 2 : intf_table = static_cast<InterfaceTable *>(db->CreateTable("db.interface.0"));
133 2 : assert(intf_table);
134 2 : agent_->set_interface_table(intf_table);
135 2 : intf_table->Init(this);
136 2 : intf_table->set_agent(agent_);
137 :
138 : // Allocate Range to be used for MetaDataIPAllocator
139 2 : agent_->set_metadata_ip_allocator(
140 2 : new MetaDataIpAllocator(agent_, 1, max_linklocal_addresses - 1));
141 2 : agent_->set_metadata_ip6_allocator(
142 2 : new MetaDataIpAllocator(agent_, 1, max_linklocal_addresses - 1));
143 :
144 : HealthCheckTable *hc_table;
145 : hc_table =
146 2 : static_cast<HealthCheckTable *>(db->CreateTable("db.healthcheck.0"));
147 2 : assert(hc_table);
148 2 : agent_->set_health_check_table(hc_table);
149 :
150 : CryptTunnelTable *crypt_tunnel_table;
151 2 : crypt_tunnel_table = static_cast<CryptTunnelTable *>(db->CreateTable("db.crypttunnel.0"));
152 2 : assert(crypt_tunnel_table);
153 2 : agent_->set_crypt_tunnel_table(crypt_tunnel_table);
154 :
155 : NextHopTable *nh_table;
156 2 : nh_table = static_cast<NextHopTable *>(db->CreateTable("db.nexthop.0"));
157 2 : assert(nh_table);
158 2 : agent_->set_nexthop_table(nh_table);
159 2 : nh_table->set_agent(agent_);
160 :
161 : VrfTable *vrf_table;
162 2 : vrf_table = static_cast<VrfTable *>(db->CreateTable("db.vrf.0"));
163 2 : assert(vrf_table);
164 2 : agent_->set_vrf_table(vrf_table);
165 2 : vrf_table->set_agent(agent_);
166 :
167 : VmTable *vm_table;
168 2 : vm_table = static_cast<VmTable *>(db->CreateTable("db.vm.0"));
169 2 : assert(vm_table);
170 2 : agent_->set_vm_table(vm_table);
171 2 : vm_table->set_agent(agent_);
172 :
173 : SgTable *sg_table;
174 2 : sg_table = static_cast<SgTable *>(db->CreateTable("db.sg.0"));
175 2 : assert(sg_table);
176 2 : agent_->set_sg_table(sg_table);
177 2 : sg_table->set_agent(agent_);
178 :
179 : TagTable *tag_table;
180 2 : tag_table = static_cast<TagTable *>(db->CreateTable("db.tag.0"));
181 2 : assert(tag_table);
182 2 : agent_->set_tag_table(tag_table);
183 2 : tag_table->set_agent(agent_);
184 :
185 : VnTable *vn_table;
186 2 : vn_table = static_cast<VnTable *>(db->CreateTable("db.vn.0"));
187 2 : assert(vn_table);
188 2 : agent_->set_vn_table(vn_table);
189 2 : vn_table->set_agent(agent_);
190 :
191 : MplsTable *mpls_table;
192 2 : mpls_table = static_cast<MplsTable *>(db->CreateTable("db.mpls.0"));
193 2 : assert(mpls_table);
194 2 : agent_->set_mpls_table(mpls_table);
195 2 : mpls_table->set_agent(agent_);
196 2 : mpls_table->ReserveLabel(0, MplsTable::kStartLabel - 1);
197 :
198 : AclTable *acl_table;
199 2 : acl_table = static_cast<AclTable *>(db->CreateTable("db.acl.0"));
200 2 : assert(acl_table);
201 2 : agent_->set_acl_table(acl_table);
202 2 : acl_table->set_agent(agent_);
203 :
204 : MirrorTable *mirror_table;
205 : mirror_table = static_cast<MirrorTable *>
206 2 : (db->CreateTable("db.mirror_table.0"));
207 2 : assert(mirror_table);
208 2 : agent_->set_mirror_table(mirror_table);
209 2 : mirror_table->set_agent(agent_);
210 2 : mirror_table->Initialize();
211 :
212 : VrfAssignTable *vassign_table = static_cast<VrfAssignTable *>
213 2 : (db->CreateTable("db.vrf_assign.0"));
214 2 : assert(vassign_table);
215 2 : agent_->set_vrf_assign_table(vassign_table);
216 2 : vassign_table->set_agent(agent_);
217 :
218 : PolicySetTable *policy_set =
219 2 : static_cast<PolicySetTable *>(db->CreateTable("db.policy_set.0"));
220 2 : assert(policy_set);
221 2 : agent_->set_policy_set_table(policy_set);
222 2 : policy_set->set_agent(agent_);
223 :
224 2 : domain_config_.reset(new DomainConfig(agent_));
225 :
226 : VxLanTable *vxlan_table;
227 2 : vxlan_table = static_cast<VxLanTable *>(db->CreateTable("db.vxlan.0"));
228 2 : assert(vxlan_table);
229 2 : agent_->set_vxlan_table(vxlan_table);
230 2 : vxlan_table->set_agent(agent_);
231 2 : vxlan_table->Initialize();
232 :
233 : QosQueueTable *qos_queue_table;
234 : qos_queue_table =
235 2 : static_cast<QosQueueTable *>(db->CreateTable("db.qos_queue.0"));
236 2 : agent_->set_qos_queue_table(qos_queue_table);
237 :
238 : ForwardingClassTable *forwarding_class_table;
239 : forwarding_class_table = static_cast<ForwardingClassTable *>(
240 2 : db->CreateTable("db.forwardingclass.0"));
241 2 : agent_->set_forwarding_class_table(forwarding_class_table);
242 :
243 : SecurityLoggingObjectTable *slo_table;
244 : slo_table = static_cast<SecurityLoggingObjectTable *>(
245 2 : db->CreateTable("db.security_logging_object.0"));
246 2 : agent_->set_slo_table(slo_table);
247 :
248 : AgentQosConfigTable *qos_config_table;
249 : qos_config_table =
250 2 : static_cast<AgentQosConfigTable *>(db->CreateTable("db.qos_config.0"));
251 2 : agent_->set_qos_config_table(qos_config_table);
252 :
253 : BridgeDomainTable *bd_table;
254 : bd_table =
255 2 : static_cast<BridgeDomainTable *>(db->CreateTable("db.bridge_domain.0"));
256 2 : assert(bd_table);
257 2 : agent_->set_bridge_domain_table(bd_table);
258 :
259 : MulticastPolicyTable *mp_table;
260 : mp_table = static_cast<MulticastPolicyTable *>(
261 2 : db->CreateTable("db.multicast_policy.0"));
262 2 : assert(mp_table);
263 2 : agent_->set_mp_table(mp_table);
264 2 : mp_table->set_agent(agent_);
265 :
266 2 : acl_table->ListenerInit();
267 :
268 : route_walk_manager_ =
269 2 : std::unique_ptr<AgentRouteWalkerManager>(new AgentRouteWalkerManager(agent_));
270 2 : multicast_ = std::unique_ptr<MulticastHandler>(new MulticastHandler(agent_));
271 2 : global_vrouter_ = std::unique_ptr<GlobalVrouter> (new GlobalVrouter(agent_));
272 : route_preference_module_ =
273 2 : std::unique_ptr<PathPreferenceModule>(new PathPreferenceModule(agent_));
274 2 : route_preference_module_->Init();
275 :
276 : ServiceInstanceTable *si_table =
277 : static_cast<ServiceInstanceTable *>(
278 2 : db->CreateTable("db.service-instance.0"));
279 2 : agent_->set_service_instance_table(si_table);
280 2 : si_table->Initialize(agent_->cfg()->cfg_graph(), dependency_manager_.get());
281 2 : si_table->set_agent(agent_);
282 :
283 : PhysicalDeviceTable *dev_table =
284 2 : DBTableCreate<PhysicalDeviceTable>(db, agent_, this,
285 : "db.physical_devices.0");
286 2 : agent_->set_physical_device_table(dev_table);
287 :
288 : PhysicalDeviceVnTable *dev_vn_table =
289 2 : DBTableCreate<PhysicalDeviceVnTable>(db, agent_, this,
290 : "db.physical_device_vn.0");
291 2 : agent_->set_physical_device_vn_table(dev_vn_table);
292 2 : profile_.reset(new AgentProfile(agent_, true));
293 :
294 2 : bgp_as_a_service_ = std::unique_ptr<BgpAsAService>(new BgpAsAService(agent_));
295 : bgp_router_config_ =
296 2 : std::unique_ptr<BgpRouterConfig> (new BgpRouterConfig(agent_));
297 :
298 2 : vrouter_ = std::unique_ptr<VRouter> (new VRouter(agent_));
299 : global_qos_config_ =
300 2 : std::unique_ptr<GlobalQosConfig>(new GlobalQosConfig(agent_));
301 : global_system_config_ =
302 2 : std::unique_ptr<GlobalSystemConfig>(new GlobalSystemConfig(agent_));
303 4 : network_ipam_ = std::unique_ptr<OperNetworkIpam>
304 4 : (new OperNetworkIpam(agent_, domain_config_.get()));
305 4 : virtual_dns_ = std::unique_ptr<OperVirtualDns>
306 4 : (new OperVirtualDns(agent_, domain_config_.get()));
307 2 : tsn_elector_ = std::unique_ptr<TsnElector>(new TsnElector(agent_));
308 4 : vxlan_routing_manager_= std::unique_ptr<VxlanRoutingManager>
309 4 : (new VxlanRoutingManager(agent_));
310 4 : hbf_handler_= std::unique_ptr<HBFHandler>
311 4 : (new HBFHandler(agent_));
312 2 : }
313 :
314 2 : void OperDB::Init() {
315 2 : dependency_manager_->Initialize(agent());
316 :
317 : // Unit tests may not initialize the agent configuration parameters.
318 2 : std::string netns_cmd;
319 2 : std::string docker_cmd;
320 2 : int netns_workers = -1;
321 2 : int netns_timeout = -1;
322 2 : if (agent_->params()) {
323 2 : netns_cmd = agent_->params()->si_netns_command();
324 2 : docker_cmd = agent_->params()->si_docker_command();
325 2 : netns_workers = agent_->params()->si_netns_workers();
326 2 : netns_timeout = agent_->params()->si_netns_timeout();
327 : }
328 2 : instance_manager_->Initialize(agent_->db(), netns_cmd,
329 : docker_cmd, netns_workers, netns_timeout);
330 2 : if (nexthop_manager_.get()) {
331 0 : nexthop_manager_->Initialize(agent_->db());
332 : }
333 :
334 2 : if (agent_sandesh_manager_.get()) {
335 2 : agent_sandesh_manager_->Init();
336 : }
337 :
338 2 : agent_->config_manager()->Init();
339 2 : domain_config_->Init();
340 2 : }
341 :
342 2 : void OperDB::InitDone() {
343 2 : profile_->InitDone();
344 2 : }
345 :
346 2 : void OperDB::RegisterDBClients() {
347 2 : IFMapDependencyManager *mgr = agent_->oper_db()->dependency_manager();
348 2 : agent_->physical_device_table()->RegisterDBClients(mgr);
349 2 : agent_->interface_table()->RegisterDBClients(mgr);
350 :
351 2 : multicast_.get()->Register();
352 2 : global_vrouter_.get()->CreateDBClients();
353 2 : route_leak_manager_.reset(new RouteLeakManager(agent_));
354 2 : tsn_elector_.get()->Register();
355 2 : vxlan_routing_manager_.get()->Register();
356 2 : hbf_handler_.get()->Register();
357 2 : }
358 :
359 2 : OperDB::OperDB(Agent *agent)
360 2 : : agent_(agent),
361 2 : dependency_manager_(
362 : AgentStaticObjectFactory::Create<IFMapDependencyManager>(
363 : agent->db(), agent->cfg()->cfg_graph())),
364 2 : instance_manager_(
365 4 : AgentStaticObjectFactory::Create<InstanceManager>(agent)) {
366 4 : if (agent_->params() &&
367 4 : 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 2 : agent_sandesh_manager_.reset(new AgentSandeshManager(agent));
373 2 : }
374 :
375 4 : OperDB::~OperDB() {
376 4 : }
377 :
378 2 : void OperDB::Shutdown() {
379 2 : agent_->mpls_table()->FreeReserveLabel(0, MplsTable::kStartLabel - 1);
380 2 : instance_manager_->Terminate();
381 2 : if (nexthop_manager_.get()) {
382 0 : nexthop_manager_->Terminate();
383 : }
384 2 : dependency_manager_->Terminate();
385 2 : global_vrouter_.reset();
386 :
387 2 : bgp_router_config_.reset();
388 :
389 2 : global_qos_config_.reset();
390 2 : global_system_config_.reset();
391 :
392 2 : route_preference_module_->Shutdown();
393 2 : multicast_->Shutdown();
394 2 : multicast_->Terminate();
395 2 : route_walk_manager_->Shutdown();
396 2 : tsn_elector_->Shutdown();
397 2 : vxlan_routing_manager_->Shutdown();
398 2 : hbf_handler_->Terminate();
399 :
400 2 : if (agent_sandesh_manager_.get()) {
401 2 : 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 2 : route_preference_module_->Shutdown();
420 2 : domain_config_->Terminate();
421 2 : if (vrouter_.get()) {
422 2 : vrouter_->Shutdown();
423 2 : vrouter_.reset();
424 : }
425 2 : if (agent()->mirror_table()) {
426 2 : agent()->mirror_table()->Shutdown();
427 : }
428 :
429 2 : if (agent()->vxlan_table()) {
430 2 : agent()->vxlan_table()->Shutdown();
431 : }
432 :
433 : //route_walk_manager_.reset();
434 2 : profile_.reset();
435 2 : route_leak_manager_.reset();
436 2 : vxlan_routing_manager_.reset();
437 2 : hbf_handler_.reset();
438 2 : }
439 :
440 2 : void OperDB::DeleteRoutes() {
441 2 : agent_->vrf_table()->DeleteRoutes();
442 2 : }
|