From 4c474b1d6d3e09c6609aa93190553e6ef5d0cb90 Mon Sep 17 00:00:00 2001 From: chitra-raghavan Date: Tue, 24 Apr 2018 05:59:56 -0400 Subject: [PATCH 1/6] Add Cable and Buffer test --- tests/test_cableBuffer.py | 157 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 tests/test_cableBuffer.py diff --git a/tests/test_cableBuffer.py b/tests/test_cableBuffer.py new file mode 100644 index 0000000000..81a6dda8c3 --- /dev/null +++ b/tests/test_cableBuffer.py @@ -0,0 +1,157 @@ +""" + test_Cablebuffer.py implements list of tests to check whether the approprotae buffer profile + is selected for an interface depending upon cable and Speed values . + + These tests need to be run in prepared environment and with the + SONiC version compiled for PLATFORM=vs + + See README.md for details +""" + +import os +import re +import time +import docker +import pytest +import commands +from swsscommon import swsscommon + +import os +import pytest +class TestCableBufferProfile(object): + cable_list = ['5m' , '40m' , '300m'] + speed_list = ['50000', '25000', '40000', '10000', '100000'] + num_ports=32 + + def getProfileDetails(self): + + profile = open("pg_profile_lookup.ini",'r') + profile_details = {} + for cable in self.cable_list: + profile_details[cable]={} + for speed in self.speed_list: + profile_details[cable][speed]={} + #get teh profile details for cable and speed combination + for line in profile : + match=re.search("(\d+)\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)",line) + if match: + length= match.group(2) + profile_details[length][match.group(1)]['size']=match.group(3) + profile_details[length][match.group(1)]['xon']=match.group(4) + profile_details[length][match.group(1)]['xoff']=match.group(5) + profile_details[length][match.group(1)]['threshold']=match.group(6) + return profile_details + + def test_CableBufferProfile(self,request,dvs): + name = request.config.getoption("--dvsname") + #copy the pg profile + os.system(" docker cp %s://usr/share/sonic/device/vswitch/pg_profile_lookup.ini . " %name) + + cdb = swsscommon.DBConnector(4, dvs.redis_sock, 0) + adb = swsscommon.DBConnector(1, dvs.redis_sock, 0) + cfg_port_table = swsscommon.Table(cdb, "PORT", '|') + cfg_cable_length_table = swsscommon.Table(cdb, "CABLE_LENGTH",'|') + cfg_buffer_profile_table = swsscommon.Table(cdb, "BUFFER_PROFILE", '|') + cfg_buffer_pg_table = swsscommon.Table(cdb, "BUFFER_PG", '|') + asic_port_table = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_PORT") + asic_profile_table = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_BUFFER_PROFILE") + + profile_details=self.getProfileDetails() + buffer_profiles = cfg_buffer_profile_table.getKeys() + expected_buffer_profiles_num = len(buffer_profiles) + # buffers.json used for the test defines 7 static profiles: + # "ingress_lossless_profile" + # "ingress_lossy_profile" + # "egress_lossless_profile" + # "egress_lossy_profile" + # "pg_lossy_profile" + # "q_lossless_profile" + # "q_lossy_profile" + # check if they get the DB + assert expected_buffer_profiles_num == 7 + assert len(asic_profile_table.getKeys()) == expected_buffer_profiles_num + + for cable in self.cable_list: + for i in range(0, self.num_ports): + fvc = swsscommon.FieldValuePairs([("Ethernet%d" % (i*4), cable)]) + cfg_cable_length_table.set("AZURE" , fvc) + interface_cable_records = cfg_cable_length_table.getKeys() + (status, fvs) = cfg_cable_length_table.get('AZURE') + assert status == True + #check cable length is set for the interfaces + for interface in fvs : + assert interface[1] == cable + + for speed in self.speed_list: + fvs = swsscommon.FieldValuePairs([("speed", speed)]) + # set same speed on all ports + for i in range(0, self.num_ports): + cfg_port_table.set("Ethernet%d" % (i*4), fvs) + time.sleep(1) + + # check the speed was set + asic_port_records = asic_port_table.getKeys() + assert len(asic_port_records) == (self.num_ports + 1) # +CPU port + num_set = 0 + for k in asic_port_records: + (status, fvs) = asic_port_table.get(k) + assert status == True + for fv in fvs: + if fv[0] == "SAI_PORT_ATTR_SPEED": + assert fv[1] == speed + num_set += 1 + # make sure speed is set for all "num_ports" ports + assert num_set == self.num_ports + # check number of created profiles + expected_buffer_profiles_num += 1 # new speed should add new PG profile + current_buffer_profiles = cfg_buffer_profile_table.getKeys() + assert len(current_buffer_profiles) == expected_buffer_profiles_num + # make sure the same number of profiles are created on ASIC + assert len(asic_profile_table.getKeys()) == expected_buffer_profiles_num + + # check new profile name + expected_new_profile_name = "pg_lossless_%s_%s_profile" %( speed ,cable) + assert current_buffer_profiles.index(expected_new_profile_name) > -1 + + #check the profile is mapped with correct values from lookuptable + (status, fvs) = cfg_buffer_profile_table.get(expected_new_profile_name) + for fv in fvs: + if fv[0]== "xon": + assert fv[1]== profile_details[cable][speed]['xon'] + elif fv[0] == "xoff" : + assert fv[1]== profile_details[cable][speed]['xoff'] + elif fv[0] == "size" : + assert fv[1]== profile_details[cable][speed]['size'] + elif fv[0] == "dynamic_th": + assert fv[1]== profile_details[cable][speed]['threshold'] + + # check correct profile is set for all ports + pg_tables = cfg_buffer_pg_table.getKeys() + for i in range(0, self.num_ports): + expected_pg_table = "Ethernet%d|3-4" % (i*4) + assert pg_tables.index(expected_pg_table) > -1 + (status, fvs) = cfg_buffer_pg_table.get(expected_pg_table) + for fv in fvs: + if fv[0] == "profile": + assert fv[1] == "[BUFFER_PROFILE|%s]" % expected_new_profile_name + #remove the file copied from docker + os.system(" rm pg_profile_lookup.ini") + + + + + + + + + + + + + + + + + + + From 738ecb7b2bea84534024bf32c625501b608f471a Mon Sep 17 00:00:00 2001 From: chitra-raghavan Date: Tue, 24 Apr 2018 06:11:31 -0400 Subject: [PATCH 2/6] Add Cable and Buffer test --- tests/test_cableBuffer.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/tests/test_cableBuffer.py b/tests/test_cableBuffer.py index 81a6dda8c3..7dc1bb3d6c 100644 --- a/tests/test_cableBuffer.py +++ b/tests/test_cableBuffer.py @@ -136,22 +136,4 @@ def test_CableBufferProfile(self,request,dvs): assert fv[1] == "[BUFFER_PROFILE|%s]" % expected_new_profile_name #remove the file copied from docker os.system(" rm pg_profile_lookup.ini") - - - - - - - - - - - - - - - - - - From ec1d5e5e3b4f9ca49c17c07511660fd8dc6f4add Mon Sep 17 00:00:00 2001 From: chitra-raghavan Date: Wed, 2 May 2018 03:04:59 -0400 Subject: [PATCH 3/6] modified according to PEP8 compliance --- tests/test_cableBuffer.py | 162 +++++++++++++++++++------------------- 1 file changed, 80 insertions(+), 82 deletions(-) diff --git a/tests/test_cableBuffer.py b/tests/test_cableBuffer.py index 7dc1bb3d6c..1ad8355ae1 100644 --- a/tests/test_cableBuffer.py +++ b/tests/test_cableBuffer.py @@ -15,48 +15,46 @@ import pytest import commands from swsscommon import swsscommon - -import os import pytest + + class TestCableBufferProfile(object): - cable_list = ['5m' , '40m' , '300m'] - speed_list = ['50000', '25000', '40000', '10000', '100000'] - num_ports=32 + cable_list = ['5m', '40m', '300m'] + speed_list = ['50000' , '25000', '40000', '10000', '100000'] + num_ports = 32 def getProfileDetails(self): - - profile = open("pg_profile_lookup.ini",'r') + profile = open("pg_profile_lookup.ini", 'r') profile_details = {} - for cable in self.cable_list: - profile_details[cable]={} - for speed in self.speed_list: - profile_details[cable][speed]={} - #get teh profile details for cable and speed combination - for line in profile : - match=re.search("(\d+)\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)",line) - if match: - length= match.group(2) - profile_details[length][match.group(1)]['size']=match.group(3) - profile_details[length][match.group(1)]['xon']=match.group(4) - profile_details[length][match.group(1)]['xoff']=match.group(5) - profile_details[length][match.group(1)]['threshold']=match.group(6) + for cable in self.cable_list: + profile_details[cable] = {} + for speed in self.speed_list: + profile_details[cable][speed] = {} + # get teh profile details for cable and speed combination + for line in profile: + match = re.search("(\d+)\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)", line) + if match: + length = match.group(2) + profile_details[length][match.group(1)]['size'] = match.group(3) + profile_details[length][match.group(1)]['xon'] = match.group(4) + profile_details[length][match.group(1)]['xoff'] = match.group(5) + profile_details[length][match.group(1)]['threshold'] = match.group(6) return profile_details - def test_CableBufferProfile(self,request,dvs): + def test_CableBufferProfile(self, request, dvs): name = request.config.getoption("--dvsname") - #copy the pg profile - os.system(" docker cp %s://usr/share/sonic/device/vswitch/pg_profile_lookup.ini . " %name) - + # copy the pg profile + os.system(" docker cp %s://usr/share/sonic/device/vswitch/pg_profile_lookup.ini . " % name) cdb = swsscommon.DBConnector(4, dvs.redis_sock, 0) adb = swsscommon.DBConnector(1, dvs.redis_sock, 0) cfg_port_table = swsscommon.Table(cdb, "PORT", '|') - cfg_cable_length_table = swsscommon.Table(cdb, "CABLE_LENGTH",'|') + cfg_cable_length_table = swsscommon.Table(cdb, "CABLE_LENGTH", '|') cfg_buffer_profile_table = swsscommon.Table(cdb, "BUFFER_PROFILE", '|') - cfg_buffer_pg_table = swsscommon.Table(cdb, "BUFFER_PG", '|') + cfg_buffer_pg_table = swsscommon.Table(cdb, "BUFFER_PG", '|') asic_port_table = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_PORT") asic_profile_table = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_BUFFER_PROFILE") - profile_details=self.getProfileDetails() + profile_details = self.getProfileDetails() buffer_profiles = cfg_buffer_profile_table.getKeys() expected_buffer_profiles_num = len(buffer_profiles) # buffers.json used for the test defines 7 static profiles: @@ -73,67 +71,67 @@ def test_CableBufferProfile(self,request,dvs): for cable in self.cable_list: for i in range(0, self.num_ports): - fvc = swsscommon.FieldValuePairs([("Ethernet%d" % (i*4), cable)]) - cfg_cable_length_table.set("AZURE" , fvc) + fvc = swsscommon.FieldValuePairs([("Ethernet%d" % (i*4), cable)]) + cfg_cable_length_table.set("AZURE", fvc) interface_cable_records = cfg_cable_length_table.getKeys() (status, fvs) = cfg_cable_length_table.get('AZURE') assert status == True - #check cable length is set for the interfaces - for interface in fvs : - assert interface[1] == cable + # check cable length is set for the interfaces + for interface in fvs: + assert interface[1] == cable for speed in self.speed_list: - fvs = swsscommon.FieldValuePairs([("speed", speed)]) - # set same speed on all ports - for i in range(0, self.num_ports): - cfg_port_table.set("Ethernet%d" % (i*4), fvs) - time.sleep(1) - - # check the speed was set - asic_port_records = asic_port_table.getKeys() - assert len(asic_port_records) == (self.num_ports + 1) # +CPU port - num_set = 0 - for k in asic_port_records: - (status, fvs) = asic_port_table.get(k) - assert status == True - for fv in fvs: - if fv[0] == "SAI_PORT_ATTR_SPEED": - assert fv[1] == speed - num_set += 1 - # make sure speed is set for all "num_ports" ports - assert num_set == self.num_ports - # check number of created profiles - expected_buffer_profiles_num += 1 # new speed should add new PG profile - current_buffer_profiles = cfg_buffer_profile_table.getKeys() - assert len(current_buffer_profiles) == expected_buffer_profiles_num - # make sure the same number of profiles are created on ASIC - assert len(asic_profile_table.getKeys()) == expected_buffer_profiles_num + fvs = swsscommon.FieldValuePairs([("speed", speed)]) + # set same speed on all ports + for i in range(0, self.num_ports): + cfg_port_table.set("Ethernet%d" % (i*4), fvs) + time.sleep(1) + + # check the speed was set + asic_port_records = asic_port_table.getKeys() + assert len(asic_port_records) == (self.num_ports + 1) # +CPU port + num_set = 0 + for k in asic_port_records: + (status, fvs) = asic_port_table.get(k) + assert status == True + for fv in fvs: + if fv[0] == "SAI_PORT_ATTR_SPEED": + assert fv[1] == speed + num_set += 1 + # make sure speed is set for all "num_ports" ports + assert num_set == self.num_ports + # check number of created profiles + expected_buffer_profiles_num += 1 # new speed should add new PG profile + current_buffer_profiles = cfg_buffer_profile_table.getKeys() + assert len(current_buffer_profiles) == expected_buffer_profiles_num + # make sure the same number of profiles are created on ASIC + assert len(asic_profile_table.getKeys()) == expected_buffer_profiles_num + + # check new profile name + expected_new_profile_name = "pg_lossless_%s_%s_profile" % (speed, cable) + assert current_buffer_profiles.index(expected_new_profile_name) > -1 - # check new profile name - expected_new_profile_name = "pg_lossless_%s_%s_profile" %( speed ,cable) - assert current_buffer_profiles.index(expected_new_profile_name) > -1 - - #check the profile is mapped with correct values from lookuptable - (status, fvs) = cfg_buffer_profile_table.get(expected_new_profile_name) - for fv in fvs: - if fv[0]== "xon": - assert fv[1]== profile_details[cable][speed]['xon'] - elif fv[0] == "xoff" : - assert fv[1]== profile_details[cable][speed]['xoff'] - elif fv[0] == "size" : - assert fv[1]== profile_details[cable][speed]['size'] - elif fv[0] == "dynamic_th": - assert fv[1]== profile_details[cable][speed]['threshold'] + # check the profile is mapped with correct values from lookuptable + (status, fvs) = cfg_buffer_profile_table.get(expected_new_profile_name) + for fv in fvs: + if fv[0] == "xon": + assert fv[1] == profile_details[cable][speed]['xon'] + elif fv[0] == "xoff": + assert fv[1] == profile_details[cable][speed]['xoff'] + elif fv[0] == "size": + assert fv[1] == profile_details[cable][speed]['size'] + elif fv[0] == "dynamic_th": + assert fv[1] == profile_details[cable][speed]['threshold'] - # check correct profile is set for all ports - pg_tables = cfg_buffer_pg_table.getKeys() - for i in range(0, self.num_ports): - expected_pg_table = "Ethernet%d|3-4" % (i*4) - assert pg_tables.index(expected_pg_table) > -1 - (status, fvs) = cfg_buffer_pg_table.get(expected_pg_table) - for fv in fvs: - if fv[0] == "profile": - assert fv[1] == "[BUFFER_PROFILE|%s]" % expected_new_profile_name - #remove the file copied from docker + # check correct profile is set for all ports + pg_tables = cfg_buffer_pg_table.getKeys() + for i in range(0, self.num_ports): + expected_pg_table = "Ethernet%d|3-4" % (i*4) + assert pg_tables.index(expected_pg_table) > -1 + (status, fvs) = cfg_buffer_pg_table.get(expected_pg_table) + for fv in fvs: + if fv[0] == "profile": + assert fv[1] == "[BUFFER_PROFILE|%s]" % expected_new_profile_name + # remove the file copied from docker os.system(" rm pg_profile_lookup.ini") From 7e3f513ae4e043cdc6b3aa127e6cec191c9c8a72 Mon Sep 17 00:00:00 2001 From: chitra-raghavan Date: Wed, 2 May 2018 06:09:05 -0400 Subject: [PATCH 4/6] updated script according to swss-common table name separator changes --- tests/pg_profile_lookup.ini | 17 +++++++++++++++++ tests/test_cableBuffer.py | 19 ++++++++----------- 2 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 tests/pg_profile_lookup.ini diff --git a/tests/pg_profile_lookup.ini b/tests/pg_profile_lookup.ini new file mode 100644 index 0000000000..f6b160fb4c --- /dev/null +++ b/tests/pg_profile_lookup.ini @@ -0,0 +1,17 @@ +# PG lossless profiles. IF Buffer profiles got changed in vs ,then this file need to be changed accordingly +# speed cable size xon xoff threshold + 10000 5m 34816 18432 16384 0 + 25000 5m 34816 18432 16384 0 + 40000 5m 34816 18432 16384 0 + 50000 5m 34816 18432 16384 0 + 100000 5m 36864 18432 18432 0 + 10000 40m 36864 18432 18432 0 + 25000 40m 39936 18432 21504 0 + 40000 40m 41984 18432 23552 0 + 50000 40m 41984 18432 23552 0 + 100000 40m 54272 18432 35840 0 + 10000 300m 49152 18432 30720 0 + 25000 300m 71680 18432 53248 0 + 40000 300m 94208 18432 75776 0 + 50000 300m 94208 18432 75776 0 + 100000 300m 184320 18432 165888 0 diff --git a/tests/test_cableBuffer.py b/tests/test_cableBuffer.py index 1ad8355ae1..ad04044c21 100644 --- a/tests/test_cableBuffer.py +++ b/tests/test_cableBuffer.py @@ -6,6 +6,8 @@ SONiC version compiled for PLATFORM=vs See README.md for details + For Running this script , we are using pg_profile_lookup.ini under ../tests directory. + In future if there is any change in buffer profiles, pg_profile_lookup.ini has to be updated in ../tests directory. """ import os @@ -30,7 +32,7 @@ def getProfileDetails(self): profile_details[cable] = {} for speed in self.speed_list: profile_details[cable][speed] = {} - # get teh profile details for cable and speed combination + # get the profile details for cable and speed combination for line in profile: match = re.search("(\d+)\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)", line) if match: @@ -41,16 +43,13 @@ def getProfileDetails(self): profile_details[length][match.group(1)]['threshold'] = match.group(6) return profile_details - def test_CableBufferProfile(self, request, dvs): - name = request.config.getoption("--dvsname") - # copy the pg profile - os.system(" docker cp %s://usr/share/sonic/device/vswitch/pg_profile_lookup.ini . " % name) + def test_CableBufferProfile(self, dvs): cdb = swsscommon.DBConnector(4, dvs.redis_sock, 0) adb = swsscommon.DBConnector(1, dvs.redis_sock, 0) - cfg_port_table = swsscommon.Table(cdb, "PORT", '|') - cfg_cable_length_table = swsscommon.Table(cdb, "CABLE_LENGTH", '|') - cfg_buffer_profile_table = swsscommon.Table(cdb, "BUFFER_PROFILE", '|') - cfg_buffer_pg_table = swsscommon.Table(cdb, "BUFFER_PG", '|') + cfg_port_table = swsscommon.Table(cdb, "PORT") + cfg_cable_length_table = swsscommon.Table(cdb, "CABLE_LENGTH") + cfg_buffer_profile_table = swsscommon.Table(cdb, "BUFFER_PROFILE") + cfg_buffer_pg_table = swsscommon.Table(cdb, "BUFFER_PG") asic_port_table = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_PORT") asic_profile_table = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_BUFFER_PROFILE") @@ -132,6 +131,4 @@ def test_CableBufferProfile(self, request, dvs): for fv in fvs: if fv[0] == "profile": assert fv[1] == "[BUFFER_PROFILE|%s]" % expected_new_profile_name - # remove the file copied from docker - os.system(" rm pg_profile_lookup.ini") From b96fb0388eab54e58988e47461c6b8d2c67dd588 Mon Sep 17 00:00:00 2001 From: chitra-raghavan Date: Thu, 3 May 2018 00:56:29 -0400 Subject: [PATCH 5/6] Renamed cable_list name as per review comment --- tests/test_cableBuffer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_cableBuffer.py b/tests/test_cableBuffer.py index ad04044c21..a92de3f381 100644 --- a/tests/test_cableBuffer.py +++ b/tests/test_cableBuffer.py @@ -21,14 +21,14 @@ class TestCableBufferProfile(object): - cable_list = ['5m', '40m', '300m'] + cable_length_list = ['5m', '40m', '300m'] speed_list = ['50000' , '25000', '40000', '10000', '100000'] num_ports = 32 def getProfileDetails(self): profile = open("pg_profile_lookup.ini", 'r') profile_details = {} - for cable in self.cable_list: + for cable in self.cable_length_list: profile_details[cable] = {} for speed in self.speed_list: profile_details[cable][speed] = {} @@ -68,7 +68,7 @@ def test_CableBufferProfile(self, dvs): assert expected_buffer_profiles_num == 7 assert len(asic_profile_table.getKeys()) == expected_buffer_profiles_num - for cable in self.cable_list: + for cable in self.cable_length_list: for i in range(0, self.num_ports): fvc = swsscommon.FieldValuePairs([("Ethernet%d" % (i*4), cable)]) cfg_cable_length_table.set("AZURE", fvc) From eb62e57d5faa923d2f4050f30648a692a60b4173 Mon Sep 17 00:00:00 2001 From: chitra-raghavan Date: Fri, 4 May 2018 01:09:05 -0400 Subject: [PATCH 6/6] corrected typo --- tests/test_cableBuffer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_cableBuffer.py b/tests/test_cableBuffer.py index a92de3f381..6f1a7d31c4 100644 --- a/tests/test_cableBuffer.py +++ b/tests/test_cableBuffer.py @@ -1,5 +1,5 @@ """ - test_Cablebuffer.py implements list of tests to check whether the approprotae buffer profile + test_Cablebuffer.py implements list of tests to check whether the appropriate buffer profile is selected for an interface depending upon cable and Speed values . These tests need to be run in prepared environment and with the