@@ -142,18 +142,25 @@ def config_logging(request):
142142 dataplane_logger .setLevel (logging .ERROR )
143143
144144
145- @pytest .fixture (scope = "session" )
146- def tbinfo (request ):
145+ def get_tbinfo (request ):
147146 """
148- Create and return testbed information
147+ Helper function to create and return testbed information
149148 """
150149 tbname = request .config .getoption ("--testbed" )
151150 tbfile = request .config .getoption ("--testbed_file" )
152151 if tbname is None or tbfile is None :
153152 raise ValueError ("testbed and testbed_file are required!" )
154153
155154 testbedinfo = TestbedInfo (tbfile )
156- return testbedinfo .testbed_topo .get (tbname , {})
155+ return tbname , testbedinfo .testbed_topo .get (tbname , {})
156+
157+ @pytest .fixture (scope = "session" )
158+ def tbinfo (request ):
159+ """
160+ Create and return testbed information
161+ """
162+ _ , testbedinfo = get_tbinfo (request )
163+ return testbedinfo
157164
158165
159166@pytest .fixture (name = "duthosts" , scope = "session" )
@@ -190,7 +197,9 @@ def duthost(duthosts, request):
190197def rand_one_dut_hostname (request ):
191198 """
192199 """
193- dut_hostnames = generate_params_dut_hostname (request )
200+ tbname , testbedinfo = get_tbinfo (request )
201+ duts_in_testbed = testbedinfo ["duts" ]
202+ dut_hostnames = generate_params_dut_hostname (duts_in_testbed , tbname )
194203 if len (dut_hostnames ) > 1 :
195204 dut_hostnames = random .sample (dut_hostnames , 1 )
196205 return dut_hostnames [0 ]
@@ -199,9 +208,10 @@ def rand_one_dut_hostname(request):
199208def rand_one_frontend_dut_hostname (request ):
200209 """
201210 """
202- frontend_dut_hostnames = generate_params_frontend_hostname (request )
203- if len (frontend_dut_hostnames ) > 1 :
204- dut_hostnames = random .sample (frontend_dut_hostnames , 1 )
211+ tbname , testbedinfo = get_tbinfo (request )
212+ duts_in_testbed = testbedinfo ["duts" ]
213+ frontend_dut_hostnames = generate_params_frontend_hostname (request , duts_in_testbed , tbname )
214+ dut_hostnames = random .sample (frontend_dut_hostnames , 1 )
205215 return dut_hostnames [0 ]
206216
207217
@@ -582,24 +592,20 @@ def get_host_data(request, dut):
582592
583593 return inv_data
584594
585- def generate_params_frontend_hostname (request ):
586- tbname = request .config .getoption ("--testbed" )
587- tbfile = request .config .getoption ("--testbed_file" )
588- if tbname is None or tbfile is None :
589- raise ValueError ("testbed and testbed_file are required!" )
590-
591- tbinfo = TestbedInfo (tbfile )
595+ def generate_params_frontend_hostname (request , duts_in_testbed , tbname ):
592596 frontend_duts = []
593597 inv_files = get_inventory_files (request )
594- for dut in tbinfo . testbed_topo [ tbname ][ "duts" ] :
598+ for dut in duts_in_testbed :
595599 if is_frontend_node (inv_files , dut ):
596600 frontend_duts .append (dut )
597-
601+ assert len (frontend_duts ) > 0 , \
602+ "Test selected require at-least one frontend node, " \
603+ "none of the DUTs '{}' in testbed '{}' are a supervisor node" .format (duts_in_testbed , tbname )
598604 return frontend_duts
599605
600606
601- def generate_params_frontend_hostname_rand_per_hwsku (request ):
602- frontend_hosts = generate_params_frontend_hostname (request )
607+ def generate_params_frontend_hostname_rand_per_hwsku (request , duts_in_testbed , tbname ):
608+ frontend_hosts = generate_params_frontend_hostname (request , duts_in_testbed , tbname )
603609 inv_files = get_inventory_files (request )
604610 # Create a list of hosts per hwsku
605611 host_hwskus = {}
@@ -626,39 +632,26 @@ def generate_params_frontend_hostname_rand_per_hwsku(request):
626632 return frontend_hosts_per_hwsku
627633
628634
629- def generate_params_supervisor_hostname (request ):
630- tbname = request .config .getoption ("--testbed" )
631- tbfile = request .config .getoption ("--testbed_file" )
632- if tbname is None or tbfile is None :
633- raise ValueError ("testbed and testbed_file are required!" )
634-
635- tbinfo = TestbedInfo (tbfile )
636-
637- if len (tbinfo .testbed_topo [tbname ]["duts" ]) == 1 :
635+ def generate_params_supervisor_hostname (request , duts_in_testbed , tbname ):
636+ if len (duts_in_testbed ) == 1 :
638637 # We have a single node - dealing with pizza box, return it
639- return [tbinfo . testbed_topo [ tbname ][ "duts" ] [0 ]]
638+ return [duts_in_testbed [0 ]]
640639 inv_files = get_inventory_files (request )
641- for dut in tbinfo .testbed_topo [tbname ]["duts" ]:
640+ for dut in duts_in_testbed :
641+ # Expecting only a single supervisor node
642642 if is_supervisor_node (inv_files , dut ):
643643 return [dut ]
644- pytest .fail ("Test selected require a supervisor node, none of the DUTs '{}' are a supervisor node" .format (tbinfo .testbed_topo [tbname ]["duts" ]))
644+ pytest .fail ("Test selected require a supervisor node, " +
645+ "none of the DUTs '{}' in testbed '{}' are a supervisor node" .format (duts_in_testbed , tbname ))
645646
646647
647- def generate_param_asic_index (request , dut_indices , param_type ):
648+ def generate_param_asic_index (request , duts_in_testbed , dut_indices , param_type ):
648649 logging .info ("generating {} asic indicies for DUT [{}] in " .format (param_type , dut_indices ))
649-
650- tbname = request .config .getoption ("--testbed" )
651- tbfile = request .config .getoption ("--testbed_file" )
652- if tbname is None or tbfile is None :
653- raise ValueError ("testbed and testbed_file are required!" )
654-
655- tbinfo = TestbedInfo (tbfile )
656-
657650 #if the params are not present treat the device as a single asic device
658651 asic_index_params = [DEFAULT_ASIC_ID ]
659652
660653 for dut_id in dut_indices :
661- dut = tbinfo . testbed_topo [ tbname ][ "duts" ] [dut_id ]
654+ dut = duts_in_testbed [dut_id ]
662655 inv_data = get_host_data (request , dut )
663656 if inv_data is not None :
664657 if param_type == ASIC_PARAM_TYPE_ALL and ASIC_PARAM_TYPE_ALL in inv_data :
@@ -669,26 +662,16 @@ def generate_param_asic_index(request, dut_indices, param_type):
669662 dut_id , dut , asic_index_params ))
670663 return asic_index_params
671664
672- def generate_params_dut_index (request ):
673- tbname = request .config .getoption ("--testbed" )
674- tbfile = request .config .getoption ("--testbed_file" )
675- if tbname is None or tbfile is None :
676- raise ValueError ("testbed and testbed_file are required!" )
677- tbinfo = TestbedInfo (tbfile )
678- num_duts = len (tbinfo .testbed_topo [tbname ]["duts" ])
679- logging .info ("Num of duts in testbed topology {}" .format (num_duts ))
665+
666+ def generate_params_dut_index (duts_in_testbeds , tbname ):
667+ num_duts = len (duts_in_testbeds )
668+ logging .info ("Num of duts in testbed '{}' is {}" .format (tbname , num_duts ))
680669 return range (num_duts )
681670
682671
683- def generate_params_dut_hostname (request ):
684- tbname = request .config .getoption ("--testbed" )
685- tbfile = request .config .getoption ("--testbed_file" )
686- if tbname is None or tbfile is None :
687- raise ValueError ("testbed and testbed_file are required!" )
688- tbinfo = TestbedInfo (tbfile )
689- duts = tbinfo .testbed_topo [tbname ]["duts" ]
690- logging .info ("DUTs in testbed topology: {}" .format (str (duts )))
691- return duts
672+ def generate_params_dut_hostname (duts_in_testbed , tbname ):
673+ logging .info ("DUTs in testbed '{}' are: {}" .format (tbname , str (duts_in_testbed )))
674+ return duts_in_testbed
692675
693676
694677def generate_port_lists (request , port_scope ):
@@ -797,29 +780,32 @@ def generate_priority_lists(request, prio_scope):
797780def pytest_generate_tests (metafunc ):
798781 # The topology always has atleast 1 dut
799782 dut_indices = [0 ]
800-
783+ tbname , testbedinfo = get_tbinfo (metafunc )
784+ duts_in_testbed = testbedinfo ["duts" ]
801785 # Enumerators ("enum_dut_index", "enum_dut_hostname", "rand_one_dut_hostname") are mutually exclusive
802786 if "enum_dut_index" in metafunc .fixturenames :
803- dut_indices = generate_params_dut_index (metafunc )
804- metafunc .parametrize ("enum_dut_index" ,dut_indices )
787+ dut_indices = generate_params_dut_index (duts_in_testbed , tbname )
788+ metafunc .parametrize ("enum_dut_index" , dut_indices , scope = "module" )
805789 elif "enum_dut_hostname" in metafunc .fixturenames :
806- dut_hostnames = generate_params_dut_hostname (metafunc )
807- metafunc .parametrize ("enum_dut_hostname" , dut_hostnames )
790+ dut_hostnames = generate_params_dut_hostname (duts_in_testbed , tbname )
791+ metafunc .parametrize ("enum_dut_hostname" , dut_hostnames , scope = "module" )
808792 elif "enum_supervisor_dut_hostname" in metafunc .fixturenames :
809- supervisor_hosts = generate_params_supervisor_hostname (metafunc )
810- metafunc .parametrize ("enum_supervisor_dut_hostname" , supervisor_hosts )
793+ supervisor_hosts = generate_params_supervisor_hostname (metafunc , duts_in_testbed , tbname )
794+ metafunc .parametrize ("enum_supervisor_dut_hostname" , supervisor_hosts , scope = "module" )
811795 elif "enum_frontend_dut_hostname" in metafunc .fixturenames :
812- frontend_hosts = generate_params_frontend_hostname (metafunc )
813- metafunc .parametrize ("enum_frontend_dut_hostname" , frontend_hosts )
796+ frontend_hosts = generate_params_frontend_hostname (metafunc , duts_in_testbed , tbname )
797+ metafunc .parametrize ("enum_frontend_dut_hostname" , frontend_hosts , scope = "module" )
814798 elif "enum_rand_one_per_hwsku_frontend_hostname" in metafunc .fixturenames :
815- frontend_hosts_per_hwsku = generate_params_frontend_hostname_rand_per_hwsku (metafunc )
816- metafunc .parametrize ("enum_rand_one_per_hwsku_frontend_hostname" , frontend_hosts_per_hwsku )
799+ frontend_hosts_per_hwsku = generate_params_frontend_hostname_rand_per_hwsku (metafunc , duts_in_testbed , tbname )
800+ metafunc .parametrize ("enum_rand_one_per_hwsku_frontend_hostname" , frontend_hosts_per_hwsku , scope = "module" )
817801
818802
819803 if "enum_asic_index" in metafunc .fixturenames :
820- metafunc .parametrize ("enum_asic_index" ,generate_param_asic_index (metafunc , dut_indices , ASIC_PARAM_TYPE_ALL ))
804+ metafunc .parametrize ("enum_asic_index" ,
805+ generate_param_asic_index (metafunc , duts_in_testbed , tbname , dut_indices , ASIC_PARAM_TYPE_ALL ))
821806 if "enum_frontend_asic_index" in metafunc .fixturenames :
822- metafunc .parametrize ("enum_frontend_asic_index" ,generate_param_asic_index (metafunc , dut_indices , ASIC_PARAM_TYPE_FRONTEND ))
807+ metafunc .parametrize ("enum_frontend_asic_index" ,
808+ generate_param_asic_index (metafunc , duts_in_testbed , tbname , dut_indices , ASIC_PARAM_TYPE_FRONTEND ))
823809
824810 if "enum_dut_portname" in metafunc .fixturenames :
825811 metafunc .parametrize ("enum_dut_portname" , generate_port_lists (metafunc , "all_ports" ))
0 commit comments