Jiri Slaby 221c28
From: Po-Hsu Lin <po-hsu.lin@canonical.com>
Jiri Slaby 221c28
Date: Thu, 16 Mar 2023 00:53:53 +0800
Jiri Slaby 221c28
Subject: [PATCH] selftests: net: devlink_port_split.py: skip test if no
Jiri Slaby 221c28
 suitable device available
Jiri Slaby 221c28
References: bsc#1012628
Jiri Slaby 221c28
Patch-mainline: 6.2.8
Jiri Slaby 221c28
Git-commit: 24994513ad13ff2c47ba91d2b5df82c3d496c370
Jiri Slaby 221c28
Jiri Slaby 221c28
[ Upstream commit 24994513ad13ff2c47ba91d2b5df82c3d496c370 ]
Jiri Slaby 221c28
Jiri Slaby 221c28
The `devlink -j port show` command output may not contain the "flavour"
Jiri Slaby 221c28
key, an example from Ubuntu 22.10 s390x LPAR(5.19.0-37-generic), with
Jiri Slaby 221c28
mlx4 driver and iproute2-5.15.0:
Jiri Slaby 221c28
  {"port":{"pci/0001:00:00.0/1":{"type":"eth","netdev":"ens301"},
Jiri Slaby 221c28
           "pci/0001:00:00.0/2":{"type":"eth","netdev":"ens301d1"},
Jiri Slaby 221c28
           "pci/0002:00:00.0/1":{"type":"eth","netdev":"ens317"},
Jiri Slaby 221c28
           "pci/0002:00:00.0/2":{"type":"eth","netdev":"ens317d1"}}}
Jiri Slaby 221c28
Jiri Slaby 221c28
This will cause a KeyError exception.
Jiri Slaby 221c28
Jiri Slaby 221c28
Create a validate_devlink_output() to check for this "flavour" from
Jiri Slaby 221c28
devlink command output to avoid this KeyError exception. Also let
Jiri Slaby 221c28
it handle the check for `devlink -j dev show` output in main().
Jiri Slaby 221c28
Jiri Slaby 221c28
Apart from this, if the test was not started because the max lanes of
Jiri Slaby 221c28
the designated device is 0. The script will still return 0 and thus
Jiri Slaby 221c28
causing a false-negative test result.
Jiri Slaby 221c28
Jiri Slaby 221c28
Use a found_max_lanes flag to determine if these tests were skipped
Jiri Slaby 221c28
due to this reason and return KSFT_SKIP to make it more clear.
Jiri Slaby 221c28
Jiri Slaby 221c28
Link: https://bugs.launchpad.net/bugs/1937133
Jiri Slaby 221c28
Fixes: f3348a82e727 ("selftests: net: Add port split test")
Jiri Slaby 221c28
Signed-off-by: Po-Hsu Lin <po-hsu.lin@canonical.com>
Jiri Slaby 221c28
Link: https://lore.kernel.org/r/20230315165353.229590-1-po-hsu.lin@canonical.com
Jiri Slaby 221c28
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Jiri Slaby 221c28
Signed-off-by: Sasha Levin <sashal@kernel.org>
Jiri Slaby 221c28
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Jiri Slaby 221c28
---
Jiri Slaby 221c28
 .../selftests/net/devlink_port_split.py       | 36 ++++++++++++++++---
Jiri Slaby 221c28
 1 file changed, 31 insertions(+), 5 deletions(-)
Jiri Slaby 221c28
Jiri Slaby 221c28
diff --git a/tools/testing/selftests/net/devlink_port_split.py b/tools/testing/selftests/net/devlink_port_split.py
Jiri Slaby 221c28
index 2b5d6ff8..2d84c7a0 100755
Jiri Slaby 221c28
--- a/tools/testing/selftests/net/devlink_port_split.py
Jiri Slaby 221c28
+++ b/tools/testing/selftests/net/devlink_port_split.py
Jiri Slaby 221c28
@@ -59,6 +59,8 @@ class devlink_ports(object):
Jiri Slaby 221c28
         assert stderr == ""
Jiri Slaby 221c28
         ports = json.loads(stdout)['port']
Jiri Slaby 221c28
 
Jiri Slaby 221c28
+        validate_devlink_output(ports, 'flavour')
Jiri Slaby 221c28
+
Jiri Slaby 221c28
         for port in ports:
Jiri Slaby 221c28
             if dev in port:
Jiri Slaby 221c28
                 if ports[port]['flavour'] == 'physical':
Jiri Slaby 221c28
@@ -220,6 +222,27 @@ def split_splittable_port(port, k, lanes, dev):
Jiri Slaby 221c28
     unsplit(port.bus_info)
Jiri Slaby 221c28
 
Jiri Slaby 221c28
 
Jiri Slaby 221c28
+def validate_devlink_output(devlink_data, target_property=None):
Jiri Slaby 221c28
+    """
Jiri Slaby 221c28
+    Determine if test should be skipped by checking:
Jiri Slaby 221c28
+      1. devlink_data contains values
Jiri Slaby 221c28
+      2. The target_property exist in devlink_data
Jiri Slaby 221c28
+    """
Jiri Slaby 221c28
+    skip_reason = None
Jiri Slaby 221c28
+    if any(devlink_data.values()):
Jiri Slaby 221c28
+        if target_property:
Jiri Slaby 221c28
+            skip_reason = "{} not found in devlink output, test skipped".format(target_property)
Jiri Slaby 221c28
+            for key in devlink_data:
Jiri Slaby 221c28
+                if target_property in devlink_data[key]:
Jiri Slaby 221c28
+                    skip_reason = None
Jiri Slaby 221c28
+    else:
Jiri Slaby 221c28
+        skip_reason = 'devlink output is empty, test skipped'
Jiri Slaby 221c28
+
Jiri Slaby 221c28
+    if skip_reason:
Jiri Slaby 221c28
+        print(skip_reason)
Jiri Slaby 221c28
+        sys.exit(KSFT_SKIP)
Jiri Slaby 221c28
+
Jiri Slaby 221c28
+
Jiri Slaby 221c28
 def make_parser():
Jiri Slaby 221c28
     parser = argparse.ArgumentParser(description='A test for port splitting.')
Jiri Slaby 221c28
     parser.add_argument('--dev',
Jiri Slaby 221c28
@@ -240,12 +263,9 @@ def main(cmdline=None):
Jiri Slaby 221c28
         stdout, stderr = run_command(cmd)
Jiri Slaby 221c28
         assert stderr == ""
Jiri Slaby 221c28
 
Jiri Slaby 221c28
+        validate_devlink_output(json.loads(stdout))
Jiri Slaby 221c28
         devs = json.loads(stdout)['dev']
Jiri Slaby 221c28
-        if devs:
Jiri Slaby 221c28
-            dev = list(devs.keys())[0]
Jiri Slaby 221c28
-        else:
Jiri Slaby 221c28
-            print("no devlink device was found, test skipped")
Jiri Slaby 221c28
-            sys.exit(KSFT_SKIP)
Jiri Slaby 221c28
+        dev = list(devs.keys())[0]
Jiri Slaby 221c28
 
Jiri Slaby 221c28
     cmd = "devlink dev show %s" % dev
Jiri Slaby 221c28
     stdout, stderr = run_command(cmd)
Jiri Slaby 221c28
@@ -255,6 +275,7 @@ def main(cmdline=None):
Jiri Slaby 221c28
 
Jiri Slaby 221c28
     ports = devlink_ports(dev)
Jiri Slaby 221c28
 
Jiri Slaby 221c28
+    found_max_lanes = False
Jiri Slaby 221c28
     for port in ports.if_names:
Jiri Slaby 221c28
         max_lanes = get_max_lanes(port.name)
Jiri Slaby 221c28
 
Jiri Slaby 221c28
@@ -277,6 +298,11 @@ def main(cmdline=None):
Jiri Slaby 221c28
                 split_splittable_port(port, lane, max_lanes, dev)
Jiri Slaby 221c28
 
Jiri Slaby 221c28
                 lane //= 2
Jiri Slaby 221c28
+        found_max_lanes = True
Jiri Slaby 221c28
+
Jiri Slaby 221c28
+    if not found_max_lanes:
Jiri Slaby 221c28
+        print(f"Test not started, no port of device {dev} reports max_lanes")
Jiri Slaby 221c28
+        sys.exit(KSFT_SKIP)
Jiri Slaby 221c28
 
Jiri Slaby 221c28
 
Jiri Slaby 221c28
 if __name__ == "__main__":
Jiri Slaby 221c28
-- 
Jiri Slaby 221c28
2.35.3
Jiri Slaby 221c28