From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 12C9742EB9 for ; Wed, 19 Jul 2023 16:29:26 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 663DF40685; Wed, 19 Jul 2023 16:29:25 +0200 (CEST) Received: from mail-pl1-f227.google.com (mail-pl1-f227.google.com [209.85.214.227]) by mails.dpdk.org (Postfix) with ESMTP id 262E640685 for ; Wed, 19 Jul 2023 16:29:24 +0200 (CEST) Received: by mail-pl1-f227.google.com with SMTP id d9443c01a7336-1b8ad9eede0so55891055ad.1 for ; Wed, 19 Jul 2023 07:29:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; t=1689776963; x=1692368963; h=cc:to:from:subject:message-id:date:from:to:cc:subject:date :message-id:reply-to; bh=L3LlmubCwV5PZqcq0RPzG3yelPZIl6yLTPmoLzoDIrI=; b=YqmHIv6oLxVLA6MBWF192cpgBwFllz6rTL0zYDcVtRoMMELUpwxrK58uIUSOdmYKcg ISI5NUnNr/V2LyipMj8esv4Was7Xgyz3rDePa6kTs3zZch51Y6gGsfx1ZpMG+5YBjpko VmR7HClhfejnza62NE/strGssbGtLRrW0C5Ng= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689776963; x=1692368963; h=cc:to:from:subject:message-id:date:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=L3LlmubCwV5PZqcq0RPzG3yelPZIl6yLTPmoLzoDIrI=; b=MqiGqSAOPAXIKKO9hrZuofEb1WBF9Qd9Ax37EAxqkgGHPpQW62FFf0EjiwpURmpeP8 VLoIx8kXip7m/3ioLa65U3PIZ+KzJ+QxcQDrIwMrte5KyYzuq1uW+PIJU7Ir9pK6SvrA ncxvSSmZMLvh/3ucJvlyF3QpCCVtTa0B4mRo1g0nz/y/I5UNCAfiAf7upUF/lMUrvhxY 4Q7OhUdrn2BKhLp0K5ucC/ISs5hH66ZH6eZKfBH5mQ5it0LmXM5qVHdzECSDUjGCp+3x 3wjH0C61fkXJDUiEFEiGjoNTwVUTyL2CObbVOvIzeIypKHRgVAXjMkib92T0CrKpd6tI uX2w== X-Gm-Message-State: ABy/qLbSa2ee2zWWBuDpN1dpKcTQ5svedGUvFGjIs0PQLlGQNk9iwLsD 7FBgnSiHF5OuMh42WTjUYbbgChFHMF783u8GlYqKLy8nTilY/OtsG4yC3A== X-Google-Smtp-Source: APBJJlGG2lCc0832qZySpZaXRvvv0s0vuOFYRJObmtpHRBgYWS8jO2ypITARcvsz/mSeAcRd6soI1JGvwPri X-Received: by 2002:a17:903:1209:b0:1b8:7c59:7d0a with SMTP id l9-20020a170903120900b001b87c597d0amr3352243plh.28.1689776963281; Wed, 19 Jul 2023 07:29:23 -0700 (PDT) Received: from postal.iol.unh.edu (postal.iol.unh.edu. [132.177.123.84]) by smtp-relay.gmail.com with ESMTPS id j12-20020a170902c3cc00b001b3aff80bc1sm325677plj.74.2023.07.19.07.29.23 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 19 Jul 2023 07:29:23 -0700 (PDT) X-Relaying-Domain: iol.unh.edu Date: Wed, 19 Jul 2023 07:29:23 -0700 (PDT) Message-ID: <64b7f343.170a0220.a7381.7904SMTPIN_ADDED_MISSING@mx.google.com> Received: from [172.21.0.2] (unknown [172.18.0.240]) by postal.iol.unh.edu (Postfix) with ESMTP id 723D2605246B; Wed, 19 Jul 2023 10:29:22 -0400 (EDT) Subject: |WARNING| pw129641-129646 [PATCH] [v3, 6/6] dts: add basic UDP test case From: dpdklab@iol.unh.edu To: test-report@dpdk.org Cc: dpdk-test-reports@iol.unh.edu Content-Type: text/plain X-BeenThere: test-report@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: automatic DPDK test reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: test-report-bounces@dpdk.org Test-Label: iol-testing Test-Status: WARNING http://dpdk.org/patch/129641 _apply patch failure_ Submitter: Juraj Linkes Date: Wednesday, July 19 2023 14:13:03 Applied on: CommitID:238f67ca9cc00be4248b14d9ca4412edb7da62f6 Apply patch set 129641-129646 failed: Checking patch dts/conf.yaml... error: while searching for: skip_smoke_tests: false # optional flag that allows you to skip smoke tests test_suites: - hello_world system_under_test: node_name: "SUT 1" vdevs: # optional; if removed, vdevs won't be used in the execution - "crypto_openssl" nodes: - name: "SUT 1" hostname: sut1.change.me.localhost error: patch failed: dts/conf.yaml:13 error: while searching for: os_driver: i40e peer_node: "TG 1" peer_pci: "0000:00:08.1" error: patch failed: dts/conf.yaml:40 Checking patch dts/framework/config/__init__.py... error: while searching for: return PortConfig(node=node, **d) @dataclass(slots=True, frozen=True) class NodeConfiguration: name: str error: patch failed: dts/framework/config/__init__.py:79 error: while searching for: os: OS lcores: str use_first_core: bool memory_channels: int hugepages: HugepageConfiguration | None ports: list[PortConfig] @staticmethod def from_dict(d: dict) -> "NodeConfiguration": hugepage_config = d.get("hugepages") if hugepage_config: if "force_first_numa" not in hugepage_config: hugepage_config["force_first_numa"] = False hugepage_config = HugepageConfiguration(**hugepage_config) common_config = { "name": d["name"], "hostname": d["hostname"], error: patch failed: dts/framework/config/__init__.py:89 error: while searching for: "os": OS(d["os"]), "lcores": d.get("lcores", "1"), "use_first_core": d.get("use_first_core", False), "memory_channels": d.get("memory_channels", 1), "hugepages": hugepage_config, "ports": [PortConfig.from_dict(d["name"], port) for port in d["ports"]], } return NodeConfiguration(**common_config) @dataclass(slots=True, frozen=True) error: patch failed: dts/framework/config/__init__.py:109 error: while searching for: perf: bool func: bool test_suites: list[TestSuiteConfig] system_under_test: NodeConfiguration vdevs: list[str] skip_smoke_tests: bool @staticmethod def from_dict(d: dict, node_map: dict) -> "ExecutionConfiguration": build_targets: list[BuildTargetConfiguration] = list( map(BuildTargetConfiguration.from_dict, d["build_targets"]) ) test_suites: list[TestSuiteConfig] = list( map(TestSuiteConfig.from_dict, d["test_suites"]) ) sut_name = d["system_under_test"]["node_name"] skip_smoke_tests = d.get("skip_smoke_tests", False) assert sut_name in node_map, f"Unknown SUT {sut_name} in execution {d}" vdevs = ( d["system_under_test"]["vdevs"] if "vdevs" in d["system_under_test"] else [] ) return ExecutionConfiguration( build_targets=build_targets, error: patch failed: dts/framework/config/__init__.py:193 error: while searching for: func=d["func"], skip_smoke_tests=skip_smoke_tests, test_suites=test_suites, system_under_test=node_map[sut_name], vdevs=vdevs, ) error: patch failed: dts/framework/config/__init__.py:217 Hunk #8 succeeded at 182 (offset -108 lines). Checking patch dts/framework/config/conf_yaml_schema.json... error: while searching for: "amount" ] }, "pci_address": { "type": "string", "pattern": "^[\\da-fA-F]{4}:[\\da-fA-F]{2}:[\\da-fA-F]{2}.\\d:?\\w*$" error: patch failed: dts/framework/config/conf_yaml_schema.json:164 error: while searching for: ] }, "minimum": 1 } }, "additionalProperties": false, error: patch failed: dts/framework/config/conf_yaml_schema.json:286 error: while searching for: "description": "Optional field that allows you to skip smoke testing", "type": "boolean" }, "system_under_test": { "type":"object", "properties": { "node_name": { error: patch failed: dts/framework/config/conf_yaml_schema.json:336 error: while searching for: "required": [ "node_name" ] } }, "additionalProperties": false, error: patch failed: dts/framework/config/conf_yaml_schema.json:353 Hunk #5 succeeded at 221 (offset -164 lines). Checking patch dts/framework/dts.py... Hunk #1 succeeded at 32 (offset -6 lines). error: while searching for: Run the given execution. This involves running the execution setup as well as running all build targets in the given execution. """ dts_logger.info(f"Running execution with SUT '{execution.system_under_test.name}'.") execution_result = result.add_execution(sut_node.config) execution_result.add_sut_info(sut_node.node_info) error: patch failed: dts/framework/dts.py:87 Checking patch dts/framework/testbed_model/sut_node.py... error: while searching for: from framework.config import ( BuildTargetConfiguration, BuildTargetInfo, NodeConfiguration, NodeInfo, ) from framework.remote_session import CommandResult, InteractiveShellType, OSSession from framework.settings import SETTINGS error: patch failed: dts/framework/testbed_model/sut_node.py:12 Hunk #2 succeeded at 24 (offset -53 lines). error: while searching for: _node_info: NodeInfo | None _compiler_version: str | None def __init__(self, node_config: NodeConfiguration): super(SutNode, self).__init__(node_config) self._dpdk_prefix_list = [] self._build_target_config = None error: patch failed: dts/framework/testbed_model/sut_node.py:89 Applying patch dts/conf.yaml with 2 rejects... Rejected hunk #1. Rejected hunk #2. Applying patch dts/framework/config/__init__.py with 5 rejects... Hunk #1 applied cleanly. Hunk #2 applied cleanly. Rejected hunk #3. Rejected hunk #4. Rejected hunk #5. Rejected hunk #6. Rejected hunk #7. Hunk #8 applied cleanly. Applying patch dts/framework/config/conf_yaml_schema.json with 4 rejects... Rejected hunk #1. Rejected hunk #2. Rejected hunk #3. Rejected hunk #4. Hunk #5 applied cleanly. Applying patch dts/framework/dts.py with 1 reject... Hunk #1 applied cleanly. Rejected hunk #2. Applying patch dts/framework/testbed_model/sut_node.py with 2 rejects... Rejected hunk #1. Hunk #2 applied cleanly. Rejected hunk #3. hint: Use 'git am --show-current-patch' to see the failed patch diff a/dts/conf.yaml b/dts/conf.yaml (rejected hunks) @@ -13,10 +13,11 @@ executions: skip_smoke_tests: false # optional flag that allows you to skip smoke tests test_suites: - hello_world - system_under_test: + system_under_test_node: node_name: "SUT 1" vdevs: # optional; if removed, vdevs won't be used in the execution - "crypto_openssl" + traffic_generator_node: "TG 1" nodes: - name: "SUT 1" hostname: sut1.change.me.localhost @@ -40,3 +41,26 @@ nodes: os_driver: i40e peer_node: "TG 1" peer_pci: "0000:00:08.1" + - name: "TG 1" + hostname: tg1.change.me.localhost + user: dtsuser + arch: x86_64 + os: linux + lcores: "" + ports: + - pci: "0000:00:08.0" + os_driver_for_dpdk: rdma + os_driver: rdma + peer_node: "SUT 1" + peer_pci: "0000:00:08.0" + - pci: "0000:00:08.1" + os_driver_for_dpdk: rdma + os_driver: rdma + peer_node: "SUT 1" + peer_pci: "0000:00:08.1" + use_first_core: false + hugepages: # optional; if removed, will use system hugepage configuration + amount: 256 + force_first_numa: false + traffic_generator: + type: SCAPY diff a/dts/framework/config/__init__.py b/dts/framework/config/__init__.py (rejected hunks) @@ -79,6 +84,26 @@ def from_dict(node: str, d: dict) -> "PortConfig": return PortConfig(node=node, **d) +@dataclass(slots=True, frozen=True) +class TrafficGeneratorConfig: + traffic_generator_type: TrafficGeneratorType + + @staticmethod + def from_dict(d: dict): + # This looks useless now, but is designed to allow expansion to traffic + # generators that require more configuration later. + match TrafficGeneratorType(d["type"]): + case TrafficGeneratorType.SCAPY: + return ScapyTrafficGeneratorConfig( + traffic_generator_type=TrafficGeneratorType.SCAPY + ) + + +@dataclass(slots=True, frozen=True) +class ScapyTrafficGeneratorConfig(TrafficGeneratorConfig): + pass + + @dataclass(slots=True, frozen=True) class NodeConfiguration: name: str @@ -89,17 +114,17 @@ class NodeConfiguration: os: OS lcores: str use_first_core: bool - memory_channels: int hugepages: HugepageConfiguration | None ports: list[PortConfig] @staticmethod - def from_dict(d: dict) -> "NodeConfiguration": + def from_dict(d: dict) -> Union["SutNodeConfiguration", "TGNodeConfiguration"]: hugepage_config = d.get("hugepages") if hugepage_config: if "force_first_numa" not in hugepage_config: hugepage_config["force_first_numa"] = False hugepage_config = HugepageConfiguration(**hugepage_config) + common_config = { "name": d["name"], "hostname": d["hostname"], @@ -109,12 +134,31 @@ def from_dict(d: dict) -> "NodeConfiguration": "os": OS(d["os"]), "lcores": d.get("lcores", "1"), "use_first_core": d.get("use_first_core", False), - "memory_channels": d.get("memory_channels", 1), "hugepages": hugepage_config, "ports": [PortConfig.from_dict(d["name"], port) for port in d["ports"]], } - return NodeConfiguration(**common_config) + if "traffic_generator" in d: + return TGNodeConfiguration( + traffic_generator=TrafficGeneratorConfig.from_dict( + d["traffic_generator"] + ), + **common_config, + ) + else: + return SutNodeConfiguration( + memory_channels=d.get("memory_channels", 1), **common_config + ) + + +@dataclass(slots=True, frozen=True) +class SutNodeConfiguration(NodeConfiguration): + memory_channels: int + + +@dataclass(slots=True, frozen=True) +class TGNodeConfiguration(NodeConfiguration): + traffic_generator: ScapyTrafficGeneratorConfig @dataclass(slots=True, frozen=True) @@ -193,23 +237,40 @@ class ExecutionConfiguration: perf: bool func: bool test_suites: list[TestSuiteConfig] - system_under_test: NodeConfiguration + system_under_test_node: SutNodeConfiguration + traffic_generator_node: TGNodeConfiguration vdevs: list[str] skip_smoke_tests: bool @staticmethod - def from_dict(d: dict, node_map: dict) -> "ExecutionConfiguration": + def from_dict( + d: dict, node_map: dict[str, Union[SutNodeConfiguration | TGNodeConfiguration]] + ) -> "ExecutionConfiguration": build_targets: list[BuildTargetConfiguration] = list( map(BuildTargetConfiguration.from_dict, d["build_targets"]) ) test_suites: list[TestSuiteConfig] = list( map(TestSuiteConfig.from_dict, d["test_suites"]) ) - sut_name = d["system_under_test"]["node_name"] + sut_name = d["system_under_test_node"]["node_name"] skip_smoke_tests = d.get("skip_smoke_tests", False) assert sut_name in node_map, f"Unknown SUT {sut_name} in execution {d}" + system_under_test_node = node_map[sut_name] + assert isinstance( + system_under_test_node, SutNodeConfiguration + ), f"Invalid SUT configuration {system_under_test_node}" + + tg_name = d["traffic_generator_node"] + assert tg_name in node_map, f"Unknown TG {tg_name} in execution {d}" + traffic_generator_node = node_map[tg_name] + assert isinstance( + traffic_generator_node, TGNodeConfiguration + ), f"Invalid TG configuration {traffic_generator_node}" + vdevs = ( - d["system_under_test"]["vdevs"] if "vdevs" in d["system_under_test"] else [] + d["system_under_test_node"]["vdevs"] + if "vdevs" in d["system_under_test_node"] + else [] ) return ExecutionConfiguration( build_targets=build_targets, @@ -217,7 +278,8 @@ def from_dict(d: dict, node_map: dict) -> "ExecutionConfiguration": func=d["func"], skip_smoke_tests=skip_smoke_tests, test_suites=test_suites, - system_under_test=node_map[sut_name], + system_under_test_node=system_under_test_node, + traffic_generator_node=traffic_generator_node, vdevs=vdevs, ) diff a/dts/framework/config/conf_yaml_schema.json b/dts/framework/config/conf_yaml_schema.json (rejected hunks) @@ -164,6 +164,11 @@ "amount" ] }, + "mac_address": { + "type": "string", + "description": "A MAC address", + "pattern": "^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$" + }, "pci_address": { "type": "string", "pattern": "^[\\da-fA-F]{4}:[\\da-fA-F]{2}:[\\da-fA-F]{2}.\\d:?\\w*$" @@ -286,6 +291,22 @@ ] }, "minimum": 1 + }, + "traffic_generator": { + "oneOf": [ + { + "type": "object", + "description": "Scapy traffic generator. Used for functional testing.", + "properties": { + "type": { + "type": "string", + "enum": [ + "SCAPY" + ] + } + } + } + ] } }, "additionalProperties": false, @@ -336,7 +357,7 @@ "description": "Optional field that allows you to skip smoke testing", "type": "boolean" }, - "system_under_test": { + "system_under_test_node": { "type":"object", "properties": { "node_name": { @@ -353,6 +374,9 @@ "required": [ "node_name" ] + }, + "traffic_generator_node": { + "$ref": "#/definitions/node_name" } }, "additionalProperties": false, diff a/dts/framework/dts.py b/dts/framework/dts.py (rejected hunks) @@ -87,7 +87,9 @@ def _run_execution( Run the given execution. This involves running the execution setup as well as running all build targets in the given execution. """ - dts_logger.info(f"Running execution with SUT '{execution.system_under_test.name}'.") + dts_logger.info( + f"Running execution with SUT '{execution.system_under_test_node.name}'." + ) execution_result = result.add_execution(sut_node.config) execution_result.add_sut_info(sut_node.node_info) diff a/dts/framework/testbed_model/sut_node.py b/dts/framework/testbed_model/sut_node.py (rejected hunks) @@ -12,8 +12,8 @@ from framework.config import ( BuildTargetConfiguration, BuildTargetInfo, - NodeConfiguration, NodeInfo, + SutNodeConfiguration, ) from framework.remote_session import CommandResult, InteractiveShellType, OSSession from framework.settings import SETTINGS @@ -89,7 +90,7 @@ class SutNode(Node): _node_info: NodeInfo | None _compiler_version: str | None - def __init__(self, node_config: NodeConfiguration): + def __init__(self, node_config: SutNodeConfiguration): super(SutNode, self).__init__(node_config) self._dpdk_prefix_list = [] self._build_target_config = None Checking patch doc/guides/tools/dts.rst... Checking patch dts/framework/dts.py... error: dts/framework/dts.py: does not match index Checking patch dts/framework/remote_session/linux_session.py... Hunk #2 succeeded at 136 (offset -1 lines). Checking patch dts/framework/remote_session/os_session.py... error: while searching for: from framework.remote_session.remote import InteractiveShell from framework.settings import SETTINGS from framework.testbed_model import LogicalCore from framework.utils import MesonArgs from .remote import ( error: patch failed: dts/framework/remote_session/os_session.py:12 error: while searching for: """ Collect information about the node """ error: patch failed: dts/framework/remote_session/os_session.py:249 Checking patch dts/framework/test_suite.py... Hunk #1 succeeded at 15 (offset -5 lines). Hunk #2 succeeded at 45 (offset -6 lines). Checking patch dts/framework/testbed_model/__init__.py... Checking patch dts/framework/testbed_model/capturing_traffic_generator.py... Checking patch dts/framework/testbed_model/hw/port.py... Checking patch dts/framework/testbed_model/node.py... error: while searching for: A node is a generic host that DTS connects to and manages. """ from typing import Any, Callable, Type from framework.config import ( error: patch failed: dts/framework/testbed_model/node.py:7 error: while searching for: VirtualDevice, lcore_filter, ) class Node(object): """ Basic class for node management. This class implements methods that manage a node, such as information gathering (of CPU/PCI/NIC) and error: patch failed: dts/framework/testbed_model/node.py:26 error: while searching for: config: NodeConfiguration name: str lcores: list[LogicalCore] _logger: DTSLOG _other_sessions: list[OSSession] _execution_config: ExecutionConfiguration error: patch failed: dts/framework/testbed_model/node.py:39 Hunk #4 succeeded at 47 (offset -6 lines). error: while searching for: self._other_sessions = [] self.virtual_devices = [] self._logger.info(f"Created node: {self.name}") def set_up_execution(self, execution_config: ExecutionConfiguration) -> None: """ error: patch failed: dts/framework/testbed_model/node.py:58 Hunk #6 succeeded at 168 (offset -47 lines). Checking patch dts/framework/testbed_model/scapy.py... Checking patch dts/framework/testbed_model/sut_node.py... error: dts/framework/testbed_model/sut_node.py: does not match index Checking patch dts/framework/testbed_model/tg_node.py... Checking patch dts/framework/testbed_model/traffic_generator.py... Checking patch dts/framework/utils.py... Hunk #3 succeeded at 64 (offset -3 lines). Applied patch doc/guides/tools/dts.rst cleanly. Applied patch dts/framework/remote_session/linux_session.py cleanly. Applying patch dts/framework/remote_session/os_session.py with 2 rejects... Rejected hunk #1. Rejected hunk #2. Applied patch dts/framework/test_suite.py cleanly. Applied patch dts/framework/testbed_model/__init__.py cleanly. Applied patch dts/framework/testbed_model/capturing_traffic_generator.py cleanly. Applied patch dts/framework/testbed_model/hw/port.py cleanly. Applying patch dts/framework/testbed_model/node.py with 4 rejects... Rejected hunk #1. Rejected hunk #2. Rejected hunk #3. Hunk #4 applied cleanly. Rejected hunk #5. Hunk #6 applied cleanly. Applied patch dts/framework/testbed_model/scapy.py cleanly. Applied patch dts/framework/testbed_model/tg_node.py cleanly. Applied patch dts/framework/testbed_model/traffic_generator.py cleanly. Applied patch dts/framework/utils.py cleanly. hint: Use 'git am --show-current-patch' to see the failed patch diff a/dts/framework/remote_session/os_session.py b/dts/framework/remote_session/os_session.py (rejected hunks) @@ -12,6 +12,7 @@ from framework.remote_session.remote import InteractiveShell from framework.settings import SETTINGS from framework.testbed_model import LogicalCore +from framework.testbed_model.hw.port import Port from framework.utils import MesonArgs from .remote import ( @@ -249,3 +250,17 @@ def get_node_info(self) -> NodeInfo: """ Collect information about the node """ + + @abstractmethod + def update_ports(self, ports: list[Port]) -> None: + """ + Get additional information about ports: + Logical name (e.g. enp7s0) if applicable + Mac address + """ + + @abstractmethod + def configure_port_state(self, port: Port, enable: bool) -> None: + """ + Enable/disable port. + """ diff a/dts/framework/testbed_model/node.py b/dts/framework/testbed_model/node.py (rejected hunks) @@ -7,6 +7,7 @@ A node is a generic host that DTS connects to and manages. """ +from abc import ABC from typing import Any, Callable, Type from framework.config import ( @@ -26,9 +27,10 @@ VirtualDevice, lcore_filter, ) +from .hw.port import Port -class Node(object): +class Node(ABC): """ Basic class for node management. This class implements methods that manage a node, such as information gathering (of CPU/PCI/NIC) and @@ -39,6 +41,7 @@ class Node(object): config: NodeConfiguration name: str lcores: list[LogicalCore] + ports: list[Port] _logger: DTSLOG _other_sessions: list[OSSession] _execution_config: ExecutionConfiguration @@ -58,8 +63,13 @@ def __init__(self, node_config: NodeConfiguration): self._other_sessions = [] self.virtual_devices = [] + self._init_ports() - self._logger.info(f"Created node: {self.name}") + def _init_ports(self) -> None: + self.ports = [Port(self.name, port_config) for port_config in self.config.ports] + self.main_session.update_ports(self.ports) + for port in self.ports: + self.configure_port_state(port) def set_up_execution(self, execution_config: ExecutionConfiguration) -> None: """ Checking patch dts/framework/remote_session/__init__.py... error: while searching for: CommandResult, InteractiveRemoteSession, InteractiveShell, RemoteSession, SSHSession, TestPmdDevice, error: patch failed: dts/framework/remote_session/__init__.py:22 Checking patch dts/framework/remote_session/remote/__init__.py... error: while searching for: from .interactive_remote_session import InteractiveRemoteSession from .interactive_shell import InteractiveShell from .remote_session import CommandResult, RemoteSession from .ssh_session import SSHSession from .testpmd_shell import TestPmdDevice, TestPmdShell error: patch failed: dts/framework/remote_session/remote/__init__.py:9 Checking patch dts/framework/testbed_model/scapy.py... error: dts/framework/testbed_model/scapy.py: does not exist in index Applying patch dts/framework/remote_session/__init__.py with 1 reject... Rejected hunk #1. Applying patch dts/framework/remote_session/remote/__init__.py with 1 reject... Rejected hunk #1. hint: Use 'git am --show-current-patch' to see the failed patch diff a/dts/framework/remote_session/__init__.py b/dts/framework/remote_session/__init__.py (rejected hunks) @@ -22,6 +22,7 @@ CommandResult, InteractiveRemoteSession, InteractiveShell, + PythonShell, RemoteSession, SSHSession, TestPmdDevice, diff a/dts/framework/remote_session/remote/__init__.py b/dts/framework/remote_session/remote/__init__.py (rejected hunks) @@ -9,6 +9,7 @@ from .interactive_remote_session import InteractiveRemoteSession from .interactive_shell import InteractiveShell +from .python_shell import PythonShell from .remote_session import CommandResult, RemoteSession from .ssh_session import SSHSession from .testpmd_shell import TestPmdDevice, TestPmdShell Checking patch dts/conf.yaml... error: while searching for: skip_smoke_tests: false # optional flag that allows you to skip smoke tests test_suites: - hello_world system_under_test_node: node_name: "SUT 1" vdevs: # optional; if removed, vdevs won't be used in the execution error: patch failed: dts/conf.yaml:13 Checking patch dts/framework/config/conf_yaml_schema.json... error: dts/framework/config/conf_yaml_schema.json: does not match index Checking patch dts/framework/remote_session/linux_session.py... error: dts/framework/remote_session/linux_session.py: does not match index Checking patch dts/framework/remote_session/os_session.py... error: while searching for: from abc import ABC, abstractmethod from collections.abc import Iterable from pathlib import PurePath from typing import Type, TypeVar from framework.config import Architecture, NodeConfiguration, NodeInfo from framework.logger import DTSLOG error: patch failed: dts/framework/remote_session/os_session.py:4 error: while searching for: """ Enable/disable port. """ error: patch failed: dts/framework/remote_session/os_session.py:264 Checking patch dts/framework/test_suite.py... error: dts/framework/test_suite.py: does not match index Checking patch dts/framework/testbed_model/node.py... error: dts/framework/testbed_model/node.py: does not match index Checking patch dts/framework/testbed_model/sut_node.py... error: dts/framework/testbed_model/sut_node.py: does not match index Checking patch dts/tests/TestSuite_os_udp.py... Applying patch dts/conf.yaml with 1 reject... Rejected hunk #1. Applying patch dts/framework/remote_session/os_session.py with 2 rejects... Rejected hunk #1. Rejected hunk #2. Applied patch dts/tests/TestSuite_os_udp.py cleanly. hint: Use 'git am --show-current-patch' to see the failed patch diff a/dts/conf.yaml b/dts/conf.yaml (rejected hunks) @@ -13,6 +13,7 @@ executions: skip_smoke_tests: false # optional flag that allows you to skip smoke tests test_suites: - hello_world + - os_udp system_under_test_node: node_name: "SUT 1" vdevs: # optional; if removed, vdevs won't be used in the execution diff a/dts/framework/remote_session/os_session.py b/dts/framework/remote_session/os_session.py (rejected hunks) @@ -4,8 +4,9 @@ from abc import ABC, abstractmethod from collections.abc import Iterable +from ipaddress import IPv4Interface, IPv6Interface from pathlib import PurePath -from typing import Type, TypeVar +from typing import Type, TypeVar, Union from framework.config import Architecture, NodeConfiguration, NodeInfo from framework.logger import DTSLOG @@ -264,3 +265,20 @@ def configure_port_state(self, port: Port, enable: bool) -> None: """ Enable/disable port. """ + + @abstractmethod + def configure_port_ip_address( + self, + address: Union[IPv4Interface, IPv6Interface], + port: Port, + delete: bool, + ) -> None: + """ + Configure (add or delete) an IP address of the input port. + """ + + @abstractmethod + def configure_ipv4_forwarding(self, enable: bool) -> None: + """ + Enable IPv4 forwarding in the underlying OS. + """ https://lab.dpdk.org/results/dashboard/patchsets/27099/ UNH-IOL DPDK Community Lab