Skip to content

Commit 0abe36e

Browse files
committed
Code optimization; review comments; updates based on converting tests
- Pulling common code of getting duts in testbed into a function. - There was code to create TestbedInfo by parsing the testbed-file and getting the testbed info for a testbed. This code was repeated in tbinfo fixture and all the parameterization helper methods. Moved this into another function 'get_tbinfo' and made other functions/fixtures call this function. - Review comments: - When selecting a frontend node, if we find that none of the DUTs in the testbed are frontend nodes, then we should fail. - scope of parameterized fixtures - By default, all the 'enum_dut*' fixtures in pytest_generate_tests were created with scope 'function'. This made these fixtures not usable in other fixtures that have 'module' scope. - Added scope to be 'module' to all the 'enum_dut*' fixtures in 'pytest_generate_tests'.
1 parent 2fd7394 commit 0abe36e

File tree

1 file changed

+57
-71
lines changed

1 file changed

+57
-71
lines changed

tests/conftest.py

Lines changed: 57 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -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):
190197
def 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):
199208
def 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

694677
def generate_port_lists(request, port_scope):
@@ -797,29 +780,32 @@ def generate_priority_lists(request, prio_scope):
797780
def 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

Comments
 (0)