Commit 24994513 authored by Po-Hsu Lin's avatar Po-Hsu Lin Committed by Jakub Kicinski

selftests: net: devlink_port_split.py: skip test if no suitable device available

The `devlink -j port show` command output may not contain the "flavour"
key, an example from Ubuntu 22.10 s390x LPAR(5.19.0-37-generic), with
mlx4 driver and iproute2-5.15.0:
  {"port":{"pci/0001:00:00.0/1":{"type":"eth","netdev":"ens301"},
           "pci/0001:00:00.0/2":{"type":"eth","netdev":"ens301d1"},
           "pci/0002:00:00.0/1":{"type":"eth","netdev":"ens317"},
           "pci/0002:00:00.0/2":{"type":"eth","netdev":"ens317d1"}}}

This will cause a KeyError exception.

Create a validate_devlink_output() to check for this "flavour" from
devlink command output to avoid this KeyError exception. Also let
it handle the check for `devlink -j dev show` output in main().

Apart from this, if the test was not started because the max lanes of
the designated device is 0. The script will still return 0 and thus
causing a false-negative test result.

Use a found_max_lanes flag to determine if these tests were skipped
due to this reason and return KSFT_SKIP to make it more clear.

Link: https://bugs.launchpad.net/bugs/1937133
Fixes: f3348a82 ("selftests: net: Add port split test")
Signed-off-by: default avatarPo-Hsu Lin <po-hsu.lin@canonical.com>
Link: https://lore.kernel.org/r/20230315165353.229590-1-po-hsu.lin@canonical.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent f3837334
...@@ -59,6 +59,8 @@ class devlink_ports(object): ...@@ -59,6 +59,8 @@ class devlink_ports(object):
assert stderr == "" assert stderr == ""
ports = json.loads(stdout)['port'] ports = json.loads(stdout)['port']
validate_devlink_output(ports, 'flavour')
for port in ports: for port in ports:
if dev in port: if dev in port:
if ports[port]['flavour'] == 'physical': if ports[port]['flavour'] == 'physical':
...@@ -220,6 +222,27 @@ def split_splittable_port(port, k, lanes, dev): ...@@ -220,6 +222,27 @@ def split_splittable_port(port, k, lanes, dev):
unsplit(port.bus_info) unsplit(port.bus_info)
def validate_devlink_output(devlink_data, target_property=None):
"""
Determine if test should be skipped by checking:
1. devlink_data contains values
2. The target_property exist in devlink_data
"""
skip_reason = None
if any(devlink_data.values()):
if target_property:
skip_reason = "{} not found in devlink output, test skipped".format(target_property)
for key in devlink_data:
if target_property in devlink_data[key]:
skip_reason = None
else:
skip_reason = 'devlink output is empty, test skipped'
if skip_reason:
print(skip_reason)
sys.exit(KSFT_SKIP)
def make_parser(): def make_parser():
parser = argparse.ArgumentParser(description='A test for port splitting.') parser = argparse.ArgumentParser(description='A test for port splitting.')
parser.add_argument('--dev', parser.add_argument('--dev',
...@@ -240,12 +263,9 @@ def main(cmdline=None): ...@@ -240,12 +263,9 @@ def main(cmdline=None):
stdout, stderr = run_command(cmd) stdout, stderr = run_command(cmd)
assert stderr == "" assert stderr == ""
validate_devlink_output(json.loads(stdout))
devs = json.loads(stdout)['dev'] devs = json.loads(stdout)['dev']
if devs: dev = list(devs.keys())[0]
dev = list(devs.keys())[0]
else:
print("no devlink device was found, test skipped")
sys.exit(KSFT_SKIP)
cmd = "devlink dev show %s" % dev cmd = "devlink dev show %s" % dev
stdout, stderr = run_command(cmd) stdout, stderr = run_command(cmd)
...@@ -255,6 +275,7 @@ def main(cmdline=None): ...@@ -255,6 +275,7 @@ def main(cmdline=None):
ports = devlink_ports(dev) ports = devlink_ports(dev)
found_max_lanes = False
for port in ports.if_names: for port in ports.if_names:
max_lanes = get_max_lanes(port.name) max_lanes = get_max_lanes(port.name)
...@@ -277,6 +298,11 @@ def main(cmdline=None): ...@@ -277,6 +298,11 @@ def main(cmdline=None):
split_splittable_port(port, lane, max_lanes, dev) split_splittable_port(port, lane, max_lanes, dev)
lane //= 2 lane //= 2
found_max_lanes = True
if not found_max_lanes:
print(f"Test not started, no port of device {dev} reports max_lanes")
sys.exit(KSFT_SKIP)
if __name__ == "__main__": if __name__ == "__main__":
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment