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-06-11 01:56:02 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             :  */
       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 : }

Generated by: LCOV version 1.14