LCOV - code coverage report
Current view: top level - vnsw/agent/oper - operdb_init.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 226 230 98.3 %
Date: 2026-11-09 02:10:49 Functions: 11 11 100.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.14