The current design requires that a peer pci port is identified so that test suites can create the correct port links. While this can work, it also creates a lot of room for user error. Instead, devices should be given a unique identifier which is referenced in defined test runs.
Both defined testbeds for the SUT and TG must have an equal number of specified ports. In each given array or ports, SUT port 0 is connected to TG port 0, SUT port 1 is connected to TG port 1, etc. Bugzilla ID: 1478 Signed-off-by: Nicholas Pratte <npra...@iol.unh.edu> --- dts/conf.yaml | 32 ++++++------- dts/framework/config/__init__.py | 12 +++-- dts/framework/config/conf_yaml_schema.json | 52 +++++++++++++--------- dts/framework/config/types.py | 19 +++++--- 4 files changed, 69 insertions(+), 46 deletions(-) diff --git a/dts/conf.yaml b/dts/conf.yaml index 7d95016e68..16214ee267 100644 --- a/dts/conf.yaml +++ b/dts/conf.yaml @@ -20,10 +20,17 @@ test_runs: # The machine running the DPDK test executable system_under_test_node: node_name: "SUT 1" + test_bed: + - "Intel SUT Port 1" + - "Intel SUT Port 2" vdevs: # optional; if removed, vdevs won't be used in the test run - "crypto_openssl" # Traffic generator node to use for this test run - traffic_generator_node: "TG 1" + traffic_generator_node: + node_name: "TG 1" + test_bed: + - "Mellanox TG Port 1" + - "Broadcom TG Port 1" nodes: # Define a system under test node, having two network ports physically # connected to the corresponding ports in TG 1 (the peer node) @@ -40,17 +47,14 @@ nodes: force_first_numa: false ports: # sets up the physical link between "SUT 1"@000:00:08.0 and "TG 1"@0000:00:08.0 - - pci: "0000:00:08.0" + - name: "Intel SUT Port 1" + pci: "0000:00:08.0" os_driver_for_dpdk: vfio-pci # OS driver that DPDK will use os_driver: i40e # OS driver to bind when the tests are not running - peer_node: "TG 1" - peer_pci: "0000:00:08.0" - # sets up the physical link between "SUT 1"@000:00:08.1 and "TG 1"@0000:00:08.1 - - pci: "0000:00:08.1" + - name: "Intel SUT Port 2" + pci: "0000:00:08.1" os_driver_for_dpdk: vfio-pci os_driver: i40e - peer_node: "TG 1" - peer_pci: "0000:00:08.1" # Define a Scapy traffic generator node, having two network ports # physically connected to the corresponding ports in SUT 1 (the peer node). - name: "TG 1" @@ -59,18 +63,14 @@ nodes: arch: x86_64 os: linux ports: - # sets up the physical link between "TG 1"@000:00:08.0 and "SUT 1"@0000:00:08.0 - - pci: "0000:00:08.0" + - name: "Mellanox TG Port 1" + pci: "0000:00:08.0" os_driver_for_dpdk: rdma os_driver: rdma - peer_node: "SUT 1" - peer_pci: "0000:00:08.0" - # sets up the physical link between "SUT 1"@000:00:08.0 and "TG 1"@0000:00:08.0 - - pci: "0000:00:08.1" + - name: "Broadcom TG Port 1" + pci: "0000:00:08.1" os_driver_for_dpdk: rdma os_driver: rdma - peer_node: "SUT 1" - peer_pci: "0000:00:08.1" hugepages_2mb: # optional; if removed, will use system hugepage configuration number_of: 256 force_first_numa: false diff --git a/dts/framework/config/__init__.py b/dts/framework/config/__init__.py index df60a5030e..534821ed22 100644 --- a/dts/framework/config/__init__.py +++ b/dts/framework/config/__init__.py @@ -151,11 +151,10 @@ class PortConfig: """ node: str + name: str pci: str os_driver_for_dpdk: str os_driver: str - peer_node: str - peer_pci: str @classmethod def from_dict(cls, node: str, d: PortConfigDict) -> Self: @@ -487,12 +486,19 @@ def from_dict( system_under_test_node, SutNodeConfiguration ), f"Invalid SUT configuration {system_under_test_node}" - tg_name = d["traffic_generator_node"] + tg_name = d["traffic_generator_node"]["node_name"] assert tg_name in node_map, f"Unknown TG {tg_name} in test run {d}" traffic_generator_node = node_map[tg_name] assert isinstance( traffic_generator_node, TGNodeConfiguration ), f"Invalid TG configuration {traffic_generator_node}" + assert len(traffic_generator_node.ports) == len( + system_under_test_node.ports + ), "Insufficient ports defined on nodes." + for port_name in d["system_under_test_node"]["test_bed"]: + assert port_name in {port.name: port for port in system_under_test_node.ports} + for port_name in d["traffic_generator_node"]["test_bed"]: + assert port_name in {port.name: port for port in traffic_generator_node.ports} vdevs = ( d["system_under_test_node"]["vdevs"] if "vdevs" in d["system_under_test_node"] else [] diff --git a/dts/framework/config/conf_yaml_schema.json b/dts/framework/config/conf_yaml_schema.json index f02a310bb5..91667b01cc 100644 --- a/dts/framework/config/conf_yaml_schema.json +++ b/dts/framework/config/conf_yaml_schema.json @@ -6,6 +6,10 @@ "type": "string", "description": "A unique identifier for a node" }, + "port_name": { + "type": "string", + "description": "A unique identifier for a node's NIC port." + }, "NIC": { "type": "string", "enum": [ @@ -190,6 +194,24 @@ "pmd_buffer_scatter" ] }, + "test_run_node": { + "type": "object", + "properties": { + "node_name": { + "$ref": "#/definitions/node_name" + }, + "test_bed": { + "type": "array", + "items": { + "$ref": "#/definitions/port_name" + } + } + }, + "required": [ + "node_name", + "test_bed" + ] + }, "test_target": { "type": "object", "properties": { @@ -260,8 +282,11 @@ "type": "array", "items": { "type": "object", - "description": "Each port should be described on both sides of the connection. This makes configuration slightly more verbose but greatly simplifies implementation. If there are inconsistencies, then DTS will not run until that issue is fixed. An example inconsistency would be port 1, node 1 says it is connected to port 1, node 2, but port 1, node 2 says it is connected to port 2, node 1.", + "description": "A list of relevant ports on a node and its corresponding driver, dpdk driver, and pci address.", "properties": { + "name": { + "$ref": "#/definitions/port_name" + }, "pci": { "$ref": "#/definitions/pci_address", "description": "The local PCI address of the port" @@ -273,23 +298,14 @@ "os_driver": { "type": "string", "description": "The driver normally used by this port (ex: i40e)" - }, - "peer_node": { - "type": "string", - "description": "The name of the node the peer port is on" - }, - "peer_pci": { - "$ref": "#/definitions/pci_address", - "description": "The PCI address of the peer port" } }, "additionalProperties": false, "required": [ + "name", "pci", "os_driver_for_dpdk", - "os_driver", - "peer_node", - "peer_pci" + "os_driver" ] }, "minimum": 1 @@ -360,11 +376,7 @@ "type": "boolean" }, "system_under_test_node": { - "type":"object", - "properties": { - "node_name": { - "$ref": "#/definitions/node_name" - }, + "$ref": "#/definitions/test_run_node", "vdevs": { "description": "Optional list of names of vdevs to be used in the test run", "type": "array", @@ -372,13 +384,9 @@ "type": "string" } } - }, - "required": [ - "node_name" - ] }, "traffic_generator_node": { - "$ref": "#/definitions/node_name" + "$ref": "#/definitions/test_run_node" } }, "additionalProperties": false, diff --git a/dts/framework/config/types.py b/dts/framework/config/types.py index cf16556403..c91f3b9009 100644 --- a/dts/framework/config/types.py +++ b/dts/framework/config/types.py @@ -14,16 +14,14 @@ class PortConfigDict(TypedDict): """Allowed keys and values.""" + #: + name: str #: pci: str #: os_driver_for_dpdk: str #: os_driver: str - #: - peer_node: str - #: - peer_pci: str class TrafficGeneratorConfigDict(TypedDict): @@ -101,9 +99,20 @@ class TestRunSUTConfigDict(TypedDict): #: node_name: str #: + test_bed: list[str] + #: vdevs: list[str] +class TestRunTGConfigDict(TypedDict): + """Allowed keys and values.""" + + #: + node_name: str + #: + test_bed: list[str] + + class TestRunConfigDict(TypedDict): """Allowed keys and values.""" @@ -120,7 +129,7 @@ class TestRunConfigDict(TypedDict): #: system_under_test_node: TestRunSUTConfigDict #: - traffic_generator_node: str + traffic_generator_node: TestRunTGConfigDict class ConfigurationDict(TypedDict): -- 2.44.0