From 98cb2a6abe3803a9697282ebc29ac55f06d08ddd Mon Sep 17 00:00:00 2001 From: Prabhat Aravind Date: Wed, 2 Oct 2024 18:15:12 +0000 Subject: [PATCH 1/8] [orchagent/dash]: Changes to support gNMI feedback for DASH objects This PR makes the following changes: * Write result of SAI API call to APP_STATE_DB for DASH objects * Instantiate DpuOrchDaemon for smartswitch DPUs. Signed-off-by: Prabhat Aravind --- orchagent/dash/dashaclorch.cpp | 2 +- orchagent/dash/dashaclorch.h | 2 +- orchagent/dash/dashorch.cpp | 29 +++++++- orchagent/dash/dashorch.h | 10 ++- orchagent/dash/dashrouteorch.cpp | 17 ++++- orchagent/dash/dashrouteorch.h | 5 +- orchagent/dash/dashvnetorch.cpp | 14 +++- orchagent/dash/dashvnetorch.h | 4 +- orchagent/main.cpp | 16 ++++- orchagent/orchdaemon.cpp | 99 ++++++++++++++++----------- orchagent/orchdaemon.h | 12 +++- orchagent/saihelper.cpp | 38 ++++++++++ orchagent/saihelper.h | 3 + tests/dash/test_dash_route_group.py | 2 + tests/mock_tests/database_config.json | 10 +++ tests/mock_tests/mock_orch_test.cpp | 8 ++- tests/mock_tests/mock_orch_test.h | 2 + 17 files changed, 216 insertions(+), 57 deletions(-) diff --git a/orchagent/dash/dashaclorch.cpp b/orchagent/dash/dashaclorch.cpp index 98bce18826..86f2ced965 100644 --- a/orchagent/dash/dashaclorch.cpp +++ b/orchagent/dash/dashaclorch.cpp @@ -74,7 +74,7 @@ inline void lexical_convert(const string &buffer, DashAclStage &stage) } -DashAclOrch::DashAclOrch(DBConnector *db, const vector &tables, DashOrch *dash_orch, ZmqServer *zmqServer) : +DashAclOrch::DashAclOrch(DBConnector *db, const vector &tables, DashOrch *dash_orch, DBConnector *app_state_db, ZmqServer *zmqServer) : ZmqOrch(db, tables, zmqServer), m_dash_orch(dash_orch), m_group_mgr(db, dash_orch, this), diff --git a/orchagent/dash/dashaclorch.h b/orchagent/dash/dashaclorch.h index b3859c5c2d..91d21c5c72 100644 --- a/orchagent/dash/dashaclorch.h +++ b/orchagent/dash/dashaclorch.h @@ -35,7 +35,7 @@ class DashAclOrch : public ZmqOrch public: using TaskArgs = std::vector; - DashAclOrch(swss::DBConnector *db, const std::vector &tables, DashOrch *dash_orch, swss::ZmqServer *zmqServer); + DashAclOrch(swss::DBConnector *db, const std::vector &tables, DashOrch *dash_orch, swss::DBConnector *app_state_db, swss::ZmqServer *zmqServer); DashAclGroupMgr& getDashAclGroupMgr(); DashTagMgr& getDashAclTagMgr(); diff --git a/orchagent/dash/dashorch.cpp b/orchagent/dash/dashorch.cpp index 0940cd4cf1..a450857885 100644 --- a/orchagent/dash/dashorch.cpp +++ b/orchagent/dash/dashorch.cpp @@ -46,7 +46,7 @@ static std::unordered_map sMacOverride { "dst_mac", SAI_DASH_ENI_MAC_OVERRIDE_TYPE_DST_MAC} }; -DashOrch::DashOrch(DBConnector *db, vector &tableName, ZmqServer *zmqServer) : +DashOrch::DashOrch(DBConnector *db, vector &tableName, DBConnector *app_state_db, ZmqServer *zmqServer) : ZmqOrch(db, tableName, zmqServer), m_eni_stat_manager(ENI_STAT_COUNTER_FLEX_COUNTER_GROUP, StatsMode::READ, ENI_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, false) { @@ -55,6 +55,11 @@ DashOrch::DashOrch(DBConnector *db, vector &tableName, ZmqServer *zmqSer m_asic_db = std::shared_ptr(new DBConnector("ASIC_DB", 0)); m_counter_db = std::shared_ptr(new DBConnector("COUNTERS_DB", 0)); m_eni_name_table = std::unique_ptr(new Table(m_counter_db.get(), COUNTERS_ENI_NAME_MAP)); + dash_eni_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_ENI_TABLE_NAME)); + dash_eni_route_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_ENI_ROUTE_TABLE_NAME)); + dash_qos_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_QOS_TABLE_NAME)); + dash_appliance_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_APPLIANCE_TABLE_NAME)); + dash_routing_type_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_ROUTING_TYPE_TABLE_NAME)); if (gTraditionalFlexCounter) { @@ -265,6 +270,7 @@ void DashOrch::doTaskApplianceTable(ConsumerBase& consumer) KeyOpFieldsValuesTuple t = it->second; string appliance_id = kfvKey(t); string op = kfvOp(t); + uint32_t result = DASH_RESULT_SUCCESS; if (op == SET_COMMAND) { @@ -283,14 +289,17 @@ void DashOrch::doTaskApplianceTable(ConsumerBase& consumer) } else { + result = DASH_RESULT_FAILURE; it++; } + writeResultToDB(dash_appliance_result_table_, appliance_id, result); } else if (op == DEL_COMMAND) { if (removeApplianceEntry(appliance_id)) { it = consumer.m_toSync.erase(it); + removeResultFromDB(dash_appliance_result_table_, appliance_id); } else { @@ -348,6 +357,7 @@ void DashOrch::doTaskRoutingTypeTable(ConsumerBase& consumer) string routing_type_str = kfvKey(t); string op = kfvOp(t); dash::route_type::RoutingType routing_type; + uint32_t result = DASH_RESULT_SUCCESS; std::transform(routing_type_str.begin(), routing_type_str.end(), routing_type_str.begin(), ::toupper); routing_type_str = "ROUTING_TYPE_" + routing_type_str; @@ -376,14 +386,17 @@ void DashOrch::doTaskRoutingTypeTable(ConsumerBase& consumer) } else { + result = DASH_RESULT_FAILURE; it++; } + writeResultToDB(dash_routing_type_result_table_, routing_type_str, result); } else if (op == DEL_COMMAND) { if (removeRoutingTypeEntry(routing_type)) { it = consumer.m_toSync.erase(it); + removeResultFromDB(dash_routing_type_result_table_, routing_type_str); } else { @@ -677,14 +690,13 @@ void DashOrch::doTaskEniTable(ConsumerBase& consumer) { SWSS_LOG_ENTER(); - const auto& tn = consumer.getTableName(); - auto it = consumer.m_toSync.begin(); while (it != consumer.m_toSync.end()) { auto t = it->second; string eni = kfvKey(t); string op = kfvOp(t); + uint32_t result = DASH_RESULT_SUCCESS; if (op == SET_COMMAND) { EniEntry entry; @@ -702,14 +714,17 @@ void DashOrch::doTaskEniTable(ConsumerBase& consumer) } else { + result = DASH_RESULT_FAILURE; it++; } + writeResultToDB(dash_eni_result_table_, eni, result); } else if (op == DEL_COMMAND) { if (removeEni(eni)) { it = consumer.m_toSync.erase(it); + removeResultFromDB(dash_eni_result_table_, eni); } else { @@ -761,6 +776,7 @@ void DashOrch::doTaskQosTable(ConsumerBase& consumer) KeyOpFieldsValuesTuple t = it->second; string qos_name = kfvKey(t); string op = kfvOp(t); + uint32_t result = DASH_RESULT_SUCCESS; if (op == SET_COMMAND) { @@ -779,14 +795,17 @@ void DashOrch::doTaskQosTable(ConsumerBase& consumer) } else { + result = DASH_RESULT_FAILURE; it++; } + writeResultToDB(dash_qos_result_table_, qos_name, result); } else if (op == DEL_COMMAND) { if (removeQosEntry(qos_name)) { it = consumer.m_toSync.erase(it); + removeResultFromDB(dash_qos_result_table_, qos_name); } else { @@ -909,6 +928,7 @@ void DashOrch::doTaskEniRouteTable(ConsumerBase& consumer) KeyOpFieldsValuesTuple t = it->second; string eni = kfvKey(t); string op = kfvOp(t); + uint32_t result = DASH_RESULT_SUCCESS; if (op == SET_COMMAND) { @@ -927,14 +947,17 @@ void DashOrch::doTaskEniRouteTable(ConsumerBase& consumer) } else { + result = DASH_RESULT_FAILURE; it++; } + writeResultToDB(dash_eni_route_result_table_, eni, result); } else if (op == DEL_COMMAND) { if (removeEniRoute(eni)) { it = consumer.m_toSync.erase(it); + removeResultFromDB(dash_eni_route_result_table_, eni); } else { diff --git a/orchagent/dash/dashorch.h b/orchagent/dash/dashorch.h index ac607a27e9..828a91ccf0 100644 --- a/orchagent/dash/dashorch.h +++ b/orchagent/dash/dashorch.h @@ -28,6 +28,9 @@ #define ENI_STAT_COUNTER_FLEX_COUNTER_GROUP "ENI_STAT_COUNTER" #define ENI_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS 10000 +#define DASH_RESULT_SUCCESS 0 +#define DASH_RESULT_FAILURE 1 + struct EniEntry { sai_object_id_t eni_id; @@ -49,7 +52,7 @@ typedef std::map EniRouteTable; class DashOrch : public ZmqOrch { public: - DashOrch(swss::DBConnector *db, std::vector &tables, swss::ZmqServer *zmqServer); + DashOrch(swss::DBConnector *db, std::vector &tables, swss::DBConnector *app_state_db, swss::ZmqServer *zmqServer); const EniEntry *getEni(const std::string &eni) const; bool getRouteTypeActions(dash::route_type::RoutingType routing_type, dash::route_type::RouteType& route_type); void handleFCStatusUpdate(bool is_enabled); @@ -61,6 +64,11 @@ class DashOrch : public ZmqOrch EniTable eni_entries_; QosTable qos_entries_; EniRouteTable eni_route_entries_; + std::unique_ptr dash_eni_result_table_; + std::unique_ptr dash_qos_result_table_; + std::unique_ptr dash_appliance_result_table_; + std::unique_ptr dash_eni_route_result_table_; + std::unique_ptr dash_routing_type_result_table_; void doTask(ConsumerBase &consumer); void doTaskApplianceTable(ConsumerBase &consumer); void doTaskRoutingTypeTable(ConsumerBase &consumer); diff --git a/orchagent/dash/dashrouteorch.cpp b/orchagent/dash/dashrouteorch.cpp index 06de34a05d..121cd00c0a 100644 --- a/orchagent/dash/dashrouteorch.cpp +++ b/orchagent/dash/dashrouteorch.cpp @@ -42,13 +42,16 @@ static std::unordered_map &tableName, DashOrch *dash_orch, ZmqServer *zmqServer) : +DashRouteOrch::DashRouteOrch(DBConnector *db, vector &tableName, DashOrch *dash_orch, DBConnector *app_state_db, ZmqServer *zmqServer) : outbound_routing_bulker_(sai_dash_outbound_routing_api, gMaxBulkSize), inbound_routing_bulker_(sai_dash_inbound_routing_api, gMaxBulkSize), ZmqOrch(db, tableName, zmqServer), dash_orch_(dash_orch) { SWSS_LOG_ENTER(); + dash_route_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_ROUTE_TABLE_NAME)); + dash_route_rule_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_ROUTE_RULE_TABLE_NAME)); + dash_route_group_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_ROUTE_GROUP_TABLE_NAME)); } bool DashRouteOrch::addOutboundRouting(const string& key, OutboundRoutingBulkContext& ctxt) @@ -342,6 +345,7 @@ void DashRouteOrch::doTaskRouteTable(ConsumerBase& consumer) KeyOpFieldsValuesTuple t = it_prev->second; string key = kfvKey(t); string op = kfvOp(t); + uint32_t result = DASH_RESULT_SUCCESS; auto found = toBulk.find(make_pair(key, op)); if (found == toBulk.end()) { @@ -365,14 +369,17 @@ void DashRouteOrch::doTaskRouteTable(ConsumerBase& consumer) } else { + result = DASH_RESULT_FAILURE; it_prev++; } + writeResultToDB(dash_route_result_table_, key, result); } else if (op == DEL_COMMAND) { if (removeOutboundRoutingPost(key, ctxt)) { it_prev = consumer.m_toSync.erase(it_prev); + removeResultFromDB(dash_route_result_table_, key); } else { @@ -621,6 +628,7 @@ void DashRouteOrch::doTaskRouteRuleTable(ConsumerBase& consumer) KeyOpFieldsValuesTuple t = it_prev->second; string key = kfvKey(t); string op = kfvOp(t); + uint32_t result = DASH_RESULT_SUCCESS; auto found = toBulk.find(make_pair(key, op)); if (found == toBulk.end()) { @@ -644,14 +652,17 @@ void DashRouteOrch::doTaskRouteRuleTable(ConsumerBase& consumer) } else { + result = DASH_RESULT_FAILURE; it_prev++; } + writeResultToDB(dash_route_rule_result_table_, key, result); } else if (op == DEL_COMMAND) { if (removeInboundRoutingPost(key, ctxt)) { it_prev = consumer.m_toSync.erase(it_prev); + removeResultFromDB(dash_route_rule_result_table_, key); } else { @@ -788,6 +799,7 @@ void DashRouteOrch::doTaskRouteGroupTable(ConsumerBase& consumer) auto t = it->second; string route_group = kfvKey(t); string op = kfvOp(t); + uint32_t result = DASH_RESULT_SUCCESS; if (op == SET_COMMAND) { dash::route_group::RouteGroup entry; @@ -804,14 +816,17 @@ void DashRouteOrch::doTaskRouteGroupTable(ConsumerBase& consumer) } else { + result = DASH_RESULT_FAILURE; it++; } + writeResultToDB(dash_route_group_result_table_, route_group, result, entry.version()); } else if (op == DEL_COMMAND) { if (removeRouteGroup(route_group)) { it = consumer.m_toSync.erase(it); + removeResultFromDB(dash_route_group_result_table_, route_group); } else { diff --git a/orchagent/dash/dashrouteorch.h b/orchagent/dash/dashrouteorch.h index 0813de7e21..cf9c805bf1 100644 --- a/orchagent/dash/dashrouteorch.h +++ b/orchagent/dash/dashrouteorch.h @@ -77,7 +77,7 @@ struct InboundRoutingBulkContext class DashRouteOrch : public ZmqOrch { public: - DashRouteOrch(swss::DBConnector *db, std::vector &tables, DashOrch *dash_orch, swss::ZmqServer *zmqServer); + DashRouteOrch(swss::DBConnector *db, std::vector &tables, DashOrch *dash_orch, swss::DBConnector *app_state_db, swss::ZmqServer *zmqServer); sai_object_id_t getRouteGroupOid(const std::string& route_group) const; void bindRouteGroup(const std::string& route_group); void unbindRouteGroup(const std::string& route_group); @@ -91,6 +91,9 @@ class DashRouteOrch : public ZmqOrch DashOrch *dash_orch_; std::unordered_map route_group_oid_map_; std::unordered_map route_group_bind_count_; + std::unique_ptr dash_route_result_table_; + std::unique_ptr dash_route_rule_result_table_; + std::unique_ptr dash_route_group_result_table_; void doTask(ConsumerBase &consumer); void doTaskRouteTable(ConsumerBase &consumer); diff --git a/orchagent/dash/dashvnetorch.cpp b/orchagent/dash/dashvnetorch.cpp index 6ce7a64880..2d63c88438 100644 --- a/orchagent/dash/dashvnetorch.cpp +++ b/orchagent/dash/dashvnetorch.cpp @@ -37,13 +37,15 @@ extern size_t gMaxBulkSize; extern CrmOrch *gCrmOrch; extern Directory gDirectory; -DashVnetOrch::DashVnetOrch(DBConnector *db, vector &tables, ZmqServer *zmqServer) : +DashVnetOrch::DashVnetOrch(DBConnector *db, vector &tables, DBConnector *app_state_db, ZmqServer *zmqServer) : vnet_bulker_(sai_dash_vnet_api, gSwitchId, gMaxBulkSize), outbound_ca_to_pa_bulker_(sai_dash_outbound_ca_to_pa_api, gMaxBulkSize), pa_validation_bulker_(sai_dash_pa_validation_api, gMaxBulkSize), ZmqOrch(db, tables, zmqServer) { SWSS_LOG_ENTER(); + dash_vnet_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_VNET_TABLE_NAME)); + dash_vnet_map_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_VNET_MAPPING_TABLE_NAME)); } bool DashVnetOrch::addVnet(const string& vnet_name, DashVnetBulkContext& ctxt) @@ -233,6 +235,7 @@ void DashVnetOrch::doTaskVnetTable(ConsumerBase& consumer) string key = kfvKey(t); string op = kfvOp(t); + uint32_t result = DASH_RESULT_SUCCESS; auto found = toBulk.find(make_pair(key, op)); if (found == toBulk.end()) { @@ -257,8 +260,10 @@ void DashVnetOrch::doTaskVnetTable(ConsumerBase& consumer) } else { + result = DASH_RESULT_FAILURE; it_prev++; } + writeResultToDB(dash_vnet_result_table_, key, result); } else if (op == DEL_COMMAND) { @@ -270,6 +275,7 @@ void DashVnetOrch::doTaskVnetTable(ConsumerBase& consumer) if (removeVnetPost(key, vnet_ctxt)) { it_prev = consumer.m_toSync.erase(it_prev); + removeResultFromDB(dash_vnet_result_table_, key); } else { @@ -291,7 +297,7 @@ bool DashVnetOrch::addOutboundCaToPa(const string& key, VnetMapBulkContext& ctxt auto& object_statuses = ctxt.outbound_ca_to_pa_object_statuses; sai_attribute_t outbound_ca_to_pa_attr; vector outbound_ca_to_pa_attrs; - + DashOrch* dash_orch = gDirectory.get(); dash::route_type::RouteType route_type_actions; if (!dash_orch->getRouteTypeActions(ctxt.metadata.routing_type(), route_type_actions)) @@ -786,6 +792,7 @@ void DashVnetOrch::doTaskVnetMapTable(ConsumerBase& consumer) KeyOpFieldsValuesTuple t = it_prev->second; string key = kfvKey(t); string op = kfvOp(t); + uint32_t result = DASH_RESULT_SUCCESS; auto found = toBulk.find(make_pair(key, op)); if (found == toBulk.end()) { @@ -810,14 +817,17 @@ void DashVnetOrch::doTaskVnetMapTable(ConsumerBase& consumer) } else { + result = DASH_RESULT_FAILURE; it_prev++; } + writeResultToDB(dash_vnet_map_result_table_, key, result); } else if (op == DEL_COMMAND) { if (removeVnetMapPost(key, ctxt)) { it_prev = consumer.m_toSync.erase(it_prev); + removeResultFromDB(dash_vnet_map_result_table_, key); } else { diff --git a/orchagent/dash/dashvnetorch.h b/orchagent/dash/dashvnetorch.h index 26d4e9d219..41457fcf6c 100644 --- a/orchagent/dash/dashvnetorch.h +++ b/orchagent/dash/dashvnetorch.h @@ -74,7 +74,7 @@ struct VnetMapBulkContext class DashVnetOrch : public ZmqOrch { public: - DashVnetOrch(swss::DBConnector *db, std::vector &tables, swss::ZmqServer *zmqServer); + DashVnetOrch(swss::DBConnector *db, std::vector &tables, swss::DBConnector *app_state_db, swss::ZmqServer *zmqServer); private: DashVnetTable vnet_table_; @@ -83,6 +83,8 @@ class DashVnetOrch : public ZmqOrch ObjectBulker vnet_bulker_; EntityBulker outbound_ca_to_pa_bulker_; EntityBulker pa_validation_bulker_; + std::unique_ptr dash_vnet_result_table_; + std::unique_ptr dash_vnet_map_result_table_; void doTask(ConsumerBase &consumer); void doTaskVnetTable(ConsumerBase &consumer); diff --git a/orchagent/main.cpp b/orchagent/main.cpp index 2e84f4ea04..0a5199ab67 100644 --- a/orchagent/main.cpp +++ b/orchagent/main.cpp @@ -822,7 +822,21 @@ int main(int argc, char **argv) } shared_ptr orchDaemon; - if (gMySwitchType != "fabric") + + /* + * Declare shared pointers for dpu specific databases + */ + shared_ptr dpu_app_db; + shared_ptr dpu_app_state_db; + + if (gMySwitchType == "dpu") + { + dpu_app_db = make_shared("DPU_APPL_DB", 0, true); + dpu_app_state_db = make_shared("DPU_APPL_STATE_DB", 0, true); + orchDaemon = make_shared(&appl_db, &config_db, &state_db, chassis_app_db.get(), dpu_app_db.get(), dpu_app_state_db.get(), zmq_server.get()); + } + + else if (gMySwitchType != "fabric") { orchDaemon = make_shared(&appl_db, &config_db, &state_db, chassis_app_db.get(), zmq_server.get()); if (gMySwitchType == "voq") diff --git a/orchagent/orchdaemon.cpp b/orchagent/orchdaemon.cpp index 5b7f1c68f6..8994e35a32 100644 --- a/orchagent/orchdaemon.cpp +++ b/orchagent/orchdaemon.cpp @@ -321,43 +321,6 @@ bool OrchDaemon::init() NvgreTunnelMapOrch *nvgre_tunnel_map_orch = new NvgreTunnelMapOrch(m_configDb, CFG_NVGRE_TUNNEL_MAP_TABLE_NAME); gDirectory.set(nvgre_tunnel_map_orch); - vector dash_vnet_tables = { - APP_DASH_VNET_TABLE_NAME, - APP_DASH_VNET_MAPPING_TABLE_NAME - }; - DashVnetOrch *dash_vnet_orch = new DashVnetOrch(m_applDb, dash_vnet_tables, m_zmqServer); - gDirectory.set(dash_vnet_orch); - - vector dash_tables = { - APP_DASH_APPLIANCE_TABLE_NAME, - APP_DASH_ROUTING_TYPE_TABLE_NAME, - APP_DASH_ENI_TABLE_NAME, - APP_DASH_ENI_ROUTE_TABLE_NAME, - APP_DASH_QOS_TABLE_NAME - }; - - DashOrch *dash_orch = new DashOrch(m_applDb, dash_tables, m_zmqServer); - gDirectory.set(dash_orch); - - vector dash_route_tables = { - APP_DASH_ROUTE_TABLE_NAME, - APP_DASH_ROUTE_RULE_TABLE_NAME, - APP_DASH_ROUTE_GROUP_TABLE_NAME - }; - - DashRouteOrch *dash_route_orch = new DashRouteOrch(m_applDb, dash_route_tables, dash_orch, m_zmqServer); - gDirectory.set(dash_route_orch); - - vector dash_acl_tables = { - APP_DASH_PREFIX_TAG_TABLE_NAME, - APP_DASH_ACL_IN_TABLE_NAME, - APP_DASH_ACL_OUT_TABLE_NAME, - APP_DASH_ACL_GROUP_TABLE_NAME, - APP_DASH_ACL_RULE_TABLE_NAME - }; - DashAclOrch *dash_acl_orch = new DashAclOrch(m_applDb, dash_acl_tables, dash_orch, m_zmqServer); - gDirectory.set(dash_acl_orch); - vector qos_tables = { CFG_TC_TO_QUEUE_MAP_TABLE_NAME, CFG_SCHEDULER_TABLE_NAME, @@ -591,10 +554,6 @@ bool OrchDaemon::init() m_orchList.push_back(mux_st_orch); m_orchList.push_back(nvgre_tunnel_orch); m_orchList.push_back(nvgre_tunnel_map_orch); - m_orchList.push_back(dash_acl_orch); - m_orchList.push_back(dash_vnet_orch); - m_orchList.push_back(dash_route_orch); - m_orchList.push_back(dash_orch); if (m_fabricEnabled) { @@ -1243,3 +1202,61 @@ bool FabricOrchDaemon::init() return true; } + +DpuOrchDaemon::DpuOrchDaemon(DBConnector *applDb, DBConnector *configDb, DBConnector *stateDb, DBConnector *chassisAppDb, DBConnector *dpuAppDb, DBConnector *dpuAppstateDb, ZmqServer *zmqServer) : + OrchDaemon(applDb, configDb, stateDb, chassisAppDb, zmqServer), + m_dpu_appDb(dpuAppDb), + m_dpu_appstateDb(dpuAppstateDb) +{ + SWSS_LOG_ENTER(); + SWSS_LOG_NOTICE("DpuOrchDaemon starting..."); +} + +bool DpuOrchDaemon::init() +{ + SWSS_LOG_NOTICE("DpuOrchDaemon init..."); + OrchDaemon::init(); + vector dash_vnet_tables = { + APP_DASH_VNET_TABLE_NAME, + APP_DASH_VNET_MAPPING_TABLE_NAME + }; + DashVnetOrch *dash_vnet_orch = new DashVnetOrch(m_applDb, dash_vnet_tables, m_dpu_appstateDb, m_zmqServer); + gDirectory.set(dash_vnet_orch); + + vector dash_tables = { + APP_DASH_APPLIANCE_TABLE_NAME, + APP_DASH_ROUTING_TYPE_TABLE_NAME, + APP_DASH_ENI_TABLE_NAME, + APP_DASH_ENI_ROUTE_TABLE_NAME, + APP_DASH_QOS_TABLE_NAME + }; + + DashOrch *dash_orch = new DashOrch(m_applDb, dash_tables, m_dpu_appstateDb, m_zmqServer); + gDirectory.set(dash_orch); + + vector dash_route_tables = { + APP_DASH_ROUTE_TABLE_NAME, + APP_DASH_ROUTE_RULE_TABLE_NAME, + APP_DASH_ROUTE_GROUP_TABLE_NAME + }; + + DashRouteOrch *dash_route_orch = new DashRouteOrch(m_applDb, dash_route_tables, dash_orch, m_dpu_appstateDb, m_zmqServer); + gDirectory.set(dash_route_orch); + + vector dash_acl_tables = { + APP_DASH_PREFIX_TAG_TABLE_NAME, + APP_DASH_ACL_IN_TABLE_NAME, + APP_DASH_ACL_OUT_TABLE_NAME, + APP_DASH_ACL_GROUP_TABLE_NAME, + APP_DASH_ACL_RULE_TABLE_NAME + }; + DashAclOrch *dash_acl_orch = new DashAclOrch(m_applDb, dash_acl_tables, dash_orch, m_dpu_appstateDb, m_zmqServer); + gDirectory.set(dash_acl_orch); + + addOrchList(dash_acl_orch); + addOrchList(dash_vnet_orch); + addOrchList(dash_route_orch); + addOrchList(dash_orch); + + return true; +} diff --git a/orchagent/orchdaemon.h b/orchagent/orchdaemon.h index 8cc75325db..3d3463d6db 100644 --- a/orchagent/orchdaemon.h +++ b/orchagent/orchdaemon.h @@ -103,7 +103,7 @@ class OrchDaemon std::thread ring_thread; -private: +protected: DBConnector *m_applDb; DBConnector *m_configDb; DBConnector *m_stateDb; @@ -135,4 +135,14 @@ class FabricOrchDaemon : public OrchDaemon DBConnector *m_configDb; }; + +class DpuOrchDaemon : public OrchDaemon +{ +public: + DpuOrchDaemon(DBConnector *, DBConnector *, DBConnector *, DBConnector *, DBConnector *, DBConnector *, ZmqServer *); + bool init() override; +private: + DBConnector *m_dpu_appDb; + DBConnector *m_dpu_appstateDb; +}; #endif /* SWSS_ORCHDAEMON_H */ diff --git a/orchagent/saihelper.cpp b/orchagent/saihelper.cpp index 773db489d6..78b6d7e61d 100644 --- a/orchagent/saihelper.cpp +++ b/orchagent/saihelper.cpp @@ -1158,3 +1158,41 @@ std::vector queryAvailableCounterStats(const sai_object_type_t ob } return stat_list; } + +void writeResultToDB(const std::unique_ptr& table, const string& key, + uint32_t res, const string& version) +{ + SWSS_LOG_ENTER(); + + if (!table) + { + SWSS_LOG_WARN("Table passed in is NULL"); + return; + } + + std::vector fvVector; + + fvVector.emplace_back("result", std::to_string(res)); + + if (!version.empty()) + { + fvVector.emplace_back("version", version); + } + + table->set(key, fvVector); + SWSS_LOG_INFO("Wrote result to DB for key %s", key.c_str()); +} + +void removeResultFromDB(const std::unique_ptr& table, const string& key) +{ + SWSS_LOG_ENTER(); + + if (!table) + { + SWSS_LOG_WARN("Table passed in is NULL"); + return; + } + + table->del(key); + SWSS_LOG_INFO("Removed result from DB for key %s", key.c_str()); +} diff --git a/orchagent/saihelper.h b/orchagent/saihelper.h index 0406427059..fab2d9ae91 100644 --- a/orchagent/saihelper.h +++ b/orchagent/saihelper.h @@ -56,3 +56,6 @@ void stopFlexCounterPolling(sai_object_id_t switch_oid, const std::string &key); std::vector queryAvailableCounterStats(const sai_object_type_t); +void writeResultToDB(const std::unique_ptr&, const std::string& key, + uint32_t res, const std::string& version=""); +void removeResultFromDB(const std::unique_ptr& table, const std::string& key); diff --git a/tests/dash/test_dash_route_group.py b/tests/dash/test_dash_route_group.py index f2051a9598..f0d379cd13 100644 --- a/tests/dash/test_dash_route_group.py +++ b/tests/dash/test_dash_route_group.py @@ -15,6 +15,8 @@ APP_DASH_ROUTE_GROUP_TABLE_NAME, ) +DVS_ENV = ["HWSKU=DPU-2P"] +NUM_PORTS = 2 @pytest.fixture(autouse=True) def common_setup_teardown(dash_db: DashDB): diff --git a/tests/mock_tests/database_config.json b/tests/mock_tests/database_config.json index baf705ea23..40a7bd4642 100644 --- a/tests/mock_tests/database_config.json +++ b/tests/mock_tests/database_config.json @@ -76,6 +76,16 @@ "id" : 14, "separator": ":", "instance" : "redis" + }, + "DPU_APPL_DB" : { + "id" : 15, + "separator": ":", + "instance" : "redis" + }, + "DPU_APPL_STATE_DB" : { + "id" : 16, + "separator": "|", + "instance" : "redis" } }, "VERSION" : "1.0" diff --git a/tests/mock_tests/mock_orch_test.cpp b/tests/mock_tests/mock_orch_test.cpp index de5a246b57..bbe2b9b831 100644 --- a/tests/mock_tests/mock_orch_test.cpp +++ b/tests/mock_tests/mock_orch_test.cpp @@ -70,6 +70,8 @@ void MockOrchTest::SetUp() m_app_db = make_shared("APPL_DB", 0); m_config_db = make_shared("CONFIG_DB", 0); m_state_db = make_shared("STATE_DB", 0); + m_dpu_app_db = make_shared("DPU_APPL_DB", 0); + m_dpu_app_state_db = make_shared("DPU_APPL_STATE_DB", 0); m_chassis_app_db = make_shared("CHASSIS_APP_DB", 0); PrepareSai(); @@ -228,7 +230,7 @@ void MockOrchTest::SetUp() APP_DASH_QOS_TABLE_NAME }; - m_DashOrch = new DashOrch(m_app_db.get(), dash_tables, nullptr); + m_DashOrch = new DashOrch(m_app_db.get(), dash_tables, m_dpu_app_state_db.get(), nullptr); gDirectory.set(m_DashOrch); ut_orch_list.push_back((Orch **)&m_DashOrch); @@ -277,7 +279,7 @@ void MockOrchTest::SetUp() APP_DASH_VNET_MAPPING_TABLE_NAME }; - m_dashVnetOrch = new DashVnetOrch(m_app_db.get(), dash_vnet_tables, nullptr); + m_dashVnetOrch = new DashVnetOrch(m_app_db.get(), dash_vnet_tables, m_dpu_app_state_db.get(), nullptr); gDirectory.set(m_dashVnetOrch); ut_orch_list.push_back((Orch **)&m_dashVnetOrch); @@ -299,4 +301,4 @@ void MockOrchTest::TearDown() ut_helper::uninitSaiApi(); } -} \ No newline at end of file +} diff --git a/tests/mock_tests/mock_orch_test.h b/tests/mock_tests/mock_orch_test.h index 5e87d222f0..97d8aed2ed 100644 --- a/tests/mock_tests/mock_orch_test.h +++ b/tests/mock_tests/mock_orch_test.h @@ -42,6 +42,8 @@ namespace mock_orch_test shared_ptr m_app_db; shared_ptr m_config_db; shared_ptr m_state_db; + shared_ptr m_dpu_app_db; + shared_ptr m_dpu_app_state_db; shared_ptr m_chassis_app_db; MuxOrch *m_MuxOrch; MuxCableOrch *m_MuxCableOrch; From 5c8e75cc1a90a70610f09a511da4844885dac086 Mon Sep 17 00:00:00 2001 From: Prabhat Aravind Date: Tue, 15 Apr 2025 22:36:20 +0000 Subject: [PATCH 2/8] Address review comments Signed-off-by: Prabhat Aravind --- orchagent/dash/dashorch.cpp | 12 ++++++------ orchagent/dash/dashrouteorch.cpp | 6 +++--- orchagent/dash/dashvnetorch.cpp | 4 ++-- orchagent/main.cpp | 3 ++- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/orchagent/dash/dashorch.cpp b/orchagent/dash/dashorch.cpp index 27a87642d8..eeedf8358f 100644 --- a/orchagent/dash/dashorch.cpp +++ b/orchagent/dash/dashorch.cpp @@ -54,12 +54,12 @@ DashOrch::DashOrch(DBConnector *db, vector &tableName, DBConnector *app_ m_asic_db = std::shared_ptr(new DBConnector("ASIC_DB", 0)); m_counter_db = std::shared_ptr(new DBConnector("COUNTERS_DB", 0)); - m_eni_name_table = std::unique_ptr
(new Table(m_counter_db.get(), COUNTERS_ENI_NAME_MAP)); - dash_eni_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_ENI_TABLE_NAME)); - dash_eni_route_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_ENI_ROUTE_TABLE_NAME)); - dash_qos_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_QOS_TABLE_NAME)); - dash_appliance_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_APPLIANCE_TABLE_NAME)); - dash_routing_type_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_ROUTING_TYPE_TABLE_NAME)); + m_eni_name_table = make_unique
(m_counter_db.get(), COUNTERS_ENI_NAME_MAP); + dash_eni_result_table_ = make_unique
(app_state_db, APP_DASH_ENI_TABLE_NAME); + dash_eni_route_result_table_ = make_unique
(app_state_db, APP_DASH_ENI_ROUTE_TABLE_NAME); + dash_qos_result_table_ = make_unique
(app_state_db, APP_DASH_QOS_TABLE_NAME); + dash_appliance_result_table_ = make_unique
(app_state_db, APP_DASH_APPLIANCE_TABLE_NAME); + dash_routing_type_result_table_ = make_unique
(app_state_db, APP_DASH_ROUTING_TYPE_TABLE_NAME); if (gTraditionalFlexCounter) { diff --git a/orchagent/dash/dashrouteorch.cpp b/orchagent/dash/dashrouteorch.cpp index 0667bcab67..392267197b 100644 --- a/orchagent/dash/dashrouteorch.cpp +++ b/orchagent/dash/dashrouteorch.cpp @@ -52,9 +52,9 @@ DashRouteOrch::DashRouteOrch(DBConnector *db, vector &tableName, DashOrc dash_orch_(dash_orch) { SWSS_LOG_ENTER(); - dash_route_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_ROUTE_TABLE_NAME)); - dash_route_rule_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_ROUTE_RULE_TABLE_NAME)); - dash_route_group_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_ROUTE_GROUP_TABLE_NAME)); + dash_route_result_table_ = make_unique
(app_state_db, APP_DASH_ROUTE_TABLE_NAME); + dash_route_rule_result_table_ = make_unique
(app_state_db, APP_DASH_ROUTE_RULE_TABLE_NAME); + dash_route_group_result_table_ = make_unique
(app_state_db, APP_DASH_ROUTE_GROUP_TABLE_NAME); } bool DashRouteOrch::addOutboundRouting(const string& key, OutboundRoutingBulkContext& ctxt) diff --git a/orchagent/dash/dashvnetorch.cpp b/orchagent/dash/dashvnetorch.cpp index 1551a67733..938588c8ae 100644 --- a/orchagent/dash/dashvnetorch.cpp +++ b/orchagent/dash/dashvnetorch.cpp @@ -45,8 +45,8 @@ DashVnetOrch::DashVnetOrch(DBConnector *db, vector &tables, DBConnector ZmqOrch(db, tables, zmqServer) { SWSS_LOG_ENTER(); - dash_vnet_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_VNET_TABLE_NAME)); - dash_vnet_map_result_table_ = unique_ptr
(new Table(app_state_db, APP_DASH_VNET_MAPPING_TABLE_NAME)); + dash_vnet_result_table_ = make_unique
(app_state_db, APP_DASH_VNET_TABLE_NAME); + dash_vnet_map_result_table_ = make_unique
(app_state_db, APP_DASH_VNET_MAPPING_TABLE_NAME); } bool DashVnetOrch::addVnet(const string& vnet_name, DashVnetBulkContext& ctxt) diff --git a/orchagent/main.cpp b/orchagent/main.cpp index 0a5199ab67..43c3bcdac4 100644 --- a/orchagent/main.cpp +++ b/orchagent/main.cpp @@ -824,7 +824,8 @@ int main(int argc, char **argv) shared_ptr orchDaemon; /* - * Declare shared pointers for dpu specific databases + * Declare shared pointers for dpu specific databases. + * These dpu databases exist on the npu for smartswitch. */ shared_ptr dpu_app_db; shared_ptr dpu_app_state_db; From b3e9be02e89fd89f8785b8025b9ba80529165794 Mon Sep 17 00:00:00 2001 From: Prabhat Aravind Date: Fri, 18 Apr 2025 18:36:55 +0000 Subject: [PATCH 3/8] Fix conflicts Signed-off-by: Prabhat Aravind --- tests/mock_tests/mock_orch_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/mock_tests/mock_orch_test.cpp b/tests/mock_tests/mock_orch_test.cpp index d9e127c0e8..b07fed6179 100644 --- a/tests/mock_tests/mock_orch_test.cpp +++ b/tests/mock_tests/mock_orch_test.cpp @@ -307,7 +307,7 @@ void MockOrchTest::SetUp() APP_DASH_ROUTE_GROUP_TABLE_NAME }; - m_DashRouteOrch = new DashRouteOrch(m_app_db.get(), dash_route_tables, m_DashOrch, nullptr); + m_DashRouteOrch = new DashRouteOrch(m_app_db.get(), dash_route_tables, m_DashOrch, m_dpu_app_state_db.get(), nullptr); gDirectory.set(m_DashRouteOrch); ut_orch_list.push_back((Orch **)&m_DashRouteOrch); From 9d676dfa43ede8c5c8f66480fff050baa8726387 Mon Sep 17 00:00:00 2001 From: Prabhat Aravind Date: Sat, 19 Apr 2025 02:12:16 +0000 Subject: [PATCH 4/8] Fix vstest Signed-off-by: Prabhat Aravind --- tests/dash/test_dash_tunnel.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/dash/test_dash_tunnel.py b/tests/dash/test_dash_tunnel.py index de1c1c3c7d..f14663fd97 100644 --- a/tests/dash/test_dash_tunnel.py +++ b/tests/dash/test_dash_tunnel.py @@ -13,6 +13,8 @@ import sai_attrs as sai import dash_api.route_type_pb2 as rt +DVS_ENV = ["HWSKU=DPU-2P"] +NUM_PORTS = 2 def get_expected_tunnel_ips(tunnel_config): # We expect orchagent to ignore duplicate IPs, so use a set to ensure the expected IPs are unique From 6e6fb9456c7dc51657a2433ecedb8adc7e209ebc Mon Sep 17 00:00:00 2001 From: Prabhat Aravind Date: Tue, 22 Apr 2025 14:19:02 +0000 Subject: [PATCH 5/8] Add changes to tunnel orch and address successful returns in pre-op Signed-off-by: Prabhat Aravind --- orchagent/dash/dashorch.cpp | 15 ++++++++++----- orchagent/dash/dashrouteorch.cpp | 28 +++++++++++++++++++++------- orchagent/dash/dashtunnelorch.cpp | 23 ++++++++++++++++++++++- orchagent/dash/dashtunnelorch.h | 2 ++ orchagent/dash/dashvnetorch.cpp | 24 ++++++++++++++++++++---- orchagent/orchdaemon.cpp | 2 +- tests/mock_tests/mock_orch_test.cpp | 2 +- 7 files changed, 77 insertions(+), 19 deletions(-) diff --git a/orchagent/dash/dashorch.cpp b/orchagent/dash/dashorch.cpp index eeedf8358f..1fa3671308 100644 --- a/orchagent/dash/dashorch.cpp +++ b/orchagent/dash/dashorch.cpp @@ -265,12 +265,13 @@ void DashOrch::doTaskApplianceTable(ConsumerBase& consumer) SWSS_LOG_ENTER(); auto it = consumer.m_toSync.begin(); + uint32_t result; while (it != consumer.m_toSync.end()) { KeyOpFieldsValuesTuple t = it->second; string appliance_id = kfvKey(t); string op = kfvOp(t); - uint32_t result = DASH_RESULT_SUCCESS; + result = DASH_RESULT_SUCCESS; if (op == SET_COMMAND) { @@ -351,13 +352,14 @@ void DashOrch::doTaskRoutingTypeTable(ConsumerBase& consumer) SWSS_LOG_ENTER(); auto it = consumer.m_toSync.begin(); + uint32_t result; while (it != consumer.m_toSync.end()) { KeyOpFieldsValuesTuple t = it->second; string routing_type_str = kfvKey(t); string op = kfvOp(t); dash::route_type::RoutingType routing_type; - uint32_t result = DASH_RESULT_SUCCESS; + result = DASH_RESULT_SUCCESS; std::transform(routing_type_str.begin(), routing_type_str.end(), routing_type_str.begin(), ::toupper); routing_type_str = "ROUTING_TYPE_" + routing_type_str; @@ -691,12 +693,13 @@ void DashOrch::doTaskEniTable(ConsumerBase& consumer) SWSS_LOG_ENTER(); auto it = consumer.m_toSync.begin(); + uint32_t result; while (it != consumer.m_toSync.end()) { auto t = it->second; string eni = kfvKey(t); string op = kfvOp(t); - uint32_t result = DASH_RESULT_SUCCESS; + result = DASH_RESULT_SUCCESS; if (op == SET_COMMAND) { EniEntry entry; @@ -771,12 +774,13 @@ bool DashOrch::removeQosEntry(const string& qos_name) void DashOrch::doTaskQosTable(ConsumerBase& consumer) { auto it = consumer.m_toSync.begin(); + uint32_t result; while (it != consumer.m_toSync.end()) { KeyOpFieldsValuesTuple t = it->second; string qos_name = kfvKey(t); string op = kfvOp(t); - uint32_t result = DASH_RESULT_SUCCESS; + result = DASH_RESULT_SUCCESS; if (op == SET_COMMAND) { @@ -923,12 +927,13 @@ bool DashOrch::removeEniRoute(const std::string& eni) void DashOrch::doTaskEniRouteTable(ConsumerBase& consumer) { auto it = consumer.m_toSync.begin(); + uint32_t result; while (it != consumer.m_toSync.end()) { KeyOpFieldsValuesTuple t = it->second; string eni = kfvKey(t); string op = kfvOp(t); - uint32_t result = DASH_RESULT_SUCCESS; + result = DASH_RESULT_SUCCESS; if (op == SET_COMMAND) { diff --git a/orchagent/dash/dashrouteorch.cpp b/orchagent/dash/dashrouteorch.cpp index 720e080ce7..2fc6bff266 100644 --- a/orchagent/dash/dashrouteorch.cpp +++ b/orchagent/dash/dashrouteorch.cpp @@ -290,7 +290,7 @@ void DashRouteOrch::doTaskRouteTable(ConsumerBase& consumer) SWSS_LOG_ENTER(); auto it = consumer.m_toSync.begin(); - + uint32_t result; while (it != consumer.m_toSync.end()) { std::map, @@ -306,6 +306,7 @@ void DashRouteOrch::doTaskRouteTable(ConsumerBase& consumer) std::forward_as_tuple()); bool inserted = rc.second; auto &ctxt = rc.first->second; + result = DASH_RESULT_SUCCESS; if (!inserted) { @@ -342,6 +343,11 @@ void DashRouteOrch::doTaskRouteTable(ConsumerBase& consumer) if (addOutboundRouting(key, ctxt)) { it = consumer.m_toSync.erase(it); + /* + * Write result only when removing from consumer in pre-op + * For other cases, this will be handled in post-op + */ + writeResultToDB(dash_route_result_table_, key, result); } else { @@ -353,6 +359,7 @@ void DashRouteOrch::doTaskRouteTable(ConsumerBase& consumer) if (removeOutboundRouting(key, ctxt)) { it = consumer.m_toSync.erase(it); + removeResultFromDB(dash_route_result_table_, key); } else { @@ -374,7 +381,7 @@ void DashRouteOrch::doTaskRouteTable(ConsumerBase& consumer) KeyOpFieldsValuesTuple t = it_prev->second; string key = kfvKey(t); string op = kfvOp(t); - uint32_t result = DASH_RESULT_SUCCESS; + result = DASH_RESULT_SUCCESS; auto found = toBulk.find(make_pair(key, op)); if (found == toBulk.end()) { @@ -398,8 +405,8 @@ void DashRouteOrch::doTaskRouteTable(ConsumerBase& consumer) } else { - result = DASH_RESULT_FAILURE; it_prev++; + result = DASH_RESULT_FAILURE; } writeResultToDB(dash_route_result_table_, key, result); } @@ -575,7 +582,7 @@ void DashRouteOrch::doTaskRouteRuleTable(ConsumerBase& consumer) SWSS_LOG_ENTER(); auto it = consumer.m_toSync.begin(); - + uint32_t result; while (it != consumer.m_toSync.end()) { std::map, @@ -591,6 +598,7 @@ void DashRouteOrch::doTaskRouteRuleTable(ConsumerBase& consumer) std::forward_as_tuple()); bool inserted = rc.second; auto &ctxt = rc.first->second; + result = DASH_RESULT_SUCCESS; if (!inserted) { @@ -625,6 +633,11 @@ void DashRouteOrch::doTaskRouteRuleTable(ConsumerBase& consumer) if (addInboundRouting(key, ctxt)) { it = consumer.m_toSync.erase(it); + /* + * Write result only when removing from consumer in pre-op + * For other cases, this will be handled in post-op + */ + writeResultToDB(dash_route_rule_result_table_, key, result); } else { @@ -636,6 +649,7 @@ void DashRouteOrch::doTaskRouteRuleTable(ConsumerBase& consumer) if (removeInboundRouting(key, ctxt)) { it = consumer.m_toSync.erase(it); + removeResultFromDB(dash_route_rule_result_table_, key); } else { @@ -657,7 +671,7 @@ void DashRouteOrch::doTaskRouteRuleTable(ConsumerBase& consumer) KeyOpFieldsValuesTuple t = it_prev->second; string key = kfvKey(t); string op = kfvOp(t); - uint32_t result = DASH_RESULT_SUCCESS; + result = DASH_RESULT_SUCCESS; auto found = toBulk.find(make_pair(key, op)); if (found == toBulk.end()) { @@ -827,13 +841,13 @@ void DashRouteOrch::doTaskRouteGroupTable(ConsumerBase& consumer) SWSS_LOG_ENTER(); auto it = consumer.m_toSync.begin(); - + uint32_t result; while (it != consumer.m_toSync.end()) { auto t = it->second; string route_group = kfvKey(t); string op = kfvOp(t); - uint32_t result = DASH_RESULT_SUCCESS; + result = DASH_RESULT_SUCCESS; if (op == SET_COMMAND) { dash::route_group::RouteGroup entry; diff --git a/orchagent/dash/dashtunnelorch.cpp b/orchagent/dash/dashtunnelorch.cpp index a8d316d994..22b29864a2 100644 --- a/orchagent/dash/dashtunnelorch.cpp +++ b/orchagent/dash/dashtunnelorch.cpp @@ -51,6 +51,7 @@ bool ipAddrEq(const dash::types::IpAddress& lhs, const dash::types::IpAddress& r DashTunnelOrch::DashTunnelOrch( swss::DBConnector *db, std::vector &tables, + swss::DBConnector *app_state_db, swss::ZmqServer *zmqServer) : tunnel_bulker_(sai_dash_tunnel_api, gSwitchId, gMaxBulkSize, SAI_OBJECT_TYPE_DASH_TUNNEL), tunnel_member_bulker_(sai_dash_tunnel_api, gSwitchId, gMaxBulkSize, SAI_OBJECT_TYPE_DASH_TUNNEL_MEMBER), @@ -58,6 +59,7 @@ DashTunnelOrch::DashTunnelOrch( ZmqOrch(db, tables, zmqServer) { SWSS_LOG_ENTER(); + dash_tunnel_result_table_ = std::make_unique(app_state_db, APP_DASH_TUNNEL_TABLE_NAME); } sai_object_id_t DashTunnelOrch::getTunnelOid(const std::string& tunnel_name) @@ -90,6 +92,7 @@ void DashTunnelOrch::doTask(ConsumerBase &consumer) SWSS_LOG_ENTER(); const auto& tn = consumer.getTableName(); + uint32_t result; SWSS_LOG_INFO("doTask: %s", tn.c_str()); if (tn != APP_DASH_TUNNEL_TABLE_NAME) { @@ -102,6 +105,7 @@ void DashTunnelOrch::doTask(ConsumerBase &consumer) { std::map, DashTunnelBulkContext> toBulk; + while (it != consumer.m_toSync.end()) { swss::KeyOpFieldsValuesTuple t = it->second; @@ -112,6 +116,7 @@ void DashTunnelOrch::doTask(ConsumerBase &consumer) std::forward_as_tuple()); bool inserted = rc.second; auto& ctxt = rc.first->second; + result = DASH_RESULT_SUCCESS; if (!inserted) { ctxt.clear(); @@ -127,6 +132,11 @@ void DashTunnelOrch::doTask(ConsumerBase &consumer) if (addTunnel(tunnel_name, ctxt)) { it = consumer.m_toSync.erase(it); + /* + * Write result only when removing from consumer in pre-op + * For other cases, this will be handled in post-op + */ + writeResultToDB(dash_tunnel_result_table_, tunnel_name, result); } else { @@ -137,6 +147,10 @@ void DashTunnelOrch::doTask(ConsumerBase &consumer) { if (removeTunnel(tunnel_name, ctxt)) { + /* + * Postpone removal of result from result table until after + * tunnel members are removed. + */ it = consumer.m_toSync.erase(it); } else @@ -145,7 +159,7 @@ void DashTunnelOrch::doTask(ConsumerBase &consumer) } } } - + tunnel_member_bulker_.flush(); tunnel_bulker_.flush(); tunnel_nhop_bulker_.flush(); @@ -156,6 +170,7 @@ void DashTunnelOrch::doTask(ConsumerBase &consumer) swss::KeyOpFieldsValuesTuple t = it_prev->second; std::string tunnel_name = kfvKey(t); std::string op = kfvOp(t); + result = DASH_RESULT_SUCCESS; auto found = toBulk.find(std::make_pair(tunnel_name, op)); if (found == toBulk.end()) { @@ -172,14 +187,17 @@ void DashTunnelOrch::doTask(ConsumerBase &consumer) } else { + result = DASH_RESULT_FAILURE; it_prev++; } + writeResultToDB(dash_tunnel_result_table_, tunnel_name, result); } else if (op == DEL_COMMAND) { if (removeTunnelPost(tunnel_name, ctxt)) { it_prev = consumer.m_toSync.erase(it_prev); + removeResultFromDB(dash_tunnel_result_table_, tunnel_name); } else { @@ -196,6 +214,7 @@ void DashTunnelOrch::doTask(ConsumerBase &consumer) swss::KeyOpFieldsValuesTuple t = it_prev->second; std::string tunnel_name = kfvKey(t); std::string op = kfvOp(t); + result = DASH_RESULT_SUCCESS; auto found = toBulk.find(std::make_pair(tunnel_name, op)); if (found == toBulk.end()) { @@ -212,8 +231,10 @@ void DashTunnelOrch::doTask(ConsumerBase &consumer) } else { + result = DASH_RESULT_FAILURE; it_prev++; } + writeResultToDB(dash_tunnel_result_table_, tunnel_name, result); } else if (op == DEL_COMMAND) { diff --git a/orchagent/dash/dashtunnelorch.h b/orchagent/dash/dashtunnelorch.h index f1d1c696d1..28ded11700 100644 --- a/orchagent/dash/dashtunnelorch.h +++ b/orchagent/dash/dashtunnelorch.h @@ -50,6 +50,7 @@ class DashTunnelOrch : public ZmqOrch DashTunnelOrch( swss::DBConnector *db, std::vector &tables, + swss::DBConnector *app_state_db, swss::ZmqServer *zmqServer); sai_object_id_t getTunnelOid(const std::string& tunnel_name); @@ -59,6 +60,7 @@ class DashTunnelOrch : public ZmqOrch ObjectBulker tunnel_member_bulker_; ObjectBulker tunnel_nhop_bulker_; std::unordered_map tunnel_table_; + std::unique_ptr dash_tunnel_result_table_; void doTask(ConsumerBase &consumer); bool addTunnel(const std::string& tunnel_name, DashTunnelBulkContext& ctxt); diff --git a/orchagent/dash/dashvnetorch.cpp b/orchagent/dash/dashvnetorch.cpp index 795ed23854..ddc9ecfe14 100644 --- a/orchagent/dash/dashvnetorch.cpp +++ b/orchagent/dash/dashvnetorch.cpp @@ -169,7 +169,7 @@ void DashVnetOrch::doTaskVnetTable(ConsumerBase& consumer) SWSS_LOG_ENTER(); auto it = consumer.m_toSync.begin(); - + uint32_t result; while (it != consumer.m_toSync.end()) { // Map to store vnet bulk op results @@ -186,6 +186,8 @@ void DashVnetOrch::doTaskVnetTable(ConsumerBase& consumer) std::forward_as_tuple()); bool inserted = rc.second; auto& vnet_ctxt = rc.first->second; + // Result needs to be reset for every iteration + result = DASH_RESULT_SUCCESS; if (!inserted) { @@ -203,6 +205,11 @@ void DashVnetOrch::doTaskVnetTable(ConsumerBase& consumer) if (addVnet(key, vnet_ctxt)) { it = consumer.m_toSync.erase(it); + /* + * Write result only when removing from consumer in pre-op + * For other cases, this will be handled in post-op + */ + writeResultToDB(dash_vnet_result_table_, key, result); } else { @@ -214,6 +221,7 @@ void DashVnetOrch::doTaskVnetTable(ConsumerBase& consumer) if (removeVnet(key, vnet_ctxt)) { it = consumer.m_toSync.erase(it); + removeResultFromDB(dash_vnet_result_table_, key); } else { @@ -236,7 +244,8 @@ void DashVnetOrch::doTaskVnetTable(ConsumerBase& consumer) string key = kfvKey(t); string op = kfvOp(t); - uint32_t result = DASH_RESULT_SUCCESS; + // Result needs to be reset for every iteration + result = DASH_RESULT_SUCCESS; auto found = toBulk.find(make_pair(key, op)); if (found == toBulk.end()) { @@ -723,7 +732,7 @@ void DashVnetOrch::doTaskVnetMapTable(ConsumerBase& consumer) SWSS_LOG_ENTER(); auto it = consumer.m_toSync.begin(); - + uint32_t result; while (it != consumer.m_toSync.end()) { std::map, @@ -739,6 +748,7 @@ void DashVnetOrch::doTaskVnetMapTable(ConsumerBase& consumer) std::forward_as_tuple()); bool inserted = rc.second; auto& ctxt = rc.first->second; + result = DASH_RESULT_SUCCESS; if (!inserted) { @@ -775,6 +785,11 @@ void DashVnetOrch::doTaskVnetMapTable(ConsumerBase& consumer) if (addVnetMap(key, ctxt)) { it = consumer.m_toSync.erase(it); + /* + * Write result only when removing from consumer in pre-op + * For other cases, this will be handled in post-op + */ + writeResultToDB(dash_vnet_map_result_table_, key, result); } else { @@ -786,6 +801,7 @@ void DashVnetOrch::doTaskVnetMapTable(ConsumerBase& consumer) if (removeVnetMap(key, ctxt)) { it = consumer.m_toSync.erase(it); + removeResultFromDB(dash_vnet_map_result_table_, key); } else { @@ -808,7 +824,7 @@ void DashVnetOrch::doTaskVnetMapTable(ConsumerBase& consumer) KeyOpFieldsValuesTuple t = it_prev->second; string key = kfvKey(t); string op = kfvOp(t); - uint32_t result = DASH_RESULT_SUCCESS; + result = DASH_RESULT_SUCCESS; auto found = toBulk.find(make_pair(key, op)); if (found == toBulk.end()) { diff --git a/orchagent/orchdaemon.cpp b/orchagent/orchdaemon.cpp index 6161522661..27b47eaf31 100644 --- a/orchagent/orchdaemon.cpp +++ b/orchagent/orchdaemon.cpp @@ -1256,7 +1256,7 @@ bool DpuOrchDaemon::init() vector dash_tunnel_tables = { APP_DASH_TUNNEL_TABLE_NAME }; - DashTunnelOrch *dash_tunnel_orch = new DashTunnelOrch(m_applDb, dash_tunnel_tables, m_zmqServer); + DashTunnelOrch *dash_tunnel_orch = new DashTunnelOrch(m_applDb, dash_tunnel_tables, m_dpu_appstateDb, m_zmqServer); gDirectory.set(dash_tunnel_orch); addOrchList(dash_acl_orch); diff --git a/tests/mock_tests/mock_orch_test.cpp b/tests/mock_tests/mock_orch_test.cpp index b07fed6179..d6a8dfe2c7 100644 --- a/tests/mock_tests/mock_orch_test.cpp +++ b/tests/mock_tests/mock_orch_test.cpp @@ -314,7 +314,7 @@ void MockOrchTest::SetUp() vector dash_tunnel_tables = { APP_DASH_TUNNEL_TABLE_NAME }; - m_DashTunnelOrch= new DashTunnelOrch(m_app_db.get(), dash_tunnel_tables, nullptr); + m_DashTunnelOrch= new DashTunnelOrch(m_app_db.get(), dash_tunnel_tables, m_dpu_app_state_db.get(), nullptr); gDirectory.set(m_DashTunnelOrch); ut_orch_list.push_back((Orch **)&m_DashTunnelOrch); From d96b437d09c5deaff7eb7765f9b60465f45b2f40 Mon Sep 17 00:00:00 2001 From: Prabhat Aravind Date: Thu, 24 Apr 2025 15:11:22 +0000 Subject: [PATCH 6/8] Fix comments in dashtunnelorch Signed-off-by: Prabhat Aravind --- orchagent/dash/dashtunnelorch.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/orchagent/dash/dashtunnelorch.cpp b/orchagent/dash/dashtunnelorch.cpp index 22b29864a2..c6ead66a25 100644 --- a/orchagent/dash/dashtunnelorch.cpp +++ b/orchagent/dash/dashtunnelorch.cpp @@ -184,13 +184,21 @@ void DashTunnelOrch::doTask(ConsumerBase &consumer) if (addTunnelPost(tunnel_name, ctxt)) { it_prev = consumer.m_toSync.erase(it_prev); + /* + * The result should be written here only if the tunnel has + * one endpoint. For more tunnel endpoints, we need to wait + * until after tunnel members post-op. + */ + if (ctxt.metadata.endpoints_size() == 1) + { + writeResultToDB(dash_tunnel_result_table_, tunnel_name, + result); + } } else { - result = DASH_RESULT_FAILURE; it_prev++; } - writeResultToDB(dash_tunnel_result_table_, tunnel_name, result); } else if (op == DEL_COMMAND) { @@ -234,6 +242,9 @@ void DashTunnelOrch::doTask(ConsumerBase &consumer) result = DASH_RESULT_FAILURE; it_prev++; } + /* + * Write result for tunnels with more than one endpoint. + */ writeResultToDB(dash_tunnel_result_table_, tunnel_name, result); } else if (op == DEL_COMMAND) From a8ca99e16d9328254cace11e8790ab69c09db371 Mon Sep 17 00:00:00 2001 From: Prabhat Aravind Date: Thu, 24 Apr 2025 23:36:17 +0000 Subject: [PATCH 7/8] Remove comment Signed-off-by: Prabhat Aravind --- orchagent/dash/dashvnetorch.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/orchagent/dash/dashvnetorch.cpp b/orchagent/dash/dashvnetorch.cpp index ddc9ecfe14..b750249a98 100644 --- a/orchagent/dash/dashvnetorch.cpp +++ b/orchagent/dash/dashvnetorch.cpp @@ -186,7 +186,6 @@ void DashVnetOrch::doTaskVnetTable(ConsumerBase& consumer) std::forward_as_tuple()); bool inserted = rc.second; auto& vnet_ctxt = rc.first->second; - // Result needs to be reset for every iteration result = DASH_RESULT_SUCCESS; if (!inserted) @@ -244,7 +243,6 @@ void DashVnetOrch::doTaskVnetTable(ConsumerBase& consumer) string key = kfvKey(t); string op = kfvOp(t); - // Result needs to be reset for every iteration result = DASH_RESULT_SUCCESS; auto found = toBulk.find(make_pair(key, op)); if (found == toBulk.end()) From 546b6cfa9a63925a5a02f3b0436342e1cc8d8472 Mon Sep 17 00:00:00 2001 From: Prabhat Aravind Date: Fri, 25 Apr 2025 23:30:51 +0000 Subject: [PATCH 8/8] Add a TODO Signed-off-by: Prabhat Aravind --- orchagent/dash/dashtunnelorch.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/orchagent/dash/dashtunnelorch.cpp b/orchagent/dash/dashtunnelorch.cpp index c6ead66a25..4068bb6d09 100644 --- a/orchagent/dash/dashtunnelorch.cpp +++ b/orchagent/dash/dashtunnelorch.cpp @@ -135,6 +135,9 @@ void DashTunnelOrch::doTask(ConsumerBase &consumer) /* * Write result only when removing from consumer in pre-op * For other cases, this will be handled in post-op + * TODO: There are cases where addTunnel returns true for + * errors that are not retried. Such cases need to be + * written to result table as a failure instead of success. */ writeResultToDB(dash_tunnel_result_table_, tunnel_name, result); }