diff --git a/syncd/NotificationProcessor.cpp b/syncd/NotificationProcessor.cpp index 3392d3ddc4..fdb2ffda88 100644 --- a/syncd/NotificationProcessor.cpp +++ b/syncd/NotificationProcessor.cpp @@ -162,6 +162,13 @@ void NotificationProcessor::redisPutFdbEntryToAsicView( if (fdb->event_type == SAI_FDB_EVENT_LEARNED || fdb->event_type == SAI_FDB_EVENT_MOVE) { + if (fdb->event_type == SAI_FDB_EVENT_MOVE) + { + SWSS_LOG_DEBUG("remove fdb entry %s for SAI_FDB_EVENT_MOVE", + sai_serialize_object_meta_key(metaKey).c_str()); + + m_client->removeAsicObject(metaKey); + } // currently we need to add type manually since fdb event don't contain type sai_attribute_t attr; diff --git a/unittest/syncd/Makefile.am b/unittest/syncd/Makefile.am index 6564f222f4..09860d440f 100644 --- a/unittest/syncd/Makefile.am +++ b/unittest/syncd/Makefile.am @@ -11,7 +11,8 @@ tests_SOURCES = main.cpp \ TestCommandLineOptions.cpp \ TestFlexCounter.cpp \ TestVirtualOidTranslator.cpp \ - TestNotificationQueue.cpp + TestNotificationQueue.cpp \ + TestNotificationProcessor.cpp tests_CXXFLAGS = $(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) tests_LDADD = $(LDADD_GTEST) $(top_srcdir)/syncd/libSyncd.a $(top_srcdir)/vslib/libSaiVS.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) diff --git a/unittest/syncd/TestNotificationProcessor.cpp b/unittest/syncd/TestNotificationProcessor.cpp new file mode 100644 index 0000000000..6104895d26 --- /dev/null +++ b/unittest/syncd/TestNotificationProcessor.cpp @@ -0,0 +1,59 @@ +#include "VirtualOidTranslator.h" +#include "RedisNotificationProducer.h" +#include "NotificationProcessor.h" +#include "lib/RedisVidIndexGenerator.h" +#include "lib/sairediscommon.h" +#include "vslib/Sai.h" + +#include + +using namespace syncd; + +TEST(NotificationProcessor, NotificationProcessorTest) +{ + auto sai = std::make_shared(); + auto dbAsic = std::make_shared("ASIC_DB", 0); + auto client = std::make_shared(dbAsic); + auto producer = std::make_shared("ASIC_DB"); + + auto notificationProcessor = std::make_shared(producer, client, + [](const swss::KeyOpFieldsValuesTuple&){}); + EXPECT_NE(notificationProcessor, nullptr); + + auto switchConfigContainer = std::make_shared(); + auto redisVidIndexGenerator = std::make_shared(dbAsic, REDIS_KEY_VIDCOUNTER); + EXPECT_NE(redisVidIndexGenerator, nullptr); + + auto virtualObjectIdManager = std::make_shared(0, switchConfigContainer, redisVidIndexGenerator); + EXPECT_NE(virtualObjectIdManager, nullptr); + + auto translator = std::make_shared(client, + virtualObjectIdManager, + sai); + EXPECT_NE(translator, nullptr); + notificationProcessor->m_translator = translator; + + // Test FDB MOVE event + std::string key = "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x26000000000001\",\"mac\":\"00:00:00:00:00:01\",\"switch_id\":\"oid:0x210000000000\"}"; + dbAsic->hset(key, "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID", "oid:0x3a000000000a98"); + dbAsic->hset(key, "SAI_FDB_ENTRY_ATTR_TYPE", "SAI_FDB_ENTRY_TYPE_STATIC"); + dbAsic->hset(key, "SAI_FDB_ENTRY_ATTR_ENDPOINT_IP", "10.0.0.1"); + + translator->insertRidAndVid(0x21000000000000,0x210000000000); + translator->insertRidAndVid(0x1003a0000004a,0x3a000000000a99); + translator->insertRidAndVid(0x2600000001,0x26000000000001); + + static std::string fdb_data = "[{\"fdb_entry\":\"{\\\"bvid\\\":\\\"oid:0x2600000001\\\",\\\"mac\\\":\\\"00:00:00:00:00:01\\\",\\\"switch_id\\\":\\\"oid:0x21000000000000\\\"}\",\"fdb_event\":\"SAI_FDB_EVENT_MOVE\",\"list\":[{\"id\":\"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID\",\"value\":\"oid:0x1003a0000004a\"}]}]"; + std::vector fdb_entry; + swss::KeyOpFieldsValuesTuple item(SAI_SWITCH_NOTIFICATION_NAME_FDB_EVENT, fdb_data, fdb_entry); + + notificationProcessor->syncProcessNotification(item); + translator->eraseRidAndVid(0x21000000000000,0x210000000000); + translator->eraseRidAndVid(0x1003a0000004a,0x3a000000000a99); + translator->eraseRidAndVid(0x2600000001,0x26000000000001); + auto bridgeport = dbAsic->hget(key, "SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID"); + auto ip = dbAsic->hget(key, "SAI_FDB_ENTRY_ATTR_ENDPOINT_IP"); + EXPECT_NE(bridgeport, nullptr); + EXPECT_EQ(*bridgeport, "oid:0x3a000000000a99"); + EXPECT_EQ(ip, nullptr); +}