@@ -683,4 +683,308 @@ TEST_F(SyncdBrcmTest, portBufferBulkSet)
683683
684684 status = m_sairedis->set (SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
685685 ASSERT_EQ (status, SAI_STATUS_SUCCESS);
686+ }
687+
688+ TEST_F (SyncdBrcmTest, portBulkSetInInitView)
689+ {
690+ sai_object_id_t switchId;
691+ sai_attribute_t attrs[1 ];
692+
693+ struct
694+ {
695+ std::vector<sai_object_id_t > oids;
696+ std::vector<sai_attribute_t > attrs;
697+ std::vector<sai_status_t > statuses;
698+
699+ void resize (size_t size)
700+ {
701+ SWSS_LOG_ENTER ();
702+
703+ oids.resize (size);
704+ attrs.resize (size);
705+ statuses.resize (size, SAI_STATUS_NOT_EXECUTED);
706+ }
707+ } ports;
708+
709+ // init view
710+
711+ attrs[0 ].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
712+ attrs[0 ].value .s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;
713+
714+ auto status = m_sairedis->set (SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
715+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
716+
717+ // create switch
718+
719+ attrs[0 ].id = SAI_SWITCH_ATTR_INIT_SWITCH;
720+ attrs[0 ].value .booldata = true ;
721+
722+ status = m_sairedis->create (SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1 , attrs);
723+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
724+
725+ // apply view
726+
727+ attrs[0 ].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
728+ attrs[0 ].value .s32 = SAI_REDIS_NOTIFY_SYNCD_APPLY_VIEW;
729+
730+ status = m_sairedis->set (SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
731+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
732+
733+ // init view
734+
735+ attrs[0 ].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
736+ attrs[0 ].value .s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;
737+
738+ status = m_sairedis->set (SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
739+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
740+
741+ // create switch
742+
743+ attrs[0 ].id = SAI_SWITCH_ATTR_INIT_SWITCH;
744+ attrs[0 ].value .booldata = true ;
745+
746+ status = m_sairedis->create (SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1 , attrs);
747+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
748+
749+ attrs[0 ].id = SAI_SWITCH_ATTR_PORT_NUMBER;
750+ status = m_sairedis->get (SAI_OBJECT_TYPE_SWITCH, switchId, 1 , attrs);
751+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
752+
753+ ports.resize (attrs[0 ].value .u32 );
754+
755+ ASSERT_TRUE (ports.oids .size () > 1 );
756+
757+ attrs[0 ].id = SAI_SWITCH_ATTR_PORT_LIST;
758+ attrs[0 ].value .objlist .count = static_cast <uint32_t >(ports.oids .size ());
759+ attrs[0 ].value .objlist .list = ports.oids .data ();
760+ status = m_sairedis->get (SAI_OBJECT_TYPE_SWITCH, switchId, 1 , attrs);
761+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
762+
763+ // Set port admin status in bulk
764+
765+ for (size_t i = 0 ; i < ports.oids .size (); i++)
766+ {
767+ ports.attrs [i].id = SAI_PORT_ATTR_ADMIN_STATE;
768+ ports.attrs [i].value .booldata = true ;
769+ }
770+
771+ status = m_sairedis->bulkSet (SAI_OBJECT_TYPE_PORT, static_cast <uint32_t >(ports.oids .size ()), ports.oids .data (),
772+ ports.attrs .data (), SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, ports.statuses .data ());
773+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
774+
775+ for (size_t i = 0 ; i < ports.oids .size (); i++)
776+ {
777+ ASSERT_EQ (ports.statuses [i], SAI_STATUS_SUCCESS);
778+ }
779+ }
780+
781+ TEST_F (SyncdBrcmTest, pgBulkSetInInitView)
782+ {
783+ sai_object_id_t switchId;
784+ sai_attribute_t attrs[1 ];
785+
786+ std::vector<sai_object_id_t > portOids;
787+
788+ struct
789+ {
790+ std::vector<sai_object_id_t > oids;
791+ std::vector<sai_attribute_t > attrs;
792+ std::vector<sai_status_t > statuses;
793+
794+ void resize (size_t size)
795+ {
796+ SWSS_LOG_ENTER ();
797+
798+ oids.resize (size);
799+ attrs.resize (size);
800+ statuses.resize (size, SAI_STATUS_NOT_EXECUTED);
801+ }
802+ } pgs;
803+
804+ // init view
805+
806+ attrs[0 ].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
807+ attrs[0 ].value .s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;
808+
809+ auto status = m_sairedis->set (SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
810+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
811+
812+ // create switch
813+
814+ attrs[0 ].id = SAI_SWITCH_ATTR_INIT_SWITCH;
815+ attrs[0 ].value .booldata = true ;
816+
817+ status = m_sairedis->create (SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1 , attrs);
818+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
819+
820+ // apply view
821+
822+ attrs[0 ].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
823+ attrs[0 ].value .s32 = SAI_REDIS_NOTIFY_SYNCD_APPLY_VIEW;
824+
825+ status = m_sairedis->set (SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
826+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
827+
828+ // init view
829+
830+ attrs[0 ].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
831+ attrs[0 ].value .s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;
832+
833+ status = m_sairedis->set (SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
834+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
835+
836+ // create switch
837+
838+ attrs[0 ].id = SAI_SWITCH_ATTR_INIT_SWITCH;
839+ attrs[0 ].value .booldata = true ;
840+
841+ status = m_sairedis->create (SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1 , attrs);
842+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
843+
844+ attrs[0 ].id = SAI_SWITCH_ATTR_PORT_NUMBER;
845+ status = m_sairedis->get (SAI_OBJECT_TYPE_SWITCH, switchId, 1 , attrs);
846+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
847+
848+ portOids.resize (attrs[0 ].value .u32 );
849+
850+ ASSERT_TRUE (portOids.size () > 1 );
851+
852+ attrs[0 ].id = SAI_SWITCH_ATTR_PORT_LIST;
853+ attrs[0 ].value .objlist .count = static_cast <uint32_t >(portOids.size ());
854+ attrs[0 ].value .objlist .list = portOids.data ();
855+ status = m_sairedis->get (SAI_OBJECT_TYPE_SWITCH, switchId, 1 , attrs);
856+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
857+
858+ attrs[0 ].id = SAI_SWITCH_ATTR_PORT_LIST;
859+ attrs[0 ].value .objlist .count = static_cast <uint32_t >(portOids.size ());
860+ attrs[0 ].value .objlist .list = portOids.data ();
861+ status = m_sairedis->get (SAI_OBJECT_TYPE_SWITCH, switchId, 1 , attrs);
862+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
863+
864+ // Create buffer pool
865+
866+ std::array<sai_attribute_t , 4 > buffer_pool_attrs;
867+ sai_object_id_t buffer_pool;
868+
869+ buffer_pool_attrs[0 ].id = SAI_BUFFER_POOL_ATTR_THRESHOLD_MODE;
870+ buffer_pool_attrs[0 ].value .u32 = SAI_BUFFER_POOL_THRESHOLD_MODE_DYNAMIC;
871+
872+ buffer_pool_attrs[1 ].id = SAI_BUFFER_POOL_ATTR_SIZE;
873+ buffer_pool_attrs[1 ].value .u32 = 47218432 ;
874+
875+ buffer_pool_attrs[2 ].id = SAI_BUFFER_POOL_ATTR_TYPE;
876+ buffer_pool_attrs[2 ].value .u32 = SAI_BUFFER_POOL_TYPE_INGRESS;
877+
878+ buffer_pool_attrs[3 ].id = SAI_BUFFER_POOL_ATTR_XOFF_SIZE;
879+ buffer_pool_attrs[3 ].value .u32 = 17708800 ;
880+
881+ status = m_sairedis->create (SAI_OBJECT_TYPE_BUFFER_POOL, &buffer_pool, switchId,
882+ static_cast <uint32_t >(buffer_pool_attrs.size ()), buffer_pool_attrs.data ());
883+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
884+
885+ // Create buffer profile
886+
887+ std::array<sai_attribute_t , 4 > buffer_profile_attrs;
888+ sai_object_id_t buffer_profile;
889+
890+ buffer_profile_attrs[0 ].id = SAI_BUFFER_PROFILE_ATTR_POOL_ID;
891+ buffer_profile_attrs[0 ].value .oid = buffer_pool;
892+
893+ buffer_profile_attrs[1 ].id = SAI_BUFFER_PROFILE_ATTR_THRESHOLD_MODE;
894+ buffer_profile_attrs[1 ].value .u32 = SAI_BUFFER_PROFILE_THRESHOLD_MODE_DYNAMIC;
895+
896+ buffer_profile_attrs[2 ].id = SAI_BUFFER_PROFILE_ATTR_SHARED_DYNAMIC_TH;
897+ buffer_profile_attrs[2 ].value .s8 = -8 ;
898+
899+ buffer_profile_attrs[3 ].id = SAI_BUFFER_PROFILE_ATTR_RESERVED_BUFFER_SIZE;
900+ buffer_profile_attrs[3 ].value .u64 = 6755399441055744 ;
901+
902+ status = m_sairedis->create (SAI_OBJECT_TYPE_BUFFER_PROFILE, &buffer_profile, switchId,
903+ static_cast <uint32_t >(buffer_profile_attrs.size ()), buffer_profile_attrs.data ());
904+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
905+
906+ // Priority group configuration
907+
908+ attrs[0 ].id = SAI_PORT_ATTR_NUMBER_OF_INGRESS_PRIORITY_GROUPS;
909+ status = m_sairedis->get (SAI_OBJECT_TYPE_PORT, portOids[0 ], 1 , attrs);
910+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
911+
912+ pgs.resize (attrs[0 ].value .u32 );
913+
914+ attrs[0 ].id = SAI_PORT_ATTR_INGRESS_PRIORITY_GROUP_LIST;
915+ attrs[0 ].value .objlist .count = static_cast <uint32_t >(pgs.oids .size ());
916+ attrs[0 ].value .objlist .list = pgs.oids .data ();
917+
918+ status = m_sairedis->get (SAI_OBJECT_TYPE_PORT, portOids[0 ], 1 , attrs);
919+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
920+
921+ for (size_t i = 0 ; i < pgs.oids .size (); i++)
922+ {
923+ pgs.attrs [i].id = SAI_INGRESS_PRIORITY_GROUP_ATTR_BUFFER_PROFILE;
924+ pgs.attrs [i].value .oid = buffer_profile;
925+ }
926+
927+ status = m_sairedis->bulkSet (SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, static_cast <uint32_t >(pgs.oids .size ()), pgs.oids .data (),
928+ pgs.attrs .data (), SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, pgs.statuses .data ());
929+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
930+
931+ for (size_t i = 0 ; i < pgs.oids .size (); i++)
932+ {
933+ ASSERT_EQ (pgs.statuses [i], SAI_STATUS_SUCCESS);
934+ }
935+ }
936+
937+ TEST_F (SyncdBrcmTest, bulkSetInInitViewForUnsupportedObjects)
938+ {
939+ sai_object_id_t switchId;
940+ sai_attribute_t attrs[1 ];
941+
942+ // init view
943+
944+ attrs[0 ].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
945+ attrs[0 ].value .s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;
946+
947+ auto status = m_sairedis->set (SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
948+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
949+
950+ // create switch
951+
952+ attrs[0 ].id = SAI_SWITCH_ATTR_INIT_SWITCH;
953+ attrs[0 ].value .booldata = true ;
954+
955+ status = m_sairedis->create (SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1 , attrs);
956+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
957+
958+ // apply view
959+
960+ attrs[0 ].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
961+ attrs[0 ].value .s32 = SAI_REDIS_NOTIFY_SYNCD_APPLY_VIEW;
962+
963+ status = m_sairedis->set (SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
964+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
965+
966+ // init view
967+
968+ attrs[0 ].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
969+ attrs[0 ].value .s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;
970+
971+ status = m_sairedis->set (SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
972+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
973+
974+ // create switch
975+
976+ attrs[0 ].id = SAI_SWITCH_ATTR_INIT_SWITCH;
977+ attrs[0 ].value .booldata = true ;
978+
979+ status = m_sairedis->create (SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1 , attrs);
980+ ASSERT_EQ (status, SAI_STATUS_SUCCESS);
981+
982+ attrs[0 ].id = SAI_SWITCH_ATTR_UNINIT_DATA_PLANE_ON_REMOVAL;
983+ attrs[0 ].value .booldata = true ;
984+
985+ sai_object_id_t oids[1 ] = {switchId};
986+ sai_status_t statuses[1 ] = {SAI_STATUS_NOT_EXECUTED};
987+
988+ ASSERT_THROW (m_sairedis->bulkSet (SAI_OBJECT_TYPE_SWITCH, 1 , oids, attrs,
989+ SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses), std::runtime_error);
686990}
0 commit comments