Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[syncd] Fix inspect asic command #1434

Merged
merged 4 commits into from
Oct 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion syncd/Syncd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3707,6 +3707,12 @@ void Syncd::inspectAsic()
continue;
}

SaiAttributeList redis_list(metaKey.objecttype, values, false);

sai_attribute_t *redis_attr_list = redis_list.get_attr_list();

m_translator->translateVidToRid(metaKey.objecttype, attr_count, redis_attr_list);

// compare fields and values from ASIC_DB and SAI response and log the difference

for (uint32_t index = 0; index < attr_count; ++index)
Expand All @@ -3725,7 +3731,7 @@ void Syncd::inspectAsic()

std::string strSaiAttrValue = sai_serialize_attr_value(*meta, attr, false);

std::string strRedisAttrValue = hash[meta->attridname];
std::string strRedisAttrValue = sai_serialize_attr_value(*meta, redis_attr_list[index], false);

if (strRedisAttrValue == strSaiAttrValue)
{
Expand Down Expand Up @@ -3836,6 +3842,14 @@ sai_status_t Syncd::processNotifySyncd(

SWSS_LOG_NOTICE("setting very first run to FALSE, op = %s", key.c_str());
}
else if (redisNotifySyncd == SAI_REDIS_NOTIFY_SYNCD_INSPECT_ASIC)
{
SWSS_LOG_NOTICE("syncd switched to INSPECT ASIC mode");

inspectAsic();

sendNotifyResponse(SAI_STATUS_SUCCESS);
}
else
{
SWSS_LOG_THROW("unknown operation: %s", key.c_str());
Expand Down
8 changes: 8 additions & 0 deletions tests/MLNX2700.pl
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,16 @@ sub test_mlnx_full_to_full
play "full_no_hostif_entry_second.rec";
}

sub test_inspect_asic
{
fresh_start;

play "inspect_asic.rec"
}

# RUN

test_inspect_asic();
test_mlnx_nhg_member;
test_mlnx_full_to_empty;
test_mlnx_empty_to_full_to_empty;
Expand Down
26 changes: 26 additions & 0 deletions tests/MLNX2700/inspect_asic.rec
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
2017-05-11.01:43:51.003662|#|recording to: sairedis.2017-05-11.01:43:51.003467.rec
2017-05-11.01:43:51.004710|a|INIT_VIEW
2017-05-11.01:43:51.008012|A|SAI_STATUS_SUCCESS
2017-05-11.01:43:51.010010|c|SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000|SAI_SWITCH_ATTR_INIT_SWITCH=true|SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY=0x415000|SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY=0x415160|SAI_SWITCH_ATTR_SWITCH_SHUTDOWN_REQUEST_NOTIFY=0x4152c0
2017-05-11.01:44:02.229827|g|SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000|SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID=oid:0x0
2017-05-11.01:44:02.230913|G|SAI_STATUS_SUCCESS|SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID=oid:0x3000000000002
2017-05-11.01:44:02.233014|g|SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000|SAI_SWITCH_ATTR_CPU_PORT=oid:0x0
2017-05-11.01:44:02.250340|G|SAI_STATUS_SUCCESS|SAI_SWITCH_ATTR_CPU_PORT=oid:0x1000000000001
2017-05-11.01:44:02.250435|g|SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000|SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS=1
2017-05-11.01:44:02.251154|G|SAI_STATUS_SUCCESS|SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS=32
2017-05-11.01:44:02.251258|g|SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000|SAI_SWITCH_ATTR_PORT_LIST=32:oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0,oid:0x0
2017-05-11.01:44:02.252737|G|SAI_STATUS_SUCCESS|SAI_SWITCH_ATTR_PORT_LIST=32:oid:0x100000000011a,oid:0x100000000013e,oid:0x1000000000162,oid:0x1000000000186,oid:0x10000000001aa,oid:0x10000000001ce,oid:0x10000000001f2,oid:0x1000000000216,oid:0x100000000023a,oid:0x100000000025e,oid:0x1000000000282,oid:0x10000000002a6,oid:0x10000000002ca,oid:0x10000000002ee,oid:0x1000000000312,oid:0x1000000000336,oid:0x100000000035a,oid:0x100000000037e,oid:0x10000000003a2,oid:0x10000000003c6,oid:0x10000000003ea,oid:0x100000000040e,oid:0x1000000000432,oid:0x1000000000456,oid:0x100000000047a,oid:0x100000000049e,oid:0x10000000004c2,oid:0x10000000004e6,oid:0x100000000050a,oid:0x100000000052e,oid:0x1000000000552,oid:0x1000000000576
2017-05-11.01:44:02.506421|c|SAI_OBJECT_TYPE_ROUTE_ENTRY:{"dest":"0.0.0.0/0","switch_id":"oid:0x21000000000000","vr":"oid:0x3000000000002"}|SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION=SAI_PACKET_ACTION_DROP
2017-05-11.01:44:02.506914|c|SAI_OBJECT_TYPE_ROUTE_ENTRY:{"dest":"::/0","switch_id":"oid:0x21000000000000","vr":"oid:0x3000000000002"}|SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION=SAI_PACKET_ACTION_DROP
2017-05-11.01:44:05.124489|c|SAI_OBJECT_TYPE_ROUTER_INTERFACE:oid:0x60000000005e1|SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID=oid:0x3000000000002|SAI_ROUTER_INTERFACE_ATTR_SRC_MAC_ADDRESS=7C:FE:90:5E:6A:80|SAI_ROUTER_INTERFACE_ATTR_TYPE=SAI_ROUTER_INTERFACE_TYPE_PORT|SAI_ROUTER_INTERFACE_ATTR_PORT_ID=oid:0x100000000023a
2017-05-11.01:44:05.126397|c|SAI_OBJECT_TYPE_ROUTER_INTERFACE:oid:0x60000000005e2|SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID=oid:0x3000000000002|SAI_ROUTER_INTERFACE_ATTR_SRC_MAC_ADDRESS=7C:FE:90:5E:6A:80|SAI_ROUTER_INTERFACE_ATTR_TYPE=SAI_ROUTER_INTERFACE_TYPE_PORT|SAI_ROUTER_INTERFACE_ATTR_PORT_ID=oid:0x1000000000552
2017-05-11.01:44:22.585866|c|SAI_OBJECT_TYPE_NEXT_HOP:oid:0x400000000061c|SAI_NEXT_HOP_ATTR_TYPE=SAI_NEXT_HOP_TYPE_IP|SAI_NEXT_HOP_ATTR_IP=10.0.0.49|SAI_NEXT_HOP_ATTR_ROUTER_INTERFACE_ID=oid:0x60000000005e1
2017-05-11.01:44:22.587132|c|SAI_OBJECT_TYPE_NEXT_HOP:oid:0x400000000061d|SAI_NEXT_HOP_ATTR_TYPE=SAI_NEXT_HOP_TYPE_IP|SAI_NEXT_HOP_ATTR_IP=10.0.0.1|SAI_NEXT_HOP_ATTR_ROUTER_INTERFACE_ID=oid:0x60000000005e2
2017-05-11.01:44:29.528915|c|SAI_OBJECT_TYPE_NEXT_HOP_GROUP:oid:0x5000000000627|SAI_NEXT_HOP_GROUP_ATTR_TYPE=SAI_NEXT_HOP_GROUP_TYPE_ECMP
2017-05-11.01:44:29.529963|c|SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MEMBER:oid:0x2d000000000628|SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_GROUP_ID=oid:0x5000000000627|SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_ID=oid:0x400000000061d
2017-05-11.01:44:32.111307|c|SAI_OBJECT_TYPE_ROUTE_ENTRY:{"dest":"192.168.0.48/32","switch_id":"oid:0x21000000000000","vr":"oid:0x3000000000002"}|SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID=oid:0x5000000000627
2017-05-11.01:44:32.246917|c|SAI_OBJECT_TYPE_ROUTE_ENTRY:{"dest":"192.168.0.192/32","switch_id":"oid:0x21000000000000","vr":"oid:0x3000000000002"}|SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID=oid:0x5000000000627
2017-05-11.01:44:02.533119|a|APPLY_VIEW
2017-05-11.01:44:02.535313|A|SAI_STATUS_SUCCESS
2017-05-11.01:44:02.533119|a|SYNCD_INSPECT_ASIC
2017-05-11.01:44:02.535313|A|SAI_STATUS_SUCCESS
7 changes: 4 additions & 3 deletions unittest/syncd/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,12 @@ tests_SOURCES = main.cpp \
TestMdioIpcServer.cpp \
TestPortStateChangeHandler.cpp \
TestWorkaround.cpp \
TestVendorSai.cpp \
TestSyncd.cpp
TestSyncd.cpp \
TestVendorSai.cpp

tests_CXXFLAGS = $(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON)
tests_LDFLAGS = -Wl,-rpath,$(top_srcdir)/lib/.libs -Wl,-rpath,$(top_srcdir)/meta/.libs
tests_LDADD = $(LDADD_GTEST) $(top_srcdir)/syncd/libSyncd.a $(top_srcdir)/vslib/libSaiVS.a $(top_srcdir)/syncd/libMdioIpcClient.a -lhiredis -lswsscommon -lnl-genl-3 -lnl-nf-3 -lnl-route-3 -lnl-3 -lpthread -L$(top_srcdir)/lib/.libs -lsairedis -L$(top_srcdir)/meta/.libs -lsaimetadata -lsaimeta -lzmq $(CODE_COVERAGE_LIBS)
tests_LDADD = $(LDADD_GTEST) $(top_srcdir)/syncd/libSyncdRequestShutdown.a $(top_srcdir)/syncd/libSyncd.a $(top_srcdir)/vslib/libSaiVS.a $(top_srcdir)/syncd/libMdioIpcClient.a \
-lhiredis -lswsscommon -lnl-genl-3 -lnl-nf-3 -lnl-route-3 -lnl-3 -lpthread -L$(top_srcdir)/lib/.libs -lsairedis -L$(top_srcdir)/meta/.libs -lsaimetadata -lsaimeta -lzmq $(CODE_COVERAGE_LIBS)

TESTS = tests
201 changes: 200 additions & 1 deletion unittest/syncd/TestSyncd.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,14 @@
#include "Syncd.h"
#include "RequestShutdown.h"
#include "vslib/ContextConfigContainer.h"
#include "vslib/VirtualSwitchSaiInterface.h"
#include "vslib/Sai.h"
#include "lib/Sai.h"

#include "swss/dbconnector.h"

#include "sairediscommon.h"

#include "MockableSaiInterface.h"
#include "CommandLineOptions.h"
#include "sairediscommon.h"
Expand All @@ -9,6 +19,195 @@
#include <gtest/gtest.h>
#include <gmock/gmock.h>

using namespace syncd;
using namespace saivs;

static void syncd_thread(
_In_ std::shared_ptr<Syncd> syncd)
{
SWSS_LOG_ENTER();

SWSS_LOG_NOTICE("thread stared");

syncd->run();

SWSS_LOG_NOTICE("thread end");
}

static std::map<std::string, std::string> profileMap;
static std::map<std::string, std::string>::iterator profileIter;

static const char* profileGetValue(
_In_ sai_switch_profile_id_t profile_id,
_In_ const char* variable)
{
SWSS_LOG_ENTER();

if (variable == NULL)
{
SWSS_LOG_WARN("variable is null");
return NULL;
}

auto it = profileMap.find(variable);

if (it == profileMap.end())
{
SWSS_LOG_NOTICE("%s: NULL", variable);
return NULL;
}

SWSS_LOG_NOTICE("%s: %s", variable, it->second.c_str());

return it->second.c_str();
}

static int profileGetNextValue(
_In_ sai_switch_profile_id_t profile_id,
_Out_ const char** variable,
_Out_ const char** value)
{
SWSS_LOG_ENTER();

if (value == NULL)
{
SWSS_LOG_INFO("resetting profile map iterator");

profileIter = profileMap.begin();
return 0;
}

if (variable == NULL)
{
SWSS_LOG_WARN("variable is null");
return -1;
}

if (profileIter == profileMap.end())
{
SWSS_LOG_INFO("iterator reached end");
return -1;
}

*variable = profileIter->first.c_str();
*value = profileIter->second.c_str();

SWSS_LOG_INFO("key: %s:%s", *variable, *value);

profileIter++;

return 0;
}

TEST(Syncd, inspectAsic)
{
auto db = std::make_shared<swss::DBConnector>("ASIC_DB", 0, true);

swss::RedisReply r(db.get(), "FLUSHALL", REDIS_REPLY_STATUS);

r.checkStatusOK();

sai_service_method_table_t smt;

smt.profile_get_value = &profileGetValue;
smt.profile_get_next_value = &profileGetNextValue;

auto vssai = std::make_shared<saivs::Sai>();

auto cmd = std::make_shared<CommandLineOptions>();

cmd->m_redisCommunicationMode = SAI_REDIS_COMMUNICATION_MODE_REDIS_SYNC;
cmd->m_enableTempView = true;
cmd->m_profileMapFile = "profile.ini";

auto syncd = std::make_shared<Syncd>(vssai, cmd, false);

std::thread thread(syncd_thread, syncd);

auto sai = std::make_shared<sairedis::Sai>();

EXPECT_EQ(SAI_STATUS_SUCCESS, sai->apiInitialize(0, &smt));

sai_attribute_t attr;

attr.id = SAI_REDIS_SWITCH_ATTR_REDIS_COMMUNICATION_MODE;
attr.value.s32 = SAI_REDIS_COMMUNICATION_MODE_REDIS_SYNC;

// set syncd mode on sairedis

EXPECT_EQ(SAI_STATUS_SUCCESS, sai->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, &attr));

attr.id = SAI_SWITCH_ATTR_INIT_SWITCH;
attr.value.booldata = true;

sai_object_id_t switchId;

// create switch

EXPECT_EQ(SAI_STATUS_SUCCESS, sai->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr));

attr.id = SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID;

// get default virtual router

EXPECT_EQ(SAI_STATUS_SUCCESS, sai->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, &attr));

sai_object_id_t routerId = attr.value.oid;

sai_object_id_t list[32];

attr.id = SAI_SWITCH_ATTR_PORT_LIST;
attr.value.objlist.count = 32;
attr.value.objlist.list = list;

// get port list

EXPECT_EQ(SAI_STATUS_SUCCESS, sai->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, &attr));

sai_attribute_t attrs[4];

attrs[0].id = SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID;
attrs[0].value.oid = routerId;
attrs[1].id = SAI_ROUTER_INTERFACE_ATTR_SRC_MAC_ADDRESS;
attrs[2].id = SAI_ROUTER_INTERFACE_ATTR_TYPE;
attrs[2].value.s32 = SAI_ROUTER_INTERFACE_TYPE_PORT;
attrs[3].id = SAI_ROUTER_INTERFACE_ATTR_PORT_ID;
attrs[3].value.oid = list[0];

// create router interface, we need oid with oid attributes
// to validate inspect asic routine

sai_object_id_t rifId;
EXPECT_EQ(SAI_STATUS_SUCCESS, sai->create(SAI_OBJECT_TYPE_ROUTER_INTERFACE, &rifId, switchId, 4, attrs));

attr.id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
attr.value.s32 = SAI_REDIS_NOTIFY_SYNCD_INSPECT_ASIC;

// inspect asic on cold boot

EXPECT_EQ(SAI_STATUS_SUCCESS, sai->set(SAI_OBJECT_TYPE_SWITCH, switchId, &attr));

// request shutdown

auto opt = std::make_shared<RequestShutdownCommandLineOptions>();

opt->setRestartType(SYNCD_RESTART_TYPE_WARM);

RequestShutdown rs(opt);

rs.send();

// join thread for syncd

thread.join();

syncd = nullptr;

// TODO inspect asic on warm boot

EXPECT_EQ(SAI_STATUS_SUCCESS, sai->apiUninitialize());
}

using namespace syncd;

class MockSelectableChannel : public sairedis::SelectableChannel {
Expand Down Expand Up @@ -58,4 +257,4 @@ TEST_F(SyncdTest, processNotifySyncd)
kfvOp(kco) = REDIS_ASIC_STATE_COMMAND_NOTIFY;
}));
syncd_object.processEvent(consumer);
}
}
3 changes: 3 additions & 0 deletions unittest/syncd/profile.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SAI_WARM_BOOT_READ_FILE=./sai_warmboot.bin
SAI_WARM_BOOT_WRITE_FILE=./sai_warmboot.bin
SAI_VS_SWITCH_TYPE=SAI_VS_SWITCH_TYPE_MLNX2700
Loading