def runTest()

in ptf/saiqueue.py [0:0]


    def runTest(self):
        print("DWRR Bandwidth Distribution Test")
        # Create configuration
        # 1. QoS map configuration for egress port to redirect traffic
        # on queues.
        # DSCP -> TC egress, PORT 25 (sender)
        map_list = []
        dscp_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        for traffic_class, dscp in zip(tc_list, dscp_list):
            dscp_to_tc = sai_thrift_qos_map_t(
                key=sai_thrift_qos_map_params_t(dscp=dscp),
                value=sai_thrift_qos_map_params_t(tc=traffic_class))
            map_list.append(dscp_to_tc)
        qos_map_list = sai_thrift_qos_map_list_t(
            count=len(map_list),
            maplist=map_list)
        indirect_qos_map = sai_thrift_create_qos_map(
            self.client,
            type=SAI_QOS_MAP_TYPE_DSCP_TO_TC,
            map_to_value_list=qos_map_list)
        status = sai_thrift_set_port_attribute(
            self.client,
            self.port25,
            qos_dscp_to_tc_map=indirect_qos_map)
        self.assertEqual(status, SAI_STATUS_SUCCESS)

        # TC -> Queue on egress, PORT 25 (sender)
        map_list2 = []
        egress_queue_indices = []

        # Port 25 queue list (sender)
        port25_attr = sai_thrift_get_port_attribute(
            self.client,
            self.port25,
            qos_number_of_queues=True,
            qos_queue_list=self.q_list)
        num_queues = port25_attr["qos_number_of_queues"]
        queue_id_list_port25 = port25_attr["qos_queue_list"].idlist

        # Port 26 queue list (receiver)
        port26_attr = sai_thrift_get_port_attribute(
            self.client,
            self.port26,
            qos_queue_list=self.q_list)
        queue_id_list_port26 = port26_attr["qos_queue_list"].idlist

        for i in tc_list:
            egress_queue_attr = sai_thrift_get_queue_attribute(
                self.client,
                port25_attr["qos_queue_list"].idlist[i],
                index=True)
            queue_index = egress_queue_attr["index"]
            egress_queue_indices.append(queue_index)
            tc_to_queue = sai_thrift_qos_map_t(
                key=sai_thrift_qos_map_params_t(tc=i),
                value=sai_thrift_qos_map_params_t(queue_index=queue_index))
            map_list2.append(tc_to_queue)

            # Clear statistics for each queue in PORT25
            clear_counter(
                    self, sai_thrift_clear_queue_stats, queue_id_list_port25[i])
            # Clear statistics for each queue in PORT26
            clear_counter(
                    self, sai_thrift_clear_queue_stats, queue_id_list_port26[i])

        qos_map_list2 = sai_thrift_qos_map_list_t(
            count=len(map_list2),
            maplist=map_list2)
        target_qos_map = sai_thrift_create_qos_map(
            self.client,
            type=SAI_QOS_MAP_TYPE_TC_TO_QUEUE,
            map_to_value_list=qos_map_list2)
        status = sai_thrift_set_port_attribute(
            self.client,
            self.port25,
            qos_tc_to_queue_map=target_qos_map)
        self.assertEqual(status, SAI_STATUS_SUCCESS)

        # 2. Create scheduler's structre
        # Scheduler profiles for queues
        schedulers = []
        weight = 8
        for queue in range(0, int(num_queues / 2)):
            sched = sai_thrift_create_scheduler(
                self.client,
                meter_type=SAI_METER_TYPE_PACKETS,
                scheduling_type=SAI_SCHEDULING_TYPE_DWRR,
                scheduling_weight=weight)
            self.assertTrue(sched != 0)
            schedulers.append(sched)
            weight //= 2

        # Scheduler profile for port shape
        shaper = sai_thrift_create_scheduler(
            self.client,
            meter_type=SAI_METER_TYPE_PACKETS,
            scheduling_type=SAI_SCHEDULING_TYPE_DWRR,
            max_bandwidth_rate=750)
        self.assertTrue(shaper != 0)

        status = sai_thrift_set_port_attribute(
            self.client,
            self.port26,
            qos_scheduler_profile_id=shaper)
        self.assertEqual(status, SAI_STATUS_SUCCESS)

        # 3. Create queue's structure
        for queue in range(0, num_queues):
            # weights for: queue.0 = 8, queue.1 = 4, queue.2 = 2
            if num_queues < 3:
                status = sai_thrift_set_queue_attribute(
                    self.client,
                    queue_id_list_port26[queue],
                    scheduler_profile_id=schedulers[queue % 3])
            # weights for others: queue.x = 1
            else:
                status = sai_thrift_set_queue_attribute(
                    self.client,
                    queue_id_list_port26[queue],
                    scheduler_profile_id=schedulers[3])
            self.assertEqual(status, SAI_STATUS_SUCCESS)

        print("\tConfiguration completed")
        # Build packets with different type of service
        pkts = []
        exp_pkts = []
        for i in range(0, num_queues):
            tos = i << 2
            pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                    eth_src="00:00:00:00:00:22",
                                    ip_dst="172.16.1.1",
                                    ip_src="192.168.0.1",
                                    ip_id=105,
                                    ip_tos=tos,
                                    ip_ttl=64)
            pkts.append(pkt)

            exp_pkt = simple_tcp_packet(eth_dst="00:11:22:33:44:55",
                                        eth_src=ROUTER_MAC,
                                        ip_dst="172.16.1.1",
                                        ip_src="192.168.0.1",
                                        ip_id=105,
                                        ip_tos=tos,
                                        ip_ttl=63)
            exp_pkts.append(exp_pkt)

        try:
            print("\tSending 19 packets PORT25 -> PORT26")
            rec_pkt = 0
            congestion_rate = 2
            pkt_cnt = congestion_rate * num_queues
            for _ in range(0, congestion_rate):
                for i in range(0, num_queues):
                    send_packet(self, self.dev_port25, pkts[i])
                    # To increase packet rate, disable verification
                    # verify_packet(self, exp_pkts[i], self.dev_port26)
                    rec_pkt += 1

            send_packet(self, self.dev_port25, pkts[2])

            print("\tChecking if received packet number equals sent one")
            print("Expected: {}, Received: {}".format(pkt_cnt, rec_pkt))
            self.assertTrue(rec_pkt == pkt_cnt)
            print("\tPackets received on PORT26")

            print("\tDelay for statistics read")
            time.sleep(5)

            print("\tChecking received packets on particular queues")
            exp_pkt_num = 8
            for queue in range(0, num_queues):
                time.sleep(5)

                q_stats = query_counter(
                    self, sai_thrift_get_queue_stats,
                    queue_id_list_port26[queue])
                rec_pkt_num = q_stats["SAI_QUEUE_STAT_PACKETS"]
                print("Queue:", queue)
                print("Received no. packets:", rec_pkt_num)
                print("Expected no. packets:", exp_pkt_num)
                # self.assertTrue(rec_pkt_num == exp_pkt_num)
                if exp_pkt_num != 1:
                    exp_pkt_num //= 2
            print("\tThe packet distribution is correct.")
            print("\tTest completed successfully")

        finally:
            stats = query_counter(
                    self, sai_thrift_get_queue_stats_ext,
                queue_id_list_port26[0],
                SAI_STATS_MODE_READ_AND_CLEAR)
            cnt = stats["SAI_QUEUE_STAT_PACKETS"]
            self.assertEqual(cnt, 2)
            stats = query_counter(
                    self, sai_thrift_get_queue_stats,
                  queue_id_list_port26[0])
            cnt = stats["SAI_QUEUE_STAT_PACKETS"]
            self.assertEqual(cnt, 0)
            print("\tTest completed successfully")

            status = sai_thrift_set_port_attribute(
                self.client,
                self.port26,
                qos_scheduler_profile_id=0)
            self.assertEqual(status, SAI_STATUS_SUCCESS)
            sai_thrift_remove_scheduler(self.client, shaper)
            status = sai_thrift_set_port_attribute(
                self.client,
                self.port25,
                qos_tc_to_queue_map=0)
            self.assertEqual(status, SAI_STATUS_SUCCESS)
            status = sai_thrift_set_port_attribute(
                self.client,
                self.port25,
                qos_dscp_to_tc_map=0)
            self.assertEqual(status, SAI_STATUS_SUCCESS)
            sai_thrift_remove_qos_map(self.client, indirect_qos_map)
            sai_thrift_remove_qos_map(self.client, target_qos_map)
            for queue in range(0, num_queues):
                status = sai_thrift_set_queue_attribute(
                    self.client,
                    queue_id_list_port26[queue],
                    scheduler_profile_id=0)
                self.assertEqual(status, SAI_STATUS_SUCCESS)
            for i in range(0, int(num_queues / 2)):
                sai_thrift_remove_scheduler(self.client, schedulers[i])