From 6b2e16a20dbd55848aa41a84a7bf0161e378be4b Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Thu, 5 Feb 2026 13:47:24 +0100 Subject: [PATCH 01/22] Initial reworked structure --- README.md | 53 ++++ bazel_common/BUILD | 0 bazel_common/bundlers.bzl | 66 ++++ bazel_common/score_basic_tools.MODULE.bazel | 4 + .../score_gcc_toolchains.MODULE.bazel | 29 ++ bazel_common/score_modules.MODULE.bazel | 17 ++ bazel_common/score_python.MODULE.bazel | 12 + .../score_qnx_toolchains.MODULE.bazel | 25 ++ images/linux_x86_64/.bazelrc | 13 + images/linux_x86_64/.bazelversion | 1 + images/linux_x86_64/BUILD | 19 ++ images/linux_x86_64/MODULE.bazel | 49 +++ images/linux_x86_64/bazel_common | 1 + images/linux_x86_64/runners/docker_x86_64 | 1 + images/linux_x86_64/showcases | 1 + images/qnx_x86_64/.bazelrc | 18 ++ images/qnx_x86_64/.bazelversion | 1 + images/qnx_x86_64/BUILD | 20 ++ images/qnx_x86_64/MODULE.bazel | 90 ++++++ images/qnx_x86_64/bazel_common | 1 + images/qnx_x86_64/build/BUILD | 74 +++++ images/qnx_x86_64/build/init.build | 99 ++++++ images/qnx_x86_64/build/system.build | 287 ++++++++++++++++++ images/qnx_x86_64/configs/BUILD | 31 ++ images/qnx_x86_64/configs/dhcpcd.conf | 42 +++ images/qnx_x86_64/configs/group | 16 + images/qnx_x86_64/configs/hostname | 1 + images/qnx_x86_64/configs/network_capture.sh | 225 ++++++++++++++ images/qnx_x86_64/configs/network_setup.sh | 33 ++ .../qnx_x86_64/configs/network_setup_dhcp.sh | 92 ++++++ images/qnx_x86_64/configs/passwd | 17 ++ images/qnx_x86_64/configs/pci_hw.cfg | 9 + images/qnx_x86_64/configs/pci_server.cfg | 7 + images/qnx_x86_64/configs/profile | 18 ++ images/qnx_x86_64/configs/qcrypto.conf | 1 + images/qnx_x86_64/configs/ssh_host_rsa_key | 38 +++ .../qnx_x86_64/configs/ssh_host_rsa_key.pub | 1 + images/qnx_x86_64/configs/sshd_config | 64 ++++ images/qnx_x86_64/configs/startup.sh | 84 +++++ images/qnx_x86_64/runners/qemu_x86_64 | 1 + images/qnx_x86_64/scripts/qnx_wireshark.sh | 276 +++++++++++++++++ images/qnx_x86_64/scripts/run_qemu.sh | 33 ++ .../scripts/run_qemu_portforward.sh | 34 +++ images/qnx_x86_64/showcases | 1 + qnx_qemu/MODULE.bazel | 19 +- qnx_qemu/build/BUILD | 14 +- qnx_qemu/build/init.build | 2 +- qnx_qemu/build/system.build | 36 +-- runners/docker_x86_64/BUILD | 24 ++ runners/docker_x86_64/scripts/run_docker.sh | 24 ++ runners/qemu_x86_64/BUILD | 29 ++ runners/qemu_x86_64/scripts/qnx_wireshark.sh | 276 +++++++++++++++++ runners/qemu_x86_64/scripts/run_qemu.sh | 32 ++ .../scripts/run_qemu_portforward.sh | 34 +++ showcases/BUILD | 0 showcases/standalone/BUILD | 7 + 56 files changed, 2372 insertions(+), 30 deletions(-) create mode 100644 bazel_common/BUILD create mode 100644 bazel_common/bundlers.bzl create mode 100644 bazel_common/score_basic_tools.MODULE.bazel create mode 100644 bazel_common/score_gcc_toolchains.MODULE.bazel create mode 100644 bazel_common/score_modules.MODULE.bazel create mode 100644 bazel_common/score_python.MODULE.bazel create mode 100644 bazel_common/score_qnx_toolchains.MODULE.bazel create mode 100644 images/linux_x86_64/.bazelrc create mode 100644 images/linux_x86_64/.bazelversion create mode 100644 images/linux_x86_64/BUILD create mode 100644 images/linux_x86_64/MODULE.bazel create mode 120000 images/linux_x86_64/bazel_common create mode 120000 images/linux_x86_64/runners/docker_x86_64 create mode 120000 images/linux_x86_64/showcases create mode 100644 images/qnx_x86_64/.bazelrc create mode 100644 images/qnx_x86_64/.bazelversion create mode 100644 images/qnx_x86_64/BUILD create mode 100644 images/qnx_x86_64/MODULE.bazel create mode 120000 images/qnx_x86_64/bazel_common create mode 100644 images/qnx_x86_64/build/BUILD create mode 100644 images/qnx_x86_64/build/init.build create mode 100644 images/qnx_x86_64/build/system.build create mode 100644 images/qnx_x86_64/configs/BUILD create mode 100755 images/qnx_x86_64/configs/dhcpcd.conf create mode 100644 images/qnx_x86_64/configs/group create mode 100644 images/qnx_x86_64/configs/hostname create mode 100644 images/qnx_x86_64/configs/network_capture.sh create mode 100644 images/qnx_x86_64/configs/network_setup.sh create mode 100644 images/qnx_x86_64/configs/network_setup_dhcp.sh create mode 100644 images/qnx_x86_64/configs/passwd create mode 100644 images/qnx_x86_64/configs/pci_hw.cfg create mode 100644 images/qnx_x86_64/configs/pci_server.cfg create mode 100644 images/qnx_x86_64/configs/profile create mode 100644 images/qnx_x86_64/configs/qcrypto.conf create mode 100644 images/qnx_x86_64/configs/ssh_host_rsa_key create mode 100644 images/qnx_x86_64/configs/ssh_host_rsa_key.pub create mode 100644 images/qnx_x86_64/configs/sshd_config create mode 100644 images/qnx_x86_64/configs/startup.sh create mode 120000 images/qnx_x86_64/runners/qemu_x86_64 create mode 100755 images/qnx_x86_64/scripts/qnx_wireshark.sh create mode 100755 images/qnx_x86_64/scripts/run_qemu.sh create mode 100755 images/qnx_x86_64/scripts/run_qemu_portforward.sh create mode 120000 images/qnx_x86_64/showcases create mode 100644 runners/docker_x86_64/BUILD create mode 100755 runners/docker_x86_64/scripts/run_docker.sh create mode 100644 runners/qemu_x86_64/BUILD create mode 100755 runners/qemu_x86_64/scripts/qnx_wireshark.sh create mode 100755 runners/qemu_x86_64/scripts/run_qemu.sh create mode 100755 runners/qemu_x86_64/scripts/run_qemu_portforward.sh create mode 100644 showcases/BUILD create mode 100644 showcases/standalone/BUILD diff --git a/README.md b/README.md index 796e2e3855..8fc566e4d4 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,59 @@ The reference integration workspace serves as a single Bazel build environment t - Test toolchain and platform support (Linux, QNX, LLVM/GCC) - Prepare for release validation workflows + +## Structure + +Repository structure + +``` +- bazel_common +- showcases +- images + - image1 + - showcases (symlink to ../../showcases) + - bazel_common (symlink to ../../bazel_common) + - runners + - runner1 (symlink to ../../../runners/runner1) + - image2 + ... +- runners + - runner1 + - runner2 +``` + +The basic idea is that we use `symlinks` to share all common functionalities to achieve `DRY` rule. + +### bazel_common +Used to keep a common bazel functionalities for `images` like: +- toolchain setups +- common tooling deps +- common S-CORE modules deps +- common `.bzl` extensions needed to streamline images + + +### showcases +Used to keep `S-CORE` wide **showcases** implementation to showcase S-CORE in certain deployments (images). Contains: +- proxy target bundling all `standalone` examples from all `S-CORE` repos to deploy then as single bazel target into image +- implementation of certain **showcases** that shall be deployed into images + + +### images +Used to keep concrete `images` for given target platform as bazel modules. Each platform shall have it's own folder with name `{platform}_{arch}` ie. `qnx_aarch64`. + +This `images` shall: + - symlink other shared folders (`bazel_common`, `showcases`) to receive common functionality. + - symlink supported `runner` (if any) + - deploy all `usecases` into image so they can be run inside + - other specific code for given `image` + +### runners +Used to keep thin logic ro reuse `runners` between images, like docker runner etc. + + + + + ## Docs To generate a full documentation of all integrated modules, run: diff --git a/bazel_common/BUILD b/bazel_common/BUILD new file mode 100644 index 0000000000..e69de29bb2 diff --git a/bazel_common/bundlers.bzl b/bazel_common/bundlers.bzl new file mode 100644 index 0000000000..68c711aacb --- /dev/null +++ b/bazel_common/bundlers.bzl @@ -0,0 +1,66 @@ +load("@rules_pkg//pkg:pkg.bzl", "pkg_tar") +load("@rules_pkg//pkg:mappings.bzl", "pkg_files") + +def pkg_bundle(name, bins, package_dir): + """Creates a reusable bundle: pkg_files → pkg_tar → untar""" + + all_files_name = name + "_all_files" + bundle_name = name + "_tar" + untar_name = name + + rename_bin_dict = {} + for s in bins: + # Extract last path component of label as filename + # e.g. @score_scrample//src:scrample → scrample + target_name = s.split(":")[-1] + rename_bin_dict[s] = "bin/" + target_name + + # Step 1: pkg_files + pkg_files( + name = all_files_name, + srcs = bins, + renames = rename_bin_dict, + ) + + # Step 2: pkg_tar + pkg_tar( + name = bundle_name, + srcs = [":" + all_files_name], + strip_prefix = "/", + package_dir = package_dir, + visibility = ["//visibility:public"], + ) + + # Step 3: untar + untar( + name = untar_name, + src = ":" + bundle_name, + visibility = ["//visibility:public"], + ) + + # Return the main targets + return { + "all_files": ":" + all_files_name, + "tar": ":" + bundle_name, + "tree": ":" + untar_name, + } + + +def _untar_impl(ctx): + out = ctx.actions.declare_directory(ctx.label.name) + + ctx.actions.run( + inputs = [ctx.file.src], + outputs = [out], + executable = "tar", + arguments = ["-xf", ctx.file.src.path, "-C", out.path], + ) + + return [DefaultInfo(files = depset([out]))] + +untar = rule( + implementation = _untar_impl, + attrs = { + "src": attr.label(allow_single_file = True), + }, +) \ No newline at end of file diff --git a/bazel_common/score_basic_tools.MODULE.bazel b/bazel_common/score_basic_tools.MODULE.bazel new file mode 100644 index 0000000000..af8d108822 --- /dev/null +++ b/bazel_common/score_basic_tools.MODULE.bazel @@ -0,0 +1,4 @@ +bazel_dep(name = "rules_shell", version = "0.6.0") +bazel_dep(name = "rules_cc", version = "0.1.1") +bazel_dep(name = "rules_pkg", version = "1.2.0") +bazel_dep(name = "score_bazel_platforms", version = "0.0.4") \ No newline at end of file diff --git a/bazel_common/score_gcc_toolchains.MODULE.bazel b/bazel_common/score_gcc_toolchains.MODULE.bazel new file mode 100644 index 0000000000..1771b1c79d --- /dev/null +++ b/bazel_common/score_gcc_toolchains.MODULE.bazel @@ -0,0 +1,29 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + + +bazel_dep(name = "score_bazel_cpp_toolchains", version = "0.2.2") +gcc = use_extension("@score_bazel_cpp_toolchains//extensions:gcc.bzl", "gcc", dev_dependency = True) + +gcc.toolchain( + name = "score_gcc_x86_64_toolchain", + target_cpu = "x86_64", + target_os = "linux", + use_default_package = True, + version = "12.2.0", +) + +use_repo( + gcc, + "score_gcc_x86_64_toolchain", +) \ No newline at end of file diff --git a/bazel_common/score_modules.MODULE.bazel b/bazel_common/score_modules.MODULE.bazel new file mode 100644 index 0000000000..30b54ae4ed --- /dev/null +++ b/bazel_common/score_modules.MODULE.bazel @@ -0,0 +1,17 @@ +bazel_dep(name = "score_baselibs", version = "0.1.3") +bazel_dep(name = "score_communication", version = "0.1.1") +bazel_dep(name = "score_persistency", version = "0.2.1") +bazel_dep(name = "score_scrample", version = "0.1.0") +bazel_dep(name = "score_orchestrator") +git_override( + module_name = "score_orchestrator", + remote = "https://github.com/eclipse-score/orchestrator.git", + commit = "18e136c34750c5db707f27f917d52efc7541e087", +) + +bazel_dep(name = "score_kyron") +git_override( + module_name = "score_kyron", + remote = "https://github.com/eclipse-score/kyron.git", + commit = "ed312bdc6a50abc73f97b8c7e2ad4726fed06e81", +) \ No newline at end of file diff --git a/bazel_common/score_python.MODULE.bazel b/bazel_common/score_python.MODULE.bazel new file mode 100644 index 0000000000..7a8c265621 --- /dev/null +++ b/bazel_common/score_python.MODULE.bazel @@ -0,0 +1,12 @@ + +bazel_dep(name = "rules_python", version = "1.0.0") + +PYTHON_VERSION = "3.12" + +python = use_extension("@rules_python//python/extensions:python.bzl", "python") +python.toolchain( + configure_coverage_tool = True, + is_default = True, + python_version = PYTHON_VERSION, +) +use_repo(python) \ No newline at end of file diff --git a/bazel_common/score_qnx_toolchains.MODULE.bazel b/bazel_common/score_qnx_toolchains.MODULE.bazel new file mode 100644 index 0000000000..4ff05dd7a0 --- /dev/null +++ b/bazel_common/score_qnx_toolchains.MODULE.bazel @@ -0,0 +1,25 @@ + +qcc = use_extension("@score_bazel_cpp_toolchains//extensions:gcc.bzl", "gcc", dev_dependency = True) + +qcc.toolchain( + name = "score_qcc_aarch64_toolchain", + sdp_version = "8.0.0", + target_cpu = "aarch64", + target_os = "qnx", + use_default_package = True, + version = "12.2.0", +) + +qcc.toolchain( + name = "score_qcc_x86_64_toolchain", + sdp_version = "8.0.0", + target_cpu = "x86_64", + target_os = "qnx", + use_default_package = True, + version = "12.2.0", +) +use_repo( + qcc, + "score_qcc_aarch64_toolchain", + "score_qcc_x86_64_toolchain", +) diff --git a/images/linux_x86_64/.bazelrc b/images/linux_x86_64/.bazelrc new file mode 100644 index 0000000000..d414e23e04 --- /dev/null +++ b/images/linux_x86_64/.bazelrc @@ -0,0 +1,13 @@ +common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ +common --registry=https://bcr.bazel.build + +common --@score_baselibs//score/mw/log/detail/flags:KUse_Stub_Implementation_Only=False +common --@score_baselibs//score/mw/log/flags:KRemote_Logging=False +common --@score_baselibs//score/json:base_library=nlohmann +common --@score_baselibs//score/memory/shared/flags:use_typedshmd=False +common --@score_communication//score/mw/com/flags:tracing_library=stub +common --cxxopt=-Wno-error=mismatched-new-delete + + +common --extra_toolchains=@score_gcc_x86_64_toolchain//:x86_64-linux-gcc_12.2.0-posix +common:build --platforms=@score_bazel_platforms//:x86_64-linux-gcc_12.2.0-posix diff --git a/images/linux_x86_64/.bazelversion b/images/linux_x86_64/.bazelversion new file mode 100644 index 0000000000..8104cabd36 --- /dev/null +++ b/images/linux_x86_64/.bazelversion @@ -0,0 +1 @@ +8.1.0 diff --git a/images/linux_x86_64/BUILD b/images/linux_x86_64/BUILD new file mode 100644 index 0000000000..42021740fa --- /dev/null +++ b/images/linux_x86_64/BUILD @@ -0,0 +1,19 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +load("@rules_shell//shell:sh_binary.bzl", "sh_binary") + +alias( + name = "image", + actual = "//showcases/standalone", + visibility = ["//visibility:public"], +) \ No newline at end of file diff --git a/images/linux_x86_64/MODULE.bazel b/images/linux_x86_64/MODULE.bazel new file mode 100644 index 0000000000..774726c5e2 --- /dev/null +++ b/images/linux_x86_64/MODULE.bazel @@ -0,0 +1,49 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +module( + name = "score_ref_int_x86_64_linux", + version = "0.0.1", + compatibility_level = 0, +) + +# Include common modules +include("//bazel_common:score_basic_tools.MODULE.bazel") + +# GCC toolchains +include ("//bazel_common:score_gcc_toolchains.MODULE.bazel") + +# Python support +include("//bazel_common:score_python.MODULE.bazel") + +# Score modules +include("//bazel_common:score_modules.MODULE.bazel") + + +# Image specific dependencies + +bazel_dep(name = "rules_boost", repo_name = "com_github_nelhage_rules_boost") +archive_override( + module_name = "rules_boost", + urls = ["https://github.com/nelhage/rules_boost/archive/refs/heads/master.tar.gz"], + strip_prefix = "rules_boost-master", +) + + +# TRLC dependency for requirements traceability +bazel_dep(name = "trlc", version = "0.0.0") +git_override( + module_name = "trlc", + commit = "650b51a47264a4f232b3341f473527710fc32669", # trlc-2.0.2 release + remote = "https://github.com/bmw-software-engineering/trlc.git", +) + diff --git a/images/linux_x86_64/bazel_common b/images/linux_x86_64/bazel_common new file mode 120000 index 0000000000..8192e6e84f --- /dev/null +++ b/images/linux_x86_64/bazel_common @@ -0,0 +1 @@ +../../bazel_common/ \ No newline at end of file diff --git a/images/linux_x86_64/runners/docker_x86_64 b/images/linux_x86_64/runners/docker_x86_64 new file mode 120000 index 0000000000..49365010bf --- /dev/null +++ b/images/linux_x86_64/runners/docker_x86_64 @@ -0,0 +1 @@ +../../../runners/docker_x86_64/ \ No newline at end of file diff --git a/images/linux_x86_64/showcases b/images/linux_x86_64/showcases new file mode 120000 index 0000000000..399ab7eace --- /dev/null +++ b/images/linux_x86_64/showcases @@ -0,0 +1 @@ +../../showcases/ \ No newline at end of file diff --git a/images/qnx_x86_64/.bazelrc b/images/qnx_x86_64/.bazelrc new file mode 100644 index 0000000000..4ad52b8985 --- /dev/null +++ b/images/qnx_x86_64/.bazelrc @@ -0,0 +1,18 @@ +common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ +common --registry=https://bcr.bazel.build + +build:_common --@score_baselibs//score/mw/log/detail/flags:KUse_Stub_Implementation_Only=False +build:_common --@score_baselibs//score/mw/log/flags:KRemote_Logging=False +build:_common --@score_baselibs//score/json:base_library=nlohmann +build:_common --@score_baselibs//score/memory/shared/flags:use_typedshmd=False +build:_common --@score_communication//score/mw/com/flags:tracing_library=stub +build:_common --cxxopt=-Wno-error=mismatched-new-delete + +build:x86_64-qnx --config=_common +build:x86_64-qnx --noexperimental_merged_skyframe_analysis_execution +build:x86_64-qnx --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 +build:x86_64-qnx --incompatible_enable_cc_toolchain_resolution +build:x86_64-qnx --incompatible_strict_action_env +build:x86_64-qnx --platforms=@score_toolchains_qnx//platforms:x86_64-qnx +build:x86_64-qnx --sandbox_writable_path=/var/tmp + diff --git a/images/qnx_x86_64/.bazelversion b/images/qnx_x86_64/.bazelversion new file mode 100644 index 0000000000..8104cabd36 --- /dev/null +++ b/images/qnx_x86_64/.bazelversion @@ -0,0 +1 @@ +8.1.0 diff --git a/images/qnx_x86_64/BUILD b/images/qnx_x86_64/BUILD new file mode 100644 index 0000000000..ce30e704ce --- /dev/null +++ b/images/qnx_x86_64/BUILD @@ -0,0 +1,20 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +load("@rules_shell//shell:sh_binary.bzl", "sh_binary") +load("@score_itf//:defs.bzl", "py_itf_test") + +alias( + name = "image", + actual = "//build:init", + visibility = ["//visibility:public"], +) \ No newline at end of file diff --git a/images/qnx_x86_64/MODULE.bazel b/images/qnx_x86_64/MODULE.bazel new file mode 100644 index 0000000000..37e07431f2 --- /dev/null +++ b/images/qnx_x86_64/MODULE.bazel @@ -0,0 +1,90 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +module( + name = "score_ref_int_qnx_x86_64", + version = "0.0.1", + compatibility_level = 0, +) + +# Include common modules +include("//bazel_common:score_basic_tools.MODULE.bazel") + +# GCC toolchains +include ("//bazel_common:score_gcc_toolchains.MODULE.bazel") # WIP: Not used yet as have problems with IFS toolchain + +# GCC toolchains +include ("//bazel_common:score_qnx_toolchains.MODULE.bazel") # WIP: Not used yet as have problems with IFS toolchain + +# Python support +include("//bazel_common:score_python.MODULE.bazel") + +# Score modules +include("//bazel_common:score_modules.MODULE.bazel") + +bazel_dep(name = "score_itf", version = "0.1.0") + +bazel_dep(name = "rules_boost", repo_name = "com_github_nelhage_rules_boost") +archive_override( + module_name = "rules_boost", + urls = ["https://github.com/nelhage/rules_boost/archive/refs/heads/master.tar.gz"], + strip_prefix = "rules_boost-master", +) + +# TRLC dependency for requirements traceability +bazel_dep(name = "trlc", version = "0.0.0") +git_override( + module_name = "trlc", + commit = "650b51a47264a4f232b3341f473527710fc32669", # trlc-2.0.2 release + remote = "https://github.com/bmw-software-engineering/trlc.git", +) + +local_path_override( + module_name = "score_toolchains_qnx", + path = "../../../toolchains_qnx", +) + +# Workaround until new toolchains can be used +bazel_dep(name = "score_toolchains_gcc", version = "0.5", dev_dependency=True) +gcc = use_extension("@score_toolchains_gcc//extentions:gcc.bzl", "gcc", dev_dependency=True) +gcc.toolchain( + url = "https://github.com/eclipse-score/toolchains_gcc_packages/releases/download/0.0.1/x86_64-unknown-linux-gnu_gcc12.tar.gz", + sha256 = "457f5f20f57528033cb840d708b507050d711ae93e009388847e113b11bf3600", + strip_prefix = "x86_64-unknown-linux-gnu", +) +gcc.extra_features( + features = [ + "minimal_warnings", + "treat_warnings_as_errors", + ], +) +gcc.warning_flags( + minimal_warnings = ["-Wall", "-Wno-error=deprecated-declarations", "-Wno-error=narrowing"], + strict_warnings = ["-Wextra", "-Wpedantic"], +) +use_repo(gcc, "gcc_toolchain", "gcc_toolchain_gcc") + +bazel_dep(name = "score_toolchains_qnx", version = "0.0.3") +toolchains_qnx = use_extension("@score_toolchains_qnx//:extensions.bzl", "toolchains_qnx", dev_dependency=True) +toolchains_qnx.sdp( + sha256 = "f2e0cb21c6baddbcb65f6a70610ce498e7685de8ea2e0f1648f01b327f6bac63", + strip_prefix = "installation", + url = "https://www.qnx.com/download/download/79858/installation.tgz", +) +use_repo(toolchains_qnx, "toolchains_qnx_sdp") +use_repo(toolchains_qnx, "toolchains_qnx_qcc") +use_repo(toolchains_qnx, "toolchains_qnx_ifs") + +# register_toolchains("@gcc_toolchain//:all") +register_toolchains("@toolchains_qnx_qcc//:qcc_x86_64") +register_toolchains("@toolchains_qnx_ifs//:ifs_x86_64") +register_toolchains("@gcc_toolchain//:all") \ No newline at end of file diff --git a/images/qnx_x86_64/bazel_common b/images/qnx_x86_64/bazel_common new file mode 120000 index 0000000000..8192e6e84f --- /dev/null +++ b/images/qnx_x86_64/bazel_common @@ -0,0 +1 @@ +../../bazel_common/ \ No newline at end of file diff --git a/images/qnx_x86_64/build/BUILD b/images/qnx_x86_64/build/BUILD new file mode 100644 index 0000000000..2310aaed25 --- /dev/null +++ b/images/qnx_x86_64/build/BUILD @@ -0,0 +1,74 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +load("@score_toolchains_qnx//rules/fs:ifs.bzl", "qnx_ifs") + +filegroup( + name = "scripts", + srcs = [ + "//configs:startup.sh", + ], + visibility = ["//visibility:private"], +) + +filegroup( + name = "configs", + srcs = [ + "//configs:pci_server.cfg", + "//configs:pci_hw.cfg", + "//configs:qcrypto.conf", + "//configs:passwd", + "//configs:group", + "//configs:sshd_config", + "//configs:ssh_host_rsa_key", + "//configs:ssh_host_rsa_key.pub", + "//configs:hostname", + "//configs:network_setup.sh", + "//configs:network_capture.sh", + "//configs:profile", + "//configs:dhcpcd.conf", + "//configs:network_setup_dhcp.sh", + ], + visibility = ["//visibility:private"], +) + +qnx_ifs( + name = "init", + build_file = "init.build", + srcs = [ + ":system.build", + ":system_dir", + ":scripts", + ":configs", + "//showcases/standalone", + # "//scrample_integration:etc_configs", + # "@score_persistency//tests/cpp_test_scenarios:cpp_test_scenarios", + ], + ext_repo_maping = { + # "SCRAMPLE_PATH": "$(location @score_scrample//src:scrample)", + # "CPP_TEST_SCENARIOS_PATH": "$(location @score_persistency//tests/cpp_test_scenarios:cpp_test_scenarios)", + "BUNDLE_PATH": "$(location //showcases/standalone)" + }, + visibility = [ + "//visibility:public", + ], +) + +filegroup( + name = "system_dir", + srcs = [ + "system.build", + "init.build", + ], +) + diff --git a/images/qnx_x86_64/build/init.build b/images/qnx_x86_64/build/init.build new file mode 100644 index 0000000000..bbec098e03 --- /dev/null +++ b/images/qnx_x86_64/build/init.build @@ -0,0 +1,99 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + + +############################################################################### +# +# Example image built based on minimal configuration from QNX +# +############################################################################### + +[-optional] + +[image=0x3600000] # Set image size to 56MB (0x3600000 bytes) +[virtual=x86_64,multiboot] boot = { # Configure for x86_64 architecture with multiboot support + # Use startup-x86 by default + startup-x86 -v -D8250..115200 -zz # Start x86 kernel with verbose output, serial console at 115200 baud + PATH=/proc/boot # Set executable search path to boot directory + LD_LIBRARY_PATH=/proc/boot # Set library search path to boot directory + [+keeplinked] procnto-smp-instr # Keep process manager linked and instrumented for SMP +} + +[+script] startup-script = { # Define startup script that runs during boot + procmgr_symlink /dev/shmem /tmp # Create symbolic link from shared memory to /tmp + # /tmp will be mounted later as a proper RAM disk + + display_msg Welcome to QNX OS 8.0 on x86_64 tweaked for S-CORE! # Display welcome message + + # These env variables get inherited by all programs which follow + SYSNAME=nto # Set system name to "nto" (Neutrino) + TERM=qansi # Set terminal type to QNX ANSI + + devc-ser8250 & # Start serial driver in background + waitfor /dev/ser1 # Wait for serial device to be available + reopen /dev/ser1 # Reopen serial device for console I/O + + display_msg Placeholder for startup script # Display startup message + etc/startup.sh # Execute main startup script + + [+session] /bin/sh & # Start shell session in background +} + +# Essential utilities - core system commands needed for basic operation +# These binaries provide fundamental system functionality and process management + +# Process and system management utilities +on # Command execution utility - runs commands with specific options +[type=link] waitfor=on # Create symbolic link: waitfor -> on (waits for resources to become available) +[type=link] ability=on # Create symbolic link: ability -> on (manages process abilities/privileges) + +# Shell and command interpreter +ksh # Korn shell - provides command-line interface and scripting +pidin # Process information display - shows running processes (like 'ps' on Linux) +[type=link] /bin/sh=/proc/boot/ksh # Create symbolic link: sh -> ksh (standard shell link) + +# File system utilities +mount # File system mount utility - mounts/unmounts file systems +getconf # System configuration query utility - retrieves system parameters +[type=link] setconf=getconf # Create symbolic link: setconf -> getconf (sets configuration parameters) + +# Device drivers for hardware access +devc-ser8250 # Serial port driver for 8250/16550 UART controllers (console access) + +# System logging utilities +slog2info # System log viewer - displays logged messages +slogger2 # System logging daemon - collects and manages log messages + +# Essential libraries - core runtime libraries required for system operation +# These libraries provide fundamental services like C runtime, networking, and logging + +# Standard C library - provides basic C runtime functions +libc.so.6 # Main C library (malloc, printf, file I/O, etc.) + +# Dynamic linker/loader - handles dynamic library loading at runtime +/usr/lib/ldqnx-64.so.2=ldqnx-64.so.2 # 64-bit QNX dynamic linker (loads shared libraries) + +# Networking library - provides socket and network communication functions +libsocket.so.4 # Socket library (TCP/IP, UDP, network I/O functions) +[type=link] libsocket.so=libsocket.so.4 # Create version-neutral symbolic link + +# System logging library - provides logging services for applications +libslog2.so.1 # System logging library (slog2_* functions) +[type=link] libslog2.so=libslog2.so.1 # Create version-neutral symbolic link + +# Storage driver - provides access to IDE/SATA block devices +devb-eide # Block device driver for IDE/SATA hard drives and SSDs + # Required for mounting QNX6 file systems from disk partitions + + +[+include] ${MAIN_BUILD_FILE_DIR}/system.build # Include additional system build configurations diff --git a/images/qnx_x86_64/build/system.build b/images/qnx_x86_64/build/system.build new file mode 100644 index 0000000000..355f07f9ad --- /dev/null +++ b/images/qnx_x86_64/build/system.build @@ -0,0 +1,287 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + + +# ============================================================================ +# QNX System Build File - Defines system partition contents +# ============================================================================ +# This file defines the contents of the QNX system partition, including +# essential utilities, libraries, configuration files, and system services +# needed for a minimal QNX QEMU environment. + +############################################# +### SHARED LIBRARIES ### +############################################# +# Essential shared libraries for system operation + +libfsnotify.so.1 # File system notification library +cam-cdrom.so # CAM (Common Access Method) CD-ROM driver +cam-disk.so # CAM disk driver for storage devices +fs-dos.so # DOS file system support +fs-qnx6.so # QNX6 file system support +io-blk.so # Block I/O manager +libbz2.so.1 # BZip2 compression library +libc++.so.2 # C++ standard library +libc.so # C standard library (essential) +libcam.so.2 # CAM library for device access +libcatalog.so.1 # Message catalog support +libcrypto.so.3 # OpenSSL crypto library (disabled) +libfscrypto.so.1 # File system encryption support +libgcc_s.so.1 # GCC runtime support library +libiconv.so.1 # Character encoding conversion +liblzma.so.5 # LZMA compression library +libm.so # Math library +libpci.so.3.0 # PCI library v3.0 for hardware access +libqcrypto.so.1.0 # QNX cryptographic library +libqh.so # QNX helper library +libregex.so.1 # Regular expression library +libsecpol.so.1 # Security policy library +libslog2parse.so.1 # System log parsing library +libssl.so.3 # OpenSSL SSL/TLS library (disabled) +libtracelog.so.1 # Trace logging library +libxml2.so.2 # XML parsing library +libz.so # Zlib compression library +libexpat.so.2 # Expat XML parser library +libjail.so.1 # QNX jail library for process containment +qcrypto-openssl-3.so # QNX cryptographic library with OpenSSL 3 support +libpam.so.2 # Pluggable Authentication Modules library + + +############################################# +### FILE MANIPULATION UTILITIES ### +############################################# +# Core file system utilities - most are provided by toybox (minimal Unix utilities) + +[type=link] /bin/ls=/proc/boot/ls # Link ls to IFS version for compatibility +# Note: /bin/sh symlink already defined in init.build as /proc/boot/ksh +toybox # Minimal Unix utilities collection (replaces many GNU tools) +[type=link] cp=toybox # Copy files and directories +[type=link] ls=toybox # List directory contents +[type=link] cat=toybox # Display file contents +[type=link] chmod=toybox # Change file permissions +[type=link] rm=toybox # Remove files and directories +[type=link] dd=toybox # Convert and copy files with specified I/O block size +[type=link] echo=toybox # Display text +[type=link] grep=toybox # Search text patterns in files +[type=link] mkdir=toybox # Create directories +[type=link] ascii=toybox # Display ASCII character set +[type=link] base64=toybox # Base64 encoding/decoding utility +[type=link] basename=toybox # Extract filename from path +[type=link] bc=toybox # Basic calculator +[type=link] bunzip2=toybox # Decompress bzip2 files +[type=link] bzcat=toybox # Display contents of bzip2 files +[type=link] cal=toybox # Display calendar +[type=link] chgrp=toybox # Change group ownership +[type=link] chown=toybox # Change file ownership +[type=link] cksum=toybox # Calculate checksums +[type=link] clear=toybox # Clear terminal screen +[type=link] cmp=toybox # Compare files byte by byte +[type=link] comm=toybox # Compare sorted files line by line +[type=link] cpio=toybox # Copy files to/from archives +[type=link] crc32=toybox # Calculate CRC32 checksums +[type=link] cut=toybox # Extract columns from files +[type=link] date=toybox # Display or set system date +[type=link] diff=toybox # Compare files line by line +[type=link] dirname=toybox # Extract directory from path +[type=link] dos2unix=toybox # Convert DOS line endings to Unix +[type=link] du=toybox # Display disk usage +[type=link] egrep=toybox # Extended grep with regular expressions +[type=link] env=toybox # Display or set environment variables +[type=link] expand=toybox # Convert tabs to spaces +[type=link] expr=toybox # Evaluate expressions +[type=link] false=toybox # Return false status +[type=link] fgrep=toybox # Fast grep for fixed strings +[type=link] file=toybox # Determine file type +[type=link] find=toybox # Search for files and directories +[type=link] fmt=toybox # Format text paragraphs +[type=link] groups=toybox # Display user group membership +[type=link] gunzip=toybox # Decompress gzip files +[type=link] gzip=toybox # Compress files with gzip +[type=link] hd=toybox # Hexadecimal dump (alias for hexdump) +[type=link] head=toybox # Display first lines of files +[type=link] hexdump=toybox # Display files in hexadecimal format +[type=link] id=toybox # Display user and group IDs +[type=link] install=toybox # Copy files and set attributes +[type=link] link=toybox # Create hard links +[type=link] logname=toybox # Display login name +[type=link] md5sum=toybox # Calculate MD5 checksums +[type=link] mkfifo=toybox # Create named pipes (FIFOs) +[type=link] mktemp=toybox # Create temporary files/directories +[type=link] more=toybox # Display files page by page +[type=link] mv=toybox # Move/rename files and directories +[type=link] nl=toybox # Number lines in files +[type=link] nohup=toybox # Run commands immune to hangups +[type=link] od=toybox # Dump files in octal format +[type=link] paste=toybox # Merge lines from files +[type=link] patch=toybox # Apply patches to files +[type=link] printenv=toybox # Print environment variables +[type=link] printf=toybox # Format and print data +[type=link] pwd=toybox # Print working directory +[type=link] readlink=toybox # Display target of symbolic links +[type=link] realpath=toybox # Display absolute path +[type=link] rmdir=toybox # Remove empty directories +[type=link] sed=toybox # Stream editor for filtering/transforming text +[type=link] seq=toybox # Generate sequences of numbers +[type=link] sha1sum=toybox # Calculate SHA1 checksums +[type=link] sleep=toybox # Suspend execution for specified time +[type=link] sort=toybox # Sort lines in text files +[type=link] split=toybox # Split files into pieces +[type=link] stat=toybox # Display file/filesystem status +[type=link] strings=toybox # Extract printable strings from files +[type=link] tail=toybox # Display last lines of files +[type=link] tee=toybox # Copy input to files and stdout +[type=link] test=toybox # Evaluate conditional expressions +[type=link] time=toybox # Time command execution +[type=link] timeout=toybox # Run command with time limit +[type=link] touch=toybox # Update file timestamps +[type=link] tr=toybox # Translate or delete characters +[type=link] true=toybox # Return true status +[type=link] truncate=toybox # Truncate files to specified size +[type=link] tty=toybox # Display terminal name +[type=link] uname=toybox # Display system information +[type=link] uniq=toybox # Remove duplicate lines +[type=link] unix2dos=toybox # Convert Unix line endings to DOS +[type=link] unlink=toybox # Remove files (system call interface) +[type=link] uudecode=toybox # Decode uuencoded files +[type=link] uuencode=toybox # Encode files using uuencoding +[type=link] uuidgen=toybox # Generate UUIDs +[type=link] wc=toybox # Count lines, words, and characters +[type=link] which=toybox # Locate commands in PATH +[type=link] whoami=toybox # Display current username +[type=link] xargs=toybox # Execute commands from standard input +[type=link] xxd=toybox # Make hexdump or reverse +[type=link] yes=toybox # Output string repeatedly +[type=link] zcat=toybox # Display contents of compressed files +[type=link] nc=toybox # Netcat for network connections and packet streaming +[type=link] netcat=toybox # Netcat alias for network connections + + +############################################# +### Tools ### +############################################# +awk # Text processing and pattern scanning +devb-ram # RAM disk block device manager +devc-pty # Pseudo-terminal device manager +fsencrypt # File system encryption utility +fsevmgr # File system event manager +if_up # Network interface configuration +ifconfig # Network interface configuration tool +ln # Create file links +mkqnx6fs # Create QNX6 file systems +mount_ifs # Mount Image File System (IFS) +mqueue # POSIX message queue manager +openssl # SSL/TLS cryptographic toolkit +pci-server # PCI bus server +pdebug # Process debugger +pfctl # Packet filter control utility +pipe # Named pipe manager +random # Random number generator service +shutdown # System shutdown utility +sync # Synchronize file system buffers to disk +tar # Archive utility for creating/extracting tar files +umount # Unmount file systems +sysctl # Configure kernel parameters at runtime +sshd # SSH daemon for remote access +ssh # SSH client for remote connections +ssh-keygen # SSH key generation utility +hostname # Set or display system hostname +route +dhcpcd # DHCP client daemon for automatic network configuration +tcpdump # Network packet capture tool for Wireshark analysis +/usr/lib/ssh/sftp-server=${QNX_TARGET}/${PROCESSOR}/usr/libexec/sftp-server # File transfer server to enable scp + +############################################# +### NETWORKING COMPONENTS ### +############################################# +io-sock # Network socket manager +mods-pci.so # PCI module support for network hardware +mods-phy.so # Physical layer module for network interfaces +mods-usb.so # USB module support +libfdt.so.1 # Flattened Device Tree library +libusbdci.so.2 # USB device controller interface library +devs-vtnet_pci.so # VirtIO network device driver for QEMU/KVM +librpc.so.2 # For TCP dump + + +############################################# +### PCI COMPONENTS ### +############################################# +# PCI-related shared libraries and modules +pci/pci_hw-Intel_x86.so # Intel x86 PCI hardware support +pci/pci_slog2.so # PCI system logging support +pci/pci_cap-0x05.so # PCI capability handler for MSI +pci/pci_cap-0x10.so # PCI Express capability handler +pci/pci_cap-0x11.so # MSI-X capability handler +pci/pci_strings.so # PCI device string database +pci/pci_bkwd_compat.so # Backward compatibility support +pci/pci_debug2.so # Enhanced PCI debugging support + + +############################################# +### SYSTEM DIRECTORIES ### +############################################# +# Create SSH and system directories with appropriate permissions +[gid=0 uid=0 dperms=755 type=dir] /var/chroot/sshd # SSH chroot directory for privilege separation +[gid=0 uid=0 dperms=700 type=dir] /var/ssh # SSH configuration and key storage directory + + +############################################# +### SCRIPTS ### +############################################# +# System startup and initialization scripts +[perms=700] /etc/startup.sh = ${MAIN_BUILD_FILE_DIR}/../configs/startup.sh # Main system startup script +[perms=700] /etc/network_setup.sh = ${MAIN_BUILD_FILE_DIR}/../configs/network_setup.sh # Network configuration script +[perms=700] /etc/network_setup_dhcp.sh = ${MAIN_BUILD_FILE_DIR}/../configs/network_setup_dhcp.sh # Network configuration script +[perms=755] /etc/network_capture = ${MAIN_BUILD_FILE_DIR}/../configs/network_capture.sh # Network packet capture utility + + +############################################# +### CONFIGURATION FILES ### +############################################# +# This section defines critical configuration files that control system +# behavior, hardware access, security policies, and user environment setup. + +[perms=0444] pci_server.cfg = ${MAIN_BUILD_FILE_DIR}/../configs/pci_server.cfg # PCI server configuration +[perms=0444] pci_hw.cfg = ${MAIN_BUILD_FILE_DIR}/../configs/pci_hw.cfg # PCI hardware configuration +[perms=0444] qcrypto.conf = ${MAIN_BUILD_FILE_DIR}/../configs/qcrypto.conf # QNX cryptographic library configuration + +# System hostname configuration +/etc/hostname = ${MAIN_BUILD_FILE_DIR}/../configs/hostname # System hostname definition file +/etc/profile = ${MAIN_BUILD_FILE_DIR}/../configs/profile + +# System user and group databases +/etc/passwd = ${MAIN_BUILD_FILE_DIR}/../configs/passwd # User account database with login information +/etc/group = ${MAIN_BUILD_FILE_DIR}/../configs/group # Group membership database + + +############################################# +### SSH CONFIGURATION ### +############################################# +# SSH server configuration (no static host keys - generated at runtime) +[perms=444] /var/ssh/sshd_config = ${MAIN_BUILD_FILE_DIR}/../configs/sshd_config # SSH daemon configuration file + +[uid=0 gid=0 perms=400] /var/ssh/ssh_host_rsa_key = ${MAIN_BUILD_FILE_DIR}/../configs/ssh_host_rsa_key # SSH server private key +[uid=0 gid=0 perms=400] /var/ssh/ssh_host_rsa_key.pub = ${MAIN_BUILD_FILE_DIR}/../configs/ssh_host_rsa_key.pub # SSH server public key + +# DHCP client configuration +[perms=644] /etc/dhcpcd.conf = ${MAIN_BUILD_FILE_DIR}/../configs/dhcpcd.conf # DHCP client configuration file + +# [perms=777] /etc/logging.json = ${MAIN_BUILD_FILE_DIR}/../scrample_integration/etc/logging.json # DHCP client configuration file +# [perms=777] /etc/mw_com_config.json = ${MAIN_BUILD_FILE_DIR}/../scrample_integration/etc/mw_com_config.json # DHCP client configuration file + +# [perms=777] /scrample = ${SCRAMPLE_PATH} +# [perms=777] /cpp_tests_persistency = ${CPP_TEST_SCENARIOS_PATH} + + +[perms=777] /usecases = ${BUNDLE_PATH} + diff --git a/images/qnx_x86_64/configs/BUILD b/images/qnx_x86_64/configs/BUILD new file mode 100644 index 0000000000..40d52d113d --- /dev/null +++ b/images/qnx_x86_64/configs/BUILD @@ -0,0 +1,31 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + + +exports_files([ + "startup.sh", + "network_setup.sh", + "network_setup_dhcp.sh", + "dhcpcd.conf", + "pci_server.cfg", + "pci_hw.cfg", + "qcrypto.conf", + "passwd", + "group", + "sshd_config", + "ssh_host_rsa_key", + "ssh_host_rsa_key.pub", + "hostname", + "profile", + "network_capture.sh" +]) diff --git a/images/qnx_x86_64/configs/dhcpcd.conf b/images/qnx_x86_64/configs/dhcpcd.conf new file mode 100755 index 0000000000..8a2ce0b86a --- /dev/null +++ b/images/qnx_x86_64/configs/dhcpcd.conf @@ -0,0 +1,42 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + + +# ******************************************************************************* +# Minimal DHCP Client Configuration for QNX QEMU System +# ******************************************************************************* +# This is a minimal dhcpcd.conf file for basic DHCP functionality + +# Allow all interfaces starting with vtnet +allowinterfaces vtnet0 + +# Use the hardware address of the interface for the Client ID +duid + +# Request essential network configuration +option routers +option domain_name_servers +option subnet_mask +option broadcast_address + +# Set timeout for DHCP requests (30 seconds) +timeout 30 + +# Disable IPv6 to simplify configuration +noipv6 + +# Don't send hostname for privacy +nohook hostname + +# Background after getting lease +background diff --git a/images/qnx_x86_64/configs/group b/images/qnx_x86_64/configs/group new file mode 100644 index 0000000000..925ba062f3 --- /dev/null +++ b/images/qnx_x86_64/configs/group @@ -0,0 +1,16 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +root::0:root +qnxuser::1000:qnxuser +sshd::6:sshd diff --git a/images/qnx_x86_64/configs/hostname b/images/qnx_x86_64/configs/hostname new file mode 100644 index 0000000000..c98f8c67fd --- /dev/null +++ b/images/qnx_x86_64/configs/hostname @@ -0,0 +1 @@ +Qnx_S-core diff --git a/images/qnx_x86_64/configs/network_capture.sh b/images/qnx_x86_64/configs/network_capture.sh new file mode 100644 index 0000000000..b0d187cbd4 --- /dev/null +++ b/images/qnx_x86_64/configs/network_capture.sh @@ -0,0 +1,225 @@ +#!/bin/sh + +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + + +# Network Packet Capture Script for QNX +# Provides tcpdump-based packet capture with remote access via netcat + +# Configuration +CAPTURE_INTERFACE="vtnet0" +CAPTURE_PORT="9999" +LOG_DIR="/tmp_ram/capture" +MAX_PACKETS="10000" +CAPTURE_FILTER="" + +usage() { + echo "Network Packet Capture for QNX" + echo "Usage: $0 [command] [options]" + echo "" + echo "Commands:" + echo " start [filter] - Start packet capture (optionally with filter)" + echo " stop - Stop all running captures" + echo " status - Show capture status" + echo " stream [filter] - Start real-time streaming to port $CAPTURE_PORT" + echo " list - List saved capture files" + echo " help - Show this help" + echo "" + echo "Examples:" + echo " $0 start # Capture all packets" + echo " $0 start \"tcp port 22\" # Capture SSH traffic only" + echo " $0 start \"icmp\" # Capture ping traffic only" + echo " $0 stream \"tcp\" # Stream TCP traffic to port $CAPTURE_PORT" + echo "" + echo "For Wireshark analysis:" + echo " 1. Run: $0 stream [filter]" + echo " 2. In Wireshark: Capture -> Options -> Manage Interfaces" + echo " 3. Add remote interface: TCP@:$CAPTURE_PORT" + echo " 4. Or with port forwarding: TCP@localhost:" + echo "" + echo "Saved captures: $LOG_DIR" + echo "Network interface: $CAPTURE_INTERFACE" +} + +# Ensure capture directory exists +mkdir -p "$LOG_DIR" + +case "${1:-help}" in + start) + CAPTURE_FILTER="${2:-}" + TIMESTAMP=$(date +%Y%m%d_%H%M%S) + CAPTURE_FILE="$LOG_DIR/capture_${TIMESTAMP}.pcap" + + echo "Starting packet capture..." + echo "Interface: $CAPTURE_INTERFACE" + echo "File: $CAPTURE_FILE" + echo "Max packets: $MAX_PACKETS" + if [ -n "$CAPTURE_FILTER" ]; then + echo "Filter: $CAPTURE_FILTER" + else + echo "Filter: none (capturing all traffic)" + fi + echo "" + + # Start tcpdump in background + if [ -n "$CAPTURE_FILTER" ]; then + tcpdump -i "$CAPTURE_INTERFACE" -w "$CAPTURE_FILE" -c "$MAX_PACKETS" "$CAPTURE_FILTER" & + else + tcpdump -i "$CAPTURE_INTERFACE" -w "$CAPTURE_FILE" -c "$MAX_PACKETS" & + fi + + TCPDUMP_PID=$! + echo "Capture started with PID: $TCPDUMP_PID" + echo "Capture file: $CAPTURE_FILE" + echo "" + echo "To stop: $0 stop" + echo "To check status: $0 status" + ;; + + stream) + CAPTURE_FILTER="${2:-}" + + echo "Starting real-time packet streaming..." + echo "Interface: $CAPTURE_INTERFACE" + echo "Streaming port: $CAPTURE_PORT" + if [ -n "$CAPTURE_FILTER" ]; then + echo "Filter: $CAPTURE_FILTER" + else + echo "Filter: none (streaming all traffic)" + fi + echo "" + echo "Connect Wireshark to: TCP@:$CAPTURE_PORT" + echo "With port forwarding: TCP@localhost:" + echo "" + echo "Press Ctrl+C to stop streaming" + echo "" + + # Create named pipe for tcpdump output + PIPE_FILE="/tmp_ram/tcpdump_pipe" + mkfifo "$PIPE_FILE" 2>/dev/null || true + + # Start tcpdump writing to pipe in background + if [ -n "$CAPTURE_FILTER" ]; then + tcpdump -i "$CAPTURE_INTERFACE" -w "$PIPE_FILE" -U "$CAPTURE_FILTER" & + else + tcpdump -i "$CAPTURE_INTERFACE" -w "$PIPE_FILE" -U & + fi + TCPDUMP_PID=$! + + # Stream pipe content via netcat + # Note: This requires netcat to be available + if command -v nc >/dev/null 2>&1; then + nc -l -p "$CAPTURE_PORT" < "$PIPE_FILE" & + NC_PID=$! + echo "Streaming via netcat (PID: $NC_PID)" + else + echo "Warning: netcat not available - streaming not possible" + echo "Install netcat or use file-based capture instead" + kill $TCPDUMP_PID 2>/dev/null + rm -f "$PIPE_FILE" + exit 1 + fi + + # Wait for user interruption + trap 'echo ""; echo "Stopping streaming..."; kill $TCPDUMP_PID $NC_PID 2>/dev/null; rm -f "$PIPE_FILE"; exit 0' INT TERM + + echo "Streaming active - tcpdump PID: $TCPDUMP_PID, netcat PID: $NC_PID" + wait + ;; + + stop) + echo "Stopping all packet captures..." + + # Find and kill tcpdump processes + TCPDUMP_PIDS=$(pidin arg | grep tcpdump | awk '{print $1}') + if [ -n "$TCPDUMP_PIDS" ]; then + for pid in $TCPDUMP_PIDS; do + echo "Killing tcpdump process: $pid" + kill "$pid" 2>/dev/null || true + done + else + echo "No tcpdump processes found" + fi + + # Find and kill netcat processes on capture port + NC_PIDS=$(pidin arg | grep nc | awk '{print $1}') + if [ -n "$NC_PIDS" ]; then + for pid in $NC_PIDS; do + echo "Killing netcat process: $pid" + kill "$pid" 2>/dev/null || true + done + fi + + # Clean up pipes + rm -f /tmp_ram/tcpdump_pipe + + echo "All captures stopped" + ;; + + status) + echo "Packet Capture Status" + echo "====================" + echo "" + + # Check for running tcpdump processes + TCPDUMP_PIDS=$(pidin arg | grep tcpdump | awk '{print $1}') + if [ -n "$TCPDUMP_PIDS" ]; then + echo "Active tcpdump processes:" + for pid in $TCPDUMP_PIDS; do + echo " PID: $pid" + done + else + echo "No tcpdump processes running" + fi + + # Check for netcat processes + NC_PIDS=$(pidin arg | grep nc | awk '{print $1}') + if [ -n "$NC_PIDS" ]; then + echo "Active netcat processes:" + for pid in $NC_PIDS; do + echo " PID: $pid" + done + fi + + echo "" + echo "Network interface status:" + ifconfig "$CAPTURE_INTERFACE" 2>/dev/null || echo "Interface $CAPTURE_INTERFACE not found" + + echo "" + echo "Capture files:" + if [ -d "$LOG_DIR" ] && [ "$(ls -A $LOG_DIR 2>/dev/null)" ]; then + ls -la "$LOG_DIR" + else + echo "No capture files found" + fi + ;; + + list) + echo "Saved capture files in $LOG_DIR:" + echo "" + if [ -d "$LOG_DIR" ] && [ "$(ls -A $LOG_DIR 2>/dev/null)" ]; then + ls -la "$LOG_DIR" + echo "" + echo "To analyze with Wireshark:" + echo "1. Copy files from QNX: scp -P 2222 root@localhost:$LOG_DIR/*.pcap ." + echo "2. Open in Wireshark: wireshark .pcap" + else + echo "No capture files found" + fi + ;; + + help|*) + usage + ;; +esac diff --git a/images/qnx_x86_64/configs/network_setup.sh b/images/qnx_x86_64/configs/network_setup.sh new file mode 100644 index 0000000000..b40af8b3e7 --- /dev/null +++ b/images/qnx_x86_64/configs/network_setup.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + + +# ******************************************************************************* +# Network Configuration Script +# Configures networking interfaces and settings for QNX system +# ******************************************************************************* + +echo "---> Starting Networking" +io-sock -m phy -m pci -d vtnet_pci # Start network stack with PHY and PCI modules, load VirtIO network driver +waitfor /dev/socket # Wait for socket device to become available before proceeding + +echo "---> Configuring network interface" +# Bring up the interface and configure with bridge-accessible IP for direct ping +if_up -p vtnet0 # Bring up the vtnet0 network interface in promiscuous mode +ifconfig vtnet0 10.0.2.15 netmask 255.255.255.0 # Configure IP address and subnet mask for vtnet0 + +# Configure system network settings +sysctl -w net.inet.icmp.bmcastecho=1 > /dev/null # Enable ICMP broadcast echo (responds to broadcast pings) +sysctl -w qnx.sec.droproot=33:33 > /dev/null # Set user/group ID (33:33) for dropping root privileges diff --git a/images/qnx_x86_64/configs/network_setup_dhcp.sh b/images/qnx_x86_64/configs/network_setup_dhcp.sh new file mode 100644 index 0000000000..1b88acf568 --- /dev/null +++ b/images/qnx_x86_64/configs/network_setup_dhcp.sh @@ -0,0 +1,92 @@ +#!/bin/sh + +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + + +# ******************************************************************************* +# Simple DHCP Network Configuration Script +# Configures networking using DHCP with minimal configuration +# ******************************************************************************* + +echo "---> Starting Networking with simple DHCP" +io-sock -m phy -m pci -d vtnet_pci # Start network stack with PHY and PCI modules, load VirtIO network driver +waitfor /dev/socket # Wait for socket device to become available before proceeding + +echo "---> Bringing up network interface" +if_up -p vtnet0 # Bring up the vtnet0 network interface in promiscuous mode + +echo "---> Starting DHCP client with minimal config" +# Start DHCP client with minimal configuration +dhcpcd -b -f /etc/dhcpcd.conf vtnet0 & +DHCP_PID=$! # Store DHCP process ID + +# Wait for DHCP to complete (up to 30 seconds) +echo "---> Waiting for DHCP lease acquisition..." +sleep 3 # Initial wait for DHCP negotiation + +# Check if we got an IP address +RETRY_COUNT=0 +MAX_RETRIES=10 # 10 retries * 3 seconds = 30 seconds total + +while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do + # Get current IP address for vtnet0 + IP_ADDR=$(ifconfig vtnet0 | grep 'inet ' | awk '{print $2}') + + if [ -n "$IP_ADDR" ] && [ "$IP_ADDR" != "0.0.0.0" ]; then + echo "---> DHCP successful! Acquired IP" + # Get additional network info + NETMASK=$(ifconfig vtnet0 | grep 'inet ' | awk '{print $4}') + echo "---> Network configuration:" + + # Save basic DHCP status + echo "DHCP_SUCCESS" > /tmp_ram/dhcp_status + IP_ADDR=$(ifconfig vtnet0 | grep 'inet ' | awk '{print $2}') + echo "IP address set to: $IP_ADDR" + echo "IP: $IP_ADDR" >> /tmp_ram/dhcp_status + echo "Date: $(date)" >> /tmp_ram/dhcp_status + break + fi + + echo "---> Still waiting for DHCP lease... (attempt $((RETRY_COUNT + 1))/$MAX_RETRIES)" + sleep 3 + RETRY_COUNT=$((RETRY_COUNT + 1)) +done + +# Check final status +IP_ADDR=$(ifconfig vtnet0 | grep 'inet ' | awk '{print $2}') +if [ -z "$IP_ADDR" ] || [ "$IP_ADDR" = "0.0.0.0" ]; then + echo "---> DHCP failed! Falling back to static IP configuration..." + # Kill DHCP client if still running + if kill -0 $DHCP_PID 2>/dev/null; then + kill $DHCP_PID 2>/dev/null + fi + + # Configure static IP as fallback + echo "---> Configuring static IP fallback: 192.168.122.100" + ifconfig vtnet0 192.168.122.100 netmask 255.255.255.0 + route add default 192.168.122.1 # Add default gateway + + # Save fallback status + echo "DHCP_FAILED_STATIC_FALLBACK" > /tmp_ram/dhcp_status + echo "IP address set to: 192.168.122.100" + echo "IP: 192.168.122.100" >> /tmp_ram/dhcp_status + echo "Date: $(date)" >> /tmp_ram/dhcp_status +else + echo "---> DHCP configuration completed successfully" +fi + +# Configure system network settings +sysctl -w net.inet.icmp.bmcastecho=1 > /dev/null # Enable ICMP broadcast echo (responds to broadcast pings) + +echo "---> Network configuration completed" \ No newline at end of file diff --git a/images/qnx_x86_64/configs/passwd b/images/qnx_x86_64/configs/passwd new file mode 100644 index 0000000000..bcd2c60854 --- /dev/null +++ b/images/qnx_x86_64/configs/passwd @@ -0,0 +1,17 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + + +root::0:0:Superuser:/:/bin/sh +qnxuser::1000:1000:QNX User:/:/bin/sh +sshd::15:6:sshd:/:/bin/false diff --git a/images/qnx_x86_64/configs/pci_hw.cfg b/images/qnx_x86_64/configs/pci_hw.cfg new file mode 100644 index 0000000000..4a619d5ee2 --- /dev/null +++ b/images/qnx_x86_64/configs/pci_hw.cfg @@ -0,0 +1,9 @@ +[interrupts] +B0:D17:F0 A 18 +B0:D17:F0 B 19 +B0:D17:F0 C 16 +B0:D17:F0 D 17 +B3:D0:F0 A 18 +B3:D0:F0 B 19 +B3:D0:F0 C 16 +B3:D0:F0 D 17 diff --git a/images/qnx_x86_64/configs/pci_server.cfg b/images/qnx_x86_64/configs/pci_server.cfg new file mode 100644 index 0000000000..899a56ba9f --- /dev/null +++ b/images/qnx_x86_64/configs/pci_server.cfg @@ -0,0 +1,7 @@ +[buscfg] +DO_BUS_CONFIG=no + +[envars] +PCI_DEBUG_MODULE=pci_debug2.so +PCI_HW_MODULE=pci_hw-Intel_x86.so +PCI_HW_CONFIG_FILE=/proc/boot/pci_hw.cfg diff --git a/images/qnx_x86_64/configs/profile b/images/qnx_x86_64/configs/profile new file mode 100644 index 0000000000..97e7e7ef30 --- /dev/null +++ b/images/qnx_x86_64/configs/profile @@ -0,0 +1,18 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + + +export TERM=qansi +export PATH=/proc/boot +export LD_LIBRARY_PATH=/proc/boot +export MAGIC=/system/etc/magic diff --git a/images/qnx_x86_64/configs/qcrypto.conf b/images/qnx_x86_64/configs/qcrypto.conf new file mode 100644 index 0000000000..b65b4c4a0e --- /dev/null +++ b/images/qnx_x86_64/configs/qcrypto.conf @@ -0,0 +1 @@ +openssl-3 tags=* diff --git a/images/qnx_x86_64/configs/ssh_host_rsa_key b/images/qnx_x86_64/configs/ssh_host_rsa_key new file mode 100644 index 0000000000..aff51a2418 --- /dev/null +++ b/images/qnx_x86_64/configs/ssh_host_rsa_key @@ -0,0 +1,38 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +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 +Fu+/MLbJQuA1zpAAAAAAEC +-----END OPENSSH PRIVATE KEY----- diff --git a/images/qnx_x86_64/configs/ssh_host_rsa_key.pub b/images/qnx_x86_64/configs/ssh_host_rsa_key.pub new file mode 100644 index 0000000000..eee47d4f30 --- /dev/null +++ b/images/qnx_x86_64/configs/ssh_host_rsa_key.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCtHgsqk8ZLaaqaeP53hj/QMt1hRVDuEFpH9pic1tkVS87ec4WLFri7ymNFBs0WwRG9jyjdDX5ISD/Gr5YLi/GFL1uN8w7E7b2dyJy9wNlH2RU5z900Iu/pqZ07L1X/A3ytvu/LkqE8oX+65uP8eZzBFhkBhXeylHsLg6k3W1JkUG7+tw5hhgLtXEpyyESPxi3xBfsGKX4wgkc8u7sdOS2DENKnhjc1Q5GhX0ifWoz6tMmzEMeveB8I5o3g6dASXBLtF9fHYEVy8Dd3gmt7KcehyktZQ7quuzWqMKxBkU+pDAELtIOfx6IrLRcf7I+mKhRonov5gWquTdwrGKNYo/n9oO4JCvDbfSYu1Zq2ykek1RdBI3UVBvLqSotRJXyBdfuVL3UAyN1veyon15vEnEYBFunyjDXJG1N+qTofTirZCBVBn8h2yjdPNCiS3Qr994R2PtLAfcuxoB4xY/KjRYtQ6TXyPjotQRrKW4XhRwibx2eOhPLBb0D8xLUL7anh5Ns= diff --git a/images/qnx_x86_64/configs/sshd_config b/images/qnx_x86_64/configs/sshd_config new file mode 100644 index 0000000000..4be18c46ba --- /dev/null +++ b/images/qnx_x86_64/configs/sshd_config @@ -0,0 +1,64 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + + +# Port number for SSH +Port 22 + +# Protocol version +Protocol 2 + +# Host key location +HostKey /var/ssh/ssh_host_rsa_key + +# Enable port forwarding +AllowTcpForwarding yes + +# Enable SCP/SFTP +Subsystem sftp /usr/lib/ssh/sftp-server + +# AUTHENTICATION SETTINGS - Simple passwordless authentication +# Enable password authentication to check for empty passwords +PasswordAuthentication yes + +# Allow empty passwords (no password required) +PermitEmptyPasswords yes + +# Disable all other authentication methods completely +PubkeyAuthentication no +ChallengeResponseAuthentication no +HostbasedAuthentication no + +# Allow root login without authentication +PermitRootLogin yes + +# Allow user environment variables +PermitUserEnvironment yes + +# Don't create PID file +PidFile none + +# Log level for debugging +LogLevel DEBUG + +# Disable strict modes for easier setup +StrictModes no + +# Disable DNS lookups for faster connection +UseDNS no + +# Maximum authentication attempts +MaxAuthTries 3 + +# Disable login grace time +LoginGraceTime 30 diff --git a/images/qnx_x86_64/configs/startup.sh b/images/qnx_x86_64/configs/startup.sh new file mode 100644 index 0000000000..ce9a5c1b5e --- /dev/null +++ b/images/qnx_x86_64/configs/startup.sh @@ -0,0 +1,84 @@ +#!/bin/sh + +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + + +# ******************************************************************************* +# System Startup Script +# Executed during system initialization to start essential services +# ******************************************************************************* +echo "---> Starting slogger2" +slogger2 -s 4096 # Start system logger with 4KB buffer size for log messages +waitfor /dev/slog # Wait for system log device to become available + +echo "---> Starting PCI Services" +pci-server --config=/proc/boot/pci_server.cfg # Start PCI server with configuration file +waitfor /dev/pci # Wait for PCI device manager to initialize + +echo "---> Starting Pipe" +pipe # Start named pipe resource manager for IPC +waitfor /dev/pipe # Wait for pipe device to become available + +echo "---> Starting Random" +random # Start random number generator device +waitfor /dev/random # Wait for random device to become available + +echo "---> Starting fsevmgr" +fsevmgr # Start file system event manager for file notifications +waitfor /dev/fsnotify # Wait for filesystem notification device + +echo "---> Starting devb-ram" +devb-ram ram capacity=1 blk ramdisk=10m,cache=512k,vnode=256 2>/dev/null # Create 10MB RAM disk with 512KB cache +waitfor /dev/ram0 # Wait for RAM disk device to be ready + +echo "---> mounting ram disk" +mkqnx6fs -q /dev/ram0 # Create QNX6 filesystem on RAM disk (quiet mode) +waitfor /dev/ram0 # Wait for filesystem creation to complete +mount -t qnx6 /dev/ram0 /tmp_ram # Mount RAM disk as QNX6 filesystem at /tmp_ram + +echo "---> Starting mqueue" +mqueue # Start POSIX message queue resource manager +waitfor /dev/mqueue # Wait for message queue device to be available + +echo "---> Starting devc-pty" +devc-pty -n 32 # Start pseudo-terminal driver with 32 PTY pairs + +echo "---> Starting devb-eide" +devb-eide cam user=20:20 blk cache=64M,auto=partition,vnode=2000,ncache=2000,commit=low # Start IDE/SATA block driver +waitfor /dev/hd0 # Wait for first hard disk to be detected + +echo "---> Configuring network" +# /etc/network_setup.sh # fixed IP setup --> commented out as dhcp is now in use +mkdir -p /tmp_ram/var/run/dhcpcd +mkdir -p /tmp_ram/var/db +ln -sP /tmp_ram/var/db /var/db +ln -sP /tmp_ram/var/run/dhcpcd /var/run/dhcpcd +/etc/network_setup_dhcp.sh # Execute network configuration script + +echo "---> Setting hostname" +if [ -f /etc/hostname ]; then # Check if hostname file exists + HOSTNAME=$(cat /etc/hostname) # Read hostname from file + hostname "$HOSTNAME" # Set system hostname + echo "Hostname set to: $HOSTNAME" +else + hostname qnx-score # Set default hostname if no file exists + echo "Qnx_S-core" > /tmp/hostname # Create temporary hostname file + echo "Default hostname set to: Qnx_S-core" +fi + +echo "---> adding /tmp_discovery folder" +mkdir -p /tmp_ram/tmp_discovery +ln -sP /tmp_ram/tmp_discovery /tmp_discovery + +/proc/boot/sshd -f /var/ssh/sshd_config # Start SSH daemon with specified configuration file diff --git a/images/qnx_x86_64/runners/qemu_x86_64 b/images/qnx_x86_64/runners/qemu_x86_64 new file mode 120000 index 0000000000..6df355217d --- /dev/null +++ b/images/qnx_x86_64/runners/qemu_x86_64 @@ -0,0 +1 @@ +../../../runners/qemu_x86_64/ \ No newline at end of file diff --git a/images/qnx_x86_64/scripts/qnx_wireshark.sh b/images/qnx_x86_64/scripts/qnx_wireshark.sh new file mode 100755 index 0000000000..2b6f3822f8 --- /dev/null +++ b/images/qnx_x86_64/scripts/qnx_wireshark.sh @@ -0,0 +1,276 @@ +#!/bin/bash + +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +# QNX Network Trace Collection Script +# Provides easy integration between QNX tcpdump and Wireshark + +set -euo pipefail + +# Configuration +QNX_HOST=${QNX_HOST:-localhost} +SSH_PORT=${SSH_PORT:-2222} +CAPTURE_PORT=${CAPTURE_PORT:-9999} +SSH_USER=${SSH_USER:-root} +SSH_OPTIONS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=10" + +usage() { + echo "QNX Network Trace Collection for Wireshark" + echo "===========================================" + echo "" + echo "Usage: $0 [command] [options]" + echo "" + echo "Commands:" + echo " capture [filter] - Start local packet capture and save to file" + echo " stream [filter] - Start real-time streaming to Wireshark" + echo " wireshark [filter] - Launch Wireshark with live capture" + echo " list - List captured files on QNX system" + echo " download [file] - Download capture file from QNX" + echo " status - Show capture status on QNX" + echo " stop - Stop all captures on QNX" + echo " help - Show this help" + echo "" + echo "Filter examples:" + echo " \"tcp port 22\" - SSH traffic only" + echo " \"icmp\" - Ping traffic only" + echo " \"tcp\" - All TCP traffic" + echo " \"host 10.0.2.2\" - Traffic to/from host gateway" + echo "" + echo "Environment variables:" + echo " QNX_HOST=$QNX_HOST # QNX system IP/hostname" + echo " SSH_PORT=$SSH_PORT # SSH port (forwarded)" + echo " CAPTURE_PORT=$CAPTURE_PORT # Packet streaming port (forwarded)" + echo " SSH_USER=$SSH_USER # SSH username" + echo "" + echo "Prerequisites:" + echo " - QNX system running with SSH access" + echo " - Port forwarding configured: localhost:$SSH_PORT -> guest:22" + echo " - Port forwarding configured: localhost:$CAPTURE_PORT -> guest:9999" + echo " - Wireshark installed on host system" +} + +check_qnx_connection() { + echo "Checking QNX connection..." + if ! ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "echo 'QNX connection successful'" >/dev/null 2>&1; then + echo "Error: Cannot connect to QNX system at $SSH_USER@$QNX_HOST:$SSH_PORT" + echo "Please ensure:" + echo " 1. QNX system is running" + echo " 2. SSH is working: ssh -p $SSH_PORT $SSH_USER@$QNX_HOST" + echo " 3. Port forwarding is configured correctly" + return 1 + fi + echo "✓ QNX connection verified" +} + +check_network_capture_tool() { + echo "Checking network capture tool on QNX..." + if ! ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "test -x /etc/network_capture" 2>/dev/null; then + echo "Error: network_capture tool not found on QNX system" + echo "Please ensure the QNX image includes the network capture script" + return 1 + fi + echo "✓ Network capture tool available" +} + +check_wireshark() { + if ! command -v wireshark >/dev/null 2>&1; then + echo "Warning: Wireshark not found on host system" + echo "To install Wireshark:" + echo " Ubuntu/Debian: sudo apt install wireshark" + echo " RHEL/CentOS: sudo yum install wireshark" + echo " macOS: brew install wireshark" + return 1 + fi + echo "✓ Wireshark available" + return 0 +} + +case "${1:-help}" in + capture) + FILTER="${2:-}" + + check_qnx_connection + check_network_capture_tool + + echo "" + echo "Starting packet capture on QNX system..." + if [ -n "$FILTER" ]; then + echo "Filter: $FILTER" + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture start '$FILTER'" + else + echo "Filter: none (all packets)" + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture start" + fi + + echo "" + echo "Capture started on QNX system" + echo "To stop: $0 stop" + echo "To check status: $0 status" + echo "To list files: $0 list" + ;; + + stream) + FILTER="${2:-}" + + check_qnx_connection + check_network_capture_tool + + echo "" + echo "Starting real-time packet streaming from QNX..." + if [ -n "$FILTER" ]; then + echo "Filter: $FILTER" + else + echo "Filter: none (all packets)" + fi + echo "Stream endpoint: localhost:$CAPTURE_PORT" + echo "" + echo "Starting stream on QNX system..." + + # Start streaming on QNX in background + if [ -n "$FILTER" ]; then + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream '$FILTER'" & + else + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream" & + fi + + QNX_STREAM_PID=$! + + echo "QNX streaming started (PID: $QNX_STREAM_PID)" + echo "" + echo "To capture in Wireshark:" + echo " 1. Open Wireshark" + echo " 2. Go to Capture -> Options" + echo " 3. Click 'Manage Interfaces'" + echo " 4. Go to 'Remote Interfaces' tab" + echo " 5. Add interface: TCP@localhost:$CAPTURE_PORT" + echo " 6. Start capture" + echo "" + echo "Or use: $0 wireshark" + echo "" + echo "Press Ctrl+C to stop streaming" + + # Wait for stream process + trap 'echo ""; echo "Stopping stream..."; kill $QNX_STREAM_PID 2>/dev/null; ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" 2>/dev/null; exit 0' INT TERM + wait $QNX_STREAM_PID + ;; + + wireshark) + FILTER="${2:-}" + + check_qnx_connection + check_network_capture_tool + + if ! check_wireshark; then + exit 1 + fi + + echo "" + echo "Launching Wireshark with QNX live capture..." + if [ -n "$FILTER" ]; then + echo "Filter: $FILTER" + else + echo "Filter: none (all packets)" + fi + + # Start streaming on QNX + echo "Starting packet stream on QNX..." + if [ -n "$FILTER" ]; then + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream '$FILTER'" & + else + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream" & + fi + + QNX_STREAM_PID=$! + + # Give stream time to start + sleep 3 + + echo "Launching Wireshark..." + # Launch Wireshark with remote capture + wireshark -k -i TCP@localhost:$CAPTURE_PORT & + WIRESHARK_PID=$! + + echo "" + echo "Wireshark launched (PID: $WIRESHARK_PID)" + echo "QNX streaming (PID: $QNX_STREAM_PID)" + echo "" + echo "Press Ctrl+C to stop both Wireshark and QNX streaming" + + # Wait and cleanup + trap 'echo ""; echo "Stopping Wireshark and QNX stream..."; kill $WIRESHARK_PID $QNX_STREAM_PID 2>/dev/null; ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" 2>/dev/null; exit 0' INT TERM + + # Wait for either process to end + wait $WIRESHARK_PID 2>/dev/null || wait $QNX_STREAM_PID 2>/dev/null + + # Cleanup remaining processes + kill $QNX_STREAM_PID $WIRESHARK_PID 2>/dev/null || true + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" 2>/dev/null || true + ;; + + list) + check_qnx_connection + check_network_capture_tool + + echo "Listing capture files on QNX system..." + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture list" + ;; + + download) + FILENAME="${2:-}" + + if [ -z "$FILENAME" ]; then + echo "Error: Filename required" + echo "Usage: $0 download " + echo "Use '$0 list' to see available files" + exit 1 + fi + + check_qnx_connection + + echo "Downloading capture file from QNX..." + echo "Remote file: /tmp_ram/capture/$FILENAME" + echo "Local file: ./$FILENAME" + + if scp $SSH_OPTIONS -P "$SSH_PORT" "$SSH_USER@$QNX_HOST:/tmp_ram/capture/$FILENAME" "./$FILENAME"; then + echo "✓ File downloaded successfully" + echo "" + echo "To analyze in Wireshark:" + echo " wireshark ./$FILENAME" + else + echo "✗ Download failed" + exit 1 + fi + ;; + + status) + check_qnx_connection + check_network_capture_tool + + echo "QNX network capture status:" + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture status" + ;; + + stop) + check_qnx_connection + check_network_capture_tool + + echo "Stopping all network captures on QNX..." + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" + echo "✓ All captures stopped" + ;; + + help|*) + usage + ;; +esac diff --git a/images/qnx_x86_64/scripts/run_qemu.sh b/images/qnx_x86_64/scripts/run_qemu.sh new file mode 100755 index 0000000000..a23f117b53 --- /dev/null +++ b/images/qnx_x86_64/scripts/run_qemu.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +set -euo pipefail + +QNX_HOST=$1 + +IFS_IMAGE=$2 + +qemu-system-x86_64 \ + -smp 2 \ + --enable-kvm \ + -cpu Cascadelake-Server-v5 \ + -m 1G \ + -pidfile /tmp/qemu.pid \ + -nographic \ + -kernel "${IFS_IMAGE}" \ + -serial mon:stdio \ + -object rng-random,filename=/dev/urandom,id=rng0 \ + -netdev bridge,id=net0,br=virbr0 -device virtio-net-pci,netdev=net0 \ + -device virtio-rng-pci,rng=rng0 \ No newline at end of file diff --git a/images/qnx_x86_64/scripts/run_qemu_portforward.sh b/images/qnx_x86_64/scripts/run_qemu_portforward.sh new file mode 100755 index 0000000000..e523bc969a --- /dev/null +++ b/images/qnx_x86_64/scripts/run_qemu_portforward.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +set -euo pipefail + +QNX_HOST=$1 + +IFS_IMAGE=$2 + +qemu-system-x86_64 \ + -smp 2 \ + --enable-kvm \ + -cpu Cascadelake-Server-v5 \ + -m 1G \ + -pidfile /tmp/qemu.pid \ + -nographic \ + -kernel "${IFS_IMAGE}" \ + -serial mon:stdio \ + -object rng-random,filename=/dev/urandom,id=rng0 \ + -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80,hostfwd=tcp::8443-:443,hostfwd=tcp::9999-:9999 \ + -device virtio-net-pci,netdev=net0 \ + -device virtio-rng-pci,rng=rng0 diff --git a/images/qnx_x86_64/showcases b/images/qnx_x86_64/showcases new file mode 120000 index 0000000000..399ab7eace --- /dev/null +++ b/images/qnx_x86_64/showcases @@ -0,0 +1 @@ +../../showcases/ \ No newline at end of file diff --git a/qnx_qemu/MODULE.bazel b/qnx_qemu/MODULE.bazel index 5fa697079b..7ff86edeb4 100644 --- a/qnx_qemu/MODULE.bazel +++ b/qnx_qemu/MODULE.bazel @@ -65,11 +65,12 @@ gcc.warning_flags( ) use_repo(gcc, "gcc_toolchain", "gcc_toolchain_gcc") -register_toolchains("@gcc_toolchain//:all") - +# register_toolchains("@gcc_toolchain//:all") +# register_toolchains("@toolchains_qnx_qcc//:qcc_x86_64") +# register_toolchains("@toolchains_qnx_ifs//:ifs_x86_64") # Configure target toolchain for QNX build. bazel_dep(name = "score_toolchains_qnx", version = "0.0.3") -toolchains_qnx = use_extension("@score_toolchains_qnx//:extensions.bzl", "toolchains_qnx") +toolchains_qnx = use_extension("@score_toolchains_qnx//:extensions.bzl", "toolchains_qnx", dev_dependency=True) toolchains_qnx.sdp( sha256 = "f2e0cb21c6baddbcb65f6a70610ce498e7685de8ea2e0f1648f01b327f6bac63", strip_prefix = "installation", @@ -79,8 +80,8 @@ use_repo(toolchains_qnx, "toolchains_qnx_sdp") use_repo(toolchains_qnx, "toolchains_qnx_qcc") use_repo(toolchains_qnx, "toolchains_qnx_ifs") -register_toolchains("@toolchains_qnx_qcc//:qcc_x86_64") -register_toolchains("@toolchains_qnx_ifs//:ifs_x86_64") +# register_toolchains("@toolchains_qnx_qcc//:qcc_x86_64") +# register_toolchains("@toolchains_qnx_ifs//:ifs_x86_64") ############################################################################### # @@ -89,13 +90,13 @@ register_toolchains("@toolchains_qnx_ifs//:ifs_x86_64") ############################################################################### bazel_dep(name = "rules_cc", version = "0.1.1") bazel_dep(name = "score_itf", version = "0.1.0") -bazel_dep(name = "score_baselibs", version = "0.1.3") +# bazel_dep(name = "score_baselibs", version = "0.1.3") -bazel_dep(name = "score_communication", version = "0.1.1") +# bazel_dep(name = "score_communication", version = "0.1.1") -bazel_dep(name = "score_scrample", version = "0.1.0") +# bazel_dep(name = "score_scrample", version = "0.1.0") -bazel_dep(name = "score_persistency", version = "0.2.1") +# bazel_dep(name = "score_persistency", version = "0.2.1") bazel_dep(name = "rules_boost", repo_name = "com_github_nelhage_rules_boost") archive_override( diff --git a/qnx_qemu/build/BUILD b/qnx_qemu/build/BUILD index 077d30e0e9..6e64a8a835 100644 --- a/qnx_qemu/build/BUILD +++ b/qnx_qemu/build/BUILD @@ -46,7 +46,8 @@ qnx_ifs( name = "init", build_file = "init.build", srcs = [ - "system.build", + ":system.build", + ":system_dir", ":scripts", ":configs", "@score_scrample//src:scrample", @@ -58,6 +59,15 @@ qnx_ifs( "CPP_TEST_SCENARIOS_PATH": "$(location @score_persistency//tests/cpp_test_scenarios:cpp_test_scenarios)", }, visibility = [ - "//:__pkg__" + "//visibility:public", + ], +) + +filegroup( + name = "system_dir", + srcs = [ + "system.build", + "init.build", ], ) + diff --git a/qnx_qemu/build/init.build b/qnx_qemu/build/init.build index 815de328ec..bbec098e03 100644 --- a/qnx_qemu/build/init.build +++ b/qnx_qemu/build/init.build @@ -96,4 +96,4 @@ devb-eide # Block device driver for IDE/SATA hard drive # Required for mounting QNX6 file systems from disk partitions -[+include] build/system.build +[+include] ${MAIN_BUILD_FILE_DIR}/system.build # Include additional system build configurations diff --git a/qnx_qemu/build/system.build b/qnx_qemu/build/system.build index baab76a47f..d80c838afa 100644 --- a/qnx_qemu/build/system.build +++ b/qnx_qemu/build/system.build @@ -239,10 +239,10 @@ pci/pci_debug2.so # Enhanced PCI debugging support ### SCRIPTS ### ############################################# # System startup and initialization scripts -[perms=700] /etc/startup.sh = configs/startup.sh # Main system startup script -[perms=700] /etc/network_setup.sh = configs/network_setup.sh # Network configuration script -[perms=700] /etc/network_setup_dhcp.sh = configs/network_setup_dhcp.sh # Network configuration script -[perms=755] /etc/network_capture = configs/network_capture.sh # Network packet capture utility +[perms=700] /etc/startup.sh = ${MAIN_BUILD_FILE_DIR}/../configs/startup.sh # Main system startup script +[perms=700] /etc/network_setup.sh = ${MAIN_BUILD_FILE_DIR}/../configs/network_setup.sh # Network configuration script +[perms=700] /etc/network_setup_dhcp.sh = ${MAIN_BUILD_FILE_DIR}/../configs/network_setup_dhcp.sh # Network configuration script +[perms=755] /etc/network_capture = ${MAIN_BUILD_FILE_DIR}/../configs/network_capture.sh # Network packet capture utility ############################################# @@ -251,33 +251,33 @@ pci/pci_debug2.so # Enhanced PCI debugging support # This section defines critical configuration files that control system # behavior, hardware access, security policies, and user environment setup. -[perms=0444] pci_server.cfg = configs/pci_server.cfg # PCI server configuration -[perms=0444] pci_hw.cfg = configs/pci_hw.cfg # PCI hardware configuration -[perms=0444] qcrypto.conf = configs/qcrypto.conf # QNX cryptographic library configuration +[perms=0444] pci_server.cfg = ${MAIN_BUILD_FILE_DIR}/../configs/pci_server.cfg # PCI server configuration +[perms=0444] pci_hw.cfg = ${MAIN_BUILD_FILE_DIR}/../configs/pci_hw.cfg # PCI hardware configuration +[perms=0444] qcrypto.conf = ${MAIN_BUILD_FILE_DIR}/../configs/qcrypto.conf # QNX cryptographic library configuration -# System hostname configuration -/etc/hostname = configs/hostname # System hostname definition file -/etc/profile = configs/profile +# System hostname configuration +/etc/hostname = ${MAIN_BUILD_FILE_DIR}/../configs/hostname # System hostname definition file +/etc/profile = ${MAIN_BUILD_FILE_DIR}/../configs/profile # System user and group databases -/etc/passwd = configs/passwd # User account database with login information -/etc/group = configs/group # Group membership database +/etc/passwd = ${MAIN_BUILD_FILE_DIR}/../configs/passwd # User account database with login information +/etc/group = ${MAIN_BUILD_FILE_DIR}/../configs/group # Group membership database ############################################# ### SSH CONFIGURATION ### ############################################# # SSH server configuration (no static host keys - generated at runtime) -[perms=444] /var/ssh/sshd_config = configs/sshd_config # SSH daemon configuration file +[perms=444] /var/ssh/sshd_config = ${MAIN_BUILD_FILE_DIR}/../configs/sshd_config # SSH daemon configuration file -[uid=0 gid=0 perms=400] /var/ssh/ssh_host_rsa_key = configs/ssh_host_rsa_key # SSH server private key -[uid=0 gid=0 perms=400] /var/ssh/ssh_host_rsa_key.pub = configs/ssh_host_rsa_key.pub # SSH server public key +[uid=0 gid=0 perms=400] /var/ssh/ssh_host_rsa_key = ${MAIN_BUILD_FILE_DIR}/../configs/ssh_host_rsa_key # SSH server private key +[uid=0 gid=0 perms=400] /var/ssh/ssh_host_rsa_key.pub = ${MAIN_BUILD_FILE_DIR}/../configs/ssh_host_rsa_key.pub # SSH server public key # DHCP client configuration -[perms=644] /etc/dhcpcd.conf = configs/dhcpcd.conf # DHCP client configuration file +[perms=644] /etc/dhcpcd.conf = ${MAIN_BUILD_FILE_DIR}/../configs/dhcpcd.conf # DHCP client configuration file -[perms=777] /etc/logging.json = scrample_integration/etc/logging.json # DHCP client configuration file -[perms=777] /etc/mw_com_config.json = scrample_integration/etc/mw_com_config.json # DHCP client configuration file +[perms=777] /etc/logging.json = ${MAIN_BUILD_FILE_DIR}/../scrample_integration/etc/logging.json # DHCP client configuration file +[perms=777] /etc/mw_com_config.json = ${MAIN_BUILD_FILE_DIR}/../scrample_integration/etc/mw_com_config.json # DHCP client configuration file [perms=777] /scrample = ${SCRAMPLE_PATH} [perms=777] /cpp_tests_persistency = ${CPP_TEST_SCENARIOS_PATH} diff --git a/runners/docker_x86_64/BUILD b/runners/docker_x86_64/BUILD new file mode 100644 index 0000000000..21a84e6eb2 --- /dev/null +++ b/runners/docker_x86_64/BUILD @@ -0,0 +1,24 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +load("@rules_shell//shell:sh_binary.bzl", "sh_binary") + +sh_binary( + name = "docker_x86_64", + srcs = ["scripts/run_docker.sh"], + args = [ + "$(location //:image)", + ], + data = [ + "//:image", + ], +) diff --git a/runners/docker_x86_64/scripts/run_docker.sh b/runners/docker_x86_64/scripts/run_docker.sh new file mode 100755 index 0000000000..91e88c06ec --- /dev/null +++ b/runners/docker_x86_64/scripts/run_docker.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +set -euo pipefail + +OVERLAY_TREE=$1 +OVERLAY_ABS_PATH=$(realpath ${OVERLAY_TREE}) +echo "Starting docker with overlay image: ${OVERLAY_ABS_PATH}" +docker run --rm -it \ + -v "${OVERLAY_ABS_PATH}:/usecases" \ + ubuntu:22.04 \ + /bin/bash \ No newline at end of file diff --git a/runners/qemu_x86_64/BUILD b/runners/qemu_x86_64/BUILD new file mode 100644 index 0000000000..5c60ebbced --- /dev/null +++ b/runners/qemu_x86_64/BUILD @@ -0,0 +1,29 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +load("@rules_shell//shell:sh_binary.bzl", "sh_binary") +load("@score_itf//:defs.bzl", "py_itf_test") + + +sh_binary( + name = "qemu_x86_64", + srcs = ["scripts/run_qemu.sh"], + args = [ + "$(location @toolchains_qnx_sdp//:host_dir)", + "$(location //:image)", + ], + data = [ + "//:image", + "@toolchains_qnx_sdp//:host_all", + "@toolchains_qnx_sdp//:host_dir", + ], +) diff --git a/runners/qemu_x86_64/scripts/qnx_wireshark.sh b/runners/qemu_x86_64/scripts/qnx_wireshark.sh new file mode 100755 index 0000000000..2b6f3822f8 --- /dev/null +++ b/runners/qemu_x86_64/scripts/qnx_wireshark.sh @@ -0,0 +1,276 @@ +#!/bin/bash + +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +# QNX Network Trace Collection Script +# Provides easy integration between QNX tcpdump and Wireshark + +set -euo pipefail + +# Configuration +QNX_HOST=${QNX_HOST:-localhost} +SSH_PORT=${SSH_PORT:-2222} +CAPTURE_PORT=${CAPTURE_PORT:-9999} +SSH_USER=${SSH_USER:-root} +SSH_OPTIONS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=10" + +usage() { + echo "QNX Network Trace Collection for Wireshark" + echo "===========================================" + echo "" + echo "Usage: $0 [command] [options]" + echo "" + echo "Commands:" + echo " capture [filter] - Start local packet capture and save to file" + echo " stream [filter] - Start real-time streaming to Wireshark" + echo " wireshark [filter] - Launch Wireshark with live capture" + echo " list - List captured files on QNX system" + echo " download [file] - Download capture file from QNX" + echo " status - Show capture status on QNX" + echo " stop - Stop all captures on QNX" + echo " help - Show this help" + echo "" + echo "Filter examples:" + echo " \"tcp port 22\" - SSH traffic only" + echo " \"icmp\" - Ping traffic only" + echo " \"tcp\" - All TCP traffic" + echo " \"host 10.0.2.2\" - Traffic to/from host gateway" + echo "" + echo "Environment variables:" + echo " QNX_HOST=$QNX_HOST # QNX system IP/hostname" + echo " SSH_PORT=$SSH_PORT # SSH port (forwarded)" + echo " CAPTURE_PORT=$CAPTURE_PORT # Packet streaming port (forwarded)" + echo " SSH_USER=$SSH_USER # SSH username" + echo "" + echo "Prerequisites:" + echo " - QNX system running with SSH access" + echo " - Port forwarding configured: localhost:$SSH_PORT -> guest:22" + echo " - Port forwarding configured: localhost:$CAPTURE_PORT -> guest:9999" + echo " - Wireshark installed on host system" +} + +check_qnx_connection() { + echo "Checking QNX connection..." + if ! ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "echo 'QNX connection successful'" >/dev/null 2>&1; then + echo "Error: Cannot connect to QNX system at $SSH_USER@$QNX_HOST:$SSH_PORT" + echo "Please ensure:" + echo " 1. QNX system is running" + echo " 2. SSH is working: ssh -p $SSH_PORT $SSH_USER@$QNX_HOST" + echo " 3. Port forwarding is configured correctly" + return 1 + fi + echo "✓ QNX connection verified" +} + +check_network_capture_tool() { + echo "Checking network capture tool on QNX..." + if ! ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "test -x /etc/network_capture" 2>/dev/null; then + echo "Error: network_capture tool not found on QNX system" + echo "Please ensure the QNX image includes the network capture script" + return 1 + fi + echo "✓ Network capture tool available" +} + +check_wireshark() { + if ! command -v wireshark >/dev/null 2>&1; then + echo "Warning: Wireshark not found on host system" + echo "To install Wireshark:" + echo " Ubuntu/Debian: sudo apt install wireshark" + echo " RHEL/CentOS: sudo yum install wireshark" + echo " macOS: brew install wireshark" + return 1 + fi + echo "✓ Wireshark available" + return 0 +} + +case "${1:-help}" in + capture) + FILTER="${2:-}" + + check_qnx_connection + check_network_capture_tool + + echo "" + echo "Starting packet capture on QNX system..." + if [ -n "$FILTER" ]; then + echo "Filter: $FILTER" + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture start '$FILTER'" + else + echo "Filter: none (all packets)" + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture start" + fi + + echo "" + echo "Capture started on QNX system" + echo "To stop: $0 stop" + echo "To check status: $0 status" + echo "To list files: $0 list" + ;; + + stream) + FILTER="${2:-}" + + check_qnx_connection + check_network_capture_tool + + echo "" + echo "Starting real-time packet streaming from QNX..." + if [ -n "$FILTER" ]; then + echo "Filter: $FILTER" + else + echo "Filter: none (all packets)" + fi + echo "Stream endpoint: localhost:$CAPTURE_PORT" + echo "" + echo "Starting stream on QNX system..." + + # Start streaming on QNX in background + if [ -n "$FILTER" ]; then + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream '$FILTER'" & + else + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream" & + fi + + QNX_STREAM_PID=$! + + echo "QNX streaming started (PID: $QNX_STREAM_PID)" + echo "" + echo "To capture in Wireshark:" + echo " 1. Open Wireshark" + echo " 2. Go to Capture -> Options" + echo " 3. Click 'Manage Interfaces'" + echo " 4. Go to 'Remote Interfaces' tab" + echo " 5. Add interface: TCP@localhost:$CAPTURE_PORT" + echo " 6. Start capture" + echo "" + echo "Or use: $0 wireshark" + echo "" + echo "Press Ctrl+C to stop streaming" + + # Wait for stream process + trap 'echo ""; echo "Stopping stream..."; kill $QNX_STREAM_PID 2>/dev/null; ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" 2>/dev/null; exit 0' INT TERM + wait $QNX_STREAM_PID + ;; + + wireshark) + FILTER="${2:-}" + + check_qnx_connection + check_network_capture_tool + + if ! check_wireshark; then + exit 1 + fi + + echo "" + echo "Launching Wireshark with QNX live capture..." + if [ -n "$FILTER" ]; then + echo "Filter: $FILTER" + else + echo "Filter: none (all packets)" + fi + + # Start streaming on QNX + echo "Starting packet stream on QNX..." + if [ -n "$FILTER" ]; then + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream '$FILTER'" & + else + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream" & + fi + + QNX_STREAM_PID=$! + + # Give stream time to start + sleep 3 + + echo "Launching Wireshark..." + # Launch Wireshark with remote capture + wireshark -k -i TCP@localhost:$CAPTURE_PORT & + WIRESHARK_PID=$! + + echo "" + echo "Wireshark launched (PID: $WIRESHARK_PID)" + echo "QNX streaming (PID: $QNX_STREAM_PID)" + echo "" + echo "Press Ctrl+C to stop both Wireshark and QNX streaming" + + # Wait and cleanup + trap 'echo ""; echo "Stopping Wireshark and QNX stream..."; kill $WIRESHARK_PID $QNX_STREAM_PID 2>/dev/null; ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" 2>/dev/null; exit 0' INT TERM + + # Wait for either process to end + wait $WIRESHARK_PID 2>/dev/null || wait $QNX_STREAM_PID 2>/dev/null + + # Cleanup remaining processes + kill $QNX_STREAM_PID $WIRESHARK_PID 2>/dev/null || true + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" 2>/dev/null || true + ;; + + list) + check_qnx_connection + check_network_capture_tool + + echo "Listing capture files on QNX system..." + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture list" + ;; + + download) + FILENAME="${2:-}" + + if [ -z "$FILENAME" ]; then + echo "Error: Filename required" + echo "Usage: $0 download " + echo "Use '$0 list' to see available files" + exit 1 + fi + + check_qnx_connection + + echo "Downloading capture file from QNX..." + echo "Remote file: /tmp_ram/capture/$FILENAME" + echo "Local file: ./$FILENAME" + + if scp $SSH_OPTIONS -P "$SSH_PORT" "$SSH_USER@$QNX_HOST:/tmp_ram/capture/$FILENAME" "./$FILENAME"; then + echo "✓ File downloaded successfully" + echo "" + echo "To analyze in Wireshark:" + echo " wireshark ./$FILENAME" + else + echo "✗ Download failed" + exit 1 + fi + ;; + + status) + check_qnx_connection + check_network_capture_tool + + echo "QNX network capture status:" + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture status" + ;; + + stop) + check_qnx_connection + check_network_capture_tool + + echo "Stopping all network captures on QNX..." + ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" + echo "✓ All captures stopped" + ;; + + help|*) + usage + ;; +esac diff --git a/runners/qemu_x86_64/scripts/run_qemu.sh b/runners/qemu_x86_64/scripts/run_qemu.sh new file mode 100755 index 0000000000..9f741d3c01 --- /dev/null +++ b/runners/qemu_x86_64/scripts/run_qemu.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +set -euo pipefail + +QNX_HOST=$1 + +IFS_IMAGE=$2 +echo "Starting QEMU with IFS image: ${IFS_IMAGE}" +qemu-system-x86_64 \ + -smp 2 \ + -cpu Cascadelake-Server-v5 \ + -m 1G \ + -pidfile /tmp/qemu.pid \ + -nographic \ + -kernel "${IFS_IMAGE}" \ + -serial mon:stdio \ + -object rng-random,filename=/dev/urandom,id=rng0 \ + -netdev bridge,id=net0,br=virbr0 -device virtio-net-pci,netdev=net0 \ + -device virtio-rng-pci,rng=rng0 \ No newline at end of file diff --git a/runners/qemu_x86_64/scripts/run_qemu_portforward.sh b/runners/qemu_x86_64/scripts/run_qemu_portforward.sh new file mode 100755 index 0000000000..e523bc969a --- /dev/null +++ b/runners/qemu_x86_64/scripts/run_qemu_portforward.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +set -euo pipefail + +QNX_HOST=$1 + +IFS_IMAGE=$2 + +qemu-system-x86_64 \ + -smp 2 \ + --enable-kvm \ + -cpu Cascadelake-Server-v5 \ + -m 1G \ + -pidfile /tmp/qemu.pid \ + -nographic \ + -kernel "${IFS_IMAGE}" \ + -serial mon:stdio \ + -object rng-random,filename=/dev/urandom,id=rng0 \ + -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80,hostfwd=tcp::8443-:443,hostfwd=tcp::9999-:9999 \ + -device virtio-net-pci,netdev=net0 \ + -device virtio-rng-pci,rng=rng0 diff --git a/showcases/BUILD b/showcases/BUILD new file mode 100644 index 0000000000..e69de29bb2 diff --git a/showcases/standalone/BUILD b/showcases/standalone/BUILD new file mode 100644 index 0000000000..c32485155d --- /dev/null +++ b/showcases/standalone/BUILD @@ -0,0 +1,7 @@ +load("//bazel_common:bundlers.bzl", "pkg_bundle") + +pkg_bundle( + name = "standalone", + package_dir = "standalone", + bins = ["@score_scrample//src:scrample"], +) From 6a44d18e4e71474392a5616c5d69ece013b22eff Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Thu, 5 Feb 2026 14:46:29 +0100 Subject: [PATCH 02/22] Move feature_showcases to showcases and deploy to x86 --- bazel_common/bundlers.bzl | 9 ++-- bazel_common/score_basic_tools.MODULE.bazel | 3 +- bazel_common/score_modules.MODULE.bazel | 6 +++ .../score_rust_toolchains.MODULE.bazel | 2 + feature_showcase/BUILD | 19 -------- feature_showcase/rust/BUILD | 38 --------------- images/linux_x86_64/.bazelrc | 4 +- images/linux_x86_64/BUILD | 2 +- images/linux_x86_64/MODULE.bazel | 3 ++ showcases/BUILD | 46 +++++++++++++++++++ .../rust => showcases}/kyron/main.rs | 0 .../orchestration_persistency/main.rs | 0 showcases/standalone/BUILD | 1 + 13 files changed, 68 insertions(+), 65 deletions(-) create mode 100644 bazel_common/score_rust_toolchains.MODULE.bazel delete mode 100644 feature_showcase/BUILD delete mode 100644 feature_showcase/rust/BUILD rename {feature_showcase/rust => showcases}/kyron/main.rs (100%) rename {feature_showcase/rust => showcases}/orchestration_persistency/main.rs (100%) diff --git a/bazel_common/bundlers.bzl b/bazel_common/bundlers.bzl index 68c711aacb..f0adb02a6b 100644 --- a/bazel_common/bundlers.bzl +++ b/bazel_common/bundlers.bzl @@ -1,11 +1,11 @@ load("@rules_pkg//pkg:pkg.bzl", "pkg_tar") load("@rules_pkg//pkg:mappings.bzl", "pkg_files") -def pkg_bundle(name, bins, package_dir): +def pkg_bundle(name, bins, package_dir, other_package_files = []): """Creates a reusable bundle: pkg_files → pkg_tar → untar""" - all_files_name = name + "_all_files" - bundle_name = name + "_tar" + all_files_name = name + "_pkg_files" + bundle_name = name + "_pkg_tar" untar_name = name rename_bin_dict = {} @@ -20,12 +20,13 @@ def pkg_bundle(name, bins, package_dir): name = all_files_name, srcs = bins, renames = rename_bin_dict, + visibility = ["//visibility:public"], ) # Step 2: pkg_tar pkg_tar( name = bundle_name, - srcs = [":" + all_files_name], + srcs = [":" + all_files_name] + other_package_files, strip_prefix = "/", package_dir = package_dir, visibility = ["//visibility:public"], diff --git a/bazel_common/score_basic_tools.MODULE.bazel b/bazel_common/score_basic_tools.MODULE.bazel index af8d108822..e6ce885161 100644 --- a/bazel_common/score_basic_tools.MODULE.bazel +++ b/bazel_common/score_basic_tools.MODULE.bazel @@ -1,4 +1,5 @@ bazel_dep(name = "rules_shell", version = "0.6.0") bazel_dep(name = "rules_cc", version = "0.1.1") bazel_dep(name = "rules_pkg", version = "1.2.0") -bazel_dep(name = "score_bazel_platforms", version = "0.0.4") \ No newline at end of file +bazel_dep(name = "score_bazel_platforms", version = "0.0.4") +bazel_dep(name = "score_crates", version = "0.0.6") diff --git a/bazel_common/score_modules.MODULE.bazel b/bazel_common/score_modules.MODULE.bazel index 30b54ae4ed..4a3995ceb6 100644 --- a/bazel_common/score_modules.MODULE.bazel +++ b/bazel_common/score_modules.MODULE.bazel @@ -14,4 +14,10 @@ git_override( module_name = "score_kyron", remote = "https://github.com/eclipse-score/kyron.git", commit = "ed312bdc6a50abc73f97b8c7e2ad4726fed06e81", +) + +git_override( + module_name = "score_persistency", + remote = "https://github.com/eclipse-score/persistency.git", + commit = "0037034bf853e5f955f028fab54ed319fb0441c3", ) \ No newline at end of file diff --git a/bazel_common/score_rust_toolchains.MODULE.bazel b/bazel_common/score_rust_toolchains.MODULE.bazel new file mode 100644 index 0000000000..a71ae2e1cf --- /dev/null +++ b/bazel_common/score_rust_toolchains.MODULE.bazel @@ -0,0 +1,2 @@ +bazel_dep(name = "rules_rust", version = "0.61.0") +bazel_dep(name = "score_toolchains_rust", version = "0.4.0", dev_dependency = True) diff --git a/feature_showcase/BUILD b/feature_showcase/BUILD deleted file mode 100644 index 6844e029a7..0000000000 --- a/feature_showcase/BUILD +++ /dev/null @@ -1,19 +0,0 @@ -filegroup( - name = "all_examples", - srcs = [ - "//feature_showcase/rust:kyron_example", - "//feature_showcase/rust:orch_per_example", - ], -) - - - -genrule( - name = "build_all", - srcs = [ - "//feature_showcase/rust:kyron_example", - "//feature_showcase/rust:orch_per_example", - ], - outs = ["done.txt"], - cmd = "echo built > $@", -) \ No newline at end of file diff --git a/feature_showcase/rust/BUILD b/feature_showcase/rust/BUILD deleted file mode 100644 index e1e4566ab0..0000000000 --- a/feature_showcase/rust/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -load("@rules_rust//rust:defs.bzl", "rust_binary") - -rust_binary( - name = "kyron_example", - srcs = glob(["kyron/**/*.rs"]), - deps = [ - "@score_kyron//src/kyron:libkyron", - "@score_kyron//src/kyron-foundation:libkyron_foundation", - "@score_crates//:tracing_subscriber", - ], - visibility = ["//visibility:public"], -) - -rust_binary( - name = "orch_per_example", - srcs = glob(["orchestration_persistency/**/*.rs"]), - deps = [ - "@score_kyron//src/kyron:libkyron", - "@score_kyron//src/kyron-foundation:libkyron_foundation", - "@score_orchestrator//src/orchestration:liborchestration", - "@score_kyron//src/logging_tracing:liblogging_tracing", - "@score_persistency//src/rust/rust_kvs:rust_kvs", - ], - visibility = ["//visibility:public"], -) diff --git a/images/linux_x86_64/.bazelrc b/images/linux_x86_64/.bazelrc index d414e23e04..1ee06f9ddb 100644 --- a/images/linux_x86_64/.bazelrc +++ b/images/linux_x86_64/.bazelrc @@ -8,6 +8,6 @@ common --@score_baselibs//score/memory/shared/flags:use_typedshmd=False common --@score_communication//score/mw/com/flags:tracing_library=stub common --cxxopt=-Wno-error=mismatched-new-delete - +common --extra_toolchains=@score_toolchains_rust//toolchains/ferrocene:ferrocene_x86_64_unknown_linux_gnu common --extra_toolchains=@score_gcc_x86_64_toolchain//:x86_64-linux-gcc_12.2.0-posix -common:build --platforms=@score_bazel_platforms//:x86_64-linux-gcc_12.2.0-posix +common --platforms=@score_bazel_platforms//:x86_64-linux-gcc_12.2.0-posix diff --git a/images/linux_x86_64/BUILD b/images/linux_x86_64/BUILD index 42021740fa..1e357acc6f 100644 --- a/images/linux_x86_64/BUILD +++ b/images/linux_x86_64/BUILD @@ -14,6 +14,6 @@ load("@rules_shell//shell:sh_binary.bzl", "sh_binary") alias( name = "image", - actual = "//showcases/standalone", + actual = "//showcases:showcases_all", visibility = ["//visibility:public"], ) \ No newline at end of file diff --git a/images/linux_x86_64/MODULE.bazel b/images/linux_x86_64/MODULE.bazel index 774726c5e2..cd471c0dd8 100644 --- a/images/linux_x86_64/MODULE.bazel +++ b/images/linux_x86_64/MODULE.bazel @@ -22,6 +22,9 @@ include("//bazel_common:score_basic_tools.MODULE.bazel") # GCC toolchains include ("//bazel_common:score_gcc_toolchains.MODULE.bazel") +# GCC toolchains +include ("//bazel_common:score_rust_toolchains.MODULE.bazel") + # Python support include("//bazel_common:score_python.MODULE.bazel") diff --git a/showcases/BUILD b/showcases/BUILD index e69de29bb2..6396b57076 100644 --- a/showcases/BUILD +++ b/showcases/BUILD @@ -0,0 +1,46 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +load("@rules_rust//rust:defs.bzl", "rust_binary") +load("//bazel_common:bundlers.bzl", "pkg_bundle") + +pkg_bundle( + name = "showcases_all", + package_dir = "showcases", + bins = [":kyron_example", ":orch_per_example", ], + other_package_files = ["//showcases/standalone:standalone_pkg_files"] +) + +rust_binary( + name = "kyron_example", + srcs = glob(["kyron/**/*.rs"]), + deps = [ + "@score_kyron//src/kyron:libkyron", + "@score_kyron//src/kyron-foundation:libkyron_foundation", + "@score_crates//:tracing_subscriber", + ], + visibility = ["//visibility:public"], +) + +rust_binary( + name = "orch_per_example", + srcs = glob(["orchestration_persistency/**/*.rs"]), + deps = [ + "@score_kyron//src/kyron:libkyron", + "@score_kyron//src/kyron-foundation:libkyron_foundation", + "@score_orchestrator//src/orchestration:liborchestration", + "@score_kyron//src/logging_tracing:liblogging_tracing", + "@score_persistency//src/rust/rust_kvs:rust_kvs", + ], + visibility = ["//visibility:public"], +) diff --git a/feature_showcase/rust/kyron/main.rs b/showcases/kyron/main.rs similarity index 100% rename from feature_showcase/rust/kyron/main.rs rename to showcases/kyron/main.rs diff --git a/feature_showcase/rust/orchestration_persistency/main.rs b/showcases/orchestration_persistency/main.rs similarity index 100% rename from feature_showcase/rust/orchestration_persistency/main.rs rename to showcases/orchestration_persistency/main.rs diff --git a/showcases/standalone/BUILD b/showcases/standalone/BUILD index c32485155d..bce8fb018c 100644 --- a/showcases/standalone/BUILD +++ b/showcases/standalone/BUILD @@ -1,5 +1,6 @@ load("//bazel_common:bundlers.bzl", "pkg_bundle") + pkg_bundle( name = "standalone", package_dir = "standalone", From e7be6b439f4e02cdc3c0313e0bfe6ebcb849909e Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Thu, 5 Feb 2026 15:44:28 +0100 Subject: [PATCH 03/22] Initial itf support in qnx_x86_64 image --- feature_integration_tests/BUILD | 0 feature_integration_tests/configs/BUILD | 5 ++ .../configs/qemu_target_config.json | 30 +++++++++ feature_integration_tests/itf/BUILD | 5 ++ .../itf/test_persistency.py | 38 ++++++++++++ .../itf/test_scrample.py | 39 ++++++++++++ feature_integration_tests/itf/test_ssh.py | 46 ++++++++++++++ images/qnx_x86_64/.bazelrc | 6 ++ images/qnx_x86_64/BUILD | 61 ++++++++++++++++++- images/qnx_x86_64/feature_integration_tests | 1 + 10 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 feature_integration_tests/BUILD create mode 100644 feature_integration_tests/configs/BUILD create mode 100644 feature_integration_tests/configs/qemu_target_config.json create mode 100644 feature_integration_tests/itf/BUILD create mode 100644 feature_integration_tests/itf/test_persistency.py create mode 100644 feature_integration_tests/itf/test_scrample.py create mode 100644 feature_integration_tests/itf/test_ssh.py create mode 120000 images/qnx_x86_64/feature_integration_tests diff --git a/feature_integration_tests/BUILD b/feature_integration_tests/BUILD new file mode 100644 index 0000000000..e69de29bb2 diff --git a/feature_integration_tests/configs/BUILD b/feature_integration_tests/configs/BUILD new file mode 100644 index 0000000000..3a0f8bece5 --- /dev/null +++ b/feature_integration_tests/configs/BUILD @@ -0,0 +1,5 @@ +exports_files( + [ + "qemu_target_config.json", + ], +) \ No newline at end of file diff --git a/feature_integration_tests/configs/qemu_target_config.json b/feature_integration_tests/configs/qemu_target_config.json new file mode 100644 index 0000000000..e90afd9081 --- /dev/null +++ b/feature_integration_tests/configs/qemu_target_config.json @@ -0,0 +1,30 @@ +{ + "S_CORE_ECU_QEMU": { + "performance_processor": { + "name": "S_CORE_ECU_QEMU_PP", + "ip_address": "169.254.158.190", + "ext_ip_address": "169.254.158.190", + "ssh_port": 22, + "diagnostic_ip_address": "169.254.158.190", + "diagnostic_address": "0x91", + "serial_device": "", + "network_interfaces": [], + "ecu_name": "s_core_ecu_qemu_pp", + "data_router_config": { + "vlan_address": "127.0.0.1", + "multicast_addresses": [] + }, + "qemu_num_cores": 2, + "qemu_ram_size": "1G" + }, + "safety_processor": { + "name": "S_CORE_ECU_QEMU_SC", + "ip_address": "169.254.158.190", + "diagnostic_ip_address": "169.254.158.190", + "diagnostic_address": "0x90", + "serial_device": "", + "use_doip": true + }, + "other_processors": {} + } +} diff --git a/feature_integration_tests/itf/BUILD b/feature_integration_tests/itf/BUILD new file mode 100644 index 0000000000..61105a833b --- /dev/null +++ b/feature_integration_tests/itf/BUILD @@ -0,0 +1,5 @@ +exports_files( + [ + "test_ssh.py", + ], +) \ No newline at end of file diff --git a/feature_integration_tests/itf/test_persistency.py b/feature_integration_tests/itf/test_persistency.py new file mode 100644 index 0000000000..96c16fc165 --- /dev/null +++ b/feature_integration_tests/itf/test_persistency.py @@ -0,0 +1,38 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +from itf.plugins.com.ping import ping +from itf.plugins.com.ssh import execute_command_output +import logging + +logger = logging.getLogger(__name__) + + +def test_persistency_test_app_is_deployed(target_fixture): + with target_fixture.sut.ssh() as ssh: + exit_code, stdout, stderr = execute_command_output( + ssh, "test -f cpp_tests_persistency" + ) + assert exit_code == 0, "SSH command failed" + +def test_persistency_test_app_is_running(target_fixture): + with target_fixture.sut.ssh() as ssh: + exit_code, stdout, stderr = execute_command_output( + ssh, "./cpp_tests_persistency --name basic.basic --input '{\"kvs_parameters\":{\"instance_id\":0}}'", + timeout = 30, max_exec_time = 180, + logger_in = logger, verbose = True, + ) + + logger.info (stdout) + logger.info (stderr) + + assert exit_code == 0, "SSH command failed" diff --git a/feature_integration_tests/itf/test_scrample.py b/feature_integration_tests/itf/test_scrample.py new file mode 100644 index 0000000000..e9533f6645 --- /dev/null +++ b/feature_integration_tests/itf/test_scrample.py @@ -0,0 +1,39 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +from itf.plugins.com.ping import ping +from itf.plugins.com.ssh import execute_command_output +import logging + +logger = logging.getLogger(__name__) + + +def test_scrample_app_is_deployed(target_fixture): + with target_fixture.sut.ssh() as ssh: + exit_code, stdout, stderr = execute_command_output( + ssh, "test -f scrample" + ) + assert exit_code == 0, "SSH command failed" + + +def test_scrample_app_is_running(target_fixture): + with target_fixture.sut.ssh() as ssh: + exit_code, stdout, stderr = execute_command_output( + ssh, "./scrample -n 10 -t 100 -m send & ./scrample -n 5 -t 100 -m recv", + timeout = 30, max_exec_time = 180, + logger_in = logger, verbose = True, + ) + + logger.info (stdout) + logger.info (stderr) + + assert exit_code == 0, "SSH command failed" diff --git a/feature_integration_tests/itf/test_ssh.py b/feature_integration_tests/itf/test_ssh.py new file mode 100644 index 0000000000..6fe77281d6 --- /dev/null +++ b/feature_integration_tests/itf/test_ssh.py @@ -0,0 +1,46 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +from itf.plugins.com.ping import ping +from itf.plugins.com.ssh import execute_command_output + + +def test_ssh_with_default_user(target_fixture): + with target_fixture.sut.ssh() as ssh: + exit_code, stdout, stderr = execute_command_output( + ssh, "echo 'Username:' $USER && uname -a" + ) + assert exit_code == 0, "SSH command failed" + assert "Username: root" in stdout[0], "Expected username not found in output" + assert "QNX Qnx_S-core 8.0.0" in stdout[1], ( + "Expected QNX kernel information not found in output" + ) + assert stderr == [], "Expected no error output" + + +def test_ssh_with_qnx_user(target_fixture): + user = "qnxuser" + with target_fixture.sut.ssh(username=user) as ssh: + exit_code, stdout, stderr = execute_command_output( + ssh, "echo 'Username:' $USER && uname -a" + ) + assert exit_code == 0, "SSH command failed" + assert f"Username: {user}" in stdout[0], "Expected username not found in output" + assert "QNX Qnx_S-core 8.0.0" in stdout[1], ( + "Expected QNX kernel information not found in output" + ) + assert stderr == [], "Expected no error output" + + +def test_ping_ok(target_fixture): + is_reachable = ping(target_fixture.sut.ip_address) + assert is_reachable, "QNX Target is not reachable via ping" diff --git a/images/qnx_x86_64/.bazelrc b/images/qnx_x86_64/.bazelrc index 4ad52b8985..670a512410 100644 --- a/images/qnx_x86_64/.bazelrc +++ b/images/qnx_x86_64/.bazelrc @@ -16,3 +16,9 @@ build:x86_64-qnx --incompatible_strict_action_env build:x86_64-qnx --platforms=@score_toolchains_qnx//platforms:x86_64-qnx build:x86_64-qnx --sandbox_writable_path=/var/tmp + +build:itf --config=x86_64-qnx +build:itf --run_under=@score_itf//scripts:run_under_qemu +build:itf --test_arg="--qemu" +build:itf --test_arg="--os=qnx" + diff --git a/images/qnx_x86_64/BUILD b/images/qnx_x86_64/BUILD index ce30e704ce..bb96cfc985 100644 --- a/images/qnx_x86_64/BUILD +++ b/images/qnx_x86_64/BUILD @@ -17,4 +17,63 @@ alias( name = "image", actual = "//build:init", visibility = ["//visibility:public"], -) \ No newline at end of file +) + +# For now we keep this not in /feature_integration_tests but locally within images + +py_itf_test( + name = "test_ssh", + srcs = [ + "//feature_integration_tests/itf:test_ssh.py", + ], + args = [ + "--target_config=$(location //feature_integration_tests/configs:qemu_target_config.json)", + "--ecu=s_core_ecu_qemu", + "--qemu_image=$(location :image)", + ], + plugins = [ + "itf.plugins.base.base_plugin", + ], + data = [ + ":image", + "//feature_integration_tests/configs:qemu_target_config.json", + ], +) + +# py_itf_test( +# name = "test_scrample", +# srcs = [ +# "feature_integration_tests/itf/test_scrample.py", +# ], +# args = [ +# "--target_config=$(location feature_integration_tests/configs/qemu_target_config.json)", +# "--ecu=s_core_ecu_qemu", +# "--qemu_image=$(location :image)", +# ], +# plugins = [ +# "itf.plugins.base.base_plugin", +# ], +# data = [ +# ":image", +# "target_config.json", +# ], +# ) + +# py_itf_test( +# name = "test_persistency", +# srcs = [ +# "feature_integration_tests/itf/test_persistency.py", +# ], +# args = [ +# "--target_config=$(location target_config.json)", +# "--ecu=s_core_ecu_qemu", +# "--qemu_image=$(location :image)", +# ], +# plugins = [ +# "itf.plugins.base.base_plugin", +# ], +# data = [ +# ":image", +# "target_config.json", +# ], +# ) diff --git a/images/qnx_x86_64/feature_integration_tests b/images/qnx_x86_64/feature_integration_tests new file mode 120000 index 0000000000..48cb83d4b4 --- /dev/null +++ b/images/qnx_x86_64/feature_integration_tests @@ -0,0 +1 @@ +../../feature_integration_tests/ \ No newline at end of file From 437bd498b6cac918ad87c90fdd3588f26d48727c Mon Sep 17 00:00:00 2001 From: Piotr Korkus Date: Thu, 5 Feb 2026 21:52:08 +0100 Subject: [PATCH 04/22] add scrample tests via images --- feature_integration_tests/configs/BUILD | 28 ++++++++- .../configs/etc/logging.json | 8 +++ .../configs/etc/mw_com_config.json | 63 +++++++++++++++++++ feature_integration_tests/itf/BUILD | 2 + .../itf/test_scrample.py | 21 ++++--- images/qnx_x86_64/BUILD | 36 +++++------ images/qnx_x86_64/MODULE.bazel | 5 +- images/qnx_x86_64/build/BUILD | 5 +- images/qnx_x86_64/build/system.build | 6 +- 9 files changed, 138 insertions(+), 36 deletions(-) create mode 100644 feature_integration_tests/configs/etc/logging.json create mode 100644 feature_integration_tests/configs/etc/mw_com_config.json diff --git a/feature_integration_tests/configs/BUILD b/feature_integration_tests/configs/BUILD index 3a0f8bece5..49587392d5 100644 --- a/feature_integration_tests/configs/BUILD +++ b/feature_integration_tests/configs/BUILD @@ -1,5 +1,31 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* exports_files( [ "qemu_target_config.json", ], -) \ No newline at end of file +) + +exports_files([ + "etc/logging.json", + "etc/mw_com_config.json", +]) + +filegroup( + name = "etc_configs", + srcs = [ + "etc/logging.json", + "etc/mw_com_config.json", + ], + visibility = ["//visibility:public"], +) diff --git a/feature_integration_tests/configs/etc/logging.json b/feature_integration_tests/configs/etc/logging.json new file mode 100644 index 0000000000..8b3d1eacc8 --- /dev/null +++ b/feature_integration_tests/configs/etc/logging.json @@ -0,0 +1,8 @@ +{ + "appId": "IPBR", + "appDesc": "ipc_bridge", + "logLevel": "kDebug", + "logLevelThresholdConsole": "kInfo", + "logMode": "kConsole", + "dynamicDatarouterIdentifiers" : true +} diff --git a/feature_integration_tests/configs/etc/mw_com_config.json b/feature_integration_tests/configs/etc/mw_com_config.json new file mode 100644 index 0000000000..1e104bd484 --- /dev/null +++ b/feature_integration_tests/configs/etc/mw_com_config.json @@ -0,0 +1,63 @@ +{ + "serviceTypes": [ + { + "serviceTypeName": "/score/MapApiLanesStamped", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ + { + "binding": "SHM", + "serviceId": 6432, + "events": [ + { + "eventName": "map_api_lanes_stamped", + "eventId": 1 + }, + { + "eventName": "dummy_data_stamped", + "eventId": 2 + } + ] + } + ] + } + ], + "serviceInstances": [ + { + "instanceSpecifier": "score/MapApiLanesStamped", + "serviceTypeName": "/score/MapApiLanesStamped", + "version": { + "major": 1, + "minor": 0 + }, + "instances": [ + { + "instanceId": 1, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { + "eventName": "map_api_lanes_stamped", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } + ] + } + ] + } + ] +} diff --git a/feature_integration_tests/itf/BUILD b/feature_integration_tests/itf/BUILD index 61105a833b..db414410fc 100644 --- a/feature_integration_tests/itf/BUILD +++ b/feature_integration_tests/itf/BUILD @@ -1,5 +1,7 @@ exports_files( [ "test_ssh.py", + "test_scrample.py", + # "test_persistency.py", ], ) \ No newline at end of file diff --git a/feature_integration_tests/itf/test_scrample.py b/feature_integration_tests/itf/test_scrample.py index e9533f6645..5acf1d9ef0 100644 --- a/feature_integration_tests/itf/test_scrample.py +++ b/feature_integration_tests/itf/test_scrample.py @@ -10,30 +10,31 @@ # # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -from itf.plugins.com.ping import ping -from itf.plugins.com.ssh import execute_command_output import logging +from itf.plugins.com.ssh import execute_command_output + logger = logging.getLogger(__name__) def test_scrample_app_is_deployed(target_fixture): with target_fixture.sut.ssh() as ssh: - exit_code, stdout, stderr = execute_command_output( - ssh, "test -f scrample" - ) + exit_code, stdout, stderr = execute_command_output(ssh, "test -f scrample") assert exit_code == 0, "SSH command failed" def test_scrample_app_is_running(target_fixture): with target_fixture.sut.ssh() as ssh: exit_code, stdout, stderr = execute_command_output( - ssh, "./scrample -n 10 -t 100 -m send & ./scrample -n 5 -t 100 -m recv", - timeout = 30, max_exec_time = 180, - logger_in = logger, verbose = True, + ssh, + "./scrample -n 10 -t 100 -m send & ./scrample -n 5 -t 100 -m recv", + timeout=30, + max_exec_time=180, + logger_in=logger, + verbose=True, ) - logger.info (stdout) - logger.info (stderr) + logger.info(stdout) + logger.info(stderr) assert exit_code == 0, "SSH command failed" diff --git a/images/qnx_x86_64/BUILD b/images/qnx_x86_64/BUILD index bb96cfc985..3535962d00 100644 --- a/images/qnx_x86_64/BUILD +++ b/images/qnx_x86_64/BUILD @@ -40,24 +40,24 @@ py_itf_test( ], ) -# py_itf_test( -# name = "test_scrample", -# srcs = [ -# "feature_integration_tests/itf/test_scrample.py", -# ], -# args = [ -# "--target_config=$(location feature_integration_tests/configs/qemu_target_config.json)", -# "--ecu=s_core_ecu_qemu", -# "--qemu_image=$(location :image)", -# ], -# plugins = [ -# "itf.plugins.base.base_plugin", -# ], -# data = [ -# ":image", -# "target_config.json", -# ], -# ) +py_itf_test( + name = "test_scrample", + srcs = [ + "//feature_integration_tests/itf:test_scrample.py", + ], + args = [ + "--target_config=$(location //feature_integration_tests/configs:qemu_target_config.json)", + "--ecu=s_core_ecu_qemu", + "--qemu_image=$(location :image)", + ], + plugins = [ + "itf.plugins.base.base_plugin", + ], + data = [ + ":image", + "//feature_integration_tests/configs:qemu_target_config.json", + ], +) # py_itf_test( # name = "test_persistency", diff --git a/images/qnx_x86_64/MODULE.bazel b/images/qnx_x86_64/MODULE.bazel index 37e07431f2..0e4b12b5ce 100644 --- a/images/qnx_x86_64/MODULE.bazel +++ b/images/qnx_x86_64/MODULE.bazel @@ -48,9 +48,10 @@ git_override( remote = "https://github.com/bmw-software-engineering/trlc.git", ) -local_path_override( +git_override( module_name = "score_toolchains_qnx", - path = "../../../toolchains_qnx", + commit = "aa94b4fb566b989d1a00395c810df2cf254a0cec", + remote = "https://github.com/qorix-group/toolchains_qnx.git", ) # Workaround until new toolchains can be used diff --git a/images/qnx_x86_64/build/BUILD b/images/qnx_x86_64/build/BUILD index 2310aaed25..4afd5dac8c 100644 --- a/images/qnx_x86_64/build/BUILD +++ b/images/qnx_x86_64/build/BUILD @@ -51,11 +51,12 @@ qnx_ifs( ":scripts", ":configs", "//showcases/standalone", - # "//scrample_integration:etc_configs", + "@score_scrample//src:scrample", + "//feature_integration_tests/configs:etc_configs", # "@score_persistency//tests/cpp_test_scenarios:cpp_test_scenarios", ], ext_repo_maping = { - # "SCRAMPLE_PATH": "$(location @score_scrample//src:scrample)", + "SCRAMPLE_PATH": "$(location @score_scrample//src:scrample)", # "CPP_TEST_SCENARIOS_PATH": "$(location @score_persistency//tests/cpp_test_scenarios:cpp_test_scenarios)", "BUNDLE_PATH": "$(location //showcases/standalone)" }, diff --git a/images/qnx_x86_64/build/system.build b/images/qnx_x86_64/build/system.build index 355f07f9ad..da3dedf8d2 100644 --- a/images/qnx_x86_64/build/system.build +++ b/images/qnx_x86_64/build/system.build @@ -276,10 +276,10 @@ pci/pci_debug2.so # Enhanced PCI debugging support # DHCP client configuration [perms=644] /etc/dhcpcd.conf = ${MAIN_BUILD_FILE_DIR}/../configs/dhcpcd.conf # DHCP client configuration file -# [perms=777] /etc/logging.json = ${MAIN_BUILD_FILE_DIR}/../scrample_integration/etc/logging.json # DHCP client configuration file -# [perms=777] /etc/mw_com_config.json = ${MAIN_BUILD_FILE_DIR}/../scrample_integration/etc/mw_com_config.json # DHCP client configuration file +[perms=777] /etc/logging.json = ${MAIN_BUILD_FILE_DIR}/../feature_integration_tests/configs/etc/logging.json # DHCP client configuration file +[perms=777] /etc/mw_com_config.json = ${MAIN_BUILD_FILE_DIR}/../feature_integration_tests/configs/etc/mw_com_config.json # DHCP client configuration file -# [perms=777] /scrample = ${SCRAMPLE_PATH} +[perms=777] /scrample = ${SCRAMPLE_PATH} # [perms=777] /cpp_tests_persistency = ${CPP_TEST_SCENARIOS_PATH} From 20ac39f9738a05992a3a5a8e60317f1f5d0a25c1 Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Fri, 6 Feb 2026 08:38:22 +0100 Subject: [PATCH 05/22] move ebclfsa into images --- bazel_common/score_modules.MODULE.bazel | 2 +- images/ebclfsa_aarch64/.bazelrc | 14 + images/ebclfsa_aarch64/.bazelversion | 1 + images/ebclfsa_aarch64/BUILD | 13 + images/ebclfsa_aarch64/MODULE.bazel | 70 +++ images/ebclfsa_aarch64/README.md | 398 ++++++++++++++++++ images/ebclfsa_aarch64/bazel_common | 1 + .../docs/system_setup.drawio.png | Bin 0 -> 38057 bytes images/ebclfsa_aarch64/patches/BUILD | 0 .../patches/fix_hard_coded_amd64.patch | 32 ++ .../persistency_integration/BUILD | 76 ++++ .../persistency_integration/run_qemu.sh | 33 ++ .../scripts/cpp_tests_persistency.sh | 4 + .../scrample_integration/BUILD | 118 ++++++ .../scrample_integration/etc/logging.json | 8 + .../etc/mw_com_config.json | 63 +++ .../scrample_integration/run_qemu.sh | 33 ++ .../scrample_integration/src/main.cc | 38 ++ images/ebclfsa_aarch64/showcases | 1 + 19 files changed, 904 insertions(+), 1 deletion(-) create mode 100644 images/ebclfsa_aarch64/.bazelrc create mode 100644 images/ebclfsa_aarch64/.bazelversion create mode 100644 images/ebclfsa_aarch64/BUILD create mode 100644 images/ebclfsa_aarch64/MODULE.bazel create mode 100644 images/ebclfsa_aarch64/README.md create mode 120000 images/ebclfsa_aarch64/bazel_common create mode 100644 images/ebclfsa_aarch64/docs/system_setup.drawio.png create mode 100644 images/ebclfsa_aarch64/patches/BUILD create mode 100644 images/ebclfsa_aarch64/patches/fix_hard_coded_amd64.patch create mode 100644 images/ebclfsa_aarch64/persistency_integration/BUILD create mode 100755 images/ebclfsa_aarch64/persistency_integration/run_qemu.sh create mode 100755 images/ebclfsa_aarch64/persistency_integration/scripts/cpp_tests_persistency.sh create mode 100644 images/ebclfsa_aarch64/scrample_integration/BUILD create mode 100644 images/ebclfsa_aarch64/scrample_integration/etc/logging.json create mode 100644 images/ebclfsa_aarch64/scrample_integration/etc/mw_com_config.json create mode 100755 images/ebclfsa_aarch64/scrample_integration/run_qemu.sh create mode 100644 images/ebclfsa_aarch64/scrample_integration/src/main.cc create mode 120000 images/ebclfsa_aarch64/showcases diff --git a/bazel_common/score_modules.MODULE.bazel b/bazel_common/score_modules.MODULE.bazel index 4a3995ceb6..4373450d63 100644 --- a/bazel_common/score_modules.MODULE.bazel +++ b/bazel_common/score_modules.MODULE.bazel @@ -1,5 +1,5 @@ bazel_dep(name = "score_baselibs", version = "0.1.3") -bazel_dep(name = "score_communication", version = "0.1.1") +bazel_dep(name = "score_communication", version = "0.1.2") bazel_dep(name = "score_persistency", version = "0.2.1") bazel_dep(name = "score_scrample", version = "0.1.0") bazel_dep(name = "score_orchestrator") diff --git a/images/ebclfsa_aarch64/.bazelrc b/images/ebclfsa_aarch64/.bazelrc new file mode 100644 index 0000000000..a7842dc4e1 --- /dev/null +++ b/images/ebclfsa_aarch64/.bazelrc @@ -0,0 +1,14 @@ +common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ +common --registry=https://bcr.bazel.build + +build:_common --@score_baselibs//score/mw/log/detail/flags:KUse_Stub_Implementation_Only=False +build:_common --@score_baselibs//score/mw/log/flags:KRemote_Logging=False +build:_common --@score_baselibs//score/json:base_library=nlohmann +build:_common --@score_baselibs//score/memory/shared/flags:use_typedshmd=False +build:_common --@score_communication//score/mw/com/flags:tracing_library=stub +build:_common --cxxopt=-Wno-error=mismatched-new-delete + +build --config=_common +build --extra_toolchains=@gcc_toolchain//:aarch64_gcc_13 +build --platforms=@score_toolchains_gcc//platforms:aarch64-linux +build --spawn_strategy=local diff --git a/images/ebclfsa_aarch64/.bazelversion b/images/ebclfsa_aarch64/.bazelversion new file mode 100644 index 0000000000..6da4de57dc --- /dev/null +++ b/images/ebclfsa_aarch64/.bazelversion @@ -0,0 +1 @@ +8.4.1 diff --git a/images/ebclfsa_aarch64/BUILD b/images/ebclfsa_aarch64/BUILD new file mode 100644 index 0000000000..df35a19965 --- /dev/null +++ b/images/ebclfsa_aarch64/BUILD @@ -0,0 +1,13 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 + +# ******************************************************************************* diff --git a/images/ebclfsa_aarch64/MODULE.bazel b/images/ebclfsa_aarch64/MODULE.bazel new file mode 100644 index 0000000000..fff1f0da95 --- /dev/null +++ b/images/ebclfsa_aarch64/MODULE.bazel @@ -0,0 +1,70 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +"EB corbos Linux for Safety Applications - S-CORE Reference Integration" + +module( + name = "score_ref_int_ebclfsa", + version = "0.1.0", + compatibility_level = 0, +) + +# Include common modules +include("//bazel_common:score_basic_tools.MODULE.bazel") + +# GCC toolchains +include ("//bazel_common:score_rust_toolchains.MODULE.bazel") + +# Python support +include("//bazel_common:score_python.MODULE.bazel") + +# Score modules +include("//bazel_common:score_modules.MODULE.bazel") + +bazel_dep(name = "score_toolchains_gcc", dev_dependency=True) +git_override( # Elektrobit corbos Linux for Safety Applications needs a specific toolchain + module_name = "score_toolchains_gcc", + remote = "https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc.git", + tag = "0.5.0-beta" # corresponds to git sha 158921ffd9aabef41a2a03bca5baeaa9f4aa9d33 +) +gcc = use_extension("@score_toolchains_gcc//extensions:gcc.bzl", "gcc", dev_dependency=True) +gcc.toolchain( + url = "https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc/releases/download/0.5.0-beta/fastdev-sdk-ubuntu-ebclfsa-ebcl-qemuarm64.tar.gz", + sha256 = "05b57bbc8d99d46df6b57f774c39a5a2664964ea7eb94147cbece08508c1f121", + strip_prefix = "fastdev-sdk-ubuntu-ebclfsa-ebcl-qemuarm64", +) +use_repo(gcc, "gcc_toolchain", "gcc_toolchain_gcc") + + +single_version_override( + module_name = "score_baselibs", + version = "0.2.2", # part of 0.5.0-beta release + patch_strip = 1, + patches = [ + "//patches:fix_hard_coded_amd64.patch", + ], +) + +# git_override is not forwarded by bazel_dep, so we need to redefine it here +git_override( + module_name = "trlc", + remote = "https://github.com/bmw-software-engineering/trlc.git", + commit = "650b51a47264a4f232b3341f473527710fc32669", # trlc-2.0.2 release +) + +# archive_override is not forwarded by bazel_dep, so we need to redefine it here +archive_override( + module_name = "rules_boost", + urls = ["https://github.com/nelhage/rules_boost/archive/refs/heads/master.tar.gz"], + strip_prefix = "rules_boost-master", +) diff --git a/images/ebclfsa_aarch64/README.md b/images/ebclfsa_aarch64/README.md new file mode 100644 index 0000000000..992639072e --- /dev/null +++ b/images/ebclfsa_aarch64/README.md @@ -0,0 +1,398 @@ +# Eclipse S-CORE on Elektrobit corbos Linux for Safety Applications + +This directory shows the integration of Eclipse S-CORE on Elektrobit corbos Linux for Safety Applications. +It builds an [example based on the Eclipse S-CORE communication framework](https://github.com/eclipse-score/scrample) as demo/test application. +This application is then [integrated](scrample_integration/) into the so-called "fast-dev" variant of EB corbos Linux for Safety Applications (EBcLfSA). +This is an `aarch64`-based, pre-built image, capable of demonstraing the execution of high integrity applications in regular Linux user-space. +The example can be executed using QEMU. +In the [related CI workflow](../.github/workflows/build_and_test_ebclfsa.yml), all these steps are performed, and the resulting log files are stored and made available for download. + +> [!TIP] +> **Quick Start** +> +> The steps performed in continuous integration can be also run interactively. +> The fastest way to achieve this is to use [GitHub Codespaces](https://github.com/features/codespaces), a cloud based development environment. +> You need a GitHub.com account for this to work. +There is a free tier of this commercial service, which is sufficient. +However, please understand that we cannot advise you about possible costs in your specific case. +> - Click on the following badge: [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/eclipse-score/reference_integration) +> - In the following dialog, make sure to select "Machine type" as "4-core". +> Click "Create codespace." +> It will take some time (2-3 minutes) for the machine to start. +> There will be a log message "Finished configuring codespace." +> - Hit "Ctrl-Shift-C" to open a new terminal. +> - Copy and paste the following command into the terminal and hit "Enter": +> +> ```bash +> cd ./ebclfsa && bazel build --config=aarch64-ebclfsa //scrample_integration:run +> ``` +> +> This will build and run the example. +> There may be a warning about "High codespace CPU (100%) utilization detected.", which you can ignore. +> The complete process will take around 6 minutes to complete on the 4-core machine. +> +> The expected output looks like this: +> +> ```console +> [...] +> Target //scrample_integration:run up-to-date: +> bazel-bin/scrample_integration/qemu_run.log +> bazel-bin/scrample_integration/ssh_scrample_run.log +>INFO: Elapsed time: 361.273s, Critical Path: 91.92s +>INFO: 836 processes: 10 internal, 826 local. +>INFO: Build completed successfully, 836 total actions +> ``` +> +> The two log files mentioned in this output are the main results of the test execution. +> You can open them by Ctrl-clicking on the output entry. +> +> The remainder of this document describes in detail what you have just accomplished. +> +> In order to close the Codespace again, first take note of the name of the Codespace. +> It is a random combination of and adjective and a noun, mentioned in the bottom left of the browser window. +> Go to your [GitHub Codespaces Dashboard](https://github.com/codespaces), find the Codespace in your list, click on the "..." in that row and select "Delete". +> +> Note that the demo can, of course, als run locally on your computer. +> Clone the repository, open it in Visual Studio Code, start the supplied Development Container, and run the demo as described above. +> This requires a setup that can run [Development Containers](https://containers.dev/) using [Visual Studio Code](https://code.visualstudio.com/). +> The [Visual Studio Code documentation](https://code.visualstudio.com/docs/devcontainers/containers) can be a good starting point; however, an in-depth explanation of this is beyond the goals of this Quick Start. + +## Prebuilt Binary Assets + +The whole setup is open source. +To simplify the deployment and focus on the integration itself, this demo uses pre-built binary assets. +These consist of a pre-built image and a cross-compilation toolchain. +Both assets are referenced in the corresponding Bazel targets and are automatically downloaded on demand. + +The pre-built image provides a so called "fast-dev" integration for EBcLfSA, +which makes development and debugging of high integrity applications easy. +The fast-dev image itself is based on a single aarch64 Linux VM with a specially patched Linux kernel and user-space. +It checks at runtime, whether high integrity applications adhere to certain assumptions of use (AoU) of EBcLfSA. + +Note that this image represents a development image but not a production image of Linux for Safety Application. +It is aimed at demonstrating development with focus on key features and AoUs. + +## Main constraints for high-integrity applications + +For non-safety ("low integrity") applications, Linux for Safety Applications _is_ a standard Linux system. +For applications with safety requirements, also referred to as _high integrity (HI) applications_, +Linux for Safety Applications expects few constraints, especially: + +1. An HI application must be flagged with an additional checksum in its ELF-header to be detected as an high integrity application. +2. An HI application must check its registration status with the supervisor. +3. At least one HI application (e.g. a health manager) must cyclically trigger + the watchdog of Linux for Safety Applications. +4. Few kernel system calls are not allowed to be invoked by an HI application. + - The patches of the "fast-dev" kernel will create a log which helps you to identify them. + - Recommendation: + Build your HI applications and associated libraries on top of the C standard's library definition. + Elektrobit will provide an appropriately qualified version for production projects. +5. Ask for advice when you want to modify/extend kernel functionality or invoke device-specific I/O operations. + +The example application disregards the items 2-5. +They are mandatory for production systems but can be violated during development in the fast-dev environment. +For example, the items 3 and 4 only make sense in a complete system. + +Current restrictions: + +- HI applications must be statically linked. +- PID1 needs to be an HI process. +- HI processes can only be started by another HI process. + +## Application- and Integration-Specific Violation of System Call Restrictions + +The current integration setup is based on a non-safety-certified set of a toolchain and standard libraries. +As a result, an application compiled and linked with the provided example toolchain will generate system call violations. +For the used communication example app this happens during application startup/teardown and is indicated by the occurrence of `ioctl`,`clone3` and `madvice` system calls. + +The full product version intended for production implements process and memory management for high integrity applications according to the C Standard Library. +When using other standard library implementations, `clone3` and `madvice` might be called. +This is ok during development and will not affect you when switching to the safety compliant C Standard Library. +Avoid calling such system calls directly from HI applications, though. +The following table gives an overview why the occurred system calls are not supported and what would be the proposed alternative solution. +Keep in mind, this is only relevant if the system calls are explicitly called by the application code, or libraries other than the provided standard libraries. + +| System Call | Reason | Suggested Alternative or Workaround | +|---------|--------|-------------------------------------| +| `ioctl` | Very flexible function signature, which is hard to "make safe" in a generic way. | Try to avoid direct `ioctl` calls. If direct driver interaction is needed, use alternative kernel standard interfaces like `netlink` or device file IO. A customer specific implementation of a certain function signature might be possible. | +| `clone3` | No part of C standard library. Not needed to create HI processes. | Use C standard library functions to create processes and threads (or system call `clone`). The full product version intended for production will implement them in a way that ensures safe execution. | +| `madvise` | No part of C standard library. All memory of HI Apps is pre-faulted and fully committed at allocation time, hence most kernel optimizations/hints have limited effect. | Use C standard library functions for memory management. The full product version intended for production will implement them in a way that ensures safe execution. | + +## User-Space + +The user-space of the pre-built image consists of three main components: + +- The _trampoline application_, a simplified HI init process +- EBcLfSA example HI and LI applications +- Low integrity system init and user-space + +system_setup drawio + +The system itself is able to run without any Eclipse S-CORE demo applications. +Nevertheless, the trampoline application already provides an entry point for a subsequently deployed application binary. +This entry point is used by the [Eclipse S-CORE Example](#eclipse-s-core-example) application. + +### Trampoline App (cflinit) + +The trampoline application `cflinit` acts as a simplified HI init process which starts the applications as listed above. +This includes the HI application of the EBcLfSA example, as well as a wrapper for the Eclipse S-CORE application binary. +Besides the HI applications, it starts [crinit](https://gitext.elektrobitautomotive.com/EB-Linux/crinit) as a secondary low integrity init daemon, +which brings up the regular (low integrity) Linux user-land. +Once all apps are started, it sleeps forever. + +Below you can see the output generated by `cflinit`. + +```console +cflinit: INFO: Hello from EBcLfSA HI init application +cflinit: INFO: Mounted tmpfs to /dev/shm +cflinit: INFO: Starting application crinit +cflinit: INFO: Starting application HI App +cflinit: ERROR: Could not read /usr/bin/hi_app (2) +cflinit: INFO: Starting application EBcLfSA HI demo +cflinit: INFO: Starting application EBcLfSA HI upper +cflinit: INFO: Finished starting child applications; going to sleep +``` + +As long as the Eclipse S-CORE example is not yet deployed (detected by a missing `/usr/bin/hi_app` binary) the above `ERROR` occurs and `cflinit` skips starting it. + +### EBcLfSA HI Demo + +For technical reasons, the image contains also a secondary demo, with the executables `ebclfsa-hi-demo`, `ebclfsa-hi-upper`, and `ebclfsa-li-demo`. +They demonstrate message passing via a shared memory interface, which does not use Eclipse S-CORE. +Hence, they are not relevant for the demonstration and should be ignored. + +### Low Integrity System Init and User-Space + +As mentioned above, `crinit` is used to set up a low integrity user-land beside the high integrity applications. +This is used primarily for development and user experience by providing components like an SSH server, a login daemon, or `gdbserver`. + +## Eclipse S-CORE Example + +> [!IMPORTANT] +> This guide assumes that you use the SDK's [dev-container](https://github.com/eclipse-score/devcontainer). +> If you are using the Codespace as described in the Quick Start, this is the case. +> The dev-container contains all required dependencies, like `qemu-system-aarch64` and `sshpass`. + +This section shows how you can use the above described SDK with the example application. +You will see how you can create a low integrity and a high integrity application, build them with the S-CORE toolchain and run them finally on Linux for Safety Applications. + +The first three subsections explain the build and runtime setup. +They help you to understand the integration. +You can apply the approach on other S-CORE apps, too. + +- Application Setup: + The two application setup of the example and how to make one of them an HI application. +- S-CORE Toolchain in Linux for Safety Applications: + The general integration of the required tools into S-CORE's Bazel toolchain. + This should work for other applications, too. +- Bazel Rules for the Example Applications: The specific Bazel ruleset for the example + +The next three sections guide you through the concrete steps of applying these rules +to build and deploy the example. + +- Full Run of the Example Application +- Building the application +- Using the fast-dev image + +And please also look at the shortcuts we implemented in the Visual Studio Code workspace to speed up the usage of the application example. +You find them at the end of this section. + +### Application Setup + +The application setup is constructed of two instances of the `scrample` application, a high integrity (HI) instance acting as receiver and a low integrity (LI) instance acting as sender. +The HI instance is started automatically by `cflinit` and listens in background. +You start the LI instance manually in a terminal to run the demo. +Even though both instances rely on the same source code, they do not use the same application binary. +The HI application instance uses a binary located at `/usr/bin/scrample_sil` with a marked ELF-header, while the unmodified binary for the LI application is located at `/usr/bin/scrample`. + +The application instances are called with the following arguments: + +| HI | LI | +| -------- | ------- | +| `-n 10 -m recv -t 200 -s /etc/mw_com_config.json` | `-n 10 -m send -t 200 -s /etc/mw_com_config.json` | + +Feel free to adjust them as needed. + +In order to have those arguments changeable, the HI arguments are not hardcoded into `cflinit`. +Instead, `cflinit` calls a small wrapper binary `/usr/bin/hi_app` which is based on the implementation in `scrample_integration/src/main.cc`. +When `hi_app` is executed by `cflinit`, it simply calls `execve` on `/usr/bin/scrample_sil` with the correct set of arguments. +This way `cflinit` keeps its static entrypoint for the Eclipse S-CORE example app, while the user is still able to specify the used arguments for the HI `scrample` instance. + +### S-CORE Toolchain in Linux for Safety Applications + +The demo SDK integrates the [S-CORE toolchain with two extensions](https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc/releases/tag/0.5.0-alpha): + +- Additional tooling for AArch64 cross-building. +- Additional tool `lisa-elf-enabler`: It marks an ELF header of an application in a way that Linux for Safety Applications detects it as an HI application. + The tool is available to Bazel via `@gcc_toolchain_gcc//:elf-enabler`. + +### Bazel Rules for the Example Applications + +The example extends the [`scrample` example](https://github.com/eclipse-score/scrample) of S-CORE with the application setup and the toolchain extensions described above. +With those changes, the toolchain can be used via `bazel build --config=aarch64-ebclfsa //scrample_integration:`. + +> [!IMPORTANT] +> Building inside a sandbox is currently not possible. + +For building and running the example setup, the following Bazel rules have been created in `scrample_integration/BUILD`: + +| Target | Dependencies | Description | +| ------ | ------------ | ----------- | +| `scrample_sil` | `@score_scrample//src:scrample` | Create copy of `scrample` at `scrample_sil` and add CRC checksum to ELF-header | +| `scrample_sil_wrapper` | | Build intermediate `scrample_sil_wrapper` | +| `hi_app` | `:scrample_sil_wrapper` `:scrample_sil` | Create copy of `scrample_sil_wrapper` at `hi_app` and add CRC checksum to ELF-header. | +| `fetch-fastdev-archive` | | Download fast-dev image archive | +| `fastdev-image` | `:fetch-fastdev-archive` | Extract fast-dev image archive | +| `upload` | `:hi_app` `:fastdev-image` | Upload application binaries to fast-dev image | +| `run` | `:upload`| Run Eclipse S-CORE example application | + +The following sections introduce some of the rules mentioned above. + +### Full Run of the Example Application + +The `run` target provides an easy entry point, to build, post-process, deploy, run and stop the example: + +```bash +bazel build --config=aarch64-ebclfsa //scrample_integration:run +``` + +This command will take a while to finish, since it performs some downloads and starts the fast-dev image. +After successful execution LI application instance can be seen in the `ssh_run.log`: + +```console +Starting to send data +Sending sample: 0 +Sending sample: 1 +Sending sample: 2 +Sending sample: 3 +Sending sample: 4 +Sending sample: 5 +Sending sample: 6 +Sending sample: 7 +Sending sample: 8 +Sending sample: 9 +Stop offering service...and terminating, bye bye +``` + +`qemu_run.log` provides the serial console output of the started fast-dev image, including the following noteworthy parts: + +1. `cflinit` starting `hi_app` as HI application: + +```console +cflinit: INFO: Starting application HI App +``` + +2. `hi_app` starting `scrample_sil` as HI application: + +```console +HI_App: Starting scrample_sil +``` + +3. The logs from `scrample_sil` as receiver itself + +```console +1970/01/01 00:00:01.1905 19125 000 ECU1 IPBR lola log info verbose 2 No explicit applicationID configured. Falling back to using process UID. Ensure unique UIDs for applications using mw::com. +... +1970/01/01 00:00:10.10215 102158 000 ECU1 IPBR lola log info verbose 2 Successfully created offer path /tmp/mw_com_lola/service_discovery/6432/1 +score/MapApiLanesStamped: Subscribing to service +score/MapApiLanesStamped: Received sample: 0 +score/MapApiLanesStamped: Received sample: 1 +score/MapApiLanesStamped: Proxy received valid data +score/MapApiLanesStamped: Cycle duration 225ms +score/MapApiLanesStamped: Received sample: 2 +score/MapApiLanesStamped: Proxy received valid data +score/MapApiLanesStamped: Cycle duration 206ms +... +score/MapApiLanesStamped: Received sample: 9 +score/MapApiLanesStamped: Proxy received valid data +score/MapApiLanesStamped: Cycle duration 202ms +score/MapApiLanesStamped: Unsubscribing... +score/MapApiLanesStamped: and terminating, bye bye +``` + +4. Kernel logs indicating that some performed system calls would not be allowed on a production system. +For more information on this, check the [previous section](#application--and-integration-specific-violation-of-system-call-restrictions) on application- and integration-specific syscall violations. + +```console +SDK:handler_do_el0_svc_pre: syscall __NR_clone3 (435) is not allowed +``` + +### Building the Application + +Building all components of the example application can be performed with the `hi_app` rule. + +```bash +bazel build --config=aarch64-ebclfsa //scrample_integration:hi_app +``` + +Due the dependencies towards `:scrample_sil` and `:scrample_sil_wrapper` this will build all required binaries. +Including the LI `scrample` binary, a temporary `scrample_sil_wrapper` binary as well as the post-processed `scrample_sil` and `hi_app` binaries. + +### Using the fast-dev Image + +The easiest way to setup the fast-dev image, is to use the `fastdev-image` rule. + +```bash +bazel build --config=aarch64-ebclfsa //scrample_integration:fastdev-image +``` + +This will first download the image via the `fetch-fastdev-archive` rule and cache the archive. +Afterwards, the `fastdev-image` rule extracts the archive (containing a disk image and a kernel) to `bazel-bin/scrample_integration/deb-qemuarm64/`. + +To start the unmodified base image (without the Eclipse S-CORE example application) manually, the included `run_qemu.sh` script can be used. + +```bash +./scrample_integration/run_qemu.sh bazel-bin/scrample_integration/deb-qemuarm64/ +``` + +This is of course optional, and only needed if a deeper manual look into the image is wished. +After the image has started up, the password `linux` can be used for the `root` user for login. +The ssh port of the qemu instance is forwarded to `localhost:2222`. +Therefore `ssh` and `scp` can be used with the same credentials from inside the development container. + +```bash +ssh -p 2222 root@localhost +``` + +> [!NOTE] +> Be aware, that running the image via qemu, will change the stored disk image. +> Bazel will detect this change and overwrite the disk image with the original one from the downloaded archive. +> If it is planned to have persistent changes on the image, copy the content of `bazel-bin/scrample_integration/deb-qemuarm64/` to a location outside of `bazel-bin` and adapt the command line argument in the above `run_qemu.sh` call accordingly. + +For deploying the example application to the image, the `upload` rule is available, which will start the image based on the content of `bazel-bin/scrample_integration/deb-qemuarm64/` and deploy all needed files via `scp`. + +```bash +bazel build --config=aarch64-ebclfsa //scrample_integration:upload +``` + +Since the deployment step will change the stored disk image, the `upload` rule stores its output in `bazel-bin/scrample_integration/deb-qemuarm64-modified/`. +Running the image with the deployed example applications works the same way as before, just with a different folder for the used image and kernel: + +```bash +./scrample_integration/run_qemu.sh bazel-bin/scrample_integration/deb-qemuarm64-modified/ +``` + +Like before you can interact with the image via the serial console or ssh. +To trigger the LI Eclipse S-CORE example app, simply call: + +```bash +scrample -n 10 -m send -t 200 -s /etc/mw_com_config.json +``` + +Note that due to the nature of the `scrample_sil` application, which shuts down after having received the defined amount of samples, this command works only once per boot-cycle. + +To reboot or power-off the running image, `crinit-ctl` with the command line argument `reboot` or `poweroff` can be used. + +```bash +# Reboot +crinit-ctl reboot +# Poweroff +crinit-ctl poweroff +``` + +## Further notes + +* The toolchain and librares are provided for demonstration and prototyping purposes without further qualification. +* A second test case for S-CORE persistency is also integrated. You can run it via + `bazel build --config=aarch64-ebclfsa //persistency_integration:run` + However, this is not integrated as HI application to avoid the additional complexity of the required wrapper. diff --git a/images/ebclfsa_aarch64/bazel_common b/images/ebclfsa_aarch64/bazel_common new file mode 120000 index 0000000000..8192e6e84f --- /dev/null +++ b/images/ebclfsa_aarch64/bazel_common @@ -0,0 +1 @@ +../../bazel_common/ \ No newline at end of file diff --git a/images/ebclfsa_aarch64/docs/system_setup.drawio.png b/images/ebclfsa_aarch64/docs/system_setup.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..f6f4fea62d2ce09c5f35c276935ef1ae06e49a68 GIT binary patch literal 38057 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 PfFEgb`Pb#5hW`HxJsk%9 literal 0 HcmV?d00001 diff --git a/images/ebclfsa_aarch64/patches/BUILD b/images/ebclfsa_aarch64/patches/BUILD new file mode 100644 index 0000000000..e69de29bb2 diff --git a/images/ebclfsa_aarch64/patches/fix_hard_coded_amd64.patch b/images/ebclfsa_aarch64/patches/fix_hard_coded_amd64.patch new file mode 100644 index 0000000000..91892e1b20 --- /dev/null +++ b/images/ebclfsa_aarch64/patches/fix_hard_coded_amd64.patch @@ -0,0 +1,32 @@ +diff --git a/MODULE.bazel b/MODULE.bazel +index 16776ba..683c131 100644 +--- a/MODULE.bazel ++++ b/MODULE.bazel +@@ -70,7 +70,7 @@ deb = use_repo_rule("@download_utils//download/deb:defs.bzl", "download_deb") + deb( + name = "acl-deb", + build = "//third_party/acl:acl.BUILD", +- urls = ["https://archive.ubuntu.com/ubuntu/pool/main/a/acl/libacl1-dev_2.2.52-3build1_amd64.deb"], ++ urls = ["https://launchpadlibrarian.net/581258948/libacl1-dev_2.3.1-1_arm64.deb"], + visibility = ["//visibility:public"], + ) + +diff --git a/third_party/acl/acl.BUILD b/third_party/acl/acl.BUILD +index 718726c..710befd 100644 +--- a/third_party/acl/acl.BUILD ++++ b/third_party/acl/acl.BUILD +@@ -1,7 +1,7 @@ + cc_library( + name = "acl", + srcs = [ +- "usr/lib/libacl.a", ++ "usr/lib/aarch64-linux-gnu/libacl.a", + ], + hdrs = [ + "usr/include/acl/libacl.h", +@@ -9,4 +9,4 @@ cc_library( + ], + includes = ["usr/include/"], + visibility = ["//visibility:public"], +-) ++) diff --git a/images/ebclfsa_aarch64/persistency_integration/BUILD b/images/ebclfsa_aarch64/persistency_integration/BUILD new file mode 100644 index 0000000000..ce66c5b263 --- /dev/null +++ b/images/ebclfsa_aarch64/persistency_integration/BUILD @@ -0,0 +1,76 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +load("@score_baselibs//score/language/safecpp:toolchain_features.bzl", "COMPILER_WARNING_FEATURES") + +genrule( + name = "fetch-fastdev-archive", + srcs = [], + outs = ["fastdev-archive.tgz"], + cmd = "wget -O $@ https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc/releases/download/0.5.0-beta/fastdev-ubuntu-ebcl-deb-qemu-arm64.tgz" +) + +genrule( + name = "fastdev-image", + srcs = [":fetch-fastdev-archive"], + outs = [ + "ebcl-qemuarm64/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic", + "ebcl-qemuarm64/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux" + ], + cmd = "tar xzf $(location :fetch-fastdev-archive) -C $(RULEDIR)", +) + +genrule( + name = "upload", + srcs = [ + "@score_persistency//tests/cpp_test_scenarios:cpp_test_scenarios", + ":fastdev-image", + "scripts/cpp_tests_persistency.sh", + "run_qemu.sh", + ], + cmd = " \ + mkdir -p $(RULEDIR)/ebcl-qemuarm64-modified &&\ + cp $(RULEDIR)/ebcl-qemuarm64/* $(RULEDIR)/ebcl-qemuarm64-modified/ &&\ + $(location run_qemu.sh) $(RULEDIR)/ebcl-qemuarm64-modified -pidfile $(RULEDIR)/qemu.pid > $(RULEDIR)/qemu_upload.log &\ + sleep 30 ; \ + sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location @score_persistency//tests/cpp_test_scenarios:cpp_test_scenarios) root@localhost:/usr/bin/cpp_tests_persistency &&\ + sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location scripts/cpp_tests_persistency.sh) root@localhost:/usr/bin/cpp_tests_persistency.sh &&\ + sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost sync &&\ + sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost crinit-ctl poweroff || true \ + sleep 5 \ + ", + outs = [ + "qemu_upload.log", + "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic", + "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux" + ], +) + +genrule( + name = "run", + srcs = [ + "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic", + "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux", + "run_qemu.sh" + ], + cmd = " \ + $(location run_qemu.sh) $(RULEDIR)/ebcl-qemuarm64-modified -pidfile $(RULEDIR)/qemu.pid > $(RULEDIR)/qemu_run.log &\ + sleep 10 ; \ + sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost cpp_tests_persistency.sh > $(RULEDIR)/ssh_persistency_test_scenarios_run.log && \ + sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost crinit-ctl poweroff || true \ + sleep 5 \ + ", + outs = [ + "qemu_run.log", + "ssh_persistency_test_scenarios_run.log", + ], +) diff --git a/images/ebclfsa_aarch64/persistency_integration/run_qemu.sh b/images/ebclfsa_aarch64/persistency_integration/run_qemu.sh new file mode 100755 index 0000000000..2b2e30349b --- /dev/null +++ b/images/ebclfsa_aarch64/persistency_integration/run_qemu.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +set -xu + +if [ -z "$1" ]; then + echo "Usage: $0 " + exit 1 +fi +BASEFOLDER=$1 +IMAGE="${BASEFOLDER}/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic" +KERNEL="${BASEFOLDER}/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux" +if [ ! -d "${BASEFOLDER}" ] || [ ! -f "${IMAGE}" ] || [ ! -f "${KERNEL}" ] ; then + echo "Run \"bazel build --config=aarch64-ebclfsa //persistency_integration:fastdev-image\" first to fetch the image" +fi + +MACHINE="virt,virtualization=true,gic-version=3" +CPU="cortex-a53" +SMP="8" +MEM="4G" +KERNEL_ARGS=("-append" "root=/dev/vda1 sdk_enable lisa_syscall_whitelist=2026 rw sharedmem.enable_sharedmem=0 init=/usr/bin/ebclfsa-cflinit") +DISK_ARGS="-device virtio-blk-device,drive=vd0 -drive if=none,format=raw,file=${IMAGE},id=vd0" +NETWORK_ARGS="-netdev user,id=net0,net=192.168.7.0/24,dhcpstart=192.168.7.2,dns=192.168.7.3,host=192.168.7.5,hostfwd=tcp::2222-:22,hostfwd=tcp::3333-:3333 -device virtio-net-device,netdev=net0 " + +if ! command -v qemu-system-aarch64 > /dev/null; then + echo "Please install qemu-system-aarch64" + exit 1 +fi + +chmod +w ${IMAGE} + +exec qemu-system-aarch64 -m "${MEM}" -machine "${MACHINE}" -cpu "${CPU}" \ + -smp "${SMP}" -kernel "${KERNEL}" "${KERNEL_ARGS[@]}" ${DISK_ARGS} \ + ${NETWORK_ARGS} -nographic ${@:2} diff --git a/images/ebclfsa_aarch64/persistency_integration/scripts/cpp_tests_persistency.sh b/images/ebclfsa_aarch64/persistency_integration/scripts/cpp_tests_persistency.sh new file mode 100755 index 0000000000..0dd092d139 --- /dev/null +++ b/images/ebclfsa_aarch64/persistency_integration/scripts/cpp_tests_persistency.sh @@ -0,0 +1,4 @@ +#!/bin/bash +# Script to run C++ persistency tests inside the QEMU environment +# Wrapper due to quoting issues when calling directly from Bazel +cpp_tests_persistency --name basic.basic --input '{"kvs_parameters":{"instance_id":0}}' diff --git a/images/ebclfsa_aarch64/scrample_integration/BUILD b/images/ebclfsa_aarch64/scrample_integration/BUILD new file mode 100644 index 0000000000..a8393c3dda --- /dev/null +++ b/images/ebclfsa_aarch64/scrample_integration/BUILD @@ -0,0 +1,118 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +load("@score_baselibs//score/language/safecpp:toolchain_features.bzl", "COMPILER_WARNING_FEATURES") + +genrule( + name = "scrample_sil", + srcs = ["@score_scrample//src:scrample"], + outs = ["scrample_sil"], + cmd = "cp $(SRCS) $@ && \ + chmod ugo+w $@ && \ + $(execpath @gcc_toolchain_gcc//:elf-enabler) $@ && \ + chmod ugo-w $@", + tools = ["@gcc_toolchain_gcc//:elf-enabler"], +) + +genrule( + name = "hi_app", + srcs = [ + ":scrample_sil_wrapper", + ":scrample_sil" + ], + outs = ["hi_app"], + cmd = "cp $(location :scrample_sil_wrapper) $@ && \ + chmod ugo+w $@ && \ + $(execpath @gcc_toolchain_gcc//:elf-enabler) $@ && \ + chmod ugo-w $@", + tools = ["@gcc_toolchain_gcc//:elf-enabler"], +) + +cc_binary( + name = "scrample_sil_wrapper", + srcs = [ + "src/main.cc", + ], + features = COMPILER_WARNING_FEATURES, + deps = [ + "@score_scrample//src:scrample", + ], +) + +genrule( + name = "fetch-fastdev-archive", + srcs = [], + outs = ["fastdev-archive.tgz"], + cmd = "wget -O $@ https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc/releases/download/0.5.0-beta/fastdev-ubuntu-ebcl-deb-qemu-arm64.tgz" +) + +genrule( + name = "fastdev-image", + srcs = [":fetch-fastdev-archive"], + outs = [ + "ebcl-qemuarm64/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic", + "ebcl-qemuarm64/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux" + ], + cmd = "tar xzf $(location :fetch-fastdev-archive) -C $(RULEDIR)", +) + +genrule( + name = "upload", + srcs = [ + "@score_scrample//src:scrample", + ":scrample_sil", + ":hi_app", + ":fastdev-image", + "etc/mw_com_config.json", + "etc/logging.json", + "run_qemu.sh", + ], + cmd = " \ + mkdir -p $(RULEDIR)/ebcl-qemuarm64-modified &&\ + cp $(RULEDIR)/ebcl-qemuarm64/* $(RULEDIR)/ebcl-qemuarm64-modified/ &&\ + $(location run_qemu.sh) $(RULEDIR)/ebcl-qemuarm64-modified -pidfile $(RULEDIR)/qemu.pid > $(RULEDIR)/qemu_upload.log &\ + sleep 30 ; \ + sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location :scrample_sil) root@localhost:/usr/bin &&\ + sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location @score_scrample//src:scrample) root@localhost:/usr/bin &&\ + sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location :hi_app) root@localhost:/usr/bin &&\ + sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location etc/mw_com_config.json) root@localhost:/etc/ &&\ + sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location etc/logging.json) root@localhost:/etc/ &&\ + sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost sync &&\ + sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost crinit-ctl poweroff || true \ + sleep 5 \ + ", + outs = [ + "qemu_upload.log", + "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic", + "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux" + ], +) + +genrule( + name = "run", + srcs = [ + "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic", + "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux", + "run_qemu.sh" + ], + cmd = " \ + $(location run_qemu.sh) $(RULEDIR)/ebcl-qemuarm64-modified -pidfile $(RULEDIR)/qemu.pid > $(RULEDIR)/qemu_run.log &\ + sleep 10 ; \ + sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost scrample -n 10 -m send -t 200 -s /etc/mw_com_config.json > $(RULEDIR)/ssh_scrample_run.log && \ + sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost crinit-ctl poweroff || true \ + sleep 5 \ + ", + outs = [ + "qemu_run.log", + "ssh_scrample_run.log", + ], +) diff --git a/images/ebclfsa_aarch64/scrample_integration/etc/logging.json b/images/ebclfsa_aarch64/scrample_integration/etc/logging.json new file mode 100644 index 0000000000..8b3d1eacc8 --- /dev/null +++ b/images/ebclfsa_aarch64/scrample_integration/etc/logging.json @@ -0,0 +1,8 @@ +{ + "appId": "IPBR", + "appDesc": "ipc_bridge", + "logLevel": "kDebug", + "logLevelThresholdConsole": "kInfo", + "logMode": "kConsole", + "dynamicDatarouterIdentifiers" : true +} diff --git a/images/ebclfsa_aarch64/scrample_integration/etc/mw_com_config.json b/images/ebclfsa_aarch64/scrample_integration/etc/mw_com_config.json new file mode 100644 index 0000000000..1e104bd484 --- /dev/null +++ b/images/ebclfsa_aarch64/scrample_integration/etc/mw_com_config.json @@ -0,0 +1,63 @@ +{ + "serviceTypes": [ + { + "serviceTypeName": "/score/MapApiLanesStamped", + "version": { + "major": 1, + "minor": 0 + }, + "bindings": [ + { + "binding": "SHM", + "serviceId": 6432, + "events": [ + { + "eventName": "map_api_lanes_stamped", + "eventId": 1 + }, + { + "eventName": "dummy_data_stamped", + "eventId": 2 + } + ] + } + ] + } + ], + "serviceInstances": [ + { + "instanceSpecifier": "score/MapApiLanesStamped", + "serviceTypeName": "/score/MapApiLanesStamped", + "version": { + "major": 1, + "minor": 0 + }, + "instances": [ + { + "instanceId": 1, + "allowedConsumer": { + "QM": [ + 4002, + 0 + ] + }, + "allowedProvider": { + "QM": [ + 4001, + 0 + ] + }, + "asil-level": "QM", + "binding": "SHM", + "events": [ + { + "eventName": "map_api_lanes_stamped", + "numberOfSampleSlots": 10, + "maxSubscribers": 3 + } + ] + } + ] + } + ] +} diff --git a/images/ebclfsa_aarch64/scrample_integration/run_qemu.sh b/images/ebclfsa_aarch64/scrample_integration/run_qemu.sh new file mode 100755 index 0000000000..3817c374f9 --- /dev/null +++ b/images/ebclfsa_aarch64/scrample_integration/run_qemu.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +set -xu + +if [ -z "$1" ]; then + echo "Usage: $0 " + exit 1 +fi +BASEFOLDER=$1 +IMAGE="${BASEFOLDER}/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic" +KERNEL="${BASEFOLDER}/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux" +if [ ! -d "${BASEFOLDER}" ] || [ ! -f "${IMAGE}" ] || [ ! -f "${KERNEL}" ] ; then + echo "Run \"bazel build --config=aarch64-ebclfsa //scrample_integration:fastdev-image\" first to fetch the image" +fi + +MACHINE="virt,virtualization=true,gic-version=3" +CPU="cortex-a53" +SMP="8" +MEM="4G" +KERNEL_ARGS=("-append" "root=/dev/vda1 sdk_enable lisa_syscall_whitelist=2026 rw sharedmem.enable_sharedmem=0 init=/usr/bin/ebclfsa-cflinit") +DISK_ARGS="-device virtio-blk-device,drive=vd0 -drive if=none,format=raw,file=${IMAGE},id=vd0" +NETWORK_ARGS="-netdev user,id=net0,net=192.168.7.0/24,dhcpstart=192.168.7.2,dns=192.168.7.3,host=192.168.7.5,hostfwd=tcp::2222-:22,hostfwd=tcp::3333-:3333 -device virtio-net-device,netdev=net0 " + +if ! command -v qemu-system-aarch64 > /dev/null; then + echo "Please install qemu-system-aarch64" + exit 1 +fi + +chmod +w ${IMAGE} + +exec qemu-system-aarch64 -m "${MEM}" -machine "${MACHINE}" -cpu "${CPU}" \ + -smp "${SMP}" -kernel "${KERNEL}" "${KERNEL_ARGS[@]}" ${DISK_ARGS} \ + ${NETWORK_ARGS} -nographic ${@:2} diff --git a/images/ebclfsa_aarch64/scrample_integration/src/main.cc b/images/ebclfsa_aarch64/scrample_integration/src/main.cc new file mode 100644 index 0000000000..72d6400215 --- /dev/null +++ b/images/ebclfsa_aarch64/scrample_integration/src/main.cc @@ -0,0 +1,38 @@ +/******************************************************************************** + * Copyright (c) 2025 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +#include +#include +#include + +int main() { + std::cout << "HI_App: Starting scrample_sil" << std::endl; + + const char *c_args[] = { + "/usr/bin/scrample_sil", + "-n", "10", + "-m", "recv", + "-t", "200", + "-s", "/etc/mw_com_config.json", + nullptr + }; + + execve("/usr/bin/scrample_sil", const_cast(c_args), nullptr); + + std::cerr << "execve failed, sleeping... Reason: " << strerror(errno) + << std::endl; + while (true) { + sleep(10); + } + return 0; +} + diff --git a/images/ebclfsa_aarch64/showcases b/images/ebclfsa_aarch64/showcases new file mode 120000 index 0000000000..399ab7eace --- /dev/null +++ b/images/ebclfsa_aarch64/showcases @@ -0,0 +1 @@ +../../showcases/ \ No newline at end of file From a64b415ca12c556438b6aceee632d6c75b7c2bd6 Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Fri, 6 Feb 2026 08:59:00 +0100 Subject: [PATCH 06/22] Rename macro --- bazel_common/bundlers.bzl | 3 ++- runners/docker_x86_64/scripts/run_docker.sh | 2 +- showcases/BUILD | 6 +++--- showcases/standalone/BUILD | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/bazel_common/bundlers.bzl b/bazel_common/bundlers.bzl index f0adb02a6b..d703fbddb7 100644 --- a/bazel_common/bundlers.bzl +++ b/bazel_common/bundlers.bzl @@ -1,7 +1,8 @@ load("@rules_pkg//pkg:pkg.bzl", "pkg_tar") load("@rules_pkg//pkg:mappings.bzl", "pkg_files") -def pkg_bundle(name, bins, package_dir, other_package_files = []): + +def score_pkg_bundle(name, bins, package_dir = None, other_package_files = []): """Creates a reusable bundle: pkg_files → pkg_tar → untar""" all_files_name = name + "_pkg_files" diff --git a/runners/docker_x86_64/scripts/run_docker.sh b/runners/docker_x86_64/scripts/run_docker.sh index 91e88c06ec..2968cb9abf 100755 --- a/runners/docker_x86_64/scripts/run_docker.sh +++ b/runners/docker_x86_64/scripts/run_docker.sh @@ -19,6 +19,6 @@ OVERLAY_TREE=$1 OVERLAY_ABS_PATH=$(realpath ${OVERLAY_TREE}) echo "Starting docker with overlay image: ${OVERLAY_ABS_PATH}" docker run --rm -it \ - -v "${OVERLAY_ABS_PATH}:/usecases" \ + -v "${OVERLAY_ABS_PATH}:/showcases" \ ubuntu:22.04 \ /bin/bash \ No newline at end of file diff --git a/showcases/BUILD b/showcases/BUILD index 6396b57076..30714735f0 100644 --- a/showcases/BUILD +++ b/showcases/BUILD @@ -12,11 +12,11 @@ # ******************************************************************************* load("@rules_rust//rust:defs.bzl", "rust_binary") -load("//bazel_common:bundlers.bzl", "pkg_bundle") +load("//bazel_common:bundlers.bzl", "score_pkg_bundle") -pkg_bundle( +score_pkg_bundle( name = "showcases_all", - package_dir = "showcases", + # package_dir = "", bins = [":kyron_example", ":orch_per_example", ], other_package_files = ["//showcases/standalone:standalone_pkg_files"] ) diff --git a/showcases/standalone/BUILD b/showcases/standalone/BUILD index bce8fb018c..5b4746fb26 100644 --- a/showcases/standalone/BUILD +++ b/showcases/standalone/BUILD @@ -1,7 +1,7 @@ -load("//bazel_common:bundlers.bzl", "pkg_bundle") +load("//bazel_common:bundlers.bzl", "score_pkg_bundle") -pkg_bundle( +score_pkg_bundle( name = "standalone", package_dir = "standalone", bins = ["@score_scrample//src:scrample"], From a41a5a9feacbe002c22c39ea4805432ace61b385 Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Fri, 6 Feb 2026 10:10:37 +0100 Subject: [PATCH 07/22] Make examples using CLI to help user understand content of release --- bazel_common/bundlers.bzl | 22 +-- bazel_common/score_basic_tools.MODULE.bazel | 5 + bazel_common/score_modules.MODULE.bazel | 2 +- images/qnx_x86_64/.bazelrc | 14 +- images/qnx_x86_64/build/system.build | 2 +- runners/docker_x86_64/scripts/run_docker.sh | 2 +- showcases/BUILD | 29 +--- showcases/cli/BUILD | 26 ++++ showcases/cli/main.rs | 129 ++++++++++++++++++ showcases/kyron/BUILD | 20 +++ showcases/kyron/kyron.score.json | 9 ++ showcases/orchestration_persistency/BUILD | 35 +++++ .../orch_per.score.json | 9 ++ 13 files changed, 260 insertions(+), 44 deletions(-) create mode 100644 showcases/cli/BUILD create mode 100644 showcases/cli/main.rs create mode 100644 showcases/kyron/BUILD create mode 100644 showcases/kyron/kyron.score.json create mode 100644 showcases/orchestration_persistency/BUILD create mode 100644 showcases/orchestration_persistency/orch_per.score.json diff --git a/bazel_common/bundlers.bzl b/bazel_common/bundlers.bzl index d703fbddb7..fbd29d4f82 100644 --- a/bazel_common/bundlers.bzl +++ b/bazel_common/bundlers.bzl @@ -2,25 +2,31 @@ load("@rules_pkg//pkg:pkg.bzl", "pkg_tar") load("@rules_pkg//pkg:mappings.bzl", "pkg_files") -def score_pkg_bundle(name, bins, package_dir = None, other_package_files = []): +def score_pkg_bundle(name, bins, config_data= None, package_dir = None, other_package_files = []): """Creates a reusable bundle: pkg_files → pkg_tar → untar""" all_files_name = name + "_pkg_files" bundle_name = name + "_pkg_tar" + all_cfg = name + "_configs" untar_name = name - rename_bin_dict = {} + rename_dict = {} for s in bins: - # Extract last path component of label as filename - # e.g. @score_scrample//src:scrample → scrample - target_name = s.split(":")[-1] - rename_bin_dict[s] = "bin/" + target_name + rename_dict[s] = "bin/" + Label(s).name + + if config_data != None: + for s in config_data: + rename_dict[s] = "configs/" + Label(s).name + + config_data_arr = [] + if config_data != None: + config_data_arr = config_data # Step 1: pkg_files pkg_files( name = all_files_name, - srcs = bins, - renames = rename_bin_dict, + srcs = bins + config_data_arr, + renames = rename_dict, visibility = ["//visibility:public"], ) diff --git a/bazel_common/score_basic_tools.MODULE.bazel b/bazel_common/score_basic_tools.MODULE.bazel index e6ce885161..0b5a92bf40 100644 --- a/bazel_common/score_basic_tools.MODULE.bazel +++ b/bazel_common/score_basic_tools.MODULE.bazel @@ -3,3 +3,8 @@ bazel_dep(name = "rules_cc", version = "0.1.1") bazel_dep(name = "rules_pkg", version = "1.2.0") bazel_dep(name = "score_bazel_platforms", version = "0.0.4") bazel_dep(name = "score_crates", version = "0.0.6") +git_override( + module_name = "score_crates", + remote = "https://github.com/eclipse-score/score-crates.git", + commit = "801481c5bb9cc6503885ec3fa881ae9145d2c9ec", +) \ No newline at end of file diff --git a/bazel_common/score_modules.MODULE.bazel b/bazel_common/score_modules.MODULE.bazel index 4373450d63..ec23c2098f 100644 --- a/bazel_common/score_modules.MODULE.bazel +++ b/bazel_common/score_modules.MODULE.bazel @@ -1,5 +1,5 @@ bazel_dep(name = "score_baselibs", version = "0.1.3") -bazel_dep(name = "score_communication", version = "0.1.2") +bazel_dep(name = "score_communication", version = "0.1.1") # EB needs 0.1.2 but others does not work with it bazel_dep(name = "score_persistency", version = "0.2.1") bazel_dep(name = "score_scrample", version = "0.1.0") bazel_dep(name = "score_orchestrator") diff --git a/images/qnx_x86_64/.bazelrc b/images/qnx_x86_64/.bazelrc index 670a512410..d9bf6563e8 100644 --- a/images/qnx_x86_64/.bazelrc +++ b/images/qnx_x86_64/.bazelrc @@ -8,13 +8,13 @@ build:_common --@score_baselibs//score/memory/shared/flags:use_typedshmd=False build:_common --@score_communication//score/mw/com/flags:tracing_library=stub build:_common --cxxopt=-Wno-error=mismatched-new-delete -build:x86_64-qnx --config=_common -build:x86_64-qnx --noexperimental_merged_skyframe_analysis_execution -build:x86_64-qnx --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 -build:x86_64-qnx --incompatible_enable_cc_toolchain_resolution -build:x86_64-qnx --incompatible_strict_action_env -build:x86_64-qnx --platforms=@score_toolchains_qnx//platforms:x86_64-qnx -build:x86_64-qnx --sandbox_writable_path=/var/tmp +build --config=_common +build --noexperimental_merged_skyframe_analysis_execution +build --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 +build --incompatible_enable_cc_toolchain_resolution +build --incompatible_strict_action_env +build --platforms=@score_toolchains_qnx//platforms:x86_64-qnx +build --sandbox_writable_path=/var/tmp build:itf --config=x86_64-qnx diff --git a/images/qnx_x86_64/build/system.build b/images/qnx_x86_64/build/system.build index da3dedf8d2..a459ba58da 100644 --- a/images/qnx_x86_64/build/system.build +++ b/images/qnx_x86_64/build/system.build @@ -283,5 +283,5 @@ pci/pci_debug2.so # Enhanced PCI debugging support # [perms=777] /cpp_tests_persistency = ${CPP_TEST_SCENARIOS_PATH} -[perms=777] /usecases = ${BUNDLE_PATH} +[perms=777] /showcases = ${BUNDLE_PATH} diff --git a/runners/docker_x86_64/scripts/run_docker.sh b/runners/docker_x86_64/scripts/run_docker.sh index 2968cb9abf..a553a0e620 100755 --- a/runners/docker_x86_64/scripts/run_docker.sh +++ b/runners/docker_x86_64/scripts/run_docker.sh @@ -21,4 +21,4 @@ echo "Starting docker with overlay image: ${OVERLAY_ABS_PATH}" docker run --rm -it \ -v "${OVERLAY_ABS_PATH}:/showcases" \ ubuntu:22.04 \ - /bin/bash \ No newline at end of file + /showcases/bin/cli \ No newline at end of file diff --git a/showcases/BUILD b/showcases/BUILD index 30714735f0..3c85d9bee0 100644 --- a/showcases/BUILD +++ b/showcases/BUILD @@ -10,37 +10,14 @@ # # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* - -load("@rules_rust//rust:defs.bzl", "rust_binary") load("//bazel_common:bundlers.bzl", "score_pkg_bundle") score_pkg_bundle( name = "showcases_all", # package_dir = "", - bins = [":kyron_example", ":orch_per_example", ], - other_package_files = ["//showcases/standalone:standalone_pkg_files"] + bins = ["//showcases/cli" ], + other_package_files = ["//showcases/standalone:standalone_pkg_files", "//showcases/kyron:kyron_pkg_files", "//showcases/orchestration_persistency:orch_per_pkg_files"], + ) -rust_binary( - name = "kyron_example", - srcs = glob(["kyron/**/*.rs"]), - deps = [ - "@score_kyron//src/kyron:libkyron", - "@score_kyron//src/kyron-foundation:libkyron_foundation", - "@score_crates//:tracing_subscriber", - ], - visibility = ["//visibility:public"], -) -rust_binary( - name = "orch_per_example", - srcs = glob(["orchestration_persistency/**/*.rs"]), - deps = [ - "@score_kyron//src/kyron:libkyron", - "@score_kyron//src/kyron-foundation:libkyron_foundation", - "@score_orchestrator//src/orchestration:liborchestration", - "@score_kyron//src/logging_tracing:liblogging_tracing", - "@score_persistency//src/rust/rust_kvs:rust_kvs", - ], - visibility = ["//visibility:public"], -) diff --git a/showcases/cli/BUILD b/showcases/cli/BUILD new file mode 100644 index 0000000000..c63d3ccb85 --- /dev/null +++ b/showcases/cli/BUILD @@ -0,0 +1,26 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +load("@rules_rust//rust:defs.bzl", "rust_binary") + +rust_binary( + name = "cli", + srcs = ["main.rs"], + deps = [ + "@score_crates//:inquire", + "@score_crates//:serde", + "@score_crates//:serde_json", + "@score_crates//:anyhow", + ], + visibility = ["//visibility:public"], +) \ No newline at end of file diff --git a/showcases/cli/main.rs b/showcases/cli/main.rs new file mode 100644 index 0000000000..e4525ddb6d --- /dev/null +++ b/showcases/cli/main.rs @@ -0,0 +1,129 @@ +use anyhow::{Context, Result}; +use inquire::MultiSelect; +use serde::Deserialize; +use std::{ + collections::HashMap, + env, + fs, + path::Path, + process::Command, +}; + +#[derive(Debug, Deserialize)] +struct ScoreConfig { + name: String, + description: String, + path: String, + args: Vec, + env: HashMap, +} + +fn print_banner() { + // Purple-blue ANSI color code + let color_code = "\x1b[38;5;99m"; // bright purple-blue + let reset_code = "\x1b[0m"; + // Hand-crafted ASCII banner for "S-CORE" + let banner = r#" + ███████╗ ██████╗ ██████╗ ██████╗ ███████╗ + ██╔════╝ ██╔════╝██╔═══██╗██╔══██╗██╔════╝ + ███████╗█████╗██║ ██║ ██║██████╔╝█████╗ + ╚════██║╚════╝██║ ██║ ██║██╔══██╗██╔══╝ + ███████║ ╚██████╗╚██████╔╝██║ ██║███████╗ + ╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ +"#; + println!("{}{}{}", color_code, banner, reset_code); + // Subtitle + println!("{}WELCOME TO SHOWCASE ENTRYPOINT{}\n", color_code, reset_code); +} + + +fn main() -> Result<()> { + print_banner(); + + let mRootDir = env::var("SCORE_CLI_INIT_DIR").unwrap_or_else(|_| "/showcases".to_string()); + + let mut mConfigs = Vec::new(); + visit_dir(Path::new(&mRootDir), &mut mConfigs)?; + + if mConfigs.is_empty() { + anyhow::bail!("No *.score.json files found under {}", mRootDir); + } + + let mOptions: Vec = mConfigs + .iter() + .map(|c| format!("{} — {}", c.name, c.description)) + .collect(); + + let mSelected = MultiSelect::new("Select examples to run:", mOptions.clone()).prompt()?; + + for mSelection in mSelected { + let mIndex = mOptions + .iter() + .position(|o| o == &mSelection) + .expect("selection index missing"); + + run_score(&mConfigs[mIndex])?; + } + + Ok(()) +} + +fn visit_dir(mDir: &Path, mConfigs: &mut Vec) -> Result<()> { + for mEntry in fs::read_dir(mDir) + .with_context(|| format!("Failed to read directory {:?}", mDir))? + { + let mEntry = mEntry?; + let mPath = mEntry.path(); + + if mPath.is_symlink() { + continue; + } + + if mPath.is_dir() { + visit_dir(&mPath, mConfigs)?; + continue; + } + + if is_score_file(&mPath) { + let mContent = fs::read_to_string(&mPath) + .with_context(|| format!("Failed reading {:?}", mPath))?; + + let mConfig: ScoreConfig = serde_json::from_str(&mContent) + .with_context(|| format!("Invalid JSON in {:?}", mPath))?; + + mConfigs.push(mConfig); + } + } + + Ok(()) +} + +fn is_score_file(mPath: &Path) -> bool { + mPath + .file_name() + .and_then(|n| n.to_str()) + .map(|n| n.ends_with(".score.json")) + .unwrap_or(false) +} + +fn run_score(mConfig: &ScoreConfig) -> Result<()> { + println!("▶ Running: {}", mConfig.name); + + let mut mCmd = Command::new(&mConfig.path); + mCmd.args(&mConfig.args); + mCmd.envs(&mConfig.env); + + let mStatus = mCmd + .status() + .with_context(|| format!("Failed to execute {}", mConfig.path))?; + + if !mStatus.success() { + anyhow::bail!( + "Command `{}` exited with status {}", + mConfig.path, + mStatus + ); + } + + Ok(()) +} diff --git a/showcases/kyron/BUILD b/showcases/kyron/BUILD new file mode 100644 index 0000000000..8cf41fc43e --- /dev/null +++ b/showcases/kyron/BUILD @@ -0,0 +1,20 @@ +load("@rules_rust//rust:defs.bzl", "rust_binary") +load("//bazel_common:bundlers.bzl", "score_pkg_bundle") + +rust_binary( + name = "kyron_example", + srcs = ["main.rs"], + deps = [ + "@score_kyron//src/kyron:libkyron", + "@score_kyron//src/kyron-foundation:libkyron_foundation", + "@score_crates//:tracing_subscriber", + ], + visibility = ["//visibility:public"], +) + + +score_pkg_bundle( + name = "kyron", + bins = [":kyron_example"], + config_data = ["//showcases/kyron:kyron.score.json"], +) diff --git a/showcases/kyron/kyron.score.json b/showcases/kyron/kyron.score.json new file mode 100644 index 0000000000..f076b2a451 --- /dev/null +++ b/showcases/kyron/kyron.score.json @@ -0,0 +1,9 @@ +{ + "name": "Kyron example", + "description": "Example for channel communication using safe async runtime - Kyron", + "path": "/showcases/bin/kyron_example", + "args": [ + ], + "env": { + } +} \ No newline at end of file diff --git a/showcases/orchestration_persistency/BUILD b/showcases/orchestration_persistency/BUILD new file mode 100644 index 0000000000..16abb3ed3e --- /dev/null +++ b/showcases/orchestration_persistency/BUILD @@ -0,0 +1,35 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +load("@rules_rust//rust:defs.bzl", "rust_binary") +load("//bazel_common:bundlers.bzl", "score_pkg_bundle") + +rust_binary( + name = "orch_per_example", + srcs = ["main.rs"], + deps = [ + "@score_kyron//src/kyron:libkyron", + "@score_kyron//src/kyron-foundation:libkyron_foundation", + "@score_orchestrator//src/orchestration:liborchestration", + "@score_kyron//src/logging_tracing:liblogging_tracing", + "@score_persistency//src/rust/rust_kvs:rust_kvs", + ], + visibility = ["//visibility:public"], +) + +score_pkg_bundle( + name = "orch_per", + bins = [":orch_per_example"], + config_data = ["//showcases/orchestration_persistency:orch_per.score.json"], +) + diff --git a/showcases/orchestration_persistency/orch_per.score.json b/showcases/orchestration_persistency/orch_per.score.json new file mode 100644 index 0000000000..587af7cc86 --- /dev/null +++ b/showcases/orchestration_persistency/orch_per.score.json @@ -0,0 +1,9 @@ +{ + "name": "Orchestration persistency - Kyron example", + "description": "Example for running orchestration graph with Kyron runtime and saving the state to disk", + "path": "/showcases/bin/orch_per_example", + "args": [ + ], + "env": { + } +} \ No newline at end of file From 54cf21079bf053cbcaf945bf0fdefbb8adb2fc87 Mon Sep 17 00:00:00 2001 From: Piotr Korkus Date: Fri, 6 Feb 2026 11:21:15 +0100 Subject: [PATCH 08/22] add persistency itf test --- feature_integration_tests/itf/BUILD | 2 +- images/qnx_x86_64/BUILD | 36 ++++++++++++++-------------- images/qnx_x86_64/build/BUILD | 4 ++-- images/qnx_x86_64/build/system.build | 10 ++++---- 4 files changed, 27 insertions(+), 25 deletions(-) diff --git a/feature_integration_tests/itf/BUILD b/feature_integration_tests/itf/BUILD index db414410fc..c757563a0f 100644 --- a/feature_integration_tests/itf/BUILD +++ b/feature_integration_tests/itf/BUILD @@ -2,6 +2,6 @@ exports_files( [ "test_ssh.py", "test_scrample.py", - # "test_persistency.py", + "test_persistency.py", ], ) \ No newline at end of file diff --git a/images/qnx_x86_64/BUILD b/images/qnx_x86_64/BUILD index 3535962d00..11e00626b1 100644 --- a/images/qnx_x86_64/BUILD +++ b/images/qnx_x86_64/BUILD @@ -59,21 +59,21 @@ py_itf_test( ], ) -# py_itf_test( -# name = "test_persistency", -# srcs = [ -# "feature_integration_tests/itf/test_persistency.py", -# ], -# args = [ -# "--target_config=$(location target_config.json)", -# "--ecu=s_core_ecu_qemu", -# "--qemu_image=$(location :image)", -# ], -# plugins = [ -# "itf.plugins.base.base_plugin", -# ], -# data = [ -# ":image", -# "target_config.json", -# ], -# ) +py_itf_test( + name = "test_persistency", + srcs = [ + "//feature_integration_tests/itf:test_persistency.py", + ], + args = [ + "--target_config=$(location //feature_integration_tests/configs:qemu_target_config.json)", + "--ecu=s_core_ecu_qemu", + "--qemu_image=$(location :image)", + ], + plugins = [ + "itf.plugins.base.base_plugin", + ], + data = [ + ":image", + "//feature_integration_tests/configs:qemu_target_config.json", + ], +) diff --git a/images/qnx_x86_64/build/BUILD b/images/qnx_x86_64/build/BUILD index 4afd5dac8c..f74332335e 100644 --- a/images/qnx_x86_64/build/BUILD +++ b/images/qnx_x86_64/build/BUILD @@ -53,11 +53,11 @@ qnx_ifs( "//showcases/standalone", "@score_scrample//src:scrample", "//feature_integration_tests/configs:etc_configs", - # "@score_persistency//tests/cpp_test_scenarios:cpp_test_scenarios", + "@score_persistency//tests/test_scenarios/cpp:test_scenarios", ], ext_repo_maping = { "SCRAMPLE_PATH": "$(location @score_scrample//src:scrample)", - # "CPP_TEST_SCENARIOS_PATH": "$(location @score_persistency//tests/cpp_test_scenarios:cpp_test_scenarios)", + "CPP_TEST_SCENARIOS_PATH": "$(location @score_persistency//tests/test_scenarios/cpp:test_scenarios)", "BUNDLE_PATH": "$(location //showcases/standalone)" }, visibility = [ diff --git a/images/qnx_x86_64/build/system.build b/images/qnx_x86_64/build/system.build index a459ba58da..23f3a49409 100644 --- a/images/qnx_x86_64/build/system.build +++ b/images/qnx_x86_64/build/system.build @@ -276,12 +276,14 @@ pci/pci_debug2.so # Enhanced PCI debugging support # DHCP client configuration [perms=644] /etc/dhcpcd.conf = ${MAIN_BUILD_FILE_DIR}/../configs/dhcpcd.conf # DHCP client configuration file -[perms=777] /etc/logging.json = ${MAIN_BUILD_FILE_DIR}/../feature_integration_tests/configs/etc/logging.json # DHCP client configuration file -[perms=777] /etc/mw_com_config.json = ${MAIN_BUILD_FILE_DIR}/../feature_integration_tests/configs/etc/mw_com_config.json # DHCP client configuration file +# Communication configuration files +[perms=777] /etc/logging.json = ${MAIN_BUILD_FILE_DIR}/../feature_integration_tests/configs/etc/logging.json +[perms=777] /etc/mw_com_config.json = ${MAIN_BUILD_FILE_DIR}/../feature_integration_tests/configs/etc/mw_com_config.json +# Executable files from external repositories [perms=777] /scrample = ${SCRAMPLE_PATH} -# [perms=777] /cpp_tests_persistency = ${CPP_TEST_SCENARIOS_PATH} - +[perms=777] /cpp_tests_persistency = ${CPP_TEST_SCENARIOS_PATH} +# Common showcases bundle [perms=777] /showcases = ${BUNDLE_PATH} From f728a5aa24bbe2236a3f380aa5026deb88238c27 Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Fri, 6 Feb 2026 11:52:34 +0100 Subject: [PATCH 09/22] Fix CLI for QNX and support x86_64 toolchain --- bazel_common/score_basic_tools.MODULE.bazel | 5 +- .../score_rust_toolchains.MODULE.bazel | 5 + images/qnx_x86_64/.bazelrc | 2 +- images/qnx_x86_64/MODULE.bazel | 11 +- images/qnx_x86_64/build/BUILD | 7 +- showcases/cli/BUILD | 2 +- showcases/cli/main.rs | 143 ++++++++++-------- 7 files changed, 97 insertions(+), 78 deletions(-) diff --git a/bazel_common/score_basic_tools.MODULE.bazel b/bazel_common/score_basic_tools.MODULE.bazel index 0b5a92bf40..95632f6ed0 100644 --- a/bazel_common/score_basic_tools.MODULE.bazel +++ b/bazel_common/score_basic_tools.MODULE.bazel @@ -6,5 +6,6 @@ bazel_dep(name = "score_crates", version = "0.0.6") git_override( module_name = "score_crates", remote = "https://github.com/eclipse-score/score-crates.git", - commit = "801481c5bb9cc6503885ec3fa881ae9145d2c9ec", -) \ No newline at end of file + commit = "ff8f312cd8ac221ff7562496c7f4d6b9b5c8ebb9", +) + diff --git a/bazel_common/score_rust_toolchains.MODULE.bazel b/bazel_common/score_rust_toolchains.MODULE.bazel index a71ae2e1cf..4ade3bd300 100644 --- a/bazel_common/score_rust_toolchains.MODULE.bazel +++ b/bazel_common/score_rust_toolchains.MODULE.bazel @@ -1,2 +1,7 @@ bazel_dep(name = "rules_rust", version = "0.61.0") bazel_dep(name = "score_toolchains_rust", version = "0.4.0", dev_dependency = True) +git_override( + module_name = "rules_rust", + remote = "https://github.com/pawelrutkaq/rules_rust.git", # To be fixed once rule_rust is in score bazel registry + commit = "293337fd6402ec3dfbeb8f2d589f38ad9124dadd", +) \ No newline at end of file diff --git a/images/qnx_x86_64/.bazelrc b/images/qnx_x86_64/.bazelrc index d9bf6563e8..5e3361e2a1 100644 --- a/images/qnx_x86_64/.bazelrc +++ b/images/qnx_x86_64/.bazelrc @@ -13,7 +13,7 @@ build --noexperimental_merged_skyframe_analysis_execution build --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 build --incompatible_enable_cc_toolchain_resolution build --incompatible_strict_action_env -build --platforms=@score_toolchains_qnx//platforms:x86_64-qnx +build --platforms=@score_bazel_platforms//:x86_64-qnx-sdp_8.0.0-posix build --sandbox_writable_path=/var/tmp diff --git a/images/qnx_x86_64/MODULE.bazel b/images/qnx_x86_64/MODULE.bazel index 0e4b12b5ce..f08efeb170 100644 --- a/images/qnx_x86_64/MODULE.bazel +++ b/images/qnx_x86_64/MODULE.bazel @@ -25,6 +25,9 @@ include ("//bazel_common:score_gcc_toolchains.MODULE.bazel") # WIP: Not used yet # GCC toolchains include ("//bazel_common:score_qnx_toolchains.MODULE.bazel") # WIP: Not used yet as have problems with IFS toolchain +# Rust toolchains +include ("//bazel_common:score_rust_toolchains.MODULE.bazel") + # Python support include("//bazel_common:score_python.MODULE.bazel") @@ -82,10 +85,12 @@ toolchains_qnx.sdp( url = "https://www.qnx.com/download/download/79858/installation.tgz", ) use_repo(toolchains_qnx, "toolchains_qnx_sdp") -use_repo(toolchains_qnx, "toolchains_qnx_qcc") +# use_repo(toolchains_qnx, "toolchains_qnx_qcc") use_repo(toolchains_qnx, "toolchains_qnx_ifs") # register_toolchains("@gcc_toolchain//:all") -register_toolchains("@toolchains_qnx_qcc//:qcc_x86_64") +register_toolchains("@score_qcc_x86_64_toolchain//:x86_64-qnx-sdp_8.0.0-posix") register_toolchains("@toolchains_qnx_ifs//:ifs_x86_64") -register_toolchains("@gcc_toolchain//:all") \ No newline at end of file +register_toolchains("@gcc_toolchain//:all") +register_toolchains("@score_toolchains_rust//toolchains/ferrocene:ferrocene_x86_64_pc_nto_qnx800") +register_toolchains("@score_toolchains_rust//toolchains/ferrocene:ferrocene_x86_64_unknown_linux_gnu") \ No newline at end of file diff --git a/images/qnx_x86_64/build/BUILD b/images/qnx_x86_64/build/BUILD index f74332335e..f9bd695f02 100644 --- a/images/qnx_x86_64/build/BUILD +++ b/images/qnx_x86_64/build/BUILD @@ -50,15 +50,12 @@ qnx_ifs( ":system_dir", ":scripts", ":configs", - "//showcases/standalone", - "@score_scrample//src:scrample", + "//showcases:showcases_all", "//feature_integration_tests/configs:etc_configs", "@score_persistency//tests/test_scenarios/cpp:test_scenarios", ], ext_repo_maping = { - "SCRAMPLE_PATH": "$(location @score_scrample//src:scrample)", - "CPP_TEST_SCENARIOS_PATH": "$(location @score_persistency//tests/test_scenarios/cpp:test_scenarios)", - "BUNDLE_PATH": "$(location //showcases/standalone)" + "BUNDLE_PATH": "$(location //showcases:showcases_all)" }, visibility = [ "//visibility:public", diff --git a/showcases/cli/BUILD b/showcases/cli/BUILD index c63d3ccb85..d94be0f295 100644 --- a/showcases/cli/BUILD +++ b/showcases/cli/BUILD @@ -17,7 +17,7 @@ rust_binary( name = "cli", srcs = ["main.rs"], deps = [ - "@score_crates//:inquire", + "@score_crates//:cliclack", "@score_crates//:serde", "@score_crates//:serde_json", "@score_crates//:anyhow", diff --git a/showcases/cli/main.rs b/showcases/cli/main.rs index e4525ddb6d..4c5131767f 100644 --- a/showcases/cli/main.rs +++ b/showcases/cli/main.rs @@ -1,14 +1,14 @@ use anyhow::{Context, Result}; -use inquire::MultiSelect; use serde::Deserialize; use std::{ collections::HashMap, - env, - fs, + env, fs, path::Path, process::Command, }; +use cliclack::{clear_screen, intro, multiselect, outro, confirm}; + #[derive(Debug, Deserialize)] struct ScoreConfig { name: String, @@ -19,111 +19,122 @@ struct ScoreConfig { } fn print_banner() { - // Purple-blue ANSI color code - let color_code = "\x1b[38;5;99m"; // bright purple-blue + let color_code = "\x1b[38;5;99m"; let reset_code = "\x1b[0m"; - // Hand-crafted ASCII banner for "S-CORE" + let banner = r#" - ███████╗ ██████╗ ██████╗ ██████╗ ███████╗ - ██╔════╝ ██╔════╝██╔═══██╗██╔══██╗██╔════╝ - ███████╗█████╗██║ ██║ ██║██████╔╝█████╗ - ╚════██║╚════╝██║ ██║ ██║██╔══██╗██╔══╝ - ███████║ ╚██████╗╚██████╔╝██║ ██║███████╗ - ╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ + ███████╗ ██████╗ ██████╗ ██████╗ ███████╗ + ██╔════╝ ██╔════╝██╔═══██╗██╔══██╗██╔════╝ + ███████╗█████╗██║ ██║ ██║██████╔╝█████╗ + ╚════██║╚════╝██║ ██║ ██║██╔══██╗██╔══╝ + ███████║ ╚██████╗╚██████╔╝██║ ██║███████╗ + ╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ "#; + println!("{}{}{}", color_code, banner, reset_code); - // Subtitle - println!("{}WELCOME TO SHOWCASE ENTRYPOINT{}\n", color_code, reset_code); } +fn pause_for_enter() -> Result<()> { + confirm("Press Enter to select examples to run...") + .initial_value(true) + .interact()?; + Ok(()) +} fn main() -> Result<()> { print_banner(); + intro("WELCOME TO SHOWCASE ENTRYPOINT")?; + pause_for_enter()?; + + clear_screen()?; - let mRootDir = env::var("SCORE_CLI_INIT_DIR").unwrap_or_else(|_| "/showcases".to_string()); + let root_dir = env::var("SCORE_CLI_INIT_DIR") + .unwrap_or_else(|_| "/showcases".to_string()); - let mut mConfigs = Vec::new(); - visit_dir(Path::new(&mRootDir), &mut mConfigs)?; + let mut configs = Vec::new(); + visit_dir(Path::new(&root_dir), &mut configs)?; - if mConfigs.is_empty() { - anyhow::bail!("No *.score.json files found under {}", mRootDir); + if configs.is_empty() { + anyhow::bail!("No *.score.json files found under {}", root_dir); } - let mOptions: Vec = mConfigs + // Create options for multiselect + let options: Vec<(usize, String, String)> = configs .iter() - .map(|c| format!("{} — {}", c.name, c.description)) + .enumerate() + .map(|(i, c)| (i, c.name.clone(), c.description.clone())) .collect(); - let mSelected = MultiSelect::new("Select examples to run:", mOptions.clone()).prompt()?; + let selected: Vec = multiselect("Select examples to run:") + .items(&options) + .interact()?; - for mSelection in mSelected { - let mIndex = mOptions - .iter() - .position(|o| o == &mSelection) - .expect("selection index missing"); + if selected.is_empty() { + outro("No examples selected. Goodbye!")?; + return Ok(()); + } - run_score(&mConfigs[mIndex])?; + for index in selected { + run_score(&configs[index])?; } + outro("All done!")?; + Ok(()) } -fn visit_dir(mDir: &Path, mConfigs: &mut Vec) -> Result<()> { - for mEntry in fs::read_dir(mDir) - .with_context(|| format!("Failed to read directory {:?}", mDir))? +fn visit_dir(dir: &Path, configs: &mut Vec) -> Result<()> { + for entry in fs::read_dir(dir) + .with_context(|| format!("Failed to read directory {:?}", dir))? { - let mEntry = mEntry?; - let mPath = mEntry.path(); - - if mPath.is_symlink() { + let entry = entry?; + let path = entry.path(); + + if path.is_symlink() { continue; } - - if mPath.is_dir() { - visit_dir(&mPath, mConfigs)?; + + if path.is_dir() { + visit_dir(&path, configs)?; continue; } - - if is_score_file(&mPath) { - let mContent = fs::read_to_string(&mPath) - .with_context(|| format!("Failed reading {:?}", mPath))?; - - let mConfig: ScoreConfig = serde_json::from_str(&mContent) - .with_context(|| format!("Invalid JSON in {:?}", mPath))?; - - mConfigs.push(mConfig); + + if is_score_file(&path) { + let content = fs::read_to_string(&path) + .with_context(|| format!("Failed reading {:?}", path))?; + let config: ScoreConfig = serde_json::from_str(&content) + .with_context(|| format!("Invalid JSON in {:?}", path))?; + configs.push(config); } } - Ok(()) } -fn is_score_file(mPath: &Path) -> bool { - mPath - .file_name() +fn is_score_file(path: &Path) -> bool { + path.file_name() .and_then(|n| n.to_str()) .map(|n| n.ends_with(".score.json")) .unwrap_or(false) } -fn run_score(mConfig: &ScoreConfig) -> Result<()> { - println!("▶ Running: {}", mConfig.name); - - let mut mCmd = Command::new(&mConfig.path); - mCmd.args(&mConfig.args); - mCmd.envs(&mConfig.env); - - let mStatus = mCmd +fn run_score(config: &ScoreConfig) -> Result<()> { + println!("▶ Running: {}", config.name); + + let mut cmd = Command::new(&config.path); + cmd.args(&config.args); + cmd.envs(&config.env); + + let status = cmd .status() - .with_context(|| format!("Failed to execute {}", mConfig.path))?; - - if !mStatus.success() { + .with_context(|| format!("Failed to execute {}", config.path))?; + + if !status.success() { anyhow::bail!( "Command `{}` exited with status {}", - mConfig.path, - mStatus + config.path, + status ); } - + Ok(()) -} +} \ No newline at end of file From fbc9da91e4a6d0f5e590f92ad01a16d573e1ee70 Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Fri, 6 Feb 2026 11:59:37 +0100 Subject: [PATCH 10/22] Add cli as entrypoint --- images/qnx_x86_64/configs/startup.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/images/qnx_x86_64/configs/startup.sh b/images/qnx_x86_64/configs/startup.sh index ce9a5c1b5e..2637825264 100644 --- a/images/qnx_x86_64/configs/startup.sh +++ b/images/qnx_x86_64/configs/startup.sh @@ -82,3 +82,4 @@ mkdir -p /tmp_ram/tmp_discovery ln -sP /tmp_ram/tmp_discovery /tmp_discovery /proc/boot/sshd -f /var/ssh/sshd_config # Start SSH daemon with specified configuration file +/showcases/bin/cli # Start the CLI application from the mounted showcases directory \ No newline at end of file From fcad0da8326318c43ef5e66229dcda5a1012b224 Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Fri, 6 Feb 2026 12:28:52 +0100 Subject: [PATCH 11/22] Cleanup module bazel --- images/linux_x86_64/MODULE.bazel | 1 - images/qnx_x86_64/.bazelrc | 2 +- images/qnx_x86_64/MODULE.bazel | 45 ++++++++++++++++---------------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/images/linux_x86_64/MODULE.bazel b/images/linux_x86_64/MODULE.bazel index cd471c0dd8..8b386b4dc2 100644 --- a/images/linux_x86_64/MODULE.bazel +++ b/images/linux_x86_64/MODULE.bazel @@ -49,4 +49,3 @@ git_override( commit = "650b51a47264a4f232b3341f473527710fc32669", # trlc-2.0.2 release remote = "https://github.com/bmw-software-engineering/trlc.git", ) - diff --git a/images/qnx_x86_64/.bazelrc b/images/qnx_x86_64/.bazelrc index 5e3361e2a1..30d271dff4 100644 --- a/images/qnx_x86_64/.bazelrc +++ b/images/qnx_x86_64/.bazelrc @@ -15,7 +15,7 @@ build --incompatible_enable_cc_toolchain_resolution build --incompatible_strict_action_env build --platforms=@score_bazel_platforms//:x86_64-qnx-sdp_8.0.0-posix build --sandbox_writable_path=/var/tmp - +build --host_platform=@score_bazel_platforms//:x86_64-linux-gcc_12.2.0-posix build:itf --config=x86_64-qnx build:itf --run_under=@score_itf//scripts:run_under_qemu diff --git a/images/qnx_x86_64/MODULE.bazel b/images/qnx_x86_64/MODULE.bazel index f08efeb170..a575132eb4 100644 --- a/images/qnx_x86_64/MODULE.bazel +++ b/images/qnx_x86_64/MODULE.bazel @@ -58,25 +58,26 @@ git_override( ) # Workaround until new toolchains can be used -bazel_dep(name = "score_toolchains_gcc", version = "0.5", dev_dependency=True) -gcc = use_extension("@score_toolchains_gcc//extentions:gcc.bzl", "gcc", dev_dependency=True) -gcc.toolchain( - url = "https://github.com/eclipse-score/toolchains_gcc_packages/releases/download/0.0.1/x86_64-unknown-linux-gnu_gcc12.tar.gz", - sha256 = "457f5f20f57528033cb840d708b507050d711ae93e009388847e113b11bf3600", - strip_prefix = "x86_64-unknown-linux-gnu", -) -gcc.extra_features( - features = [ - "minimal_warnings", - "treat_warnings_as_errors", - ], -) -gcc.warning_flags( - minimal_warnings = ["-Wall", "-Wno-error=deprecated-declarations", "-Wno-error=narrowing"], - strict_warnings = ["-Wextra", "-Wpedantic"], -) -use_repo(gcc, "gcc_toolchain", "gcc_toolchain_gcc") +# bazel_dep(name = "score_toolchains_gcc", version = "0.5", dev_dependency=True) +# gcc = use_extension("@score_toolchains_gcc//extentions:gcc.bzl", "gcc", dev_dependency=True) +# gcc.toolchain( +# url = "https://github.com/eclipse-score/toolchains_gcc_packages/releases/download/0.0.1/x86_64-unknown-linux-gnu_gcc12.tar.gz", +# sha256 = "457f5f20f57528033cb840d708b507050d711ae93e009388847e113b11bf3600", +# strip_prefix = "x86_64-unknown-linux-gnu", +# ) +# gcc.extra_features( +# features = [ +# "minimal_warnings", +# "treat_warnings_as_errors", +# ], +# ) +# gcc.warning_flags( +# minimal_warnings = ["-Wall", "-Wno-error=deprecated-declarations", "-Wno-error=narrowing"], +# strict_warnings = ["-Wextra", "-Wpedantic"], +# ) +# use_repo(gcc, "gcc_toolchain", "gcc_toolchain_gcc") +# Currently required for ifs tooling bazel_dep(name = "score_toolchains_qnx", version = "0.0.3") toolchains_qnx = use_extension("@score_toolchains_qnx//:extensions.bzl", "toolchains_qnx", dev_dependency=True) toolchains_qnx.sdp( @@ -85,12 +86,12 @@ toolchains_qnx.sdp( url = "https://www.qnx.com/download/download/79858/installation.tgz", ) use_repo(toolchains_qnx, "toolchains_qnx_sdp") -# use_repo(toolchains_qnx, "toolchains_qnx_qcc") use_repo(toolchains_qnx, "toolchains_qnx_ifs") -# register_toolchains("@gcc_toolchain//:all") + register_toolchains("@score_qcc_x86_64_toolchain//:x86_64-qnx-sdp_8.0.0-posix") register_toolchains("@toolchains_qnx_ifs//:ifs_x86_64") -register_toolchains("@gcc_toolchain//:all") +# register_toolchains("@gcc_toolchain//:all") register_toolchains("@score_toolchains_rust//toolchains/ferrocene:ferrocene_x86_64_pc_nto_qnx800") -register_toolchains("@score_toolchains_rust//toolchains/ferrocene:ferrocene_x86_64_unknown_linux_gnu") \ No newline at end of file +register_toolchains("@score_toolchains_rust//toolchains/ferrocene:ferrocene_x86_64_unknown_linux_gnu") +register_toolchains("@score_gcc_x86_64_toolchain//:x86_64-linux-gcc_12.2.0-posix") \ No newline at end of file From a7b133d179139fe89e91ee460aab61335f38c5ad Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Fri, 6 Feb 2026 13:29:59 +0100 Subject: [PATCH 12/22] Fix logo --- showcases/cli/main.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/showcases/cli/main.rs b/showcases/cli/main.rs index 4c5131767f..22aae6d615 100644 --- a/showcases/cli/main.rs +++ b/showcases/cli/main.rs @@ -23,12 +23,12 @@ fn print_banner() { let reset_code = "\x1b[0m"; let banner = r#" - ███████╗ ██████╗ ██████╗ ██████╗ ███████╗ - ██╔════╝ ██╔════╝██╔═══██╗██╔══██╗██╔════╝ - ███████╗█████╗██║ ██║ ██║██████╔╝█████╗ - ╚════██║╚════╝██║ ██║ ██║██╔══██╗██╔══╝ - ███████║ ╚██████╗╚██████╔╝██║ ██║███████╗ - ╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ + ███████╗ ██████╗ ██████╗ ██████╗ ███████╗ + ██╔════╝ ██╔════╝██╔═══██╗██╔══██╗██╔════╝ + ███████╗█████╗██║ ██║ ██║██████╔╝█████╗ + ╚════██║╚════╝██║ ██║ ██║██╔══██╗██╔══╝ + ███████║ ╚██████╗╚██████╔╝██║ ██║███████╗ + ╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ "#; println!("{}{}{}", color_code, banner, reset_code); From 73407adab9397f623acdb1e1d04524e6d0b6bcdf Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Fri, 6 Feb 2026 15:44:00 +0100 Subject: [PATCH 13/22] Single module test --- images/.bazelrc | 34 +++ images/.bazelversion | 1 + {bazel_common => images}/BUILD | 0 images/{qnx_x86_64 => }/MODULE.bazel | 19 -- .../bazel_common}/BUILD | 0 .../bazel_common}/bundlers.bzl | 0 .../score_basic_tools.MODULE.bazel | 0 .../score_gcc_toolchains.MODULE.bazel | 0 .../bazel_common}/score_modules.MODULE.bazel | 0 .../bazel_common}/score_python.MODULE.bazel | 0 .../score_qnx_toolchains.MODULE.bazel | 0 .../score_rust_toolchains.MODULE.bazel | 0 images/ebclfsa_aarch64/.bazelrc | 14 - images/ebclfsa_aarch64/.bazelversion | 1 - images/ebclfsa_aarch64/MODULE.bazel | 70 ----- images/ebclfsa_aarch64/bazel_common | 1 - images/ebclfsa_aarch64/showcases | 1 - images/feature_integration_tests/BUILD | 0 .../feature_integration_tests}/README.md | 0 .../feature_integration_tests}/configs/BUILD | 0 .../configs/etc/logging.json | 0 .../configs/etc/mw_com_config.json | 0 .../configs/qemu_target_config.json | 0 .../feature_integration_tests}/itf/BUILD | 0 .../itf/test_persistency.py | 0 .../itf/test_scrample.py | 0 .../itf/test_ssh.py | 0 .../test_cases/BUILD | 0 .../test_cases/conftest.py | 0 .../test_cases/fit_scenario.py | 0 .../test_cases/pytest.ini | 0 .../test_cases/requirements.txt | 0 .../test_cases/requirements.txt.lock | 0 .../test_cases/test_properties.py | 0 .../test_orchestration_with_persistency.py | 0 .../persistency/test_multiple_kvs_per_app.py | 0 .../test_scenarios/rust/BUILD | 0 .../rust/src/internals/kyron/mod.rs | 0 .../src/internals/kyron/runtime_helper.rs | 0 .../test_scenarios/rust/src/internals/mod.rs | 0 .../src/internals/persistency/kvs_instance.rs | 0 .../internals/persistency/kvs_parameters.rs | 0 .../rust/src/internals/persistency/mod.rs | 0 .../test_scenarios/rust/src/main.rs | 0 .../rust/src/scenarios/basic/mod.rs | 0 .../basic/orchestration_with_persistency.rs | 0 .../test_scenarios/rust/src/scenarios/mod.rs | 0 .../rust/src/scenarios/persistency/mod.rs | 0 .../persistency/multiple_kvs_per_app.rs | 0 images/linux_x86_64/.bazelrc | 13 - images/linux_x86_64/.bazelversion | 1 - images/linux_x86_64/BUILD | 11 + images/linux_x86_64/MODULE.bazel | 51 ---- images/linux_x86_64/bazel_common | 1 - images/linux_x86_64/runners/docker_x86_64 | 1 - images/linux_x86_64/showcases | 1 - images/qnx_x86_64/.bazelrc | 24 -- images/qnx_x86_64/.bazelversion | 1 - images/qnx_x86_64/BUILD | 16 +- images/qnx_x86_64/bazel_common | 1 - images/qnx_x86_64/build/BUILD | 30 +- images/qnx_x86_64/build/system.build | 4 +- images/qnx_x86_64/feature_integration_tests | 1 - images/qnx_x86_64/runners/qemu_x86_64 | 1 - images/qnx_x86_64/scripts/run_qemu.sh | 33 --- images/qnx_x86_64/showcases | 1 - .../runners}/docker_x86_64/BUILD | 20 +- images/runners/docker_x86_64/scripts/BUILD | 1 + .../docker_x86_64/scripts/run_docker.sh | 0 {runners => images/runners}/qemu_x86_64/BUILD | 26 +- images/runners/qemu_x86_64/scripts/BUILD | 1 + .../qemu_x86_64}/scripts/qnx_wireshark.sh | 0 .../runners}/qemu_x86_64/scripts/run_qemu.sh | 0 .../scripts/run_qemu_portforward.sh | 0 images/score.sh | 66 +++++ {showcases => images/showcases}/BUILD | 0 {showcases => images/showcases}/cli/BUILD | 0 {showcases => images/showcases}/cli/main.rs | 0 {showcases => images/showcases}/kyron/BUILD | 0 .../showcases}/kyron/kyron.score.json | 0 {showcases => images/showcases}/kyron/main.rs | 0 .../orchestration_persistency/BUILD | 0 .../orchestration_persistency/main.rs | 0 .../orch_per.score.json | 0 .../showcases}/standalone/BUILD | 0 runners/qemu_x86_64/scripts/qnx_wireshark.sh | 276 ------------------ .../scripts/run_qemu_portforward.sh | 34 --- 87 files changed, 169 insertions(+), 587 deletions(-) create mode 100644 images/.bazelrc create mode 100644 images/.bazelversion rename {bazel_common => images}/BUILD (100%) rename images/{qnx_x86_64 => }/MODULE.bazel (77%) rename {feature_integration_tests => images/bazel_common}/BUILD (100%) rename {bazel_common => images/bazel_common}/bundlers.bzl (100%) rename {bazel_common => images/bazel_common}/score_basic_tools.MODULE.bazel (100%) rename {bazel_common => images/bazel_common}/score_gcc_toolchains.MODULE.bazel (100%) rename {bazel_common => images/bazel_common}/score_modules.MODULE.bazel (100%) rename {bazel_common => images/bazel_common}/score_python.MODULE.bazel (100%) rename {bazel_common => images/bazel_common}/score_qnx_toolchains.MODULE.bazel (100%) rename {bazel_common => images/bazel_common}/score_rust_toolchains.MODULE.bazel (100%) delete mode 100644 images/ebclfsa_aarch64/.bazelrc delete mode 100644 images/ebclfsa_aarch64/.bazelversion delete mode 100644 images/ebclfsa_aarch64/MODULE.bazel delete mode 120000 images/ebclfsa_aarch64/bazel_common delete mode 120000 images/ebclfsa_aarch64/showcases create mode 100644 images/feature_integration_tests/BUILD rename {feature_integration_tests => images/feature_integration_tests}/README.md (100%) rename {feature_integration_tests => images/feature_integration_tests}/configs/BUILD (100%) rename {feature_integration_tests => images/feature_integration_tests}/configs/etc/logging.json (100%) rename {feature_integration_tests => images/feature_integration_tests}/configs/etc/mw_com_config.json (100%) rename {feature_integration_tests => images/feature_integration_tests}/configs/qemu_target_config.json (100%) rename {feature_integration_tests => images/feature_integration_tests}/itf/BUILD (100%) rename {feature_integration_tests => images/feature_integration_tests}/itf/test_persistency.py (100%) rename {feature_integration_tests => images/feature_integration_tests}/itf/test_scrample.py (100%) rename {feature_integration_tests => images/feature_integration_tests}/itf/test_ssh.py (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_cases/BUILD (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_cases/conftest.py (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_cases/fit_scenario.py (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_cases/pytest.ini (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_cases/requirements.txt (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_cases/requirements.txt.lock (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_cases/test_properties.py (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_cases/tests/basic/test_orchestration_with_persistency.py (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_cases/tests/persistency/test_multiple_kvs_per_app.py (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_scenarios/rust/BUILD (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_scenarios/rust/src/internals/kyron/mod.rs (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_scenarios/rust/src/internals/kyron/runtime_helper.rs (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_scenarios/rust/src/internals/mod.rs (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_scenarios/rust/src/internals/persistency/kvs_instance.rs (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_scenarios/rust/src/internals/persistency/kvs_parameters.rs (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_scenarios/rust/src/internals/persistency/mod.rs (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_scenarios/rust/src/main.rs (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_scenarios/rust/src/scenarios/basic/mod.rs (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_scenarios/rust/src/scenarios/basic/orchestration_with_persistency.rs (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_scenarios/rust/src/scenarios/mod.rs (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_scenarios/rust/src/scenarios/persistency/mod.rs (100%) rename {feature_integration_tests => images/feature_integration_tests}/test_scenarios/rust/src/scenarios/persistency/multiple_kvs_per_app.rs (100%) delete mode 100644 images/linux_x86_64/.bazelrc delete mode 100644 images/linux_x86_64/.bazelversion delete mode 100644 images/linux_x86_64/MODULE.bazel delete mode 120000 images/linux_x86_64/bazel_common delete mode 120000 images/linux_x86_64/runners/docker_x86_64 delete mode 120000 images/linux_x86_64/showcases delete mode 100644 images/qnx_x86_64/.bazelrc delete mode 100644 images/qnx_x86_64/.bazelversion delete mode 120000 images/qnx_x86_64/bazel_common delete mode 120000 images/qnx_x86_64/feature_integration_tests delete mode 120000 images/qnx_x86_64/runners/qemu_x86_64 delete mode 100755 images/qnx_x86_64/scripts/run_qemu.sh delete mode 120000 images/qnx_x86_64/showcases rename {runners => images/runners}/docker_x86_64/BUILD (74%) create mode 100644 images/runners/docker_x86_64/scripts/BUILD rename {runners => images/runners}/docker_x86_64/scripts/run_docker.sh (100%) rename {runners => images/runners}/qemu_x86_64/BUILD (66%) create mode 100644 images/runners/qemu_x86_64/scripts/BUILD rename images/{qnx_x86_64 => runners/qemu_x86_64}/scripts/qnx_wireshark.sh (100%) rename {runners => images/runners}/qemu_x86_64/scripts/run_qemu.sh (100%) rename images/{qnx_x86_64 => runners/qemu_x86_64}/scripts/run_qemu_portforward.sh (100%) create mode 100755 images/score.sh rename {showcases => images/showcases}/BUILD (100%) rename {showcases => images/showcases}/cli/BUILD (100%) rename {showcases => images/showcases}/cli/main.rs (100%) rename {showcases => images/showcases}/kyron/BUILD (100%) rename {showcases => images/showcases}/kyron/kyron.score.json (100%) rename {showcases => images/showcases}/kyron/main.rs (100%) rename {showcases => images/showcases}/orchestration_persistency/BUILD (100%) rename {showcases => images/showcases}/orchestration_persistency/main.rs (100%) rename {showcases => images/showcases}/orchestration_persistency/orch_per.score.json (100%) rename {showcases => images/showcases}/standalone/BUILD (100%) delete mode 100755 runners/qemu_x86_64/scripts/qnx_wireshark.sh delete mode 100755 runners/qemu_x86_64/scripts/run_qemu_portforward.sh diff --git a/images/.bazelrc b/images/.bazelrc new file mode 100644 index 0000000000..1496a52386 --- /dev/null +++ b/images/.bazelrc @@ -0,0 +1,34 @@ +common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ +common --registry=https://bcr.bazel.build + +build:_common --@score_baselibs//score/mw/log/detail/flags:KUse_Stub_Implementation_Only=False +build:_common --@score_baselibs//score/mw/log/flags:KRemote_Logging=False +build:_common --@score_baselibs//score/json:base_library=nlohmann +build:_common --@score_baselibs//score/memory/shared/flags:use_typedshmd=False +build:_common --@score_communication//score/mw/com/flags:tracing_library=stub +build:_common --cxxopt=-Wno-error=mismatched-new-delete +build:_common --host_platform=@score_bazel_platforms//:x86_64-linux-gcc_12.2.0-posix +build:_common --extra_toolchains=@score_toolchains_rust//toolchains/ferrocene:ferrocene_x86_64_unknown_linux_gnu +build:_common --extra_toolchains=@score_gcc_x86_64_toolchain//:x86_64-linux-gcc_12.2.0-posix + +build:qnx-x86_64 --config=_common +build:qnx-x86_64 --noexperimental_merged_skyframe_analysis_execution +build:qnx-x86_64 --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 +build:qnx-x86_64 --incompatible_enable_cc_toolchain_resolution +build:qnx-x86_64 --incompatible_strict_action_env +build:qnx-x86_64 --sandbox_writable_path=/var/tmp +build:qnx-x86_64 --platforms=@score_bazel_platforms//:x86_64-qnx-sdp_8.0.0-posix +build:qnx-x86_64 --extra_toolchains=@score_qcc_x86_64_toolchain//:x86_64-qnx-sdp_8.0.0-posix +build:qnx-x86_64 --extra_toolchains=@toolchains_qnx_ifs//:ifs_x86_64 +build:qnx-x86_64 --extra_toolchains=@score_toolchains_rust//toolchains/ferrocene:ferrocene_x86_64_pc_nto_qnx800 + +build:itf-qnx-x86_64 --config=qnx-x86_64 +build:itf-qnx-x86_64 --run_under=@score_itf//scripts:run_under_qemu +build:itf-qnx-x86_64 --test_arg="--qemu" +build:itf-qnx-x86_64 --test_arg="--os=qnx" + + +build:linux-x86_64 --config=_common +build:linux-x86_64 --extra_toolchains=@score_gcc_x86_64_toolchain//:x86_64-linux-gcc_12.2.0-posix +build:linux-x86_64 --platforms=@score_bazel_platforms//:x86_64-linux-gcc_12.2.0-posix + diff --git a/images/.bazelversion b/images/.bazelversion new file mode 100644 index 0000000000..e7fdef7e2e --- /dev/null +++ b/images/.bazelversion @@ -0,0 +1 @@ +8.4.2 diff --git a/bazel_common/BUILD b/images/BUILD similarity index 100% rename from bazel_common/BUILD rename to images/BUILD diff --git a/images/qnx_x86_64/MODULE.bazel b/images/MODULE.bazel similarity index 77% rename from images/qnx_x86_64/MODULE.bazel rename to images/MODULE.bazel index a575132eb4..e74390e917 100644 --- a/images/qnx_x86_64/MODULE.bazel +++ b/images/MODULE.bazel @@ -57,25 +57,6 @@ git_override( remote = "https://github.com/qorix-group/toolchains_qnx.git", ) -# Workaround until new toolchains can be used -# bazel_dep(name = "score_toolchains_gcc", version = "0.5", dev_dependency=True) -# gcc = use_extension("@score_toolchains_gcc//extentions:gcc.bzl", "gcc", dev_dependency=True) -# gcc.toolchain( -# url = "https://github.com/eclipse-score/toolchains_gcc_packages/releases/download/0.0.1/x86_64-unknown-linux-gnu_gcc12.tar.gz", -# sha256 = "457f5f20f57528033cb840d708b507050d711ae93e009388847e113b11bf3600", -# strip_prefix = "x86_64-unknown-linux-gnu", -# ) -# gcc.extra_features( -# features = [ -# "minimal_warnings", -# "treat_warnings_as_errors", -# ], -# ) -# gcc.warning_flags( -# minimal_warnings = ["-Wall", "-Wno-error=deprecated-declarations", "-Wno-error=narrowing"], -# strict_warnings = ["-Wextra", "-Wpedantic"], -# ) -# use_repo(gcc, "gcc_toolchain", "gcc_toolchain_gcc") # Currently required for ifs tooling bazel_dep(name = "score_toolchains_qnx", version = "0.0.3") diff --git a/feature_integration_tests/BUILD b/images/bazel_common/BUILD similarity index 100% rename from feature_integration_tests/BUILD rename to images/bazel_common/BUILD diff --git a/bazel_common/bundlers.bzl b/images/bazel_common/bundlers.bzl similarity index 100% rename from bazel_common/bundlers.bzl rename to images/bazel_common/bundlers.bzl diff --git a/bazel_common/score_basic_tools.MODULE.bazel b/images/bazel_common/score_basic_tools.MODULE.bazel similarity index 100% rename from bazel_common/score_basic_tools.MODULE.bazel rename to images/bazel_common/score_basic_tools.MODULE.bazel diff --git a/bazel_common/score_gcc_toolchains.MODULE.bazel b/images/bazel_common/score_gcc_toolchains.MODULE.bazel similarity index 100% rename from bazel_common/score_gcc_toolchains.MODULE.bazel rename to images/bazel_common/score_gcc_toolchains.MODULE.bazel diff --git a/bazel_common/score_modules.MODULE.bazel b/images/bazel_common/score_modules.MODULE.bazel similarity index 100% rename from bazel_common/score_modules.MODULE.bazel rename to images/bazel_common/score_modules.MODULE.bazel diff --git a/bazel_common/score_python.MODULE.bazel b/images/bazel_common/score_python.MODULE.bazel similarity index 100% rename from bazel_common/score_python.MODULE.bazel rename to images/bazel_common/score_python.MODULE.bazel diff --git a/bazel_common/score_qnx_toolchains.MODULE.bazel b/images/bazel_common/score_qnx_toolchains.MODULE.bazel similarity index 100% rename from bazel_common/score_qnx_toolchains.MODULE.bazel rename to images/bazel_common/score_qnx_toolchains.MODULE.bazel diff --git a/bazel_common/score_rust_toolchains.MODULE.bazel b/images/bazel_common/score_rust_toolchains.MODULE.bazel similarity index 100% rename from bazel_common/score_rust_toolchains.MODULE.bazel rename to images/bazel_common/score_rust_toolchains.MODULE.bazel diff --git a/images/ebclfsa_aarch64/.bazelrc b/images/ebclfsa_aarch64/.bazelrc deleted file mode 100644 index a7842dc4e1..0000000000 --- a/images/ebclfsa_aarch64/.bazelrc +++ /dev/null @@ -1,14 +0,0 @@ -common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ -common --registry=https://bcr.bazel.build - -build:_common --@score_baselibs//score/mw/log/detail/flags:KUse_Stub_Implementation_Only=False -build:_common --@score_baselibs//score/mw/log/flags:KRemote_Logging=False -build:_common --@score_baselibs//score/json:base_library=nlohmann -build:_common --@score_baselibs//score/memory/shared/flags:use_typedshmd=False -build:_common --@score_communication//score/mw/com/flags:tracing_library=stub -build:_common --cxxopt=-Wno-error=mismatched-new-delete - -build --config=_common -build --extra_toolchains=@gcc_toolchain//:aarch64_gcc_13 -build --platforms=@score_toolchains_gcc//platforms:aarch64-linux -build --spawn_strategy=local diff --git a/images/ebclfsa_aarch64/.bazelversion b/images/ebclfsa_aarch64/.bazelversion deleted file mode 100644 index 6da4de57dc..0000000000 --- a/images/ebclfsa_aarch64/.bazelversion +++ /dev/null @@ -1 +0,0 @@ -8.4.1 diff --git a/images/ebclfsa_aarch64/MODULE.bazel b/images/ebclfsa_aarch64/MODULE.bazel deleted file mode 100644 index fff1f0da95..0000000000 --- a/images/ebclfsa_aarch64/MODULE.bazel +++ /dev/null @@ -1,70 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -"EB corbos Linux for Safety Applications - S-CORE Reference Integration" - -module( - name = "score_ref_int_ebclfsa", - version = "0.1.0", - compatibility_level = 0, -) - -# Include common modules -include("//bazel_common:score_basic_tools.MODULE.bazel") - -# GCC toolchains -include ("//bazel_common:score_rust_toolchains.MODULE.bazel") - -# Python support -include("//bazel_common:score_python.MODULE.bazel") - -# Score modules -include("//bazel_common:score_modules.MODULE.bazel") - -bazel_dep(name = "score_toolchains_gcc", dev_dependency=True) -git_override( # Elektrobit corbos Linux for Safety Applications needs a specific toolchain - module_name = "score_toolchains_gcc", - remote = "https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc.git", - tag = "0.5.0-beta" # corresponds to git sha 158921ffd9aabef41a2a03bca5baeaa9f4aa9d33 -) -gcc = use_extension("@score_toolchains_gcc//extensions:gcc.bzl", "gcc", dev_dependency=True) -gcc.toolchain( - url = "https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc/releases/download/0.5.0-beta/fastdev-sdk-ubuntu-ebclfsa-ebcl-qemuarm64.tar.gz", - sha256 = "05b57bbc8d99d46df6b57f774c39a5a2664964ea7eb94147cbece08508c1f121", - strip_prefix = "fastdev-sdk-ubuntu-ebclfsa-ebcl-qemuarm64", -) -use_repo(gcc, "gcc_toolchain", "gcc_toolchain_gcc") - - -single_version_override( - module_name = "score_baselibs", - version = "0.2.2", # part of 0.5.0-beta release - patch_strip = 1, - patches = [ - "//patches:fix_hard_coded_amd64.patch", - ], -) - -# git_override is not forwarded by bazel_dep, so we need to redefine it here -git_override( - module_name = "trlc", - remote = "https://github.com/bmw-software-engineering/trlc.git", - commit = "650b51a47264a4f232b3341f473527710fc32669", # trlc-2.0.2 release -) - -# archive_override is not forwarded by bazel_dep, so we need to redefine it here -archive_override( - module_name = "rules_boost", - urls = ["https://github.com/nelhage/rules_boost/archive/refs/heads/master.tar.gz"], - strip_prefix = "rules_boost-master", -) diff --git a/images/ebclfsa_aarch64/bazel_common b/images/ebclfsa_aarch64/bazel_common deleted file mode 120000 index 8192e6e84f..0000000000 --- a/images/ebclfsa_aarch64/bazel_common +++ /dev/null @@ -1 +0,0 @@ -../../bazel_common/ \ No newline at end of file diff --git a/images/ebclfsa_aarch64/showcases b/images/ebclfsa_aarch64/showcases deleted file mode 120000 index 399ab7eace..0000000000 --- a/images/ebclfsa_aarch64/showcases +++ /dev/null @@ -1 +0,0 @@ -../../showcases/ \ No newline at end of file diff --git a/images/feature_integration_tests/BUILD b/images/feature_integration_tests/BUILD new file mode 100644 index 0000000000..e69de29bb2 diff --git a/feature_integration_tests/README.md b/images/feature_integration_tests/README.md similarity index 100% rename from feature_integration_tests/README.md rename to images/feature_integration_tests/README.md diff --git a/feature_integration_tests/configs/BUILD b/images/feature_integration_tests/configs/BUILD similarity index 100% rename from feature_integration_tests/configs/BUILD rename to images/feature_integration_tests/configs/BUILD diff --git a/feature_integration_tests/configs/etc/logging.json b/images/feature_integration_tests/configs/etc/logging.json similarity index 100% rename from feature_integration_tests/configs/etc/logging.json rename to images/feature_integration_tests/configs/etc/logging.json diff --git a/feature_integration_tests/configs/etc/mw_com_config.json b/images/feature_integration_tests/configs/etc/mw_com_config.json similarity index 100% rename from feature_integration_tests/configs/etc/mw_com_config.json rename to images/feature_integration_tests/configs/etc/mw_com_config.json diff --git a/feature_integration_tests/configs/qemu_target_config.json b/images/feature_integration_tests/configs/qemu_target_config.json similarity index 100% rename from feature_integration_tests/configs/qemu_target_config.json rename to images/feature_integration_tests/configs/qemu_target_config.json diff --git a/feature_integration_tests/itf/BUILD b/images/feature_integration_tests/itf/BUILD similarity index 100% rename from feature_integration_tests/itf/BUILD rename to images/feature_integration_tests/itf/BUILD diff --git a/feature_integration_tests/itf/test_persistency.py b/images/feature_integration_tests/itf/test_persistency.py similarity index 100% rename from feature_integration_tests/itf/test_persistency.py rename to images/feature_integration_tests/itf/test_persistency.py diff --git a/feature_integration_tests/itf/test_scrample.py b/images/feature_integration_tests/itf/test_scrample.py similarity index 100% rename from feature_integration_tests/itf/test_scrample.py rename to images/feature_integration_tests/itf/test_scrample.py diff --git a/feature_integration_tests/itf/test_ssh.py b/images/feature_integration_tests/itf/test_ssh.py similarity index 100% rename from feature_integration_tests/itf/test_ssh.py rename to images/feature_integration_tests/itf/test_ssh.py diff --git a/feature_integration_tests/test_cases/BUILD b/images/feature_integration_tests/test_cases/BUILD similarity index 100% rename from feature_integration_tests/test_cases/BUILD rename to images/feature_integration_tests/test_cases/BUILD diff --git a/feature_integration_tests/test_cases/conftest.py b/images/feature_integration_tests/test_cases/conftest.py similarity index 100% rename from feature_integration_tests/test_cases/conftest.py rename to images/feature_integration_tests/test_cases/conftest.py diff --git a/feature_integration_tests/test_cases/fit_scenario.py b/images/feature_integration_tests/test_cases/fit_scenario.py similarity index 100% rename from feature_integration_tests/test_cases/fit_scenario.py rename to images/feature_integration_tests/test_cases/fit_scenario.py diff --git a/feature_integration_tests/test_cases/pytest.ini b/images/feature_integration_tests/test_cases/pytest.ini similarity index 100% rename from feature_integration_tests/test_cases/pytest.ini rename to images/feature_integration_tests/test_cases/pytest.ini diff --git a/feature_integration_tests/test_cases/requirements.txt b/images/feature_integration_tests/test_cases/requirements.txt similarity index 100% rename from feature_integration_tests/test_cases/requirements.txt rename to images/feature_integration_tests/test_cases/requirements.txt diff --git a/feature_integration_tests/test_cases/requirements.txt.lock b/images/feature_integration_tests/test_cases/requirements.txt.lock similarity index 100% rename from feature_integration_tests/test_cases/requirements.txt.lock rename to images/feature_integration_tests/test_cases/requirements.txt.lock diff --git a/feature_integration_tests/test_cases/test_properties.py b/images/feature_integration_tests/test_cases/test_properties.py similarity index 100% rename from feature_integration_tests/test_cases/test_properties.py rename to images/feature_integration_tests/test_cases/test_properties.py diff --git a/feature_integration_tests/test_cases/tests/basic/test_orchestration_with_persistency.py b/images/feature_integration_tests/test_cases/tests/basic/test_orchestration_with_persistency.py similarity index 100% rename from feature_integration_tests/test_cases/tests/basic/test_orchestration_with_persistency.py rename to images/feature_integration_tests/test_cases/tests/basic/test_orchestration_with_persistency.py diff --git a/feature_integration_tests/test_cases/tests/persistency/test_multiple_kvs_per_app.py b/images/feature_integration_tests/test_cases/tests/persistency/test_multiple_kvs_per_app.py similarity index 100% rename from feature_integration_tests/test_cases/tests/persistency/test_multiple_kvs_per_app.py rename to images/feature_integration_tests/test_cases/tests/persistency/test_multiple_kvs_per_app.py diff --git a/feature_integration_tests/test_scenarios/rust/BUILD b/images/feature_integration_tests/test_scenarios/rust/BUILD similarity index 100% rename from feature_integration_tests/test_scenarios/rust/BUILD rename to images/feature_integration_tests/test_scenarios/rust/BUILD diff --git a/feature_integration_tests/test_scenarios/rust/src/internals/kyron/mod.rs b/images/feature_integration_tests/test_scenarios/rust/src/internals/kyron/mod.rs similarity index 100% rename from feature_integration_tests/test_scenarios/rust/src/internals/kyron/mod.rs rename to images/feature_integration_tests/test_scenarios/rust/src/internals/kyron/mod.rs diff --git a/feature_integration_tests/test_scenarios/rust/src/internals/kyron/runtime_helper.rs b/images/feature_integration_tests/test_scenarios/rust/src/internals/kyron/runtime_helper.rs similarity index 100% rename from feature_integration_tests/test_scenarios/rust/src/internals/kyron/runtime_helper.rs rename to images/feature_integration_tests/test_scenarios/rust/src/internals/kyron/runtime_helper.rs diff --git a/feature_integration_tests/test_scenarios/rust/src/internals/mod.rs b/images/feature_integration_tests/test_scenarios/rust/src/internals/mod.rs similarity index 100% rename from feature_integration_tests/test_scenarios/rust/src/internals/mod.rs rename to images/feature_integration_tests/test_scenarios/rust/src/internals/mod.rs diff --git a/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_instance.rs b/images/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_instance.rs similarity index 100% rename from feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_instance.rs rename to images/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_instance.rs diff --git a/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_parameters.rs b/images/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_parameters.rs similarity index 100% rename from feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_parameters.rs rename to images/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_parameters.rs diff --git a/feature_integration_tests/test_scenarios/rust/src/internals/persistency/mod.rs b/images/feature_integration_tests/test_scenarios/rust/src/internals/persistency/mod.rs similarity index 100% rename from feature_integration_tests/test_scenarios/rust/src/internals/persistency/mod.rs rename to images/feature_integration_tests/test_scenarios/rust/src/internals/persistency/mod.rs diff --git a/feature_integration_tests/test_scenarios/rust/src/main.rs b/images/feature_integration_tests/test_scenarios/rust/src/main.rs similarity index 100% rename from feature_integration_tests/test_scenarios/rust/src/main.rs rename to images/feature_integration_tests/test_scenarios/rust/src/main.rs diff --git a/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/mod.rs b/images/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/mod.rs similarity index 100% rename from feature_integration_tests/test_scenarios/rust/src/scenarios/basic/mod.rs rename to images/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/mod.rs diff --git a/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/orchestration_with_persistency.rs b/images/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/orchestration_with_persistency.rs similarity index 100% rename from feature_integration_tests/test_scenarios/rust/src/scenarios/basic/orchestration_with_persistency.rs rename to images/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/orchestration_with_persistency.rs diff --git a/feature_integration_tests/test_scenarios/rust/src/scenarios/mod.rs b/images/feature_integration_tests/test_scenarios/rust/src/scenarios/mod.rs similarity index 100% rename from feature_integration_tests/test_scenarios/rust/src/scenarios/mod.rs rename to images/feature_integration_tests/test_scenarios/rust/src/scenarios/mod.rs diff --git a/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/mod.rs b/images/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/mod.rs similarity index 100% rename from feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/mod.rs rename to images/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/mod.rs diff --git a/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/multiple_kvs_per_app.rs b/images/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/multiple_kvs_per_app.rs similarity index 100% rename from feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/multiple_kvs_per_app.rs rename to images/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/multiple_kvs_per_app.rs diff --git a/images/linux_x86_64/.bazelrc b/images/linux_x86_64/.bazelrc deleted file mode 100644 index 1ee06f9ddb..0000000000 --- a/images/linux_x86_64/.bazelrc +++ /dev/null @@ -1,13 +0,0 @@ -common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ -common --registry=https://bcr.bazel.build - -common --@score_baselibs//score/mw/log/detail/flags:KUse_Stub_Implementation_Only=False -common --@score_baselibs//score/mw/log/flags:KRemote_Logging=False -common --@score_baselibs//score/json:base_library=nlohmann -common --@score_baselibs//score/memory/shared/flags:use_typedshmd=False -common --@score_communication//score/mw/com/flags:tracing_library=stub -common --cxxopt=-Wno-error=mismatched-new-delete - -common --extra_toolchains=@score_toolchains_rust//toolchains/ferrocene:ferrocene_x86_64_unknown_linux_gnu -common --extra_toolchains=@score_gcc_x86_64_toolchain//:x86_64-linux-gcc_12.2.0-posix -common --platforms=@score_bazel_platforms//:x86_64-linux-gcc_12.2.0-posix diff --git a/images/linux_x86_64/.bazelversion b/images/linux_x86_64/.bazelversion deleted file mode 100644 index 8104cabd36..0000000000 --- a/images/linux_x86_64/.bazelversion +++ /dev/null @@ -1 +0,0 @@ -8.1.0 diff --git a/images/linux_x86_64/BUILD b/images/linux_x86_64/BUILD index 1e357acc6f..89f762468c 100644 --- a/images/linux_x86_64/BUILD +++ b/images/linux_x86_64/BUILD @@ -16,4 +16,15 @@ alias( name = "image", actual = "//showcases:showcases_all", visibility = ["//visibility:public"], +) + +sh_binary( + name = "run", + srcs = ["//runners/docker_x86_64/scripts:run_docker.sh"], + args = [ + "$(location :image)", + ], + data = [ + ":image", + ], ) \ No newline at end of file diff --git a/images/linux_x86_64/MODULE.bazel b/images/linux_x86_64/MODULE.bazel deleted file mode 100644 index 8b386b4dc2..0000000000 --- a/images/linux_x86_64/MODULE.bazel +++ /dev/null @@ -1,51 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -module( - name = "score_ref_int_x86_64_linux", - version = "0.0.1", - compatibility_level = 0, -) - -# Include common modules -include("//bazel_common:score_basic_tools.MODULE.bazel") - -# GCC toolchains -include ("//bazel_common:score_gcc_toolchains.MODULE.bazel") - -# GCC toolchains -include ("//bazel_common:score_rust_toolchains.MODULE.bazel") - -# Python support -include("//bazel_common:score_python.MODULE.bazel") - -# Score modules -include("//bazel_common:score_modules.MODULE.bazel") - - -# Image specific dependencies - -bazel_dep(name = "rules_boost", repo_name = "com_github_nelhage_rules_boost") -archive_override( - module_name = "rules_boost", - urls = ["https://github.com/nelhage/rules_boost/archive/refs/heads/master.tar.gz"], - strip_prefix = "rules_boost-master", -) - - -# TRLC dependency for requirements traceability -bazel_dep(name = "trlc", version = "0.0.0") -git_override( - module_name = "trlc", - commit = "650b51a47264a4f232b3341f473527710fc32669", # trlc-2.0.2 release - remote = "https://github.com/bmw-software-engineering/trlc.git", -) diff --git a/images/linux_x86_64/bazel_common b/images/linux_x86_64/bazel_common deleted file mode 120000 index 8192e6e84f..0000000000 --- a/images/linux_x86_64/bazel_common +++ /dev/null @@ -1 +0,0 @@ -../../bazel_common/ \ No newline at end of file diff --git a/images/linux_x86_64/runners/docker_x86_64 b/images/linux_x86_64/runners/docker_x86_64 deleted file mode 120000 index 49365010bf..0000000000 --- a/images/linux_x86_64/runners/docker_x86_64 +++ /dev/null @@ -1 +0,0 @@ -../../../runners/docker_x86_64/ \ No newline at end of file diff --git a/images/linux_x86_64/showcases b/images/linux_x86_64/showcases deleted file mode 120000 index 399ab7eace..0000000000 --- a/images/linux_x86_64/showcases +++ /dev/null @@ -1 +0,0 @@ -../../showcases/ \ No newline at end of file diff --git a/images/qnx_x86_64/.bazelrc b/images/qnx_x86_64/.bazelrc deleted file mode 100644 index 30d271dff4..0000000000 --- a/images/qnx_x86_64/.bazelrc +++ /dev/null @@ -1,24 +0,0 @@ -common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ -common --registry=https://bcr.bazel.build - -build:_common --@score_baselibs//score/mw/log/detail/flags:KUse_Stub_Implementation_Only=False -build:_common --@score_baselibs//score/mw/log/flags:KRemote_Logging=False -build:_common --@score_baselibs//score/json:base_library=nlohmann -build:_common --@score_baselibs//score/memory/shared/flags:use_typedshmd=False -build:_common --@score_communication//score/mw/com/flags:tracing_library=stub -build:_common --cxxopt=-Wno-error=mismatched-new-delete - -build --config=_common -build --noexperimental_merged_skyframe_analysis_execution -build --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 -build --incompatible_enable_cc_toolchain_resolution -build --incompatible_strict_action_env -build --platforms=@score_bazel_platforms//:x86_64-qnx-sdp_8.0.0-posix -build --sandbox_writable_path=/var/tmp -build --host_platform=@score_bazel_platforms//:x86_64-linux-gcc_12.2.0-posix - -build:itf --config=x86_64-qnx -build:itf --run_under=@score_itf//scripts:run_under_qemu -build:itf --test_arg="--qemu" -build:itf --test_arg="--os=qnx" - diff --git a/images/qnx_x86_64/.bazelversion b/images/qnx_x86_64/.bazelversion deleted file mode 100644 index 8104cabd36..0000000000 --- a/images/qnx_x86_64/.bazelversion +++ /dev/null @@ -1 +0,0 @@ -8.1.0 diff --git a/images/qnx_x86_64/BUILD b/images/qnx_x86_64/BUILD index 11e00626b1..66883a3cb5 100644 --- a/images/qnx_x86_64/BUILD +++ b/images/qnx_x86_64/BUILD @@ -15,10 +15,24 @@ load("@score_itf//:defs.bzl", "py_itf_test") alias( name = "image", - actual = "//build:init", + actual = "//qnx_x86_64/build:init", visibility = ["//visibility:public"], ) +sh_binary( + name = "run", + srcs = ["//runners/qemu_x86_64/scripts:run_qemu.sh"], + args = [ + "$(location @toolchains_qnx_sdp//:host_dir)", + "$(location :image)", + ], + data = [ + ":image", + "@toolchains_qnx_sdp//:host_all", + "@toolchains_qnx_sdp//:host_dir", + ], +) + # For now we keep this not in /feature_integration_tests but locally within images py_itf_test( diff --git a/images/qnx_x86_64/bazel_common b/images/qnx_x86_64/bazel_common deleted file mode 120000 index 8192e6e84f..0000000000 --- a/images/qnx_x86_64/bazel_common +++ /dev/null @@ -1 +0,0 @@ -../../bazel_common/ \ No newline at end of file diff --git a/images/qnx_x86_64/build/BUILD b/images/qnx_x86_64/build/BUILD index f9bd695f02..d07bdd27a5 100644 --- a/images/qnx_x86_64/build/BUILD +++ b/images/qnx_x86_64/build/BUILD @@ -16,7 +16,7 @@ load("@score_toolchains_qnx//rules/fs:ifs.bzl", "qnx_ifs") filegroup( name = "scripts", srcs = [ - "//configs:startup.sh", + "//qnx_x86_64/configs:startup.sh", ], visibility = ["//visibility:private"], ) @@ -24,20 +24,20 @@ filegroup( filegroup( name = "configs", srcs = [ - "//configs:pci_server.cfg", - "//configs:pci_hw.cfg", - "//configs:qcrypto.conf", - "//configs:passwd", - "//configs:group", - "//configs:sshd_config", - "//configs:ssh_host_rsa_key", - "//configs:ssh_host_rsa_key.pub", - "//configs:hostname", - "//configs:network_setup.sh", - "//configs:network_capture.sh", - "//configs:profile", - "//configs:dhcpcd.conf", - "//configs:network_setup_dhcp.sh", + "//qnx_x86_64/configs:pci_server.cfg", + "//qnx_x86_64/configs:pci_hw.cfg", + "//qnx_x86_64/configs:qcrypto.conf", + "//qnx_x86_64/configs:passwd", + "//qnx_x86_64/configs:group", + "//qnx_x86_64/configs:sshd_config", + "//qnx_x86_64/configs:ssh_host_rsa_key", + "//qnx_x86_64/configs:ssh_host_rsa_key.pub", + "//qnx_x86_64/configs:hostname", + "//qnx_x86_64/configs:network_setup.sh", + "//qnx_x86_64/configs:network_capture.sh", + "//qnx_x86_64/configs:profile", + "//qnx_x86_64/configs:dhcpcd.conf", + "//qnx_x86_64/configs:network_setup_dhcp.sh", ], visibility = ["//visibility:private"], ) diff --git a/images/qnx_x86_64/build/system.build b/images/qnx_x86_64/build/system.build index 23f3a49409..f846c14434 100644 --- a/images/qnx_x86_64/build/system.build +++ b/images/qnx_x86_64/build/system.build @@ -277,8 +277,8 @@ pci/pci_debug2.so # Enhanced PCI debugging support [perms=644] /etc/dhcpcd.conf = ${MAIN_BUILD_FILE_DIR}/../configs/dhcpcd.conf # DHCP client configuration file # Communication configuration files -[perms=777] /etc/logging.json = ${MAIN_BUILD_FILE_DIR}/../feature_integration_tests/configs/etc/logging.json -[perms=777] /etc/mw_com_config.json = ${MAIN_BUILD_FILE_DIR}/../feature_integration_tests/configs/etc/mw_com_config.json +[perms=777] /etc/logging.json = ${MAIN_BUILD_FILE_DIR}/../../feature_integration_tests/configs/etc/logging.json +[perms=777] /etc/mw_com_config.json = ${MAIN_BUILD_FILE_DIR}/../../feature_integration_tests/configs/etc/mw_com_config.json # Executable files from external repositories [perms=777] /scrample = ${SCRAMPLE_PATH} diff --git a/images/qnx_x86_64/feature_integration_tests b/images/qnx_x86_64/feature_integration_tests deleted file mode 120000 index 48cb83d4b4..0000000000 --- a/images/qnx_x86_64/feature_integration_tests +++ /dev/null @@ -1 +0,0 @@ -../../feature_integration_tests/ \ No newline at end of file diff --git a/images/qnx_x86_64/runners/qemu_x86_64 b/images/qnx_x86_64/runners/qemu_x86_64 deleted file mode 120000 index 6df355217d..0000000000 --- a/images/qnx_x86_64/runners/qemu_x86_64 +++ /dev/null @@ -1 +0,0 @@ -../../../runners/qemu_x86_64/ \ No newline at end of file diff --git a/images/qnx_x86_64/scripts/run_qemu.sh b/images/qnx_x86_64/scripts/run_qemu.sh deleted file mode 100755 index a23f117b53..0000000000 --- a/images/qnx_x86_64/scripts/run_qemu.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -set -euo pipefail - -QNX_HOST=$1 - -IFS_IMAGE=$2 - -qemu-system-x86_64 \ - -smp 2 \ - --enable-kvm \ - -cpu Cascadelake-Server-v5 \ - -m 1G \ - -pidfile /tmp/qemu.pid \ - -nographic \ - -kernel "${IFS_IMAGE}" \ - -serial mon:stdio \ - -object rng-random,filename=/dev/urandom,id=rng0 \ - -netdev bridge,id=net0,br=virbr0 -device virtio-net-pci,netdev=net0 \ - -device virtio-rng-pci,rng=rng0 \ No newline at end of file diff --git a/images/qnx_x86_64/showcases b/images/qnx_x86_64/showcases deleted file mode 120000 index 399ab7eace..0000000000 --- a/images/qnx_x86_64/showcases +++ /dev/null @@ -1 +0,0 @@ -../../showcases/ \ No newline at end of file diff --git a/runners/docker_x86_64/BUILD b/images/runners/docker_x86_64/BUILD similarity index 74% rename from runners/docker_x86_64/BUILD rename to images/runners/docker_x86_64/BUILD index 21a84e6eb2..17a9a3cbca 100644 --- a/runners/docker_x86_64/BUILD +++ b/images/runners/docker_x86_64/BUILD @@ -12,13 +12,13 @@ # ******************************************************************************* load("@rules_shell//shell:sh_binary.bzl", "sh_binary") -sh_binary( - name = "docker_x86_64", - srcs = ["scripts/run_docker.sh"], - args = [ - "$(location //:image)", - ], - data = [ - "//:image", - ], -) +# sh_binary( +# name = "docker_x86_64", +# srcs = ["scripts/run_docker.sh"], +# args = [ +# "$(location //linux_x86_64:image)", +# ], +# data = [ +# "//linux_x86_64:image", +# ], +# ) diff --git a/images/runners/docker_x86_64/scripts/BUILD b/images/runners/docker_x86_64/scripts/BUILD new file mode 100644 index 0000000000..6e17fd110a --- /dev/null +++ b/images/runners/docker_x86_64/scripts/BUILD @@ -0,0 +1 @@ +exports_files(["run_docker.sh"]) \ No newline at end of file diff --git a/runners/docker_x86_64/scripts/run_docker.sh b/images/runners/docker_x86_64/scripts/run_docker.sh similarity index 100% rename from runners/docker_x86_64/scripts/run_docker.sh rename to images/runners/docker_x86_64/scripts/run_docker.sh diff --git a/runners/qemu_x86_64/BUILD b/images/runners/qemu_x86_64/BUILD similarity index 66% rename from runners/qemu_x86_64/BUILD rename to images/runners/qemu_x86_64/BUILD index 5c60ebbced..52ddaba0f2 100644 --- a/runners/qemu_x86_64/BUILD +++ b/images/runners/qemu_x86_64/BUILD @@ -14,16 +14,16 @@ load("@rules_shell//shell:sh_binary.bzl", "sh_binary") load("@score_itf//:defs.bzl", "py_itf_test") -sh_binary( - name = "qemu_x86_64", - srcs = ["scripts/run_qemu.sh"], - args = [ - "$(location @toolchains_qnx_sdp//:host_dir)", - "$(location //:image)", - ], - data = [ - "//:image", - "@toolchains_qnx_sdp//:host_all", - "@toolchains_qnx_sdp//:host_dir", - ], -) +# sh_binary( +# name = "qemu_x86_64", +# srcs = ["scripts/run_qemu.sh"], +# args = [ +# "$(location @toolchains_qnx_sdp//:host_dir)", +# "$(location //:image)", +# ], +# data = [ +# "//:image", +# "@toolchains_qnx_sdp//:host_all", +# "@toolchains_qnx_sdp//:host_dir", +# ], +# ) diff --git a/images/runners/qemu_x86_64/scripts/BUILD b/images/runners/qemu_x86_64/scripts/BUILD new file mode 100644 index 0000000000..1ba1d2b847 --- /dev/null +++ b/images/runners/qemu_x86_64/scripts/BUILD @@ -0,0 +1 @@ +exports_files(["run_qemu.sh"]) \ No newline at end of file diff --git a/images/qnx_x86_64/scripts/qnx_wireshark.sh b/images/runners/qemu_x86_64/scripts/qnx_wireshark.sh similarity index 100% rename from images/qnx_x86_64/scripts/qnx_wireshark.sh rename to images/runners/qemu_x86_64/scripts/qnx_wireshark.sh diff --git a/runners/qemu_x86_64/scripts/run_qemu.sh b/images/runners/qemu_x86_64/scripts/run_qemu.sh similarity index 100% rename from runners/qemu_x86_64/scripts/run_qemu.sh rename to images/runners/qemu_x86_64/scripts/run_qemu.sh diff --git a/images/qnx_x86_64/scripts/run_qemu_portforward.sh b/images/runners/qemu_x86_64/scripts/run_qemu_portforward.sh similarity index 100% rename from images/qnx_x86_64/scripts/run_qemu_portforward.sh rename to images/runners/qemu_x86_64/scripts/run_qemu_portforward.sh diff --git a/images/score.sh b/images/score.sh new file mode 100755 index 0000000000..e008b192b8 --- /dev/null +++ b/images/score.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash + +# ================== CONFIG ================== +# Each entry: "Description|command to execute" +mEntries=( + "Run QNX x86_64 QEMU | bazel run --config qnx-x86_64 //qnx_x86_64:run" + "Run Linux x86_64 Docker | bazel run --config linux-x86_64 //linux_x86_64:run" + "Exit|exit 0" +) + +# ================== INTERNAL ================== +mDescriptions=() +mCommands=() + +for mEntry in "${mEntries[@]}"; do + mDescriptions+=("${mEntry%%|*}") + mCommands+=("${mEntry#*|}") +done + +mSelected=0 +mCount=${#mDescriptions[@]} + +draw_menu() { + clear + echo "Use ↑ ↓ to navigate, Enter to run, q to quit" + echo + + for i in "${!mDescriptions[@]}"; do + if [[ $i -eq $mSelected ]]; then + printf " \e[7m %s \e[0m\n" "${mDescriptions[$i]}" + else + printf " %s\n" "${mDescriptions[$i]}" + fi + done +} + +run_selected() { + clear + echo "▶ ${mDescriptions[$mSelected]}" + echo + + eval "${mCommands[$mSelected]}" +} + +# ================== LOOP ================== +while true; do + draw_menu + + IFS= read -rsn1 mKey + case "$mKey" in + $'\x1b') + read -rsn2 mKey + case "$mKey" in + "[A") ((mSelected = (mSelected - 1 + mCount) % mCount)) ;; + "[B") ((mSelected = (mSelected + 1) % mCount)) ;; + esac + ;; + "") + run_selected + exit $? + ;; + q) + exit 0 + ;; + esac +done diff --git a/showcases/BUILD b/images/showcases/BUILD similarity index 100% rename from showcases/BUILD rename to images/showcases/BUILD diff --git a/showcases/cli/BUILD b/images/showcases/cli/BUILD similarity index 100% rename from showcases/cli/BUILD rename to images/showcases/cli/BUILD diff --git a/showcases/cli/main.rs b/images/showcases/cli/main.rs similarity index 100% rename from showcases/cli/main.rs rename to images/showcases/cli/main.rs diff --git a/showcases/kyron/BUILD b/images/showcases/kyron/BUILD similarity index 100% rename from showcases/kyron/BUILD rename to images/showcases/kyron/BUILD diff --git a/showcases/kyron/kyron.score.json b/images/showcases/kyron/kyron.score.json similarity index 100% rename from showcases/kyron/kyron.score.json rename to images/showcases/kyron/kyron.score.json diff --git a/showcases/kyron/main.rs b/images/showcases/kyron/main.rs similarity index 100% rename from showcases/kyron/main.rs rename to images/showcases/kyron/main.rs diff --git a/showcases/orchestration_persistency/BUILD b/images/showcases/orchestration_persistency/BUILD similarity index 100% rename from showcases/orchestration_persistency/BUILD rename to images/showcases/orchestration_persistency/BUILD diff --git a/showcases/orchestration_persistency/main.rs b/images/showcases/orchestration_persistency/main.rs similarity index 100% rename from showcases/orchestration_persistency/main.rs rename to images/showcases/orchestration_persistency/main.rs diff --git a/showcases/orchestration_persistency/orch_per.score.json b/images/showcases/orchestration_persistency/orch_per.score.json similarity index 100% rename from showcases/orchestration_persistency/orch_per.score.json rename to images/showcases/orchestration_persistency/orch_per.score.json diff --git a/showcases/standalone/BUILD b/images/showcases/standalone/BUILD similarity index 100% rename from showcases/standalone/BUILD rename to images/showcases/standalone/BUILD diff --git a/runners/qemu_x86_64/scripts/qnx_wireshark.sh b/runners/qemu_x86_64/scripts/qnx_wireshark.sh deleted file mode 100755 index 2b6f3822f8..0000000000 --- a/runners/qemu_x86_64/scripts/qnx_wireshark.sh +++ /dev/null @@ -1,276 +0,0 @@ -#!/bin/bash - -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -# QNX Network Trace Collection Script -# Provides easy integration between QNX tcpdump and Wireshark - -set -euo pipefail - -# Configuration -QNX_HOST=${QNX_HOST:-localhost} -SSH_PORT=${SSH_PORT:-2222} -CAPTURE_PORT=${CAPTURE_PORT:-9999} -SSH_USER=${SSH_USER:-root} -SSH_OPTIONS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=10" - -usage() { - echo "QNX Network Trace Collection for Wireshark" - echo "===========================================" - echo "" - echo "Usage: $0 [command] [options]" - echo "" - echo "Commands:" - echo " capture [filter] - Start local packet capture and save to file" - echo " stream [filter] - Start real-time streaming to Wireshark" - echo " wireshark [filter] - Launch Wireshark with live capture" - echo " list - List captured files on QNX system" - echo " download [file] - Download capture file from QNX" - echo " status - Show capture status on QNX" - echo " stop - Stop all captures on QNX" - echo " help - Show this help" - echo "" - echo "Filter examples:" - echo " \"tcp port 22\" - SSH traffic only" - echo " \"icmp\" - Ping traffic only" - echo " \"tcp\" - All TCP traffic" - echo " \"host 10.0.2.2\" - Traffic to/from host gateway" - echo "" - echo "Environment variables:" - echo " QNX_HOST=$QNX_HOST # QNX system IP/hostname" - echo " SSH_PORT=$SSH_PORT # SSH port (forwarded)" - echo " CAPTURE_PORT=$CAPTURE_PORT # Packet streaming port (forwarded)" - echo " SSH_USER=$SSH_USER # SSH username" - echo "" - echo "Prerequisites:" - echo " - QNX system running with SSH access" - echo " - Port forwarding configured: localhost:$SSH_PORT -> guest:22" - echo " - Port forwarding configured: localhost:$CAPTURE_PORT -> guest:9999" - echo " - Wireshark installed on host system" -} - -check_qnx_connection() { - echo "Checking QNX connection..." - if ! ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "echo 'QNX connection successful'" >/dev/null 2>&1; then - echo "Error: Cannot connect to QNX system at $SSH_USER@$QNX_HOST:$SSH_PORT" - echo "Please ensure:" - echo " 1. QNX system is running" - echo " 2. SSH is working: ssh -p $SSH_PORT $SSH_USER@$QNX_HOST" - echo " 3. Port forwarding is configured correctly" - return 1 - fi - echo "✓ QNX connection verified" -} - -check_network_capture_tool() { - echo "Checking network capture tool on QNX..." - if ! ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "test -x /etc/network_capture" 2>/dev/null; then - echo "Error: network_capture tool not found on QNX system" - echo "Please ensure the QNX image includes the network capture script" - return 1 - fi - echo "✓ Network capture tool available" -} - -check_wireshark() { - if ! command -v wireshark >/dev/null 2>&1; then - echo "Warning: Wireshark not found on host system" - echo "To install Wireshark:" - echo " Ubuntu/Debian: sudo apt install wireshark" - echo " RHEL/CentOS: sudo yum install wireshark" - echo " macOS: brew install wireshark" - return 1 - fi - echo "✓ Wireshark available" - return 0 -} - -case "${1:-help}" in - capture) - FILTER="${2:-}" - - check_qnx_connection - check_network_capture_tool - - echo "" - echo "Starting packet capture on QNX system..." - if [ -n "$FILTER" ]; then - echo "Filter: $FILTER" - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture start '$FILTER'" - else - echo "Filter: none (all packets)" - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture start" - fi - - echo "" - echo "Capture started on QNX system" - echo "To stop: $0 stop" - echo "To check status: $0 status" - echo "To list files: $0 list" - ;; - - stream) - FILTER="${2:-}" - - check_qnx_connection - check_network_capture_tool - - echo "" - echo "Starting real-time packet streaming from QNX..." - if [ -n "$FILTER" ]; then - echo "Filter: $FILTER" - else - echo "Filter: none (all packets)" - fi - echo "Stream endpoint: localhost:$CAPTURE_PORT" - echo "" - echo "Starting stream on QNX system..." - - # Start streaming on QNX in background - if [ -n "$FILTER" ]; then - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream '$FILTER'" & - else - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream" & - fi - - QNX_STREAM_PID=$! - - echo "QNX streaming started (PID: $QNX_STREAM_PID)" - echo "" - echo "To capture in Wireshark:" - echo " 1. Open Wireshark" - echo " 2. Go to Capture -> Options" - echo " 3. Click 'Manage Interfaces'" - echo " 4. Go to 'Remote Interfaces' tab" - echo " 5. Add interface: TCP@localhost:$CAPTURE_PORT" - echo " 6. Start capture" - echo "" - echo "Or use: $0 wireshark" - echo "" - echo "Press Ctrl+C to stop streaming" - - # Wait for stream process - trap 'echo ""; echo "Stopping stream..."; kill $QNX_STREAM_PID 2>/dev/null; ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" 2>/dev/null; exit 0' INT TERM - wait $QNX_STREAM_PID - ;; - - wireshark) - FILTER="${2:-}" - - check_qnx_connection - check_network_capture_tool - - if ! check_wireshark; then - exit 1 - fi - - echo "" - echo "Launching Wireshark with QNX live capture..." - if [ -n "$FILTER" ]; then - echo "Filter: $FILTER" - else - echo "Filter: none (all packets)" - fi - - # Start streaming on QNX - echo "Starting packet stream on QNX..." - if [ -n "$FILTER" ]; then - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream '$FILTER'" & - else - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream" & - fi - - QNX_STREAM_PID=$! - - # Give stream time to start - sleep 3 - - echo "Launching Wireshark..." - # Launch Wireshark with remote capture - wireshark -k -i TCP@localhost:$CAPTURE_PORT & - WIRESHARK_PID=$! - - echo "" - echo "Wireshark launched (PID: $WIRESHARK_PID)" - echo "QNX streaming (PID: $QNX_STREAM_PID)" - echo "" - echo "Press Ctrl+C to stop both Wireshark and QNX streaming" - - # Wait and cleanup - trap 'echo ""; echo "Stopping Wireshark and QNX stream..."; kill $WIRESHARK_PID $QNX_STREAM_PID 2>/dev/null; ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" 2>/dev/null; exit 0' INT TERM - - # Wait for either process to end - wait $WIRESHARK_PID 2>/dev/null || wait $QNX_STREAM_PID 2>/dev/null - - # Cleanup remaining processes - kill $QNX_STREAM_PID $WIRESHARK_PID 2>/dev/null || true - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" 2>/dev/null || true - ;; - - list) - check_qnx_connection - check_network_capture_tool - - echo "Listing capture files on QNX system..." - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture list" - ;; - - download) - FILENAME="${2:-}" - - if [ -z "$FILENAME" ]; then - echo "Error: Filename required" - echo "Usage: $0 download " - echo "Use '$0 list' to see available files" - exit 1 - fi - - check_qnx_connection - - echo "Downloading capture file from QNX..." - echo "Remote file: /tmp_ram/capture/$FILENAME" - echo "Local file: ./$FILENAME" - - if scp $SSH_OPTIONS -P "$SSH_PORT" "$SSH_USER@$QNX_HOST:/tmp_ram/capture/$FILENAME" "./$FILENAME"; then - echo "✓ File downloaded successfully" - echo "" - echo "To analyze in Wireshark:" - echo " wireshark ./$FILENAME" - else - echo "✗ Download failed" - exit 1 - fi - ;; - - status) - check_qnx_connection - check_network_capture_tool - - echo "QNX network capture status:" - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture status" - ;; - - stop) - check_qnx_connection - check_network_capture_tool - - echo "Stopping all network captures on QNX..." - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" - echo "✓ All captures stopped" - ;; - - help|*) - usage - ;; -esac diff --git a/runners/qemu_x86_64/scripts/run_qemu_portforward.sh b/runners/qemu_x86_64/scripts/run_qemu_portforward.sh deleted file mode 100755 index e523bc969a..0000000000 --- a/runners/qemu_x86_64/scripts/run_qemu_portforward.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -set -euo pipefail - -QNX_HOST=$1 - -IFS_IMAGE=$2 - -qemu-system-x86_64 \ - -smp 2 \ - --enable-kvm \ - -cpu Cascadelake-Server-v5 \ - -m 1G \ - -pidfile /tmp/qemu.pid \ - -nographic \ - -kernel "${IFS_IMAGE}" \ - -serial mon:stdio \ - -object rng-random,filename=/dev/urandom,id=rng0 \ - -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80,hostfwd=tcp::8443-:443,hostfwd=tcp::9999-:9999 \ - -device virtio-net-pci,netdev=net0 \ - -device virtio-rng-pci,rng=rng0 From 5b2feb3cfd5a76fadb53a90001194657040c325d Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Mon, 9 Feb 2026 09:12:01 +0100 Subject: [PATCH 14/22] Port EB Corbos --- images/.bazelrc | 4 +++ images/MODULE.bazel | 8 ----- .../score_gcc_toolchains.MODULE.bazel | 36 +++++++++++++++++++ .../bazel_common/score_modules.MODULE.bazel | 12 ++++++- images/ebclfsa_aarch64/README.md | 2 +- .../scrample_integration/BUILD | 4 +-- images/score.sh | 1 + 7 files changed, 55 insertions(+), 12 deletions(-) diff --git a/images/.bazelrc b/images/.bazelrc index 1496a52386..26eb4854eb 100644 --- a/images/.bazelrc +++ b/images/.bazelrc @@ -32,3 +32,7 @@ build:linux-x86_64 --config=_common build:linux-x86_64 --extra_toolchains=@score_gcc_x86_64_toolchain//:x86_64-linux-gcc_12.2.0-posix build:linux-x86_64 --platforms=@score_bazel_platforms//:x86_64-linux-gcc_12.2.0-posix +build:eb-aarch64 --config=_common +build:eb-aarch64 --extra_toolchains=@gcc_toolchain//:aarch64_gcc_13 +build:eb-aarch64 --platforms=@score_toolchains_gcc//platforms:aarch64-linux +build:eb-aarch64 --spawn_strategy=local diff --git a/images/MODULE.bazel b/images/MODULE.bazel index e74390e917..3725e8e71e 100644 --- a/images/MODULE.bazel +++ b/images/MODULE.bazel @@ -68,11 +68,3 @@ toolchains_qnx.sdp( ) use_repo(toolchains_qnx, "toolchains_qnx_sdp") use_repo(toolchains_qnx, "toolchains_qnx_ifs") - - -register_toolchains("@score_qcc_x86_64_toolchain//:x86_64-qnx-sdp_8.0.0-posix") -register_toolchains("@toolchains_qnx_ifs//:ifs_x86_64") -# register_toolchains("@gcc_toolchain//:all") -register_toolchains("@score_toolchains_rust//toolchains/ferrocene:ferrocene_x86_64_pc_nto_qnx800") -register_toolchains("@score_toolchains_rust//toolchains/ferrocene:ferrocene_x86_64_unknown_linux_gnu") -register_toolchains("@score_gcc_x86_64_toolchain//:x86_64-linux-gcc_12.2.0-posix") \ No newline at end of file diff --git a/images/bazel_common/score_gcc_toolchains.MODULE.bazel b/images/bazel_common/score_gcc_toolchains.MODULE.bazel index 1771b1c79d..d8fee2cd96 100644 --- a/images/bazel_common/score_gcc_toolchains.MODULE.bazel +++ b/images/bazel_common/score_gcc_toolchains.MODULE.bazel @@ -23,6 +23,42 @@ gcc.toolchain( version = "12.2.0", ) +# This is how new gcc more or less shall be registered: TBD by EB +# gcc.sdp( +# name = "fastdev_sdk", +# url = "https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc/releases/download/0.5.0-beta/fastdev-sdk-ubuntu-ebclfsa-ebcl-qemuarm64.tar.gz", +# strip_prefix = "fastdev-sdk-ubuntu-ebclfsa-ebcl-qemuarm64", +# sha256 = "05b57bbc8d99d46df6b57f774c39a5a2664964ea7eb94147cbece08508c1f121", +# build_file = "//ebclfsa_aarch64/toolchain:gcc.BUILD", +# ) +# gcc.toolchain( +# name = "score_ebclfsa_aarch64_toolchain", +# sdp_to_link = "fastdev_sdk", +# target_os = "linux", +# target_cpu = "aarch64", +# version = "12.2.0", +# extra_link_flags = [ +# "-lpthread", +# ] +# ) + +# Workaround until above is fixed +bazel_dep(name = "score_toolchains_gcc", dev_dependency=True) +git_override( # Elektrobit corbos Linux for Safety Applications needs a specific toolchain + module_name = "score_toolchains_gcc", + remote = "https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc.git", + tag = "0.5.0-beta" # corresponds to git sha 158921ffd9aabef41a2a03bca5baeaa9f4aa9d33 +) +eb = use_extension("@score_toolchains_gcc//extensions:gcc.bzl", "gcc", dev_dependency=True) +eb.toolchain( + url = "https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc/releases/download/0.5.0-beta/fastdev-sdk-ubuntu-ebclfsa-ebcl-qemuarm64.tar.gz", + sha256 = "05b57bbc8d99d46df6b57f774c39a5a2664964ea7eb94147cbece08508c1f121", + strip_prefix = "fastdev-sdk-ubuntu-ebclfsa-ebcl-qemuarm64", +) + +use_repo(eb, "gcc_toolchain", "gcc_toolchain_gcc") + + use_repo( gcc, "score_gcc_x86_64_toolchain", diff --git a/images/bazel_common/score_modules.MODULE.bazel b/images/bazel_common/score_modules.MODULE.bazel index ec23c2098f..ed2d39c312 100644 --- a/images/bazel_common/score_modules.MODULE.bazel +++ b/images/bazel_common/score_modules.MODULE.bazel @@ -1,5 +1,5 @@ bazel_dep(name = "score_baselibs", version = "0.1.3") -bazel_dep(name = "score_communication", version = "0.1.1") # EB needs 0.1.2 but others does not work with it +bazel_dep(name = "score_communication", version = "0.1.1",) # EB needs 0.1.2 but others does not work with it bazel_dep(name = "score_persistency", version = "0.2.1") bazel_dep(name = "score_scrample", version = "0.1.0") bazel_dep(name = "score_orchestrator") @@ -20,4 +20,14 @@ git_override( module_name = "score_persistency", remote = "https://github.com/eclipse-score/persistency.git", commit = "0037034bf853e5f955f028fab54ed319fb0441c3", +) + + +single_version_override( + module_name = "score_baselibs", + version = "0.1.3", + patch_strip = 1, + patches = [ + "//ebclfsa_aarch64/patches:fix_hard_coded_amd64.patch", + ], ) \ No newline at end of file diff --git a/images/ebclfsa_aarch64/README.md b/images/ebclfsa_aarch64/README.md index 992639072e..a7b6fa45dc 100644 --- a/images/ebclfsa_aarch64/README.md +++ b/images/ebclfsa_aarch64/README.md @@ -224,7 +224,7 @@ The demo SDK integrates the [S-CORE toolchain with two extensions](https://githu - Additional tooling for AArch64 cross-building. - Additional tool `lisa-elf-enabler`: It marks an ELF header of an application in a way that Linux for Safety Applications detects it as an HI application. - The tool is available to Bazel via `@gcc_toolchain_gcc//:elf-enabler`. + The tool is available to Bazel via `@eb_toolchain_gcc//:elf-enabler`. ### Bazel Rules for the Example Applications diff --git a/images/ebclfsa_aarch64/scrample_integration/BUILD b/images/ebclfsa_aarch64/scrample_integration/BUILD index a8393c3dda..84fe2cfa9f 100644 --- a/images/ebclfsa_aarch64/scrample_integration/BUILD +++ b/images/ebclfsa_aarch64/scrample_integration/BUILD @@ -13,7 +13,7 @@ load("@score_baselibs//score/language/safecpp:toolchain_features.bzl", "COMPILER_WARNING_FEATURES") genrule( - name = "scrample_sil", + name = "scrample_sil_r", srcs = ["@score_scrample//src:scrample"], outs = ["scrample_sil"], cmd = "cp $(SRCS) $@ && \ @@ -27,7 +27,7 @@ genrule( name = "hi_app", srcs = [ ":scrample_sil_wrapper", - ":scrample_sil" + ":scrample_sil_r" ], outs = ["hi_app"], cmd = "cp $(location :scrample_sil_wrapper) $@ && \ diff --git a/images/score.sh b/images/score.sh index e008b192b8..52d5ec6022 100755 --- a/images/score.sh +++ b/images/score.sh @@ -5,6 +5,7 @@ mEntries=( "Run QNX x86_64 QEMU | bazel run --config qnx-x86_64 //qnx_x86_64:run" "Run Linux x86_64 Docker | bazel run --config linux-x86_64 //linux_x86_64:run" + "Run Elektrobit Corbos aarch64 QEMU | bazel build --config eb-aarch64 //ebclfsa_aarch64/scrample_integration:run" "Exit|exit 0" ) From cef74277ba68f9dbf2c918630f18b476cc7323c8 Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Mon, 9 Feb 2026 13:35:21 +0100 Subject: [PATCH 15/22] Move autosd --- images/.bazelrc | 7 + images/autosd/BUILD.bazel | 34 +++++ images/autosd/build/.gitignore | 6 + images/autosd/build/README.md | 96 ++++++++++++++ .../build/files/bluechi-agent-main.conf | 15 +++ .../autosd/build/files/bluechi-agent-qm.conf | 15 +++ .../build/files/bluechi-controller.conf | 26 ++++ .../autosd/build/files/lola-ipc-pub.service | 26 ++++ .../autosd/build/files/lola-ipc-sub.service | 26 ++++ images/autosd/build/files/lola-ipc-test | 40 ++++++ .../autosd/build/files/lola-ipc-test.service | 21 +++ images/autosd/build/image.aib.yml | 120 ++++++++++++++++++ images/autosd/build/scripts/run_qemu | 27 ++++ images/autosd/build/vars-devel.yml | 14 ++ images/autosd/build/vars.yml | 14 ++ images/autosd/patches/BUILD | 0 .../baselibs/0001-RH-exception-header.patch | 12 ++ .../baselibs/0002-RH-algorithm-header.patch | 36 ++++++ images/autosd/patches/baselibs/BUILD | 0 .../0001-example-visibility.patch | 55 ++++++++ .../score_basic_tools.MODULE.bazel | 7 + .../score_gcc_toolchains.MODULE.bazel | 23 +++- 22 files changed, 619 insertions(+), 1 deletion(-) create mode 100644 images/autosd/BUILD.bazel create mode 100644 images/autosd/build/.gitignore create mode 100644 images/autosd/build/README.md create mode 100644 images/autosd/build/files/bluechi-agent-main.conf create mode 100644 images/autosd/build/files/bluechi-agent-qm.conf create mode 100644 images/autosd/build/files/bluechi-controller.conf create mode 100644 images/autosd/build/files/lola-ipc-pub.service create mode 100644 images/autosd/build/files/lola-ipc-sub.service create mode 100755 images/autosd/build/files/lola-ipc-test create mode 100644 images/autosd/build/files/lola-ipc-test.service create mode 100644 images/autosd/build/image.aib.yml create mode 100755 images/autosd/build/scripts/run_qemu create mode 100644 images/autosd/build/vars-devel.yml create mode 100644 images/autosd/build/vars.yml create mode 100644 images/autosd/patches/BUILD create mode 100644 images/autosd/patches/baselibs/0001-RH-exception-header.patch create mode 100644 images/autosd/patches/baselibs/0002-RH-algorithm-header.patch create mode 100644 images/autosd/patches/baselibs/BUILD create mode 100644 images/autosd/patches/communication/0001-example-visibility.patch diff --git a/images/.bazelrc b/images/.bazelrc index 26eb4854eb..119db2e912 100644 --- a/images/.bazelrc +++ b/images/.bazelrc @@ -36,3 +36,10 @@ build:eb-aarch64 --config=_common build:eb-aarch64 --extra_toolchains=@gcc_toolchain//:aarch64_gcc_13 build:eb-aarch64 --platforms=@score_toolchains_gcc//platforms:aarch64-linux build:eb-aarch64 --spawn_strategy=local + + +build:autosd-x86_64 --config=_common +build:autosd-x86_64 --platforms=@score_bazel_platforms//:x86_64-linux +build:autosd-x86_64 --force_pic +build:autosd-x86_64 --extra_toolchains=@autosd_10_gcc_repo//:gcc_toolchain_linux_x86_64 +build:autosd-x86_64 --extra_toolchains=@rules_rpm//toolchains:linux_x86_64 diff --git a/images/autosd/BUILD.bazel b/images/autosd/BUILD.bazel new file mode 100644 index 0000000000..82e9bd66d0 --- /dev/null +++ b/images/autosd/BUILD.bazel @@ -0,0 +1,34 @@ +# ******************************************************************************* +# Copyright (c) 2024 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +load("@rules_rpm//rpm:defs.bzl", "rpm_package") + +# TODO: Shall use targets from use-cases +# Bring back files once we cleanup scrample integration soon +rpm_package( + name = "lola-demo", + binaries = [ + "@score_scrample//src:scrample", + ], + config_dir = "/etc/lola", + # data = [ + # "@score_communication//score/mw/com/example/ipc_bridge:etc/mw_com_config.json", + # ], + data_dir = "/usr/share/lola/examples", + description = "LOLA middleware communication libraries for development including core communication, configuration components, and example client/server binaries for testing", + # libraries = [ + # "@score_communication//score/mw/com:com", + # "@score_communication//score/mw/com:config_schema", + # ], + summary = "LOLA Demo", + version = "1.0.0", +) diff --git a/images/autosd/build/.gitignore b/images/autosd/build/.gitignore new file mode 100644 index 0000000000..5c103a0641 --- /dev/null +++ b/images/autosd/build/.gitignore @@ -0,0 +1,6 @@ +_build/ +outputs/ +auto-image-builder.sh + +*.qcow2 +*.img diff --git a/images/autosd/build/README.md b/images/autosd/build/README.md new file mode 100644 index 0000000000..744b67fe7a --- /dev/null +++ b/images/autosd/build/README.md @@ -0,0 +1,96 @@ +AutoSD MCO LoLa Demo +==================== + +## Background and Basic Info + +This demo build an AutoSD image using [Automotive-Image-Builder](https://gitlab.com/CentOS/automotive/src/automotive-image-builder). +This image comes pre-populated with the S-core's [communication](https://github.com/eclipse-score/communication) project packaged as RPM in a [COPR](https://copr.fedorainfracloud.org/coprs/pingou/score-playground/) repository as well as the [QM](https://github.com/containers/qm) project. + +The image is pre-configured to allow the communication project to send and receive messages within the root partition but also between the root partition and the QM partition. + + +Some things to know about this demo: +- The RPM packaging, currently, doesn't rely on Bazel. This is something that is being fixed, but in the current stage it is not there yet. +- Baselibs and communication have had to get some patches, some of which have already been sent upstream: + - Missing headers: https://github.com/eclipse-score/communication/pull/64 + - Missing headers: https://github.com/eclipse-score/baselibs/pull/19 + - Compilation issues on newer GCC + support for Linux ARM64: https://github.com/eclipse-score/baselibs/pull/22 + - Fix dangling references and compiler warnings for newer GCC: https://github.com/eclipse-score/communication/pull/68 + - Fix Google benchmark main function scope: https://github.com/eclipse-score/communication/pull/67 +- Other changes have not yet been sent upstream: + - Add the ability to configure the path where communication opens the shared memory segments: https://github.com/eclipse-score/communication/commit/127a64f07f48e1d69783dc20f217da813115dbe6 (not the final version of this change) + +The goal of this last commit is to avoid having to mount the entire `/dev/shm` into the QM partition and instead mount just a subfolder: `/dev/shm/lola_qm`. + + +## Building It + +A linux system is required to build this image but Ubuntu +and an OCI compliant container manager (docker, podman) should be enough. + +Download the builder script: + +``` +$ curl -o auto-image-builder.sh \ + "https://gitlab.com/CentOS/automotive/src/automotive-image-builder/-/raw/main/auto-image-builder.sh" +$ chmod +x automotive-image-builder +``` + +Build a qemu image by running: + +``` +sudo ./auto-image-builder.sh build \ +--define-file vars.yml \ +--define-file vars-devel.yml \ +--target qemu \ +--export qcow2 \ +--distro autosd10 lola-demo.aib.yml \ +autosd10-lola-x86_64.qcow2 +``` + +Change the image perms (if needed) since `sudo` was used: + +``` +sudo chown $(logname) autosd10-lola-x86_64.qcow2 +``` + +## Running/Testing the Demo + +You can run the qcow2 image with your qemu tool of choice and login into the image (either directly or over ssh) +with `root / password` (developer access defined by `vars-devel`). + +The image contains Systemd service defintions for LoLa, in both host and QM environemnts: + +- lola-ipc-sub.service +- lola-ipc-pub.service + +They can be used in the same environment or between them, to exemplify its mixed critical orchestration integration. + +For example, to run the publisher in the host environment while receiving messages in the QM one: + + +Start the subscriber in the QM partition: + +``` +# start the service +podman exec -it qm systemctl start lola-ipc-sub + +# check status +podman exec -it qm systemctl status lola-ipc-sub + +# get logs +podman exec -it qm journalctl -u lola-ipc-sub.service +``` + + +Start a publisher in the host environment: + +``` +systemctl start lola-ipc-pub +``` + +Check the QM process logs again with: + +``` +podman exec -it qm journalctl -u lola-ipc-sub.service +``` diff --git a/images/autosd/build/files/bluechi-agent-main.conf b/images/autosd/build/files/bluechi-agent-main.conf new file mode 100644 index 0000000000..63a52a150c --- /dev/null +++ b/images/autosd/build/files/bluechi-agent-main.conf @@ -0,0 +1,15 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +[bluechi-agent] +NodeName=agent-main +ControllerAddress=unix:path=/run/bluechi/bluechi.sock diff --git a/images/autosd/build/files/bluechi-agent-qm.conf b/images/autosd/build/files/bluechi-agent-qm.conf new file mode 100644 index 0000000000..ec97e88021 --- /dev/null +++ b/images/autosd/build/files/bluechi-agent-qm.conf @@ -0,0 +1,15 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +[bluechi-agent] +NodeName=agent-qm +ControllerAddress=unix:path=/run/bluechi/bluechi.sock diff --git a/images/autosd/build/files/bluechi-controller.conf b/images/autosd/build/files/bluechi-controller.conf new file mode 100644 index 0000000000..de800486c7 --- /dev/null +++ b/images/autosd/build/files/bluechi-controller.conf @@ -0,0 +1,26 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +[bluechi-controller] +ControllerPort=2020 +UseTCP=true +UseUDS=true +LogLevel=DEBUG +AllowedNodeNames=agent-main,agent-qm + +[node agent-main] +Allowed=true +AllowDependenciesOn=agent-main,agent-qm + +[node agent-qm] +Allowed=true +AllowDependenciesOn=agent-main,agent-qm diff --git a/images/autosd/build/files/lola-ipc-pub.service b/images/autosd/build/files/lola-ipc-pub.service new file mode 100644 index 0000000000..8fe536b493 --- /dev/null +++ b/images/autosd/build/files/lola-ipc-pub.service @@ -0,0 +1,26 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +[Unit] +Description=LoLa IPC Publisher +After=network.target + +[Service] +Type=simple +WorkingDirectory=/usr/share/lola/examples +ExecStart=/usr/bin/ipc_bridge_cpp --mode skeleton --num-cycles 5 --cycle-time 1000 --service_instance_manifest mw_com_config.json +Restart=on-failure +RestartSec=5 +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/images/autosd/build/files/lola-ipc-sub.service b/images/autosd/build/files/lola-ipc-sub.service new file mode 100644 index 0000000000..d1a108ec78 --- /dev/null +++ b/images/autosd/build/files/lola-ipc-sub.service @@ -0,0 +1,26 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +[Unit] +Requires=bluechi-proxy@agent-main_lola-ipc-pub.service +Description=LoLa IPC Subscriber +After=network.target + +[Service] +WorkingDirectory=/usr/share/lola/examples +ExecStart=/usr/bin/ipc_bridge_cpp --mode proxy --num-cycles 5 --cycle-time 1000 --service_instance_manifest mw_com_config.json +Restart=on-failure +RestartSec=5 +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/images/autosd/build/files/lola-ipc-test b/images/autosd/build/files/lola-ipc-test new file mode 100755 index 0000000000..6ec3e45772 --- /dev/null +++ b/images/autosd/build/files/lola-ipc-test @@ -0,0 +1,40 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +#!/bin/bash +set -e + +BOOTSTRAP=${1:-false} +BOOSTRAP=$(echo "${BOOTSTRAP}" | tr '[:upper:]' '[:lower:]') + +if [[ "${BOOTSTRAP}" == "true" ]]; then + podman exec -it qm systemctl start lola-ipc-sub.service + systemctl start lola-ipc-pub.service + + sleep 60 +fi + +# check publisher logs +journalctl -u lola-ipc-pub | cat | grep -qE 'Sending sample: [0-9]+' +if [ "$?" -ne "0" ]; then + echo Could not match 'Sending sample: [0-9]+' from lola-ipc-pub.service logs. + exit $? +fi + +# check subscriber logs +podman exec -it qm journalctl -u lola-ipc-sub.service | cat | grep -qE 'Received sample: [0-9]+' +if [ "$?" -ne "0" ]; then + echo Could not match 'Received sample: [0-9]+' from lola-ipc-sub.service logs + exit $? +fi + +exit 0 diff --git a/images/autosd/build/files/lola-ipc-test.service b/images/autosd/build/files/lola-ipc-test.service new file mode 100644 index 0000000000..428a8b19ce --- /dev/null +++ b/images/autosd/build/files/lola-ipc-test.service @@ -0,0 +1,21 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +[Unit] +Requires=bluechi-proxy@agent-qm_lola-ipc-sub.service +Requires=bluechi-proxy@agent-main_lola-ipc-pub.service +After=proxy@agent-main_lola-ipc-pub.service + +[Service] +Type=oneshot +ExecStart=/bin/bash /usr/bin/lola-ipc-test +RemainAfterExit=yes diff --git a/images/autosd/build/image.aib.yml b/images/autosd/build/image.aib.yml new file mode 100644 index 0000000000..0e673538c9 --- /dev/null +++ b/images/autosd/build/image.aib.yml @@ -0,0 +1,120 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +# +name: score-autosd + +image: + selinux_mode: permissive +content: + enable_repos: + - devel + repos: + - id: epel + baseurl: https://dl.fedoraproject.org/pub/epel/10/Everything/$arch/ + - id: score + baseurl: file:///host/rpms + rpms: + - vim-enhanced + - gdb + - strace + - boost-devel + - tree + - dnf + # For testing the image only: + - openssh-server + - openssh-clients + # bluechi packages + - bluechi-selinux + - bluechi-controller + - bluechi-agent + - bluechi-ctl + # score + - lola-demo + + make_dirs: + - path: /etc/containers/systemd/qm.container.d + mode: 0755 + parents: true + exist_ok: true + + # Configure shared socket directory via tmpfiles + add_files: + - path: /usr/lib/tmpfiles.d/lola_disc.conf + text: | + # Lola service discovery folder + D! /tmp/mw_com_lola 0755 root root + - path: /etc/containers/systemd/qm.container.d/10-lola-ipc.conf + text: | + # Mount shared IPC directory for lola + [Container] + Volume=/dev/shm:/dev/shm + Volume=/tmp/mw_com_lola:/tmp/mw_com_lola + - path: /etc/containers/systemd/qm.container.d/11-bluechi-socket.conf + text: | + [Container] + Volume=/run/bluechi:/run/bluechi + # bluechi files + - path: /etc/bluechi/controller.conf.d/0-main.conf + source_path: files/bluechi-controller.conf + - path: /etc/bluechi/agent.conf.d/0-main.conf + source_path: files/bluechi-agent-main.conf + # lola service files + - path: /etc/systemd/system/lola-ipc-pub.service + source_path: files/lola-ipc-pub.service + # lola test script + - path: /usr/bin/lola-ipc-test + source_path: files/lola-ipc-test + chmod_files: + - path: /usr/bin/lola-ipc-test + mode: "0755" + + # Required for testing the image only: + systemd: + enabled_services: + # Enable ssh daemon + - sshd.service + - bluechi-controller.service + - bluechi-agent.service + +qm: + memory_limit: + max: infinity + high: infinity + content: + enable_repos: + - devel + repos: + - id: epel + baseurl: https://dl.fedoraproject.org/pub/epel/10/Everything/$arch/ + - id: score + baseurl: file:///host/rpms + rpms: + - boost-devel + - bluechi-agent + - lola-demo + add_files: + # lola service files + - path: /etc/systemd/system/lola-ipc-sub.service + source_path: files/lola-ipc-sub.service + # bluechi files + - path: /etc/bluechi/agent.conf.d/0-qm.conf + source_path: files/bluechi-agent-qm.conf + systemd: + enabled_services: + - bluechi-agent + +auth: + # Required for testing the image only: + sshd_config: + PasswordAuthentication: true + PermitRootLogin: true diff --git a/images/autosd/build/scripts/run_qemu b/images/autosd/build/scripts/run_qemu new file mode 100755 index 0000000000..039b242a86 --- /dev/null +++ b/images/autosd/build/scripts/run_qemu @@ -0,0 +1,27 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* +#!/bin/bash + +/usr/bin/qemu-system-x86_64 \ +-drive file=/usr/share/OVMF/OVMF_CODE_4M.fd,if=pflash,format=raw,unit=0,readonly=on \ +-drive file=/usr/share/OVMF/OVMF_VARS_4M.fd,if=pflash,format=raw,unit=1,snapshot=on,readonly=off \ +-enable-kvm \ +-m 5G \ +-smp $(nproc) \ +-machine q35 \ +-cpu host \ +-device virtio-net-pci,netdev=n0 \ +-netdev user,id=n0,hostfwd=tcp::2222-:22 \ +-daemonize \ +-display none \ +-drive file=disk.qcow2,index=0,media=disk,format=qcow2,if=virtio,id=rootdisk,snapshot=off diff --git a/images/autosd/build/vars-devel.yml b/images/autosd/build/vars-devel.yml new file mode 100644 index 0000000000..cfebf2ebf2 --- /dev/null +++ b/images/autosd/build/vars-devel.yml @@ -0,0 +1,14 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +root_password: $6$xoLqEUz0cGGJRx01$H3H/bFm0myJPULNMtbSsOFd/2BnHqHkMD92Sfxd.EKM9hXTWSmELG8cf205l6dktomuTcgKGGtGDgtvHVXSWU. diff --git a/images/autosd/build/vars.yml b/images/autosd/build/vars.yml new file mode 100644 index 0000000000..f76998dd8f --- /dev/null +++ b/images/autosd/build/vars.yml @@ -0,0 +1,14 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +disable_ipv6: false diff --git a/images/autosd/patches/BUILD b/images/autosd/patches/BUILD new file mode 100644 index 0000000000..e69de29bb2 diff --git a/images/autosd/patches/baselibs/0001-RH-exception-header.patch b/images/autosd/patches/baselibs/0001-RH-exception-header.patch new file mode 100644 index 0000000000..d48191eab2 --- /dev/null +++ b/images/autosd/patches/baselibs/0001-RH-exception-header.patch @@ -0,0 +1,12 @@ +diff --git a/score/concurrency/clock.h b/score/concurrency/clock.h +index 0fa7719..365a003 100644 +--- a/score/concurrency/clock.h ++++ b/score/concurrency/clock.h +@@ -15,6 +15,7 @@ + + #include + #include ++#include + + namespace score + { diff --git a/images/autosd/patches/baselibs/0002-RH-algorithm-header.patch b/images/autosd/patches/baselibs/0002-RH-algorithm-header.patch new file mode 100644 index 0000000000..70fc3780a9 --- /dev/null +++ b/images/autosd/patches/baselibs/0002-RH-algorithm-header.patch @@ -0,0 +1,36 @@ +diff --git a/score/language/futurecpp/tests/member_iterator_test.cpp b/score/language/futurecpp/tests/member_iterator_test.cpp +index bea1361..6d649d2 100644 +--- a/score/language/futurecpp/tests/member_iterator_test.cpp ++++ b/score/language/futurecpp/tests/member_iterator_test.cpp +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + + #include + +diff --git a/score/language/futurecpp/tests/multi_span_test.cpp b/score/language/futurecpp/tests/multi_span_test.cpp +index 9b57903..c0da98b 100644 +--- a/score/language/futurecpp/tests/multi_span_test.cpp ++++ b/score/language/futurecpp/tests/multi_span_test.cpp +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + + #include + +diff --git a/score/mw/log/detail/logging_identifier.h b/score/mw/log/detail/logging_identifier.h +index ec02bac..b15bdfa 100644 +--- a/score/mw/log/detail/logging_identifier.h ++++ b/score/mw/log/detail/logging_identifier.h +@@ -19,6 +19,7 @@ + + #include + #include ++#include + + namespace score + { diff --git a/images/autosd/patches/baselibs/BUILD b/images/autosd/patches/baselibs/BUILD new file mode 100644 index 0000000000..e69de29bb2 diff --git a/images/autosd/patches/communication/0001-example-visibility.patch b/images/autosd/patches/communication/0001-example-visibility.patch new file mode 100644 index 0000000000..8040c2872b --- /dev/null +++ b/images/autosd/patches/communication/0001-example-visibility.patch @@ -0,0 +1,55 @@ +diff --git a/score/mw/com/example/ipc_bridge/BUILD b/score/mw/com/example/ipc_bridge/BUILD +index 2c364e1..f797762 100644 +--- a/score/mw/com/example/ipc_bridge/BUILD ++++ b/score/mw/com/example/ipc_bridge/BUILD +@@ -29,6 +29,7 @@ cc_binary( + "@score_baselibs//score/language/futurecpp", + "@score_baselibs//score/mw/log", + ], ++ visibility = ["//visibility:public"] + ) + + cc_library( +@@ -45,6 +46,7 @@ cc_library( + "//score/mw/com", + "@score_baselibs//score/mw/log", + ], ++ visibility = ["//visibility:public"] + ) + + cc_library( +@@ -60,6 +62,7 @@ cc_library( + "//score/mw/com", + "@score_baselibs//score/language/futurecpp", + ], ++ visibility = ["//visibility:public"] + ) + + rust_library( +@@ -70,6 +73,7 @@ rust_library( + "//score/mw/com/impl/rust:mw_com", + "@crate_index//:libc", + ], ++ visibility = ["//visibility:public"] + ) + + rust_binary( +@@ -84,6 +88,7 @@ rust_binary( + "@crate_index//:clap", + "@crate_index//:futures", + ], ++ visibility = ["//visibility:public"] + ) + + cc_library( +@@ -94,4 +99,10 @@ cc_library( + ":datatype", + "//score/mw/com/impl/rust:bridge_macros", + ], ++ visibility = ["//visibility:public"] ++) ++ ++exports_files( ++ ["etc/mw_com_config.json", "etc/logging.json"], ++ visibility = ["//visibility:public"] + ) diff --git a/images/bazel_common/score_basic_tools.MODULE.bazel b/images/bazel_common/score_basic_tools.MODULE.bazel index 95632f6ed0..ee685dcfbb 100644 --- a/images/bazel_common/score_basic_tools.MODULE.bazel +++ b/images/bazel_common/score_basic_tools.MODULE.bazel @@ -9,3 +9,10 @@ git_override( commit = "ff8f312cd8ac221ff7562496c7f4d6b9b5c8ebb9", ) + +bazel_dep(name = "rules_rpm", version = "0.1.0") +git_override( + module_name = "rules_rpm", + branch = "main", + remote = "https://github.com/bilelmoussaoui/bazel-rpm.git", +) diff --git a/images/bazel_common/score_gcc_toolchains.MODULE.bazel b/images/bazel_common/score_gcc_toolchains.MODULE.bazel index d8fee2cd96..5dca055929 100644 --- a/images/bazel_common/score_gcc_toolchains.MODULE.bazel +++ b/images/bazel_common/score_gcc_toolchains.MODULE.bazel @@ -56,9 +56,30 @@ eb.toolchain( strip_prefix = "fastdev-sdk-ubuntu-ebclfsa-ebcl-qemuarm64", ) -use_repo(eb, "gcc_toolchain", "gcc_toolchain_gcc") +bazel_dep(name = "os_autosd_toolchain", version = "0.0.1") +# override with git +git_override( + module_name = "os_autosd_toolchain", + remote = "https://github.com/odra/inc_os_autosd.git", + branch = "repo-new-structure", + strip_prefix = "toolchain" + +) +autosd_10_gcc = use_extension("@os_autosd_toolchain//autosd_10_gcc:extensions.bzl", "autosd_10_gcc_extension") +use_repo(autosd_10_gcc, "autosd_10_gcc_repo") + + +autosd_9_gcc = use_extension("@os_autosd_toolchain//autosd_9_gcc:extensions.bzl", "autosd_9_gcc_extension") +use_repo(autosd_9_gcc, "autosd_9_gcc_repo") + +# Register the RPM toolchain +rpm_toolchain = use_extension("@rules_rpm//toolchains:extensions.bzl", "rpm_toolchain") +use_repo(rpm_toolchain, "rpm_toolchain") + + +use_repo(eb, "gcc_toolchain", "gcc_toolchain_gcc") use_repo( gcc, "score_gcc_x86_64_toolchain", From a85887007c37e18bb9b36a7177ef36ae1e4d59ad Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Mon, 9 Feb 2026 13:37:18 +0100 Subject: [PATCH 16/22] Make structure more meangfull --- .../0001-example-visibility.patch | 55 ------------ images/ebclfsa_aarch64/patches/BUILD | 0 images/feature_integration_tests/BUILD | 0 images/score.sh | 67 --------------- {images => integration}/.bazelrc | 0 {images => integration}/.bazelversion | 0 {images => integration}/BUILD | 0 {images => integration}/MODULE.bazel | 0 .../bazel_common}/BUILD | 0 .../bazel_common/bundlers.bzl | 0 .../score_basic_tools.MODULE.bazel | 0 .../score_gcc_toolchains.MODULE.bazel | 0 .../bazel_common/score_modules.MODULE.bazel | 4 +- .../bazel_common/score_python.MODULE.bazel | 0 .../score_qnx_toolchains.MODULE.bazel | 0 .../score_rust_toolchains.MODULE.bazel | 0 .../feature_integration_tests}/BUILD | 0 .../feature_integration_tests/README.md | 0 .../feature_integration_tests/configs/BUILD | 0 .../configs}/etc/logging.json | 0 .../configs}/etc/mw_com_config.json | 0 .../configs/qemu_target_config.json | 0 .../feature_integration_tests/itf/BUILD | 0 .../itf/test_persistency.py | 0 .../itf/test_scrample.py | 0 .../feature_integration_tests/itf/test_ssh.py | 0 .../test_cases/BUILD | 0 .../test_cases/conftest.py | 0 .../test_cases/fit_scenario.py | 0 .../test_cases/pytest.ini | 0 .../test_cases/requirements.txt | 0 .../test_cases/requirements.txt.lock | 0 .../test_cases/test_properties.py | 0 .../test_orchestration_with_persistency.py | 0 .../persistency/test_multiple_kvs_per_app.py | 0 .../test_scenarios/rust/BUILD | 0 .../rust/src/internals/kyron/mod.rs | 0 .../src/internals/kyron/runtime_helper.rs | 0 .../test_scenarios/rust/src/internals/mod.rs | 0 .../src/internals/persistency/kvs_instance.rs | 0 .../internals/persistency/kvs_parameters.rs | 0 .../rust/src/internals/persistency/mod.rs | 0 .../test_scenarios/rust/src/main.rs | 0 .../rust/src/scenarios/basic/mod.rs | 0 .../basic/orchestration_with_persistency.rs | 0 .../test_scenarios/rust/src/scenarios/mod.rs | 0 .../rust/src/scenarios/persistency/mod.rs | 0 .../persistency/multiple_kvs_per_app.rs | 0 .../images}/autosd/BUILD.bazel | 0 .../images}/autosd/build/.gitignore | 0 .../images}/autosd/build/README.md | 0 .../build/files/bluechi-agent-main.conf | 0 .../autosd/build/files/bluechi-agent-qm.conf | 0 .../build/files/bluechi-controller.conf | 0 .../autosd/build/files/lola-ipc-pub.service | 0 .../autosd/build/files/lola-ipc-sub.service | 0 .../images}/autosd/build/files/lola-ipc-test | 0 .../autosd/build/files/lola-ipc-test.service | 0 .../images}/autosd/build/image.aib.yml | 0 .../images}/autosd/build/scripts/run_qemu | 0 .../images}/autosd/build/vars-devel.yml | 0 .../images}/autosd/build/vars.yml | 0 .../images}/ebclfsa_aarch64/BUILD | 0 .../images}/ebclfsa_aarch64/README.md | 0 .../docs/system_setup.drawio.png | Bin .../persistency_integration/BUILD | 0 .../persistency_integration/run_qemu.sh | 0 .../scripts/cpp_tests_persistency.sh | 0 .../scrample_integration/BUILD | 0 .../scrample_integration}/etc/logging.json | 0 .../etc/mw_com_config.json | 0 .../scrample_integration/run_qemu.sh | 0 .../scrample_integration/src/main.cc | 0 .../images}/linux_x86_64/BUILD | 0 .../images}/qnx_x86_64/BUILD | 2 +- .../images}/qnx_x86_64/build/BUILD | 30 +++---- .../images}/qnx_x86_64/build/init.build | 0 .../images}/qnx_x86_64/build/system.build | 0 .../images}/qnx_x86_64/configs/BUILD | 0 .../images}/qnx_x86_64/configs/dhcpcd.conf | 0 .../images}/qnx_x86_64/configs/group | 0 .../images}/qnx_x86_64/configs/hostname | 0 .../qnx_x86_64/configs/network_capture.sh | 0 .../qnx_x86_64/configs/network_setup.sh | 0 .../qnx_x86_64/configs/network_setup_dhcp.sh | 0 .../images}/qnx_x86_64/configs/passwd | 0 .../images}/qnx_x86_64/configs/pci_hw.cfg | 0 .../images}/qnx_x86_64/configs/pci_server.cfg | 0 .../images}/qnx_x86_64/configs/profile | 0 .../images}/qnx_x86_64/configs/qcrypto.conf | 0 .../qnx_x86_64/configs/ssh_host_rsa_key | 0 .../qnx_x86_64/configs/ssh_host_rsa_key.pub | 0 .../images}/qnx_x86_64/configs/sshd_config | 0 .../images}/qnx_x86_64/configs/startup.sh | 0 .../baselibs/0001-RH-exception-header.patch | 0 .../baselibs/0002-RH-algorithm-header.patch | 0 .../patches/baselibs}/BUILD | 0 .../baselibs}/fix_hard_coded_amd64.patch | 0 .../runners/docker_x86_64/BUILD | 0 .../runners/docker_x86_64/scripts/BUILD | 0 .../docker_x86_64/scripts/run_docker.sh | 0 .../runners/qemu_x86_64/BUILD | 0 .../runners/qemu_x86_64/scripts/BUILD | 0 .../qemu_x86_64/scripts/qnx_wireshark.sh | 0 .../runners/qemu_x86_64/scripts/run_qemu.sh | 0 .../scripts/run_qemu_portforward.sh | 0 integration/score_starter | 78 ++++++++++++++++++ {images => integration}/showcases/BUILD | 0 {images => integration}/showcases/cli/BUILD | 0 {images => integration}/showcases/cli/main.rs | 0 {images => integration}/showcases/kyron/BUILD | 0 .../showcases/kyron/kyron.score.json | 0 .../showcases/kyron/main.rs | 0 .../showcases/orchestration_persistency/BUILD | 0 .../orchestration_persistency/main.rs | 0 .../orch_per.score.json | 0 .../showcases/standalone/BUILD | 0 117 files changed, 97 insertions(+), 139 deletions(-) delete mode 100644 images/autosd/patches/communication/0001-example-visibility.patch delete mode 100644 images/ebclfsa_aarch64/patches/BUILD delete mode 100644 images/feature_integration_tests/BUILD delete mode 100755 images/score.sh rename {images => integration}/.bazelrc (100%) rename {images => integration}/.bazelversion (100%) rename {images => integration}/BUILD (100%) rename {images => integration}/MODULE.bazel (100%) rename {images/autosd/patches => integration/bazel_common}/BUILD (100%) rename {images => integration}/bazel_common/bundlers.bzl (100%) rename {images => integration}/bazel_common/score_basic_tools.MODULE.bazel (100%) rename {images => integration}/bazel_common/score_gcc_toolchains.MODULE.bazel (100%) rename {images => integration}/bazel_common/score_modules.MODULE.bazel (84%) rename {images => integration}/bazel_common/score_python.MODULE.bazel (100%) rename {images => integration}/bazel_common/score_qnx_toolchains.MODULE.bazel (100%) rename {images => integration}/bazel_common/score_rust_toolchains.MODULE.bazel (100%) rename {images/autosd/patches/baselibs => integration/feature_integration_tests}/BUILD (100%) rename {images => integration}/feature_integration_tests/README.md (100%) rename {images => integration}/feature_integration_tests/configs/BUILD (100%) rename {images/ebclfsa_aarch64/scrample_integration => integration/feature_integration_tests/configs}/etc/logging.json (100%) rename {images/ebclfsa_aarch64/scrample_integration => integration/feature_integration_tests/configs}/etc/mw_com_config.json (100%) rename {images => integration}/feature_integration_tests/configs/qemu_target_config.json (100%) rename {images => integration}/feature_integration_tests/itf/BUILD (100%) rename {images => integration}/feature_integration_tests/itf/test_persistency.py (100%) rename {images => integration}/feature_integration_tests/itf/test_scrample.py (100%) rename {images => integration}/feature_integration_tests/itf/test_ssh.py (100%) rename {images => integration}/feature_integration_tests/test_cases/BUILD (100%) rename {images => integration}/feature_integration_tests/test_cases/conftest.py (100%) rename {images => integration}/feature_integration_tests/test_cases/fit_scenario.py (100%) rename {images => integration}/feature_integration_tests/test_cases/pytest.ini (100%) rename {images => integration}/feature_integration_tests/test_cases/requirements.txt (100%) rename {images => integration}/feature_integration_tests/test_cases/requirements.txt.lock (100%) rename {images => integration}/feature_integration_tests/test_cases/test_properties.py (100%) rename {images => integration}/feature_integration_tests/test_cases/tests/basic/test_orchestration_with_persistency.py (100%) rename {images => integration}/feature_integration_tests/test_cases/tests/persistency/test_multiple_kvs_per_app.py (100%) rename {images => integration}/feature_integration_tests/test_scenarios/rust/BUILD (100%) rename {images => integration}/feature_integration_tests/test_scenarios/rust/src/internals/kyron/mod.rs (100%) rename {images => integration}/feature_integration_tests/test_scenarios/rust/src/internals/kyron/runtime_helper.rs (100%) rename {images => integration}/feature_integration_tests/test_scenarios/rust/src/internals/mod.rs (100%) rename {images => integration}/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_instance.rs (100%) rename {images => integration}/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_parameters.rs (100%) rename {images => integration}/feature_integration_tests/test_scenarios/rust/src/internals/persistency/mod.rs (100%) rename {images => integration}/feature_integration_tests/test_scenarios/rust/src/main.rs (100%) rename {images => integration}/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/mod.rs (100%) rename {images => integration}/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/orchestration_with_persistency.rs (100%) rename {images => integration}/feature_integration_tests/test_scenarios/rust/src/scenarios/mod.rs (100%) rename {images => integration}/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/mod.rs (100%) rename {images => integration}/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/multiple_kvs_per_app.rs (100%) rename {images => integration/images}/autosd/BUILD.bazel (100%) rename {images => integration/images}/autosd/build/.gitignore (100%) rename {images => integration/images}/autosd/build/README.md (100%) rename {images => integration/images}/autosd/build/files/bluechi-agent-main.conf (100%) rename {images => integration/images}/autosd/build/files/bluechi-agent-qm.conf (100%) rename {images => integration/images}/autosd/build/files/bluechi-controller.conf (100%) rename {images => integration/images}/autosd/build/files/lola-ipc-pub.service (100%) rename {images => integration/images}/autosd/build/files/lola-ipc-sub.service (100%) rename {images => integration/images}/autosd/build/files/lola-ipc-test (100%) rename {images => integration/images}/autosd/build/files/lola-ipc-test.service (100%) rename {images => integration/images}/autosd/build/image.aib.yml (100%) rename {images => integration/images}/autosd/build/scripts/run_qemu (100%) rename {images => integration/images}/autosd/build/vars-devel.yml (100%) rename {images => integration/images}/autosd/build/vars.yml (100%) rename {images => integration/images}/ebclfsa_aarch64/BUILD (100%) rename {images => integration/images}/ebclfsa_aarch64/README.md (100%) rename {images => integration/images}/ebclfsa_aarch64/docs/system_setup.drawio.png (100%) rename {images => integration/images}/ebclfsa_aarch64/persistency_integration/BUILD (100%) rename {images => integration/images}/ebclfsa_aarch64/persistency_integration/run_qemu.sh (100%) rename {images => integration/images}/ebclfsa_aarch64/persistency_integration/scripts/cpp_tests_persistency.sh (100%) rename {images => integration/images}/ebclfsa_aarch64/scrample_integration/BUILD (100%) rename {images/feature_integration_tests/configs => integration/images/ebclfsa_aarch64/scrample_integration}/etc/logging.json (100%) rename {images/feature_integration_tests/configs => integration/images/ebclfsa_aarch64/scrample_integration}/etc/mw_com_config.json (100%) rename {images => integration/images}/ebclfsa_aarch64/scrample_integration/run_qemu.sh (100%) rename {images => integration/images}/ebclfsa_aarch64/scrample_integration/src/main.cc (100%) rename {images => integration/images}/linux_x86_64/BUILD (100%) rename {images => integration/images}/qnx_x86_64/BUILD (98%) rename {images => integration/images}/qnx_x86_64/build/BUILD (64%) rename {images => integration/images}/qnx_x86_64/build/init.build (100%) rename {images => integration/images}/qnx_x86_64/build/system.build (100%) rename {images => integration/images}/qnx_x86_64/configs/BUILD (100%) rename {images => integration/images}/qnx_x86_64/configs/dhcpcd.conf (100%) rename {images => integration/images}/qnx_x86_64/configs/group (100%) rename {images => integration/images}/qnx_x86_64/configs/hostname (100%) rename {images => integration/images}/qnx_x86_64/configs/network_capture.sh (100%) rename {images => integration/images}/qnx_x86_64/configs/network_setup.sh (100%) rename {images => integration/images}/qnx_x86_64/configs/network_setup_dhcp.sh (100%) rename {images => integration/images}/qnx_x86_64/configs/passwd (100%) rename {images => integration/images}/qnx_x86_64/configs/pci_hw.cfg (100%) rename {images => integration/images}/qnx_x86_64/configs/pci_server.cfg (100%) rename {images => integration/images}/qnx_x86_64/configs/profile (100%) rename {images => integration/images}/qnx_x86_64/configs/qcrypto.conf (100%) rename {images => integration/images}/qnx_x86_64/configs/ssh_host_rsa_key (100%) rename {images => integration/images}/qnx_x86_64/configs/ssh_host_rsa_key.pub (100%) rename {images => integration/images}/qnx_x86_64/configs/sshd_config (100%) rename {images => integration/images}/qnx_x86_64/configs/startup.sh (100%) rename {images/autosd => integration}/patches/baselibs/0001-RH-exception-header.patch (100%) rename {images/autosd => integration}/patches/baselibs/0002-RH-algorithm-header.patch (100%) rename {images/bazel_common => integration/patches/baselibs}/BUILD (100%) rename {images/ebclfsa_aarch64/patches => integration/patches/baselibs}/fix_hard_coded_amd64.patch (100%) rename {images => integration}/runners/docker_x86_64/BUILD (100%) rename {images => integration}/runners/docker_x86_64/scripts/BUILD (100%) rename {images => integration}/runners/docker_x86_64/scripts/run_docker.sh (100%) rename {images => integration}/runners/qemu_x86_64/BUILD (100%) rename {images => integration}/runners/qemu_x86_64/scripts/BUILD (100%) rename {images => integration}/runners/qemu_x86_64/scripts/qnx_wireshark.sh (100%) rename {images => integration}/runners/qemu_x86_64/scripts/run_qemu.sh (100%) rename {images => integration}/runners/qemu_x86_64/scripts/run_qemu_portforward.sh (100%) create mode 100755 integration/score_starter rename {images => integration}/showcases/BUILD (100%) rename {images => integration}/showcases/cli/BUILD (100%) rename {images => integration}/showcases/cli/main.rs (100%) rename {images => integration}/showcases/kyron/BUILD (100%) rename {images => integration}/showcases/kyron/kyron.score.json (100%) rename {images => integration}/showcases/kyron/main.rs (100%) rename {images => integration}/showcases/orchestration_persistency/BUILD (100%) rename {images => integration}/showcases/orchestration_persistency/main.rs (100%) rename {images => integration}/showcases/orchestration_persistency/orch_per.score.json (100%) rename {images => integration}/showcases/standalone/BUILD (100%) diff --git a/images/autosd/patches/communication/0001-example-visibility.patch b/images/autosd/patches/communication/0001-example-visibility.patch deleted file mode 100644 index 8040c2872b..0000000000 --- a/images/autosd/patches/communication/0001-example-visibility.patch +++ /dev/null @@ -1,55 +0,0 @@ -diff --git a/score/mw/com/example/ipc_bridge/BUILD b/score/mw/com/example/ipc_bridge/BUILD -index 2c364e1..f797762 100644 ---- a/score/mw/com/example/ipc_bridge/BUILD -+++ b/score/mw/com/example/ipc_bridge/BUILD -@@ -29,6 +29,7 @@ cc_binary( - "@score_baselibs//score/language/futurecpp", - "@score_baselibs//score/mw/log", - ], -+ visibility = ["//visibility:public"] - ) - - cc_library( -@@ -45,6 +46,7 @@ cc_library( - "//score/mw/com", - "@score_baselibs//score/mw/log", - ], -+ visibility = ["//visibility:public"] - ) - - cc_library( -@@ -60,6 +62,7 @@ cc_library( - "//score/mw/com", - "@score_baselibs//score/language/futurecpp", - ], -+ visibility = ["//visibility:public"] - ) - - rust_library( -@@ -70,6 +73,7 @@ rust_library( - "//score/mw/com/impl/rust:mw_com", - "@crate_index//:libc", - ], -+ visibility = ["//visibility:public"] - ) - - rust_binary( -@@ -84,6 +88,7 @@ rust_binary( - "@crate_index//:clap", - "@crate_index//:futures", - ], -+ visibility = ["//visibility:public"] - ) - - cc_library( -@@ -94,4 +99,10 @@ cc_library( - ":datatype", - "//score/mw/com/impl/rust:bridge_macros", - ], -+ visibility = ["//visibility:public"] -+) -+ -+exports_files( -+ ["etc/mw_com_config.json", "etc/logging.json"], -+ visibility = ["//visibility:public"] - ) diff --git a/images/ebclfsa_aarch64/patches/BUILD b/images/ebclfsa_aarch64/patches/BUILD deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/images/feature_integration_tests/BUILD b/images/feature_integration_tests/BUILD deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/images/score.sh b/images/score.sh deleted file mode 100755 index 52d5ec6022..0000000000 --- a/images/score.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash - -# ================== CONFIG ================== -# Each entry: "Description|command to execute" -mEntries=( - "Run QNX x86_64 QEMU | bazel run --config qnx-x86_64 //qnx_x86_64:run" - "Run Linux x86_64 Docker | bazel run --config linux-x86_64 //linux_x86_64:run" - "Run Elektrobit Corbos aarch64 QEMU | bazel build --config eb-aarch64 //ebclfsa_aarch64/scrample_integration:run" - "Exit|exit 0" -) - -# ================== INTERNAL ================== -mDescriptions=() -mCommands=() - -for mEntry in "${mEntries[@]}"; do - mDescriptions+=("${mEntry%%|*}") - mCommands+=("${mEntry#*|}") -done - -mSelected=0 -mCount=${#mDescriptions[@]} - -draw_menu() { - clear - echo "Use ↑ ↓ to navigate, Enter to run, q to quit" - echo - - for i in "${!mDescriptions[@]}"; do - if [[ $i -eq $mSelected ]]; then - printf " \e[7m %s \e[0m\n" "${mDescriptions[$i]}" - else - printf " %s\n" "${mDescriptions[$i]}" - fi - done -} - -run_selected() { - clear - echo "▶ ${mDescriptions[$mSelected]}" - echo - - eval "${mCommands[$mSelected]}" -} - -# ================== LOOP ================== -while true; do - draw_menu - - IFS= read -rsn1 mKey - case "$mKey" in - $'\x1b') - read -rsn2 mKey - case "$mKey" in - "[A") ((mSelected = (mSelected - 1 + mCount) % mCount)) ;; - "[B") ((mSelected = (mSelected + 1) % mCount)) ;; - esac - ;; - "") - run_selected - exit $? - ;; - q) - exit 0 - ;; - esac -done diff --git a/images/.bazelrc b/integration/.bazelrc similarity index 100% rename from images/.bazelrc rename to integration/.bazelrc diff --git a/images/.bazelversion b/integration/.bazelversion similarity index 100% rename from images/.bazelversion rename to integration/.bazelversion diff --git a/images/BUILD b/integration/BUILD similarity index 100% rename from images/BUILD rename to integration/BUILD diff --git a/images/MODULE.bazel b/integration/MODULE.bazel similarity index 100% rename from images/MODULE.bazel rename to integration/MODULE.bazel diff --git a/images/autosd/patches/BUILD b/integration/bazel_common/BUILD similarity index 100% rename from images/autosd/patches/BUILD rename to integration/bazel_common/BUILD diff --git a/images/bazel_common/bundlers.bzl b/integration/bazel_common/bundlers.bzl similarity index 100% rename from images/bazel_common/bundlers.bzl rename to integration/bazel_common/bundlers.bzl diff --git a/images/bazel_common/score_basic_tools.MODULE.bazel b/integration/bazel_common/score_basic_tools.MODULE.bazel similarity index 100% rename from images/bazel_common/score_basic_tools.MODULE.bazel rename to integration/bazel_common/score_basic_tools.MODULE.bazel diff --git a/images/bazel_common/score_gcc_toolchains.MODULE.bazel b/integration/bazel_common/score_gcc_toolchains.MODULE.bazel similarity index 100% rename from images/bazel_common/score_gcc_toolchains.MODULE.bazel rename to integration/bazel_common/score_gcc_toolchains.MODULE.bazel diff --git a/images/bazel_common/score_modules.MODULE.bazel b/integration/bazel_common/score_modules.MODULE.bazel similarity index 84% rename from images/bazel_common/score_modules.MODULE.bazel rename to integration/bazel_common/score_modules.MODULE.bazel index ed2d39c312..c53101fce0 100644 --- a/images/bazel_common/score_modules.MODULE.bazel +++ b/integration/bazel_common/score_modules.MODULE.bazel @@ -28,6 +28,8 @@ single_version_override( version = "0.1.3", patch_strip = 1, patches = [ - "//ebclfsa_aarch64/patches:fix_hard_coded_amd64.patch", + "//patches/baselibs:fix_hard_coded_amd64.patch", + "//patches/baselibs:0001-RH-exception-header.patch", + "//patches/baselibs:0002-RH-algorithm-header.patch", ], ) \ No newline at end of file diff --git a/images/bazel_common/score_python.MODULE.bazel b/integration/bazel_common/score_python.MODULE.bazel similarity index 100% rename from images/bazel_common/score_python.MODULE.bazel rename to integration/bazel_common/score_python.MODULE.bazel diff --git a/images/bazel_common/score_qnx_toolchains.MODULE.bazel b/integration/bazel_common/score_qnx_toolchains.MODULE.bazel similarity index 100% rename from images/bazel_common/score_qnx_toolchains.MODULE.bazel rename to integration/bazel_common/score_qnx_toolchains.MODULE.bazel diff --git a/images/bazel_common/score_rust_toolchains.MODULE.bazel b/integration/bazel_common/score_rust_toolchains.MODULE.bazel similarity index 100% rename from images/bazel_common/score_rust_toolchains.MODULE.bazel rename to integration/bazel_common/score_rust_toolchains.MODULE.bazel diff --git a/images/autosd/patches/baselibs/BUILD b/integration/feature_integration_tests/BUILD similarity index 100% rename from images/autosd/patches/baselibs/BUILD rename to integration/feature_integration_tests/BUILD diff --git a/images/feature_integration_tests/README.md b/integration/feature_integration_tests/README.md similarity index 100% rename from images/feature_integration_tests/README.md rename to integration/feature_integration_tests/README.md diff --git a/images/feature_integration_tests/configs/BUILD b/integration/feature_integration_tests/configs/BUILD similarity index 100% rename from images/feature_integration_tests/configs/BUILD rename to integration/feature_integration_tests/configs/BUILD diff --git a/images/ebclfsa_aarch64/scrample_integration/etc/logging.json b/integration/feature_integration_tests/configs/etc/logging.json similarity index 100% rename from images/ebclfsa_aarch64/scrample_integration/etc/logging.json rename to integration/feature_integration_tests/configs/etc/logging.json diff --git a/images/ebclfsa_aarch64/scrample_integration/etc/mw_com_config.json b/integration/feature_integration_tests/configs/etc/mw_com_config.json similarity index 100% rename from images/ebclfsa_aarch64/scrample_integration/etc/mw_com_config.json rename to integration/feature_integration_tests/configs/etc/mw_com_config.json diff --git a/images/feature_integration_tests/configs/qemu_target_config.json b/integration/feature_integration_tests/configs/qemu_target_config.json similarity index 100% rename from images/feature_integration_tests/configs/qemu_target_config.json rename to integration/feature_integration_tests/configs/qemu_target_config.json diff --git a/images/feature_integration_tests/itf/BUILD b/integration/feature_integration_tests/itf/BUILD similarity index 100% rename from images/feature_integration_tests/itf/BUILD rename to integration/feature_integration_tests/itf/BUILD diff --git a/images/feature_integration_tests/itf/test_persistency.py b/integration/feature_integration_tests/itf/test_persistency.py similarity index 100% rename from images/feature_integration_tests/itf/test_persistency.py rename to integration/feature_integration_tests/itf/test_persistency.py diff --git a/images/feature_integration_tests/itf/test_scrample.py b/integration/feature_integration_tests/itf/test_scrample.py similarity index 100% rename from images/feature_integration_tests/itf/test_scrample.py rename to integration/feature_integration_tests/itf/test_scrample.py diff --git a/images/feature_integration_tests/itf/test_ssh.py b/integration/feature_integration_tests/itf/test_ssh.py similarity index 100% rename from images/feature_integration_tests/itf/test_ssh.py rename to integration/feature_integration_tests/itf/test_ssh.py diff --git a/images/feature_integration_tests/test_cases/BUILD b/integration/feature_integration_tests/test_cases/BUILD similarity index 100% rename from images/feature_integration_tests/test_cases/BUILD rename to integration/feature_integration_tests/test_cases/BUILD diff --git a/images/feature_integration_tests/test_cases/conftest.py b/integration/feature_integration_tests/test_cases/conftest.py similarity index 100% rename from images/feature_integration_tests/test_cases/conftest.py rename to integration/feature_integration_tests/test_cases/conftest.py diff --git a/images/feature_integration_tests/test_cases/fit_scenario.py b/integration/feature_integration_tests/test_cases/fit_scenario.py similarity index 100% rename from images/feature_integration_tests/test_cases/fit_scenario.py rename to integration/feature_integration_tests/test_cases/fit_scenario.py diff --git a/images/feature_integration_tests/test_cases/pytest.ini b/integration/feature_integration_tests/test_cases/pytest.ini similarity index 100% rename from images/feature_integration_tests/test_cases/pytest.ini rename to integration/feature_integration_tests/test_cases/pytest.ini diff --git a/images/feature_integration_tests/test_cases/requirements.txt b/integration/feature_integration_tests/test_cases/requirements.txt similarity index 100% rename from images/feature_integration_tests/test_cases/requirements.txt rename to integration/feature_integration_tests/test_cases/requirements.txt diff --git a/images/feature_integration_tests/test_cases/requirements.txt.lock b/integration/feature_integration_tests/test_cases/requirements.txt.lock similarity index 100% rename from images/feature_integration_tests/test_cases/requirements.txt.lock rename to integration/feature_integration_tests/test_cases/requirements.txt.lock diff --git a/images/feature_integration_tests/test_cases/test_properties.py b/integration/feature_integration_tests/test_cases/test_properties.py similarity index 100% rename from images/feature_integration_tests/test_cases/test_properties.py rename to integration/feature_integration_tests/test_cases/test_properties.py diff --git a/images/feature_integration_tests/test_cases/tests/basic/test_orchestration_with_persistency.py b/integration/feature_integration_tests/test_cases/tests/basic/test_orchestration_with_persistency.py similarity index 100% rename from images/feature_integration_tests/test_cases/tests/basic/test_orchestration_with_persistency.py rename to integration/feature_integration_tests/test_cases/tests/basic/test_orchestration_with_persistency.py diff --git a/images/feature_integration_tests/test_cases/tests/persistency/test_multiple_kvs_per_app.py b/integration/feature_integration_tests/test_cases/tests/persistency/test_multiple_kvs_per_app.py similarity index 100% rename from images/feature_integration_tests/test_cases/tests/persistency/test_multiple_kvs_per_app.py rename to integration/feature_integration_tests/test_cases/tests/persistency/test_multiple_kvs_per_app.py diff --git a/images/feature_integration_tests/test_scenarios/rust/BUILD b/integration/feature_integration_tests/test_scenarios/rust/BUILD similarity index 100% rename from images/feature_integration_tests/test_scenarios/rust/BUILD rename to integration/feature_integration_tests/test_scenarios/rust/BUILD diff --git a/images/feature_integration_tests/test_scenarios/rust/src/internals/kyron/mod.rs b/integration/feature_integration_tests/test_scenarios/rust/src/internals/kyron/mod.rs similarity index 100% rename from images/feature_integration_tests/test_scenarios/rust/src/internals/kyron/mod.rs rename to integration/feature_integration_tests/test_scenarios/rust/src/internals/kyron/mod.rs diff --git a/images/feature_integration_tests/test_scenarios/rust/src/internals/kyron/runtime_helper.rs b/integration/feature_integration_tests/test_scenarios/rust/src/internals/kyron/runtime_helper.rs similarity index 100% rename from images/feature_integration_tests/test_scenarios/rust/src/internals/kyron/runtime_helper.rs rename to integration/feature_integration_tests/test_scenarios/rust/src/internals/kyron/runtime_helper.rs diff --git a/images/feature_integration_tests/test_scenarios/rust/src/internals/mod.rs b/integration/feature_integration_tests/test_scenarios/rust/src/internals/mod.rs similarity index 100% rename from images/feature_integration_tests/test_scenarios/rust/src/internals/mod.rs rename to integration/feature_integration_tests/test_scenarios/rust/src/internals/mod.rs diff --git a/images/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_instance.rs b/integration/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_instance.rs similarity index 100% rename from images/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_instance.rs rename to integration/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_instance.rs diff --git a/images/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_parameters.rs b/integration/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_parameters.rs similarity index 100% rename from images/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_parameters.rs rename to integration/feature_integration_tests/test_scenarios/rust/src/internals/persistency/kvs_parameters.rs diff --git a/images/feature_integration_tests/test_scenarios/rust/src/internals/persistency/mod.rs b/integration/feature_integration_tests/test_scenarios/rust/src/internals/persistency/mod.rs similarity index 100% rename from images/feature_integration_tests/test_scenarios/rust/src/internals/persistency/mod.rs rename to integration/feature_integration_tests/test_scenarios/rust/src/internals/persistency/mod.rs diff --git a/images/feature_integration_tests/test_scenarios/rust/src/main.rs b/integration/feature_integration_tests/test_scenarios/rust/src/main.rs similarity index 100% rename from images/feature_integration_tests/test_scenarios/rust/src/main.rs rename to integration/feature_integration_tests/test_scenarios/rust/src/main.rs diff --git a/images/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/mod.rs b/integration/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/mod.rs similarity index 100% rename from images/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/mod.rs rename to integration/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/mod.rs diff --git a/images/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/orchestration_with_persistency.rs b/integration/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/orchestration_with_persistency.rs similarity index 100% rename from images/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/orchestration_with_persistency.rs rename to integration/feature_integration_tests/test_scenarios/rust/src/scenarios/basic/orchestration_with_persistency.rs diff --git a/images/feature_integration_tests/test_scenarios/rust/src/scenarios/mod.rs b/integration/feature_integration_tests/test_scenarios/rust/src/scenarios/mod.rs similarity index 100% rename from images/feature_integration_tests/test_scenarios/rust/src/scenarios/mod.rs rename to integration/feature_integration_tests/test_scenarios/rust/src/scenarios/mod.rs diff --git a/images/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/mod.rs b/integration/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/mod.rs similarity index 100% rename from images/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/mod.rs rename to integration/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/mod.rs diff --git a/images/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/multiple_kvs_per_app.rs b/integration/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/multiple_kvs_per_app.rs similarity index 100% rename from images/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/multiple_kvs_per_app.rs rename to integration/feature_integration_tests/test_scenarios/rust/src/scenarios/persistency/multiple_kvs_per_app.rs diff --git a/images/autosd/BUILD.bazel b/integration/images/autosd/BUILD.bazel similarity index 100% rename from images/autosd/BUILD.bazel rename to integration/images/autosd/BUILD.bazel diff --git a/images/autosd/build/.gitignore b/integration/images/autosd/build/.gitignore similarity index 100% rename from images/autosd/build/.gitignore rename to integration/images/autosd/build/.gitignore diff --git a/images/autosd/build/README.md b/integration/images/autosd/build/README.md similarity index 100% rename from images/autosd/build/README.md rename to integration/images/autosd/build/README.md diff --git a/images/autosd/build/files/bluechi-agent-main.conf b/integration/images/autosd/build/files/bluechi-agent-main.conf similarity index 100% rename from images/autosd/build/files/bluechi-agent-main.conf rename to integration/images/autosd/build/files/bluechi-agent-main.conf diff --git a/images/autosd/build/files/bluechi-agent-qm.conf b/integration/images/autosd/build/files/bluechi-agent-qm.conf similarity index 100% rename from images/autosd/build/files/bluechi-agent-qm.conf rename to integration/images/autosd/build/files/bluechi-agent-qm.conf diff --git a/images/autosd/build/files/bluechi-controller.conf b/integration/images/autosd/build/files/bluechi-controller.conf similarity index 100% rename from images/autosd/build/files/bluechi-controller.conf rename to integration/images/autosd/build/files/bluechi-controller.conf diff --git a/images/autosd/build/files/lola-ipc-pub.service b/integration/images/autosd/build/files/lola-ipc-pub.service similarity index 100% rename from images/autosd/build/files/lola-ipc-pub.service rename to integration/images/autosd/build/files/lola-ipc-pub.service diff --git a/images/autosd/build/files/lola-ipc-sub.service b/integration/images/autosd/build/files/lola-ipc-sub.service similarity index 100% rename from images/autosd/build/files/lola-ipc-sub.service rename to integration/images/autosd/build/files/lola-ipc-sub.service diff --git a/images/autosd/build/files/lola-ipc-test b/integration/images/autosd/build/files/lola-ipc-test similarity index 100% rename from images/autosd/build/files/lola-ipc-test rename to integration/images/autosd/build/files/lola-ipc-test diff --git a/images/autosd/build/files/lola-ipc-test.service b/integration/images/autosd/build/files/lola-ipc-test.service similarity index 100% rename from images/autosd/build/files/lola-ipc-test.service rename to integration/images/autosd/build/files/lola-ipc-test.service diff --git a/images/autosd/build/image.aib.yml b/integration/images/autosd/build/image.aib.yml similarity index 100% rename from images/autosd/build/image.aib.yml rename to integration/images/autosd/build/image.aib.yml diff --git a/images/autosd/build/scripts/run_qemu b/integration/images/autosd/build/scripts/run_qemu similarity index 100% rename from images/autosd/build/scripts/run_qemu rename to integration/images/autosd/build/scripts/run_qemu diff --git a/images/autosd/build/vars-devel.yml b/integration/images/autosd/build/vars-devel.yml similarity index 100% rename from images/autosd/build/vars-devel.yml rename to integration/images/autosd/build/vars-devel.yml diff --git a/images/autosd/build/vars.yml b/integration/images/autosd/build/vars.yml similarity index 100% rename from images/autosd/build/vars.yml rename to integration/images/autosd/build/vars.yml diff --git a/images/ebclfsa_aarch64/BUILD b/integration/images/ebclfsa_aarch64/BUILD similarity index 100% rename from images/ebclfsa_aarch64/BUILD rename to integration/images/ebclfsa_aarch64/BUILD diff --git a/images/ebclfsa_aarch64/README.md b/integration/images/ebclfsa_aarch64/README.md similarity index 100% rename from images/ebclfsa_aarch64/README.md rename to integration/images/ebclfsa_aarch64/README.md diff --git a/images/ebclfsa_aarch64/docs/system_setup.drawio.png b/integration/images/ebclfsa_aarch64/docs/system_setup.drawio.png similarity index 100% rename from images/ebclfsa_aarch64/docs/system_setup.drawio.png rename to integration/images/ebclfsa_aarch64/docs/system_setup.drawio.png diff --git a/images/ebclfsa_aarch64/persistency_integration/BUILD b/integration/images/ebclfsa_aarch64/persistency_integration/BUILD similarity index 100% rename from images/ebclfsa_aarch64/persistency_integration/BUILD rename to integration/images/ebclfsa_aarch64/persistency_integration/BUILD diff --git a/images/ebclfsa_aarch64/persistency_integration/run_qemu.sh b/integration/images/ebclfsa_aarch64/persistency_integration/run_qemu.sh similarity index 100% rename from images/ebclfsa_aarch64/persistency_integration/run_qemu.sh rename to integration/images/ebclfsa_aarch64/persistency_integration/run_qemu.sh diff --git a/images/ebclfsa_aarch64/persistency_integration/scripts/cpp_tests_persistency.sh b/integration/images/ebclfsa_aarch64/persistency_integration/scripts/cpp_tests_persistency.sh similarity index 100% rename from images/ebclfsa_aarch64/persistency_integration/scripts/cpp_tests_persistency.sh rename to integration/images/ebclfsa_aarch64/persistency_integration/scripts/cpp_tests_persistency.sh diff --git a/images/ebclfsa_aarch64/scrample_integration/BUILD b/integration/images/ebclfsa_aarch64/scrample_integration/BUILD similarity index 100% rename from images/ebclfsa_aarch64/scrample_integration/BUILD rename to integration/images/ebclfsa_aarch64/scrample_integration/BUILD diff --git a/images/feature_integration_tests/configs/etc/logging.json b/integration/images/ebclfsa_aarch64/scrample_integration/etc/logging.json similarity index 100% rename from images/feature_integration_tests/configs/etc/logging.json rename to integration/images/ebclfsa_aarch64/scrample_integration/etc/logging.json diff --git a/images/feature_integration_tests/configs/etc/mw_com_config.json b/integration/images/ebclfsa_aarch64/scrample_integration/etc/mw_com_config.json similarity index 100% rename from images/feature_integration_tests/configs/etc/mw_com_config.json rename to integration/images/ebclfsa_aarch64/scrample_integration/etc/mw_com_config.json diff --git a/images/ebclfsa_aarch64/scrample_integration/run_qemu.sh b/integration/images/ebclfsa_aarch64/scrample_integration/run_qemu.sh similarity index 100% rename from images/ebclfsa_aarch64/scrample_integration/run_qemu.sh rename to integration/images/ebclfsa_aarch64/scrample_integration/run_qemu.sh diff --git a/images/ebclfsa_aarch64/scrample_integration/src/main.cc b/integration/images/ebclfsa_aarch64/scrample_integration/src/main.cc similarity index 100% rename from images/ebclfsa_aarch64/scrample_integration/src/main.cc rename to integration/images/ebclfsa_aarch64/scrample_integration/src/main.cc diff --git a/images/linux_x86_64/BUILD b/integration/images/linux_x86_64/BUILD similarity index 100% rename from images/linux_x86_64/BUILD rename to integration/images/linux_x86_64/BUILD diff --git a/images/qnx_x86_64/BUILD b/integration/images/qnx_x86_64/BUILD similarity index 98% rename from images/qnx_x86_64/BUILD rename to integration/images/qnx_x86_64/BUILD index 66883a3cb5..2ae1748607 100644 --- a/images/qnx_x86_64/BUILD +++ b/integration/images/qnx_x86_64/BUILD @@ -15,7 +15,7 @@ load("@score_itf//:defs.bzl", "py_itf_test") alias( name = "image", - actual = "//qnx_x86_64/build:init", + actual = "//images/qnx_x86_64/build:init", visibility = ["//visibility:public"], ) diff --git a/images/qnx_x86_64/build/BUILD b/integration/images/qnx_x86_64/build/BUILD similarity index 64% rename from images/qnx_x86_64/build/BUILD rename to integration/images/qnx_x86_64/build/BUILD index d07bdd27a5..1ec2e2d81b 100644 --- a/images/qnx_x86_64/build/BUILD +++ b/integration/images/qnx_x86_64/build/BUILD @@ -16,7 +16,7 @@ load("@score_toolchains_qnx//rules/fs:ifs.bzl", "qnx_ifs") filegroup( name = "scripts", srcs = [ - "//qnx_x86_64/configs:startup.sh", + "//images/qnx_x86_64/configs:startup.sh", ], visibility = ["//visibility:private"], ) @@ -24,20 +24,20 @@ filegroup( filegroup( name = "configs", srcs = [ - "//qnx_x86_64/configs:pci_server.cfg", - "//qnx_x86_64/configs:pci_hw.cfg", - "//qnx_x86_64/configs:qcrypto.conf", - "//qnx_x86_64/configs:passwd", - "//qnx_x86_64/configs:group", - "//qnx_x86_64/configs:sshd_config", - "//qnx_x86_64/configs:ssh_host_rsa_key", - "//qnx_x86_64/configs:ssh_host_rsa_key.pub", - "//qnx_x86_64/configs:hostname", - "//qnx_x86_64/configs:network_setup.sh", - "//qnx_x86_64/configs:network_capture.sh", - "//qnx_x86_64/configs:profile", - "//qnx_x86_64/configs:dhcpcd.conf", - "//qnx_x86_64/configs:network_setup_dhcp.sh", + "//images/qnx_x86_64/configs:pci_server.cfg", + "//images/qnx_x86_64/configs:pci_hw.cfg", + "//images/qnx_x86_64/configs:qcrypto.conf", + "//images/qnx_x86_64/configs:passwd", + "//images/qnx_x86_64/configs:group", + "//images/qnx_x86_64/configs:sshd_config", + "//images/qnx_x86_64/configs:ssh_host_rsa_key", + "//images/qnx_x86_64/configs:ssh_host_rsa_key.pub", + "//images/qnx_x86_64/configs:hostname", + "//images/qnx_x86_64/configs:network_setup.sh", + "//images/qnx_x86_64/configs:network_capture.sh", + "//images/qnx_x86_64/configs:profile", + "//images/qnx_x86_64/configs:dhcpcd.conf", + "//images/qnx_x86_64/configs:network_setup_dhcp.sh", ], visibility = ["//visibility:private"], ) diff --git a/images/qnx_x86_64/build/init.build b/integration/images/qnx_x86_64/build/init.build similarity index 100% rename from images/qnx_x86_64/build/init.build rename to integration/images/qnx_x86_64/build/init.build diff --git a/images/qnx_x86_64/build/system.build b/integration/images/qnx_x86_64/build/system.build similarity index 100% rename from images/qnx_x86_64/build/system.build rename to integration/images/qnx_x86_64/build/system.build diff --git a/images/qnx_x86_64/configs/BUILD b/integration/images/qnx_x86_64/configs/BUILD similarity index 100% rename from images/qnx_x86_64/configs/BUILD rename to integration/images/qnx_x86_64/configs/BUILD diff --git a/images/qnx_x86_64/configs/dhcpcd.conf b/integration/images/qnx_x86_64/configs/dhcpcd.conf similarity index 100% rename from images/qnx_x86_64/configs/dhcpcd.conf rename to integration/images/qnx_x86_64/configs/dhcpcd.conf diff --git a/images/qnx_x86_64/configs/group b/integration/images/qnx_x86_64/configs/group similarity index 100% rename from images/qnx_x86_64/configs/group rename to integration/images/qnx_x86_64/configs/group diff --git a/images/qnx_x86_64/configs/hostname b/integration/images/qnx_x86_64/configs/hostname similarity index 100% rename from images/qnx_x86_64/configs/hostname rename to integration/images/qnx_x86_64/configs/hostname diff --git a/images/qnx_x86_64/configs/network_capture.sh b/integration/images/qnx_x86_64/configs/network_capture.sh similarity index 100% rename from images/qnx_x86_64/configs/network_capture.sh rename to integration/images/qnx_x86_64/configs/network_capture.sh diff --git a/images/qnx_x86_64/configs/network_setup.sh b/integration/images/qnx_x86_64/configs/network_setup.sh similarity index 100% rename from images/qnx_x86_64/configs/network_setup.sh rename to integration/images/qnx_x86_64/configs/network_setup.sh diff --git a/images/qnx_x86_64/configs/network_setup_dhcp.sh b/integration/images/qnx_x86_64/configs/network_setup_dhcp.sh similarity index 100% rename from images/qnx_x86_64/configs/network_setup_dhcp.sh rename to integration/images/qnx_x86_64/configs/network_setup_dhcp.sh diff --git a/images/qnx_x86_64/configs/passwd b/integration/images/qnx_x86_64/configs/passwd similarity index 100% rename from images/qnx_x86_64/configs/passwd rename to integration/images/qnx_x86_64/configs/passwd diff --git a/images/qnx_x86_64/configs/pci_hw.cfg b/integration/images/qnx_x86_64/configs/pci_hw.cfg similarity index 100% rename from images/qnx_x86_64/configs/pci_hw.cfg rename to integration/images/qnx_x86_64/configs/pci_hw.cfg diff --git a/images/qnx_x86_64/configs/pci_server.cfg b/integration/images/qnx_x86_64/configs/pci_server.cfg similarity index 100% rename from images/qnx_x86_64/configs/pci_server.cfg rename to integration/images/qnx_x86_64/configs/pci_server.cfg diff --git a/images/qnx_x86_64/configs/profile b/integration/images/qnx_x86_64/configs/profile similarity index 100% rename from images/qnx_x86_64/configs/profile rename to integration/images/qnx_x86_64/configs/profile diff --git a/images/qnx_x86_64/configs/qcrypto.conf b/integration/images/qnx_x86_64/configs/qcrypto.conf similarity index 100% rename from images/qnx_x86_64/configs/qcrypto.conf rename to integration/images/qnx_x86_64/configs/qcrypto.conf diff --git a/images/qnx_x86_64/configs/ssh_host_rsa_key b/integration/images/qnx_x86_64/configs/ssh_host_rsa_key similarity index 100% rename from images/qnx_x86_64/configs/ssh_host_rsa_key rename to integration/images/qnx_x86_64/configs/ssh_host_rsa_key diff --git a/images/qnx_x86_64/configs/ssh_host_rsa_key.pub b/integration/images/qnx_x86_64/configs/ssh_host_rsa_key.pub similarity index 100% rename from images/qnx_x86_64/configs/ssh_host_rsa_key.pub rename to integration/images/qnx_x86_64/configs/ssh_host_rsa_key.pub diff --git a/images/qnx_x86_64/configs/sshd_config b/integration/images/qnx_x86_64/configs/sshd_config similarity index 100% rename from images/qnx_x86_64/configs/sshd_config rename to integration/images/qnx_x86_64/configs/sshd_config diff --git a/images/qnx_x86_64/configs/startup.sh b/integration/images/qnx_x86_64/configs/startup.sh similarity index 100% rename from images/qnx_x86_64/configs/startup.sh rename to integration/images/qnx_x86_64/configs/startup.sh diff --git a/images/autosd/patches/baselibs/0001-RH-exception-header.patch b/integration/patches/baselibs/0001-RH-exception-header.patch similarity index 100% rename from images/autosd/patches/baselibs/0001-RH-exception-header.patch rename to integration/patches/baselibs/0001-RH-exception-header.patch diff --git a/images/autosd/patches/baselibs/0002-RH-algorithm-header.patch b/integration/patches/baselibs/0002-RH-algorithm-header.patch similarity index 100% rename from images/autosd/patches/baselibs/0002-RH-algorithm-header.patch rename to integration/patches/baselibs/0002-RH-algorithm-header.patch diff --git a/images/bazel_common/BUILD b/integration/patches/baselibs/BUILD similarity index 100% rename from images/bazel_common/BUILD rename to integration/patches/baselibs/BUILD diff --git a/images/ebclfsa_aarch64/patches/fix_hard_coded_amd64.patch b/integration/patches/baselibs/fix_hard_coded_amd64.patch similarity index 100% rename from images/ebclfsa_aarch64/patches/fix_hard_coded_amd64.patch rename to integration/patches/baselibs/fix_hard_coded_amd64.patch diff --git a/images/runners/docker_x86_64/BUILD b/integration/runners/docker_x86_64/BUILD similarity index 100% rename from images/runners/docker_x86_64/BUILD rename to integration/runners/docker_x86_64/BUILD diff --git a/images/runners/docker_x86_64/scripts/BUILD b/integration/runners/docker_x86_64/scripts/BUILD similarity index 100% rename from images/runners/docker_x86_64/scripts/BUILD rename to integration/runners/docker_x86_64/scripts/BUILD diff --git a/images/runners/docker_x86_64/scripts/run_docker.sh b/integration/runners/docker_x86_64/scripts/run_docker.sh similarity index 100% rename from images/runners/docker_x86_64/scripts/run_docker.sh rename to integration/runners/docker_x86_64/scripts/run_docker.sh diff --git a/images/runners/qemu_x86_64/BUILD b/integration/runners/qemu_x86_64/BUILD similarity index 100% rename from images/runners/qemu_x86_64/BUILD rename to integration/runners/qemu_x86_64/BUILD diff --git a/images/runners/qemu_x86_64/scripts/BUILD b/integration/runners/qemu_x86_64/scripts/BUILD similarity index 100% rename from images/runners/qemu_x86_64/scripts/BUILD rename to integration/runners/qemu_x86_64/scripts/BUILD diff --git a/images/runners/qemu_x86_64/scripts/qnx_wireshark.sh b/integration/runners/qemu_x86_64/scripts/qnx_wireshark.sh similarity index 100% rename from images/runners/qemu_x86_64/scripts/qnx_wireshark.sh rename to integration/runners/qemu_x86_64/scripts/qnx_wireshark.sh diff --git a/images/runners/qemu_x86_64/scripts/run_qemu.sh b/integration/runners/qemu_x86_64/scripts/run_qemu.sh similarity index 100% rename from images/runners/qemu_x86_64/scripts/run_qemu.sh rename to integration/runners/qemu_x86_64/scripts/run_qemu.sh diff --git a/images/runners/qemu_x86_64/scripts/run_qemu_portforward.sh b/integration/runners/qemu_x86_64/scripts/run_qemu_portforward.sh similarity index 100% rename from images/runners/qemu_x86_64/scripts/run_qemu_portforward.sh rename to integration/runners/qemu_x86_64/scripts/run_qemu_portforward.sh diff --git a/integration/score_starter b/integration/score_starter new file mode 100755 index 0000000000..3a6f290c8f --- /dev/null +++ b/integration/score_starter @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +import os +import sys +import termios +import tty +import subprocess + +# ================== CONFIG ================== +# Each entry: (description, command) +mEntries = [ + ("Run QNX x86_64 QEMU", "bazel run --config qnx-x86_64 //images/qnx_x86_64:run"), + ("Run Linux x86_64 Docker", "bazel run --config linux-x86_64 //images/linux_x86_64:run"), + ("Run Elektrobit Corbos aarch64 QEMU", + "bazel build --config eb-aarch64 //images/ebclfsa_aarch64/scrample_integration:run"), + ("Exit", "exit 0"), +] + +# ================== INTERNAL ================== +mSelected = 0 +mCount = len(mEntries) + + +def clear(): + os.system("clear") + + +def draw_menu(): + clear() + print("Use ↑ ↓ to navigate, Enter to run, q to quit\n") + for i, (desc, _) in enumerate(mEntries): + if i == mSelected: + # inverse video + print(f" \033[7m {desc} \033[0m") + else: + print(f" {desc}") + + +def run_selected(): + clear() + desc, cmd = mEntries[mSelected] + print(f"▶ {desc}\n") + + if cmd.startswith("exit"): + sys.exit(0) + + # Run command in user's shell + result = subprocess.call(cmd, shell=True) + sys.exit(result) + + +def read_key(): + fd = sys.stdin.fileno() + old = termios.tcgetattr(fd) + try: + tty.setraw(fd) + ch1 = sys.stdin.read(1) + if ch1 == "\x1b": + ch2 = sys.stdin.read(1) + ch3 = sys.stdin.read(1) + return ch1 + ch2 + ch3 + return ch1 + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old) + + +# ================== LOOP ================== +while True: + draw_menu() + key = read_key() + + if key == "\x1b[A": # Up + mSelected = (mSelected - 1) % mCount + elif key == "\x1b[B": # Down + mSelected = (mSelected + 1) % mCount + elif key in ("\r", "\n"): # Enter + run_selected() + elif key == "q": + sys.exit(0) diff --git a/images/showcases/BUILD b/integration/showcases/BUILD similarity index 100% rename from images/showcases/BUILD rename to integration/showcases/BUILD diff --git a/images/showcases/cli/BUILD b/integration/showcases/cli/BUILD similarity index 100% rename from images/showcases/cli/BUILD rename to integration/showcases/cli/BUILD diff --git a/images/showcases/cli/main.rs b/integration/showcases/cli/main.rs similarity index 100% rename from images/showcases/cli/main.rs rename to integration/showcases/cli/main.rs diff --git a/images/showcases/kyron/BUILD b/integration/showcases/kyron/BUILD similarity index 100% rename from images/showcases/kyron/BUILD rename to integration/showcases/kyron/BUILD diff --git a/images/showcases/kyron/kyron.score.json b/integration/showcases/kyron/kyron.score.json similarity index 100% rename from images/showcases/kyron/kyron.score.json rename to integration/showcases/kyron/kyron.score.json diff --git a/images/showcases/kyron/main.rs b/integration/showcases/kyron/main.rs similarity index 100% rename from images/showcases/kyron/main.rs rename to integration/showcases/kyron/main.rs diff --git a/images/showcases/orchestration_persistency/BUILD b/integration/showcases/orchestration_persistency/BUILD similarity index 100% rename from images/showcases/orchestration_persistency/BUILD rename to integration/showcases/orchestration_persistency/BUILD diff --git a/images/showcases/orchestration_persistency/main.rs b/integration/showcases/orchestration_persistency/main.rs similarity index 100% rename from images/showcases/orchestration_persistency/main.rs rename to integration/showcases/orchestration_persistency/main.rs diff --git a/images/showcases/orchestration_persistency/orch_per.score.json b/integration/showcases/orchestration_persistency/orch_per.score.json similarity index 100% rename from images/showcases/orchestration_persistency/orch_per.score.json rename to integration/showcases/orchestration_persistency/orch_per.score.json diff --git a/images/showcases/standalone/BUILD b/integration/showcases/standalone/BUILD similarity index 100% rename from images/showcases/standalone/BUILD rename to integration/showcases/standalone/BUILD From 9f6cd6f793d2489641f37480b85788c75ce66f26 Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Mon, 9 Feb 2026 15:03:59 +0100 Subject: [PATCH 17/22] Fix patches --- .../bazel_common/score_modules.MODULE.bazel | 2 +- .../images/qnx_x86_64/build/system.build | 4 +- .../baselibs/003-acl-fixes-for-aarch64.patch | 65 +++++++++++++++++++ 3 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 integration/patches/baselibs/003-acl-fixes-for-aarch64.patch diff --git a/integration/bazel_common/score_modules.MODULE.bazel b/integration/bazel_common/score_modules.MODULE.bazel index c53101fce0..9b58a3d23d 100644 --- a/integration/bazel_common/score_modules.MODULE.bazel +++ b/integration/bazel_common/score_modules.MODULE.bazel @@ -28,7 +28,7 @@ single_version_override( version = "0.1.3", patch_strip = 1, patches = [ - "//patches/baselibs:fix_hard_coded_amd64.patch", + "//patches/baselibs:003-acl-fixes-for-aarch64.patch", "//patches/baselibs:0001-RH-exception-header.patch", "//patches/baselibs:0002-RH-algorithm-header.patch", ], diff --git a/integration/images/qnx_x86_64/build/system.build b/integration/images/qnx_x86_64/build/system.build index f846c14434..4e7bc1a12f 100644 --- a/integration/images/qnx_x86_64/build/system.build +++ b/integration/images/qnx_x86_64/build/system.build @@ -277,8 +277,8 @@ pci/pci_debug2.so # Enhanced PCI debugging support [perms=644] /etc/dhcpcd.conf = ${MAIN_BUILD_FILE_DIR}/../configs/dhcpcd.conf # DHCP client configuration file # Communication configuration files -[perms=777] /etc/logging.json = ${MAIN_BUILD_FILE_DIR}/../../feature_integration_tests/configs/etc/logging.json -[perms=777] /etc/mw_com_config.json = ${MAIN_BUILD_FILE_DIR}/../../feature_integration_tests/configs/etc/mw_com_config.json +[perms=777] /etc/logging.json = ${MAIN_BUILD_FILE_DIR}/../../../feature_integration_tests/configs/etc/logging.json +[perms=777] /etc/mw_com_config.json = ${MAIN_BUILD_FILE_DIR}/../../../feature_integration_tests/configs/etc/mw_com_config.json # Executable files from external repositories [perms=777] /scrample = ${SCRAMPLE_PATH} diff --git a/integration/patches/baselibs/003-acl-fixes-for-aarch64.patch b/integration/patches/baselibs/003-acl-fixes-for-aarch64.patch new file mode 100644 index 0000000000..95ea478477 --- /dev/null +++ b/integration/patches/baselibs/003-acl-fixes-for-aarch64.patch @@ -0,0 +1,65 @@ +From 37a6329193e94d93fef91fc184e95e9a8b67a98b Mon Sep 17 00:00:00 2001 +From: Pawel Rutka +Date: Mon, 9 Feb 2026 14:51:53 +0100 +Subject: [PATCH] T + +Signed-off-by: Pawel Rutka +--- + MODULE.bazel | 7 +++++++ + third_party/acl/BUILD | 6 +++++- + third_party/acl/acl.BUILD | 7 ++++--- + 3 files changed, 16 insertions(+), 4 deletions(-) + +diff --git a/MODULE.bazel b/MODULE.bazel +index f7991cb..b78d618 100644 +--- a/MODULE.bazel ++++ b/MODULE.bazel +@@ -64,6 +64,13 @@ deb( + visibility = ["//visibility:public"], + ) + ++deb( ++ name = "acl-deb-aarch64", ++ build = "//third_party/acl:acl.BUILD", ++ urls = ["https://launchpadlibrarian.net/581258948/libacl1-dev_2.3.1-1_arm64.deb"], ++ visibility = ["//visibility:public"], ++) ++ + deb( + name = "valgrind-deb", + build = "//third_party/valgrind:valgrind.BUILD", +diff --git a/third_party/acl/BUILD b/third_party/acl/BUILD +index dfcac1e..c76bee3 100644 +--- a/third_party/acl/BUILD ++++ b/third_party/acl/BUILD +@@ -1,5 +1,9 @@ + alias( + name = "acl", +- actual = "@acl-deb//:acl", ++ actual = select({ ++ "@platforms//cpu:aarch64": "@acl-deb-aarch64//:acl", ++ "//conditions:default": "@acl-deb//:acl", ++ }), + visibility = ["//visibility:public"], + ) ++ +diff --git a/third_party/acl/acl.BUILD b/third_party/acl/acl.BUILD +index 2163068..d86c7f7 100644 +--- a/third_party/acl/acl.BUILD ++++ b/third_party/acl/acl.BUILD +@@ -1,8 +1,9 @@ + cc_library( + name = "acl", +- srcs = [ +- "usr/lib/libacl.a", +- ], ++ srcs = select({ ++ "@platforms//cpu:aarch64": ["usr/lib/aarch64-linux-gnu/libacl.a"], ++ "//conditions:default": ["usr/lib/libacl.a"], ++ }), + hdrs = [ + "usr/include/acl/libacl.h", + "usr/include/sys/acl.h", +-- +2.43.0 + From 3f92fc4472e2b87f01d0cd50472c6123c6cb6c7e Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Mon, 9 Feb 2026 15:06:36 +0100 Subject: [PATCH 18/22] Remove autosd and EB --- autosd/.bazelrc | 71 ---- autosd/BUILD.bazel | 32 -- autosd/MODULE.bazel | 70 --- autosd/build/.gitignore | 6 - autosd/build/README.md | 96 ----- autosd/build/files/bluechi-agent-main.conf | 15 - autosd/build/files/bluechi-agent-qm.conf | 15 - autosd/build/files/bluechi-controller.conf | 26 -- autosd/build/files/lola-ipc-pub.service | 26 -- autosd/build/files/lola-ipc-sub.service | 26 -- autosd/build/files/lola-ipc-test | 40 -- autosd/build/files/lola-ipc-test.service | 21 - autosd/build/image.aib.yml | 120 ------ autosd/build/scripts/run_qemu | 27 -- autosd/build/vars-devel.yml | 14 - autosd/build/vars.yml | 14 - autosd/patches/BUILD | 0 .../baselibs/0001-RH-exception-header.patch | 12 - .../baselibs/0002-RH-algorithm-header.patch | 36 -- autosd/patches/baselibs/BUILD | 0 .../0001-example-visibility.patch | 55 --- autosd/score_modules.MODULE.bazel | 94 ----- autosd/score_toolchains.MODULE.bazel | 33 -- ebclfsa/.bazelrc | 14 - ebclfsa/.bazelversion | 1 - ebclfsa/BUILD | 13 - ebclfsa/MODULE.bazel | 69 --- ebclfsa/README.md | 398 ------------------ ebclfsa/docs/system_setup.drawio.png | Bin 38057 -> 0 bytes ebclfsa/patches/BUILD | 0 ebclfsa/patches/fix_hard_coded_amd64.patch | 32 -- ebclfsa/persistency_integration/BUILD | 76 ---- ebclfsa/persistency_integration/run_qemu.sh | 33 -- .../scripts/cpp_tests_persistency.sh | 4 - ebclfsa/scrample_integration/BUILD | 118 ------ ebclfsa/scrample_integration/etc/logging.json | 8 - .../etc/mw_com_config.json | 63 --- ebclfsa/scrample_integration/run_qemu.sh | 33 -- ebclfsa/scrample_integration/src/main.cc | 38 -- 39 files changed, 1749 deletions(-) delete mode 100644 autosd/.bazelrc delete mode 100644 autosd/BUILD.bazel delete mode 100644 autosd/MODULE.bazel delete mode 100644 autosd/build/.gitignore delete mode 100644 autosd/build/README.md delete mode 100644 autosd/build/files/bluechi-agent-main.conf delete mode 100644 autosd/build/files/bluechi-agent-qm.conf delete mode 100644 autosd/build/files/bluechi-controller.conf delete mode 100644 autosd/build/files/lola-ipc-pub.service delete mode 100644 autosd/build/files/lola-ipc-sub.service delete mode 100755 autosd/build/files/lola-ipc-test delete mode 100644 autosd/build/files/lola-ipc-test.service delete mode 100644 autosd/build/image.aib.yml delete mode 100755 autosd/build/scripts/run_qemu delete mode 100644 autosd/build/vars-devel.yml delete mode 100644 autosd/build/vars.yml delete mode 100644 autosd/patches/BUILD delete mode 100644 autosd/patches/baselibs/0001-RH-exception-header.patch delete mode 100644 autosd/patches/baselibs/0002-RH-algorithm-header.patch delete mode 100644 autosd/patches/baselibs/BUILD delete mode 100644 autosd/patches/communication/0001-example-visibility.patch delete mode 100644 autosd/score_modules.MODULE.bazel delete mode 100644 autosd/score_toolchains.MODULE.bazel delete mode 100644 ebclfsa/.bazelrc delete mode 100644 ebclfsa/.bazelversion delete mode 100644 ebclfsa/BUILD delete mode 100644 ebclfsa/MODULE.bazel delete mode 100644 ebclfsa/README.md delete mode 100644 ebclfsa/docs/system_setup.drawio.png delete mode 100644 ebclfsa/patches/BUILD delete mode 100644 ebclfsa/patches/fix_hard_coded_amd64.patch delete mode 100644 ebclfsa/persistency_integration/BUILD delete mode 100755 ebclfsa/persistency_integration/run_qemu.sh delete mode 100755 ebclfsa/persistency_integration/scripts/cpp_tests_persistency.sh delete mode 100644 ebclfsa/scrample_integration/BUILD delete mode 100644 ebclfsa/scrample_integration/etc/logging.json delete mode 100644 ebclfsa/scrample_integration/etc/mw_com_config.json delete mode 100755 ebclfsa/scrample_integration/run_qemu.sh delete mode 100644 ebclfsa/scrample_integration/src/main.cc diff --git a/autosd/.bazelrc b/autosd/.bazelrc deleted file mode 100644 index 94e9876fed..0000000000 --- a/autosd/.bazelrc +++ /dev/null @@ -1,71 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ -common --registry=https://bcr.bazel.build - - -# Flags needed by score_baselibs and communication modules. -# Do not add more! -build --@score_baselibs//score/mw/log/detail/flags:KUse_Stub_Implementation_Only=False -build --@score_baselibs//score/mw/log/flags:KRemote_Logging=False -build --@score_baselibs//score/json:base_library=nlohmann -build --@score_communication//score/mw/com/flags:tracing_library=stub - -# stop legacy behavior of creating __init__.py files -build --incompatible_default_to_explicit_init_py -build --incompatible_strict_action_env -build --experimental_retain_test_configuration_across_testonly #https://github.com/bazelbuild/bazel/issues/6842 - -test --test_tag_filters=-manual -test --test_output=errors - -build:_bl_common --host_platform=@score_bazel_platforms//:x86_64-linux - -# This config is for internal module usage ONLY. -build:bl-x86_64-linux --config=_bl_common -build:bl-x86_64-linux --platforms=@score_bazel_platforms//:x86_64-linux -build:bl-x86_64-linux --extra_toolchains=@gcc_toolchain//:host_gcc_12 - -# This config is for internal module usage ONLY. -build:bl-x86_64-qnx --config=_bl_common -build:bl-x86_64-qnx --platforms=@score_bazel_platforms//:x86_64-qnx -build:bl-x86_64-qnx --extra_toolchains=@toolchains_qnx_qcc//:qcc_x86_64 - -# This config is for internal module usage ONLY. -# build --incompatible_enable_cc_toolchain_resolution -build:bl-x86_64-linux-autosd --config=_bl_common -build:bl-x86_64-linux-autosd --platforms=@score_bazel_platforms//:x86_64-linux -build:bl-x86_64-linux-autosd --extra_toolchains=@autosd_10_gcc_repo//:gcc_toolchain_linux_x86_64 -build:bl-x86_64-linux-autosd --force_pic - -# This config is for internal module usage ONLY. -test:bl-x86_64-linux --config=_bl_common -test:bl-x86_64-linux --build_tests_only -test:bl-x86_64-linux --test_tag_filters=-manual -test:bl-x86_64-linux --test_output=errors - - -# config from communication .bazelrc file -# unshare /dev/shm and /tmp -test --sandbox_tmpfs_path=/dev/shm -test --sandbox_tmpfs_path=/tmp - -# Java -build --java_language_version=17 -build --tool_java_language_version=17 -build --java_runtime_version=remotejdk_17 -build --tool_java_runtime_version=remotejdk_17 - -# user specific overrides (like proxy settings) -try-import %workspace%/user.bazelrc diff --git a/autosd/BUILD.bazel b/autosd/BUILD.bazel deleted file mode 100644 index 43453c4640..0000000000 --- a/autosd/BUILD.bazel +++ /dev/null @@ -1,32 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2024 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -load("@rules_rpm//rpm:defs.bzl", "rpm_package") - -rpm_package( - name = "lola-demo", - binaries = [ - "@score_communication//score/mw/com/example/ipc_bridge:ipc_bridge_cpp", - ], - config_dir = "/etc/lola", - data = [ - "@score_communication//score/mw/com/example/ipc_bridge:etc/mw_com_config.json", - ], - data_dir = "/usr/share/lola/examples", - description = "LOLA middleware communication libraries for development including core communication, configuration components, and example client/server binaries for testing", - libraries = [ - "@score_communication//score/mw/com:com", - "@score_communication//score/mw/com:config_schema", - ], - summary = "LOLA Demo", - version = "1.0.0", -) diff --git a/autosd/MODULE.bazel b/autosd/MODULE.bazel deleted file mode 100644 index 1ea1e1e142..0000000000 --- a/autosd/MODULE.bazel +++ /dev/null @@ -1,70 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -module( - name = "os_autosd_reference_integration", - version = "0.0.1", -) - -include("//:score_modules.MODULE.bazel") -include("//:score_toolchains.MODULE.bazel") - -## Python -bazel_dep(name = "rules_python", version = "1.4.1") - -PYTHON_VERSION = "3.12" - -python = use_extension("@rules_python//python/extensions:python.bzl", "python") -python.toolchain( - configure_coverage_tool = True, - is_default = True, - python_version = PYTHON_VERSION, -) -use_repo(python) - -pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip", dev_dependency = True) -pip.parse( - hub_name = "pip_score_venv_test", - python_version = PYTHON_VERSION, - requirements_lock = "//feature_integration_tests/python_test_cases:requirements.txt.lock", -) -use_repo(pip, "pip_score_venv_test") - -# communication module dependencies -# archive_override are not forwarded by bazel_dep, so we need to redefine it here -bazel_dep(name = "rules_boost", repo_name = "com_github_nelhage_rules_boost") -archive_override( - module_name = "rules_boost", - strip_prefix = "rules_boost-master", - urls = ["https://github.com/nelhage/rules_boost/archive/refs/heads/master.tar.gz"], -) - -# git_override are not forwarded by bazel_dep, so we need to redefine it here -bazel_dep(name = "trlc") -git_override( - module_name = "trlc", - commit = "650b51a47264a4f232b3341f473527710fc32669", # trlc-2.0.2 release - remote = "https://github.com/bmw-software-engineering/trlc.git", -) - -# imports for the feature showcase module -bazel_dep(name = "rules_rust", version = "0.61.0") -bazel_dep(name = "score_itf", version = "0.1.0") -bazel_dep(name = "score_crates", version = "0.0.4") - -# RPM packaging support -bazel_dep(name = "rules_rpm", version = "0.1.0") -git_override( - module_name = "rules_rpm", - branch = "main", - remote = "https://github.com/bilelmoussaoui/bazel-rpm.git", -) diff --git a/autosd/build/.gitignore b/autosd/build/.gitignore deleted file mode 100644 index 5c103a0641..0000000000 --- a/autosd/build/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -_build/ -outputs/ -auto-image-builder.sh - -*.qcow2 -*.img diff --git a/autosd/build/README.md b/autosd/build/README.md deleted file mode 100644 index 744b67fe7a..0000000000 --- a/autosd/build/README.md +++ /dev/null @@ -1,96 +0,0 @@ -AutoSD MCO LoLa Demo -==================== - -## Background and Basic Info - -This demo build an AutoSD image using [Automotive-Image-Builder](https://gitlab.com/CentOS/automotive/src/automotive-image-builder). -This image comes pre-populated with the S-core's [communication](https://github.com/eclipse-score/communication) project packaged as RPM in a [COPR](https://copr.fedorainfracloud.org/coprs/pingou/score-playground/) repository as well as the [QM](https://github.com/containers/qm) project. - -The image is pre-configured to allow the communication project to send and receive messages within the root partition but also between the root partition and the QM partition. - - -Some things to know about this demo: -- The RPM packaging, currently, doesn't rely on Bazel. This is something that is being fixed, but in the current stage it is not there yet. -- Baselibs and communication have had to get some patches, some of which have already been sent upstream: - - Missing headers: https://github.com/eclipse-score/communication/pull/64 - - Missing headers: https://github.com/eclipse-score/baselibs/pull/19 - - Compilation issues on newer GCC + support for Linux ARM64: https://github.com/eclipse-score/baselibs/pull/22 - - Fix dangling references and compiler warnings for newer GCC: https://github.com/eclipse-score/communication/pull/68 - - Fix Google benchmark main function scope: https://github.com/eclipse-score/communication/pull/67 -- Other changes have not yet been sent upstream: - - Add the ability to configure the path where communication opens the shared memory segments: https://github.com/eclipse-score/communication/commit/127a64f07f48e1d69783dc20f217da813115dbe6 (not the final version of this change) - -The goal of this last commit is to avoid having to mount the entire `/dev/shm` into the QM partition and instead mount just a subfolder: `/dev/shm/lola_qm`. - - -## Building It - -A linux system is required to build this image but Ubuntu -and an OCI compliant container manager (docker, podman) should be enough. - -Download the builder script: - -``` -$ curl -o auto-image-builder.sh \ - "https://gitlab.com/CentOS/automotive/src/automotive-image-builder/-/raw/main/auto-image-builder.sh" -$ chmod +x automotive-image-builder -``` - -Build a qemu image by running: - -``` -sudo ./auto-image-builder.sh build \ ---define-file vars.yml \ ---define-file vars-devel.yml \ ---target qemu \ ---export qcow2 \ ---distro autosd10 lola-demo.aib.yml \ -autosd10-lola-x86_64.qcow2 -``` - -Change the image perms (if needed) since `sudo` was used: - -``` -sudo chown $(logname) autosd10-lola-x86_64.qcow2 -``` - -## Running/Testing the Demo - -You can run the qcow2 image with your qemu tool of choice and login into the image (either directly or over ssh) -with `root / password` (developer access defined by `vars-devel`). - -The image contains Systemd service defintions for LoLa, in both host and QM environemnts: - -- lola-ipc-sub.service -- lola-ipc-pub.service - -They can be used in the same environment or between them, to exemplify its mixed critical orchestration integration. - -For example, to run the publisher in the host environment while receiving messages in the QM one: - - -Start the subscriber in the QM partition: - -``` -# start the service -podman exec -it qm systemctl start lola-ipc-sub - -# check status -podman exec -it qm systemctl status lola-ipc-sub - -# get logs -podman exec -it qm journalctl -u lola-ipc-sub.service -``` - - -Start a publisher in the host environment: - -``` -systemctl start lola-ipc-pub -``` - -Check the QM process logs again with: - -``` -podman exec -it qm journalctl -u lola-ipc-sub.service -``` diff --git a/autosd/build/files/bluechi-agent-main.conf b/autosd/build/files/bluechi-agent-main.conf deleted file mode 100644 index 63a52a150c..0000000000 --- a/autosd/build/files/bluechi-agent-main.conf +++ /dev/null @@ -1,15 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -[bluechi-agent] -NodeName=agent-main -ControllerAddress=unix:path=/run/bluechi/bluechi.sock diff --git a/autosd/build/files/bluechi-agent-qm.conf b/autosd/build/files/bluechi-agent-qm.conf deleted file mode 100644 index ec97e88021..0000000000 --- a/autosd/build/files/bluechi-agent-qm.conf +++ /dev/null @@ -1,15 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -[bluechi-agent] -NodeName=agent-qm -ControllerAddress=unix:path=/run/bluechi/bluechi.sock diff --git a/autosd/build/files/bluechi-controller.conf b/autosd/build/files/bluechi-controller.conf deleted file mode 100644 index de800486c7..0000000000 --- a/autosd/build/files/bluechi-controller.conf +++ /dev/null @@ -1,26 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -[bluechi-controller] -ControllerPort=2020 -UseTCP=true -UseUDS=true -LogLevel=DEBUG -AllowedNodeNames=agent-main,agent-qm - -[node agent-main] -Allowed=true -AllowDependenciesOn=agent-main,agent-qm - -[node agent-qm] -Allowed=true -AllowDependenciesOn=agent-main,agent-qm diff --git a/autosd/build/files/lola-ipc-pub.service b/autosd/build/files/lola-ipc-pub.service deleted file mode 100644 index 8fe536b493..0000000000 --- a/autosd/build/files/lola-ipc-pub.service +++ /dev/null @@ -1,26 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -[Unit] -Description=LoLa IPC Publisher -After=network.target - -[Service] -Type=simple -WorkingDirectory=/usr/share/lola/examples -ExecStart=/usr/bin/ipc_bridge_cpp --mode skeleton --num-cycles 5 --cycle-time 1000 --service_instance_manifest mw_com_config.json -Restart=on-failure -RestartSec=5 -RemainAfterExit=yes - -[Install] -WantedBy=multi-user.target diff --git a/autosd/build/files/lola-ipc-sub.service b/autosd/build/files/lola-ipc-sub.service deleted file mode 100644 index d1a108ec78..0000000000 --- a/autosd/build/files/lola-ipc-sub.service +++ /dev/null @@ -1,26 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -[Unit] -Requires=bluechi-proxy@agent-main_lola-ipc-pub.service -Description=LoLa IPC Subscriber -After=network.target - -[Service] -WorkingDirectory=/usr/share/lola/examples -ExecStart=/usr/bin/ipc_bridge_cpp --mode proxy --num-cycles 5 --cycle-time 1000 --service_instance_manifest mw_com_config.json -Restart=on-failure -RestartSec=5 -RemainAfterExit=yes - -[Install] -WantedBy=multi-user.target diff --git a/autosd/build/files/lola-ipc-test b/autosd/build/files/lola-ipc-test deleted file mode 100755 index 6ec3e45772..0000000000 --- a/autosd/build/files/lola-ipc-test +++ /dev/null @@ -1,40 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -#!/bin/bash -set -e - -BOOTSTRAP=${1:-false} -BOOSTRAP=$(echo "${BOOTSTRAP}" | tr '[:upper:]' '[:lower:]') - -if [[ "${BOOTSTRAP}" == "true" ]]; then - podman exec -it qm systemctl start lola-ipc-sub.service - systemctl start lola-ipc-pub.service - - sleep 60 -fi - -# check publisher logs -journalctl -u lola-ipc-pub | cat | grep -qE 'Sending sample: [0-9]+' -if [ "$?" -ne "0" ]; then - echo Could not match 'Sending sample: [0-9]+' from lola-ipc-pub.service logs. - exit $? -fi - -# check subscriber logs -podman exec -it qm journalctl -u lola-ipc-sub.service | cat | grep -qE 'Received sample: [0-9]+' -if [ "$?" -ne "0" ]; then - echo Could not match 'Received sample: [0-9]+' from lola-ipc-sub.service logs - exit $? -fi - -exit 0 diff --git a/autosd/build/files/lola-ipc-test.service b/autosd/build/files/lola-ipc-test.service deleted file mode 100644 index 428a8b19ce..0000000000 --- a/autosd/build/files/lola-ipc-test.service +++ /dev/null @@ -1,21 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -[Unit] -Requires=bluechi-proxy@agent-qm_lola-ipc-sub.service -Requires=bluechi-proxy@agent-main_lola-ipc-pub.service -After=proxy@agent-main_lola-ipc-pub.service - -[Service] -Type=oneshot -ExecStart=/bin/bash /usr/bin/lola-ipc-test -RemainAfterExit=yes diff --git a/autosd/build/image.aib.yml b/autosd/build/image.aib.yml deleted file mode 100644 index 0e673538c9..0000000000 --- a/autosd/build/image.aib.yml +++ /dev/null @@ -1,120 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -# -name: score-autosd - -image: - selinux_mode: permissive -content: - enable_repos: - - devel - repos: - - id: epel - baseurl: https://dl.fedoraproject.org/pub/epel/10/Everything/$arch/ - - id: score - baseurl: file:///host/rpms - rpms: - - vim-enhanced - - gdb - - strace - - boost-devel - - tree - - dnf - # For testing the image only: - - openssh-server - - openssh-clients - # bluechi packages - - bluechi-selinux - - bluechi-controller - - bluechi-agent - - bluechi-ctl - # score - - lola-demo - - make_dirs: - - path: /etc/containers/systemd/qm.container.d - mode: 0755 - parents: true - exist_ok: true - - # Configure shared socket directory via tmpfiles - add_files: - - path: /usr/lib/tmpfiles.d/lola_disc.conf - text: | - # Lola service discovery folder - D! /tmp/mw_com_lola 0755 root root - - path: /etc/containers/systemd/qm.container.d/10-lola-ipc.conf - text: | - # Mount shared IPC directory for lola - [Container] - Volume=/dev/shm:/dev/shm - Volume=/tmp/mw_com_lola:/tmp/mw_com_lola - - path: /etc/containers/systemd/qm.container.d/11-bluechi-socket.conf - text: | - [Container] - Volume=/run/bluechi:/run/bluechi - # bluechi files - - path: /etc/bluechi/controller.conf.d/0-main.conf - source_path: files/bluechi-controller.conf - - path: /etc/bluechi/agent.conf.d/0-main.conf - source_path: files/bluechi-agent-main.conf - # lola service files - - path: /etc/systemd/system/lola-ipc-pub.service - source_path: files/lola-ipc-pub.service - # lola test script - - path: /usr/bin/lola-ipc-test - source_path: files/lola-ipc-test - chmod_files: - - path: /usr/bin/lola-ipc-test - mode: "0755" - - # Required for testing the image only: - systemd: - enabled_services: - # Enable ssh daemon - - sshd.service - - bluechi-controller.service - - bluechi-agent.service - -qm: - memory_limit: - max: infinity - high: infinity - content: - enable_repos: - - devel - repos: - - id: epel - baseurl: https://dl.fedoraproject.org/pub/epel/10/Everything/$arch/ - - id: score - baseurl: file:///host/rpms - rpms: - - boost-devel - - bluechi-agent - - lola-demo - add_files: - # lola service files - - path: /etc/systemd/system/lola-ipc-sub.service - source_path: files/lola-ipc-sub.service - # bluechi files - - path: /etc/bluechi/agent.conf.d/0-qm.conf - source_path: files/bluechi-agent-qm.conf - systemd: - enabled_services: - - bluechi-agent - -auth: - # Required for testing the image only: - sshd_config: - PasswordAuthentication: true - PermitRootLogin: true diff --git a/autosd/build/scripts/run_qemu b/autosd/build/scripts/run_qemu deleted file mode 100755 index 039b242a86..0000000000 --- a/autosd/build/scripts/run_qemu +++ /dev/null @@ -1,27 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -#!/bin/bash - -/usr/bin/qemu-system-x86_64 \ --drive file=/usr/share/OVMF/OVMF_CODE_4M.fd,if=pflash,format=raw,unit=0,readonly=on \ --drive file=/usr/share/OVMF/OVMF_VARS_4M.fd,if=pflash,format=raw,unit=1,snapshot=on,readonly=off \ --enable-kvm \ --m 5G \ --smp $(nproc) \ --machine q35 \ --cpu host \ --device virtio-net-pci,netdev=n0 \ --netdev user,id=n0,hostfwd=tcp::2222-:22 \ --daemonize \ --display none \ --drive file=disk.qcow2,index=0,media=disk,format=qcow2,if=virtio,id=rootdisk,snapshot=off diff --git a/autosd/build/vars-devel.yml b/autosd/build/vars-devel.yml deleted file mode 100644 index cfebf2ebf2..0000000000 --- a/autosd/build/vars-devel.yml +++ /dev/null @@ -1,14 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -root_password: $6$xoLqEUz0cGGJRx01$H3H/bFm0myJPULNMtbSsOFd/2BnHqHkMD92Sfxd.EKM9hXTWSmELG8cf205l6dktomuTcgKGGtGDgtvHVXSWU. diff --git a/autosd/build/vars.yml b/autosd/build/vars.yml deleted file mode 100644 index f76998dd8f..0000000000 --- a/autosd/build/vars.yml +++ /dev/null @@ -1,14 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -disable_ipv6: false diff --git a/autosd/patches/BUILD b/autosd/patches/BUILD deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/autosd/patches/baselibs/0001-RH-exception-header.patch b/autosd/patches/baselibs/0001-RH-exception-header.patch deleted file mode 100644 index d48191eab2..0000000000 --- a/autosd/patches/baselibs/0001-RH-exception-header.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/score/concurrency/clock.h b/score/concurrency/clock.h -index 0fa7719..365a003 100644 ---- a/score/concurrency/clock.h -+++ b/score/concurrency/clock.h -@@ -15,6 +15,7 @@ - - #include - #include -+#include - - namespace score - { diff --git a/autosd/patches/baselibs/0002-RH-algorithm-header.patch b/autosd/patches/baselibs/0002-RH-algorithm-header.patch deleted file mode 100644 index 70fc3780a9..0000000000 --- a/autosd/patches/baselibs/0002-RH-algorithm-header.patch +++ /dev/null @@ -1,36 +0,0 @@ -diff --git a/score/language/futurecpp/tests/member_iterator_test.cpp b/score/language/futurecpp/tests/member_iterator_test.cpp -index bea1361..6d649d2 100644 ---- a/score/language/futurecpp/tests/member_iterator_test.cpp -+++ b/score/language/futurecpp/tests/member_iterator_test.cpp -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - - #include - -diff --git a/score/language/futurecpp/tests/multi_span_test.cpp b/score/language/futurecpp/tests/multi_span_test.cpp -index 9b57903..c0da98b 100644 ---- a/score/language/futurecpp/tests/multi_span_test.cpp -+++ b/score/language/futurecpp/tests/multi_span_test.cpp -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - - #include - -diff --git a/score/mw/log/detail/logging_identifier.h b/score/mw/log/detail/logging_identifier.h -index ec02bac..b15bdfa 100644 ---- a/score/mw/log/detail/logging_identifier.h -+++ b/score/mw/log/detail/logging_identifier.h -@@ -19,6 +19,7 @@ - - #include - #include -+#include - - namespace score - { diff --git a/autosd/patches/baselibs/BUILD b/autosd/patches/baselibs/BUILD deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/autosd/patches/communication/0001-example-visibility.patch b/autosd/patches/communication/0001-example-visibility.patch deleted file mode 100644 index 8040c2872b..0000000000 --- a/autosd/patches/communication/0001-example-visibility.patch +++ /dev/null @@ -1,55 +0,0 @@ -diff --git a/score/mw/com/example/ipc_bridge/BUILD b/score/mw/com/example/ipc_bridge/BUILD -index 2c364e1..f797762 100644 ---- a/score/mw/com/example/ipc_bridge/BUILD -+++ b/score/mw/com/example/ipc_bridge/BUILD -@@ -29,6 +29,7 @@ cc_binary( - "@score_baselibs//score/language/futurecpp", - "@score_baselibs//score/mw/log", - ], -+ visibility = ["//visibility:public"] - ) - - cc_library( -@@ -45,6 +46,7 @@ cc_library( - "//score/mw/com", - "@score_baselibs//score/mw/log", - ], -+ visibility = ["//visibility:public"] - ) - - cc_library( -@@ -60,6 +62,7 @@ cc_library( - "//score/mw/com", - "@score_baselibs//score/language/futurecpp", - ], -+ visibility = ["//visibility:public"] - ) - - rust_library( -@@ -70,6 +73,7 @@ rust_library( - "//score/mw/com/impl/rust:mw_com", - "@crate_index//:libc", - ], -+ visibility = ["//visibility:public"] - ) - - rust_binary( -@@ -84,6 +88,7 @@ rust_binary( - "@crate_index//:clap", - "@crate_index//:futures", - ], -+ visibility = ["//visibility:public"] - ) - - cc_library( -@@ -94,4 +99,10 @@ cc_library( - ":datatype", - "//score/mw/com/impl/rust:bridge_macros", - ], -+ visibility = ["//visibility:public"] -+) -+ -+exports_files( -+ ["etc/mw_com_config.json", "etc/logging.json"], -+ visibility = ["//visibility:public"] - ) diff --git a/autosd/score_modules.MODULE.bazel b/autosd/score_modules.MODULE.bazel deleted file mode 100644 index 22a726be63..0000000000 --- a/autosd/score_modules.MODULE.bazel +++ /dev/null @@ -1,94 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -bazel_dep(name = "score_baselibs") -single_version_override( - module_name = "score_baselibs", - version = "0.1.3", - patches = [ - "//patches/baselibs:0001-RH-exception-header.patch", - "//patches/baselibs:0002-RH-algorithm-header.patch", - ], - patch_strip = 1, -) - -bazel_dep(name = "score_communication") -single_version_override( - module_name = "score_communication", - version = "0.1.0", - patches = [ - "patches/communication/0001-example-visibility.patch", - ], - patch_strip = 1 -) - -bazel_dep(name = "score_persistency") -single_version_override( - module_name = "score_persistency", - version = "0.2.1", -) - -bazel_dep(name = "score_orchestrator") -single_version_override( - module_name = "score_orchestrator", - version = "0.0.3", -) - -bazel_dep(name = "score_tooling") -single_version_override( - module_name = "score_tooling", - version = "1.0.2", -) - -bazel_dep(name = "score_platform") -single_version_override( - module_name = "score_platform", - version = "0.5.0", -) - -bazel_dep(name = "score_bazel_platforms") -single_version_override( - module_name = "score_bazel_platforms", - version = "0.0.2", -) - -bazel_dep(name = "score_test_scenarios") -single_version_override( - module_name = "score_test_scenarios", - version = "0.3.0", -) - -bazel_dep(name = "score_docs_as_code") -single_version_override( - module_name = "score_docs_as_code", - version = "2.2.0", -) - -bazel_dep(name = "score_process") -single_version_override( - module_name = "score_process", - version = "1.3.2", -) - -bazel_dep(name = "score_feo", version = "1.0.2") -single_version_override( - module_name = "score_feo", - version = "1.0.2", -) - -bazel_dep(name = "score_kyron") -git_override( - module_name = "score_kyron", - remote = "https://github.com/eclipse-score/kyron.git", - commit = "c5837ac6612a5ebf91cd016775f2d3ee85ed6892", -) diff --git a/autosd/score_toolchains.MODULE.bazel b/autosd/score_toolchains.MODULE.bazel deleted file mode 100644 index a2aecce635..0000000000 --- a/autosd/score_toolchains.MODULE.bazel +++ /dev/null @@ -1,33 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -bazel_dep(name = "os_autosd_toolchain", version = "0.0.1") -# override with git -git_override( - module_name = "os_autosd_toolchain", - remote = "https://github.com/odra/inc_os_autosd.git", - branch = "repo-new-structure", - strip_prefix = "toolchain" - -) -autosd_10_gcc = use_extension("@os_autosd_toolchain//autosd_10_gcc:extensions.bzl", "autosd_10_gcc_extension") -use_repo(autosd_10_gcc, "autosd_10_gcc_repo") -register_toolchains("@autosd_10_gcc_repo//:gcc_toolchain_linux_x86_64") - -autosd_9_gcc = use_extension("@os_autosd_toolchain//autosd_9_gcc:extensions.bzl", "autosd_9_gcc_extension") -use_repo(autosd_9_gcc, "autosd_9_gcc_repo") -register_toolchains("@autosd_9_gcc_repo//:gcc_toolchain_linux_x86_64") - -# Register the RPM toolchain -rpm_toolchain = use_extension("@rules_rpm//toolchains:extensions.bzl", "rpm_toolchain") -use_repo(rpm_toolchain, "rpm_toolchain") -register_toolchains("@rules_rpm//toolchains:linux_x86_64") diff --git a/ebclfsa/.bazelrc b/ebclfsa/.bazelrc deleted file mode 100644 index c9589ef9ce..0000000000 --- a/ebclfsa/.bazelrc +++ /dev/null @@ -1,14 +0,0 @@ -common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ -common --registry=https://bcr.bazel.build - -build:_common --@score_baselibs//score/mw/log/detail/flags:KUse_Stub_Implementation_Only=False -build:_common --@score_baselibs//score/mw/log/flags:KRemote_Logging=False -build:_common --@score_baselibs//score/json:base_library=nlohmann -build:_common --@score_baselibs//score/memory/shared/flags:use_typedshmd=False -build:_common --@score_communication//score/mw/com/flags:tracing_library=stub -build:_common --cxxopt=-Wno-error=mismatched-new-delete - -build:aarch64-ebclfsa --config=_common -build:aarch64-ebclfsa --extra_toolchains=@gcc_toolchain//:aarch64_gcc_13 -build:aarch64-ebclfsa --platforms=@score_toolchains_gcc//platforms:aarch64-linux -build:aarch64-ebclfsa --spawn_strategy=local diff --git a/ebclfsa/.bazelversion b/ebclfsa/.bazelversion deleted file mode 100644 index 6da4de57dc..0000000000 --- a/ebclfsa/.bazelversion +++ /dev/null @@ -1 +0,0 @@ -8.4.1 diff --git a/ebclfsa/BUILD b/ebclfsa/BUILD deleted file mode 100644 index df35a19965..0000000000 --- a/ebclfsa/BUILD +++ /dev/null @@ -1,13 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 - -# ******************************************************************************* diff --git a/ebclfsa/MODULE.bazel b/ebclfsa/MODULE.bazel deleted file mode 100644 index 04b66a5975..0000000000 --- a/ebclfsa/MODULE.bazel +++ /dev/null @@ -1,69 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -"EB corbos Linux for Safety Applications - S-CORE Reference Integration" - -module( - name = "reference_integration_ebclfsa", - version = "0.1.0", - compatibility_level = 0, -) - -bazel_dep(name = "rules_cc", version = "0.2.1") - -bazel_dep(name = "score_toolchains_gcc", dev_dependency=True) -git_override( # Elektrobit corbos Linux for Safety Applications needs a specific toolchain - module_name = "score_toolchains_gcc", - remote = "https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc.git", - tag = "0.5.0-beta" # corresponds to git sha 158921ffd9aabef41a2a03bca5baeaa9f4aa9d33 -) -gcc = use_extension("@score_toolchains_gcc//extensions:gcc.bzl", "gcc", dev_dependency=True) -gcc.toolchain( - url = "https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc/releases/download/0.5.0-beta/fastdev-sdk-ubuntu-ebclfsa-ebcl-qemuarm64.tar.gz", - sha256 = "05b57bbc8d99d46df6b57f774c39a5a2664964ea7eb94147cbece08508c1f121", - strip_prefix = "fastdev-sdk-ubuntu-ebclfsa-ebcl-qemuarm64", -) -use_repo(gcc, "gcc_toolchain", "gcc_toolchain_gcc") - -bazel_dep(name = "score_docs_as_code", version = "2.2.0") # part of 0.5.0-beta release -single_version_override( - module_name = "score_docs_as_code", - version = "2.2.0", -) - -bazel_dep(name = "score_baselibs") -single_version_override( - module_name = "score_baselibs", - version = "0.2.2", # part of 0.5.0-beta release - patch_strip = 1, - patches = [ - "//patches:fix_hard_coded_amd64.patch", - ], -) -bazel_dep(name = "score_communication", version = "0.1.2") # part of 0.5.0-beta release -bazel_dep(name = "score_scrample", version = "0.1.0") # part of 0.5.0-beta release -bazel_dep(name = "score_persistency", version = "0.2.2") # part of 0.5.0-beta release - -# git_override is not forwarded by bazel_dep, so we need to redefine it here -git_override( - module_name = "trlc", - remote = "https://github.com/bmw-software-engineering/trlc.git", - commit = "650b51a47264a4f232b3341f473527710fc32669", # trlc-2.0.2 release -) - -# archive_override is not forwarded by bazel_dep, so we need to redefine it here -archive_override( - module_name = "rules_boost", - urls = ["https://github.com/nelhage/rules_boost/archive/refs/heads/master.tar.gz"], - strip_prefix = "rules_boost-master", -) diff --git a/ebclfsa/README.md b/ebclfsa/README.md deleted file mode 100644 index 992639072e..0000000000 --- a/ebclfsa/README.md +++ /dev/null @@ -1,398 +0,0 @@ -# Eclipse S-CORE on Elektrobit corbos Linux for Safety Applications - -This directory shows the integration of Eclipse S-CORE on Elektrobit corbos Linux for Safety Applications. -It builds an [example based on the Eclipse S-CORE communication framework](https://github.com/eclipse-score/scrample) as demo/test application. -This application is then [integrated](scrample_integration/) into the so-called "fast-dev" variant of EB corbos Linux for Safety Applications (EBcLfSA). -This is an `aarch64`-based, pre-built image, capable of demonstraing the execution of high integrity applications in regular Linux user-space. -The example can be executed using QEMU. -In the [related CI workflow](../.github/workflows/build_and_test_ebclfsa.yml), all these steps are performed, and the resulting log files are stored and made available for download. - -> [!TIP] -> **Quick Start** -> -> The steps performed in continuous integration can be also run interactively. -> The fastest way to achieve this is to use [GitHub Codespaces](https://github.com/features/codespaces), a cloud based development environment. -> You need a GitHub.com account for this to work. -There is a free tier of this commercial service, which is sufficient. -However, please understand that we cannot advise you about possible costs in your specific case. -> - Click on the following badge: [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/eclipse-score/reference_integration) -> - In the following dialog, make sure to select "Machine type" as "4-core". -> Click "Create codespace." -> It will take some time (2-3 minutes) for the machine to start. -> There will be a log message "Finished configuring codespace." -> - Hit "Ctrl-Shift-C" to open a new terminal. -> - Copy and paste the following command into the terminal and hit "Enter": -> -> ```bash -> cd ./ebclfsa && bazel build --config=aarch64-ebclfsa //scrample_integration:run -> ``` -> -> This will build and run the example. -> There may be a warning about "High codespace CPU (100%) utilization detected.", which you can ignore. -> The complete process will take around 6 minutes to complete on the 4-core machine. -> -> The expected output looks like this: -> -> ```console -> [...] -> Target //scrample_integration:run up-to-date: -> bazel-bin/scrample_integration/qemu_run.log -> bazel-bin/scrample_integration/ssh_scrample_run.log ->INFO: Elapsed time: 361.273s, Critical Path: 91.92s ->INFO: 836 processes: 10 internal, 826 local. ->INFO: Build completed successfully, 836 total actions -> ``` -> -> The two log files mentioned in this output are the main results of the test execution. -> You can open them by Ctrl-clicking on the output entry. -> -> The remainder of this document describes in detail what you have just accomplished. -> -> In order to close the Codespace again, first take note of the name of the Codespace. -> It is a random combination of and adjective and a noun, mentioned in the bottom left of the browser window. -> Go to your [GitHub Codespaces Dashboard](https://github.com/codespaces), find the Codespace in your list, click on the "..." in that row and select "Delete". -> -> Note that the demo can, of course, als run locally on your computer. -> Clone the repository, open it in Visual Studio Code, start the supplied Development Container, and run the demo as described above. -> This requires a setup that can run [Development Containers](https://containers.dev/) using [Visual Studio Code](https://code.visualstudio.com/). -> The [Visual Studio Code documentation](https://code.visualstudio.com/docs/devcontainers/containers) can be a good starting point; however, an in-depth explanation of this is beyond the goals of this Quick Start. - -## Prebuilt Binary Assets - -The whole setup is open source. -To simplify the deployment and focus on the integration itself, this demo uses pre-built binary assets. -These consist of a pre-built image and a cross-compilation toolchain. -Both assets are referenced in the corresponding Bazel targets and are automatically downloaded on demand. - -The pre-built image provides a so called "fast-dev" integration for EBcLfSA, -which makes development and debugging of high integrity applications easy. -The fast-dev image itself is based on a single aarch64 Linux VM with a specially patched Linux kernel and user-space. -It checks at runtime, whether high integrity applications adhere to certain assumptions of use (AoU) of EBcLfSA. - -Note that this image represents a development image but not a production image of Linux for Safety Application. -It is aimed at demonstrating development with focus on key features and AoUs. - -## Main constraints for high-integrity applications - -For non-safety ("low integrity") applications, Linux for Safety Applications _is_ a standard Linux system. -For applications with safety requirements, also referred to as _high integrity (HI) applications_, -Linux for Safety Applications expects few constraints, especially: - -1. An HI application must be flagged with an additional checksum in its ELF-header to be detected as an high integrity application. -2. An HI application must check its registration status with the supervisor. -3. At least one HI application (e.g. a health manager) must cyclically trigger - the watchdog of Linux for Safety Applications. -4. Few kernel system calls are not allowed to be invoked by an HI application. - - The patches of the "fast-dev" kernel will create a log which helps you to identify them. - - Recommendation: - Build your HI applications and associated libraries on top of the C standard's library definition. - Elektrobit will provide an appropriately qualified version for production projects. -5. Ask for advice when you want to modify/extend kernel functionality or invoke device-specific I/O operations. - -The example application disregards the items 2-5. -They are mandatory for production systems but can be violated during development in the fast-dev environment. -For example, the items 3 and 4 only make sense in a complete system. - -Current restrictions: - -- HI applications must be statically linked. -- PID1 needs to be an HI process. -- HI processes can only be started by another HI process. - -## Application- and Integration-Specific Violation of System Call Restrictions - -The current integration setup is based on a non-safety-certified set of a toolchain and standard libraries. -As a result, an application compiled and linked with the provided example toolchain will generate system call violations. -For the used communication example app this happens during application startup/teardown and is indicated by the occurrence of `ioctl`,`clone3` and `madvice` system calls. - -The full product version intended for production implements process and memory management for high integrity applications according to the C Standard Library. -When using other standard library implementations, `clone3` and `madvice` might be called. -This is ok during development and will not affect you when switching to the safety compliant C Standard Library. -Avoid calling such system calls directly from HI applications, though. -The following table gives an overview why the occurred system calls are not supported and what would be the proposed alternative solution. -Keep in mind, this is only relevant if the system calls are explicitly called by the application code, or libraries other than the provided standard libraries. - -| System Call | Reason | Suggested Alternative or Workaround | -|---------|--------|-------------------------------------| -| `ioctl` | Very flexible function signature, which is hard to "make safe" in a generic way. | Try to avoid direct `ioctl` calls. If direct driver interaction is needed, use alternative kernel standard interfaces like `netlink` or device file IO. A customer specific implementation of a certain function signature might be possible. | -| `clone3` | No part of C standard library. Not needed to create HI processes. | Use C standard library functions to create processes and threads (or system call `clone`). The full product version intended for production will implement them in a way that ensures safe execution. | -| `madvise` | No part of C standard library. All memory of HI Apps is pre-faulted and fully committed at allocation time, hence most kernel optimizations/hints have limited effect. | Use C standard library functions for memory management. The full product version intended for production will implement them in a way that ensures safe execution. | - -## User-Space - -The user-space of the pre-built image consists of three main components: - -- The _trampoline application_, a simplified HI init process -- EBcLfSA example HI and LI applications -- Low integrity system init and user-space - -system_setup drawio - -The system itself is able to run without any Eclipse S-CORE demo applications. -Nevertheless, the trampoline application already provides an entry point for a subsequently deployed application binary. -This entry point is used by the [Eclipse S-CORE Example](#eclipse-s-core-example) application. - -### Trampoline App (cflinit) - -The trampoline application `cflinit` acts as a simplified HI init process which starts the applications as listed above. -This includes the HI application of the EBcLfSA example, as well as a wrapper for the Eclipse S-CORE application binary. -Besides the HI applications, it starts [crinit](https://gitext.elektrobitautomotive.com/EB-Linux/crinit) as a secondary low integrity init daemon, -which brings up the regular (low integrity) Linux user-land. -Once all apps are started, it sleeps forever. - -Below you can see the output generated by `cflinit`. - -```console -cflinit: INFO: Hello from EBcLfSA HI init application -cflinit: INFO: Mounted tmpfs to /dev/shm -cflinit: INFO: Starting application crinit -cflinit: INFO: Starting application HI App -cflinit: ERROR: Could not read /usr/bin/hi_app (2) -cflinit: INFO: Starting application EBcLfSA HI demo -cflinit: INFO: Starting application EBcLfSA HI upper -cflinit: INFO: Finished starting child applications; going to sleep -``` - -As long as the Eclipse S-CORE example is not yet deployed (detected by a missing `/usr/bin/hi_app` binary) the above `ERROR` occurs and `cflinit` skips starting it. - -### EBcLfSA HI Demo - -For technical reasons, the image contains also a secondary demo, with the executables `ebclfsa-hi-demo`, `ebclfsa-hi-upper`, and `ebclfsa-li-demo`. -They demonstrate message passing via a shared memory interface, which does not use Eclipse S-CORE. -Hence, they are not relevant for the demonstration and should be ignored. - -### Low Integrity System Init and User-Space - -As mentioned above, `crinit` is used to set up a low integrity user-land beside the high integrity applications. -This is used primarily for development and user experience by providing components like an SSH server, a login daemon, or `gdbserver`. - -## Eclipse S-CORE Example - -> [!IMPORTANT] -> This guide assumes that you use the SDK's [dev-container](https://github.com/eclipse-score/devcontainer). -> If you are using the Codespace as described in the Quick Start, this is the case. -> The dev-container contains all required dependencies, like `qemu-system-aarch64` and `sshpass`. - -This section shows how you can use the above described SDK with the example application. -You will see how you can create a low integrity and a high integrity application, build them with the S-CORE toolchain and run them finally on Linux for Safety Applications. - -The first three subsections explain the build and runtime setup. -They help you to understand the integration. -You can apply the approach on other S-CORE apps, too. - -- Application Setup: - The two application setup of the example and how to make one of them an HI application. -- S-CORE Toolchain in Linux for Safety Applications: - The general integration of the required tools into S-CORE's Bazel toolchain. - This should work for other applications, too. -- Bazel Rules for the Example Applications: The specific Bazel ruleset for the example - -The next three sections guide you through the concrete steps of applying these rules -to build and deploy the example. - -- Full Run of the Example Application -- Building the application -- Using the fast-dev image - -And please also look at the shortcuts we implemented in the Visual Studio Code workspace to speed up the usage of the application example. -You find them at the end of this section. - -### Application Setup - -The application setup is constructed of two instances of the `scrample` application, a high integrity (HI) instance acting as receiver and a low integrity (LI) instance acting as sender. -The HI instance is started automatically by `cflinit` and listens in background. -You start the LI instance manually in a terminal to run the demo. -Even though both instances rely on the same source code, they do not use the same application binary. -The HI application instance uses a binary located at `/usr/bin/scrample_sil` with a marked ELF-header, while the unmodified binary for the LI application is located at `/usr/bin/scrample`. - -The application instances are called with the following arguments: - -| HI | LI | -| -------- | ------- | -| `-n 10 -m recv -t 200 -s /etc/mw_com_config.json` | `-n 10 -m send -t 200 -s /etc/mw_com_config.json` | - -Feel free to adjust them as needed. - -In order to have those arguments changeable, the HI arguments are not hardcoded into `cflinit`. -Instead, `cflinit` calls a small wrapper binary `/usr/bin/hi_app` which is based on the implementation in `scrample_integration/src/main.cc`. -When `hi_app` is executed by `cflinit`, it simply calls `execve` on `/usr/bin/scrample_sil` with the correct set of arguments. -This way `cflinit` keeps its static entrypoint for the Eclipse S-CORE example app, while the user is still able to specify the used arguments for the HI `scrample` instance. - -### S-CORE Toolchain in Linux for Safety Applications - -The demo SDK integrates the [S-CORE toolchain with two extensions](https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc/releases/tag/0.5.0-alpha): - -- Additional tooling for AArch64 cross-building. -- Additional tool `lisa-elf-enabler`: It marks an ELF header of an application in a way that Linux for Safety Applications detects it as an HI application. - The tool is available to Bazel via `@gcc_toolchain_gcc//:elf-enabler`. - -### Bazel Rules for the Example Applications - -The example extends the [`scrample` example](https://github.com/eclipse-score/scrample) of S-CORE with the application setup and the toolchain extensions described above. -With those changes, the toolchain can be used via `bazel build --config=aarch64-ebclfsa //scrample_integration:`. - -> [!IMPORTANT] -> Building inside a sandbox is currently not possible. - -For building and running the example setup, the following Bazel rules have been created in `scrample_integration/BUILD`: - -| Target | Dependencies | Description | -| ------ | ------------ | ----------- | -| `scrample_sil` | `@score_scrample//src:scrample` | Create copy of `scrample` at `scrample_sil` and add CRC checksum to ELF-header | -| `scrample_sil_wrapper` | | Build intermediate `scrample_sil_wrapper` | -| `hi_app` | `:scrample_sil_wrapper` `:scrample_sil` | Create copy of `scrample_sil_wrapper` at `hi_app` and add CRC checksum to ELF-header. | -| `fetch-fastdev-archive` | | Download fast-dev image archive | -| `fastdev-image` | `:fetch-fastdev-archive` | Extract fast-dev image archive | -| `upload` | `:hi_app` `:fastdev-image` | Upload application binaries to fast-dev image | -| `run` | `:upload`| Run Eclipse S-CORE example application | - -The following sections introduce some of the rules mentioned above. - -### Full Run of the Example Application - -The `run` target provides an easy entry point, to build, post-process, deploy, run and stop the example: - -```bash -bazel build --config=aarch64-ebclfsa //scrample_integration:run -``` - -This command will take a while to finish, since it performs some downloads and starts the fast-dev image. -After successful execution LI application instance can be seen in the `ssh_run.log`: - -```console -Starting to send data -Sending sample: 0 -Sending sample: 1 -Sending sample: 2 -Sending sample: 3 -Sending sample: 4 -Sending sample: 5 -Sending sample: 6 -Sending sample: 7 -Sending sample: 8 -Sending sample: 9 -Stop offering service...and terminating, bye bye -``` - -`qemu_run.log` provides the serial console output of the started fast-dev image, including the following noteworthy parts: - -1. `cflinit` starting `hi_app` as HI application: - -```console -cflinit: INFO: Starting application HI App -``` - -2. `hi_app` starting `scrample_sil` as HI application: - -```console -HI_App: Starting scrample_sil -``` - -3. The logs from `scrample_sil` as receiver itself - -```console -1970/01/01 00:00:01.1905 19125 000 ECU1 IPBR lola log info verbose 2 No explicit applicationID configured. Falling back to using process UID. Ensure unique UIDs for applications using mw::com. -... -1970/01/01 00:00:10.10215 102158 000 ECU1 IPBR lola log info verbose 2 Successfully created offer path /tmp/mw_com_lola/service_discovery/6432/1 -score/MapApiLanesStamped: Subscribing to service -score/MapApiLanesStamped: Received sample: 0 -score/MapApiLanesStamped: Received sample: 1 -score/MapApiLanesStamped: Proxy received valid data -score/MapApiLanesStamped: Cycle duration 225ms -score/MapApiLanesStamped: Received sample: 2 -score/MapApiLanesStamped: Proxy received valid data -score/MapApiLanesStamped: Cycle duration 206ms -... -score/MapApiLanesStamped: Received sample: 9 -score/MapApiLanesStamped: Proxy received valid data -score/MapApiLanesStamped: Cycle duration 202ms -score/MapApiLanesStamped: Unsubscribing... -score/MapApiLanesStamped: and terminating, bye bye -``` - -4. Kernel logs indicating that some performed system calls would not be allowed on a production system. -For more information on this, check the [previous section](#application--and-integration-specific-violation-of-system-call-restrictions) on application- and integration-specific syscall violations. - -```console -SDK:handler_do_el0_svc_pre: syscall __NR_clone3 (435) is not allowed -``` - -### Building the Application - -Building all components of the example application can be performed with the `hi_app` rule. - -```bash -bazel build --config=aarch64-ebclfsa //scrample_integration:hi_app -``` - -Due the dependencies towards `:scrample_sil` and `:scrample_sil_wrapper` this will build all required binaries. -Including the LI `scrample` binary, a temporary `scrample_sil_wrapper` binary as well as the post-processed `scrample_sil` and `hi_app` binaries. - -### Using the fast-dev Image - -The easiest way to setup the fast-dev image, is to use the `fastdev-image` rule. - -```bash -bazel build --config=aarch64-ebclfsa //scrample_integration:fastdev-image -``` - -This will first download the image via the `fetch-fastdev-archive` rule and cache the archive. -Afterwards, the `fastdev-image` rule extracts the archive (containing a disk image and a kernel) to `bazel-bin/scrample_integration/deb-qemuarm64/`. - -To start the unmodified base image (without the Eclipse S-CORE example application) manually, the included `run_qemu.sh` script can be used. - -```bash -./scrample_integration/run_qemu.sh bazel-bin/scrample_integration/deb-qemuarm64/ -``` - -This is of course optional, and only needed if a deeper manual look into the image is wished. -After the image has started up, the password `linux` can be used for the `root` user for login. -The ssh port of the qemu instance is forwarded to `localhost:2222`. -Therefore `ssh` and `scp` can be used with the same credentials from inside the development container. - -```bash -ssh -p 2222 root@localhost -``` - -> [!NOTE] -> Be aware, that running the image via qemu, will change the stored disk image. -> Bazel will detect this change and overwrite the disk image with the original one from the downloaded archive. -> If it is planned to have persistent changes on the image, copy the content of `bazel-bin/scrample_integration/deb-qemuarm64/` to a location outside of `bazel-bin` and adapt the command line argument in the above `run_qemu.sh` call accordingly. - -For deploying the example application to the image, the `upload` rule is available, which will start the image based on the content of `bazel-bin/scrample_integration/deb-qemuarm64/` and deploy all needed files via `scp`. - -```bash -bazel build --config=aarch64-ebclfsa //scrample_integration:upload -``` - -Since the deployment step will change the stored disk image, the `upload` rule stores its output in `bazel-bin/scrample_integration/deb-qemuarm64-modified/`. -Running the image with the deployed example applications works the same way as before, just with a different folder for the used image and kernel: - -```bash -./scrample_integration/run_qemu.sh bazel-bin/scrample_integration/deb-qemuarm64-modified/ -``` - -Like before you can interact with the image via the serial console or ssh. -To trigger the LI Eclipse S-CORE example app, simply call: - -```bash -scrample -n 10 -m send -t 200 -s /etc/mw_com_config.json -``` - -Note that due to the nature of the `scrample_sil` application, which shuts down after having received the defined amount of samples, this command works only once per boot-cycle. - -To reboot or power-off the running image, `crinit-ctl` with the command line argument `reboot` or `poweroff` can be used. - -```bash -# Reboot -crinit-ctl reboot -# Poweroff -crinit-ctl poweroff -``` - -## Further notes - -* The toolchain and librares are provided for demonstration and prototyping purposes without further qualification. -* A second test case for S-CORE persistency is also integrated. You can run it via - `bazel build --config=aarch64-ebclfsa //persistency_integration:run` - However, this is not integrated as HI application to avoid the additional complexity of the required wrapper. diff --git a/ebclfsa/docs/system_setup.drawio.png b/ebclfsa/docs/system_setup.drawio.png deleted file mode 100644 index f6f4fea62d2ce09c5f35c276935ef1ae06e49a68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38057 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 PfFEgb`Pb#5hW`HxJsk%9 diff --git a/ebclfsa/patches/BUILD b/ebclfsa/patches/BUILD deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/ebclfsa/patches/fix_hard_coded_amd64.patch b/ebclfsa/patches/fix_hard_coded_amd64.patch deleted file mode 100644 index 91892e1b20..0000000000 --- a/ebclfsa/patches/fix_hard_coded_amd64.patch +++ /dev/null @@ -1,32 +0,0 @@ -diff --git a/MODULE.bazel b/MODULE.bazel -index 16776ba..683c131 100644 ---- a/MODULE.bazel -+++ b/MODULE.bazel -@@ -70,7 +70,7 @@ deb = use_repo_rule("@download_utils//download/deb:defs.bzl", "download_deb") - deb( - name = "acl-deb", - build = "//third_party/acl:acl.BUILD", -- urls = ["https://archive.ubuntu.com/ubuntu/pool/main/a/acl/libacl1-dev_2.2.52-3build1_amd64.deb"], -+ urls = ["https://launchpadlibrarian.net/581258948/libacl1-dev_2.3.1-1_arm64.deb"], - visibility = ["//visibility:public"], - ) - -diff --git a/third_party/acl/acl.BUILD b/third_party/acl/acl.BUILD -index 718726c..710befd 100644 ---- a/third_party/acl/acl.BUILD -+++ b/third_party/acl/acl.BUILD -@@ -1,7 +1,7 @@ - cc_library( - name = "acl", - srcs = [ -- "usr/lib/libacl.a", -+ "usr/lib/aarch64-linux-gnu/libacl.a", - ], - hdrs = [ - "usr/include/acl/libacl.h", -@@ -9,4 +9,4 @@ cc_library( - ], - includes = ["usr/include/"], - visibility = ["//visibility:public"], --) -+) diff --git a/ebclfsa/persistency_integration/BUILD b/ebclfsa/persistency_integration/BUILD deleted file mode 100644 index ce66c5b263..0000000000 --- a/ebclfsa/persistency_integration/BUILD +++ /dev/null @@ -1,76 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -load("@score_baselibs//score/language/safecpp:toolchain_features.bzl", "COMPILER_WARNING_FEATURES") - -genrule( - name = "fetch-fastdev-archive", - srcs = [], - outs = ["fastdev-archive.tgz"], - cmd = "wget -O $@ https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc/releases/download/0.5.0-beta/fastdev-ubuntu-ebcl-deb-qemu-arm64.tgz" -) - -genrule( - name = "fastdev-image", - srcs = [":fetch-fastdev-archive"], - outs = [ - "ebcl-qemuarm64/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic", - "ebcl-qemuarm64/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux" - ], - cmd = "tar xzf $(location :fetch-fastdev-archive) -C $(RULEDIR)", -) - -genrule( - name = "upload", - srcs = [ - "@score_persistency//tests/cpp_test_scenarios:cpp_test_scenarios", - ":fastdev-image", - "scripts/cpp_tests_persistency.sh", - "run_qemu.sh", - ], - cmd = " \ - mkdir -p $(RULEDIR)/ebcl-qemuarm64-modified &&\ - cp $(RULEDIR)/ebcl-qemuarm64/* $(RULEDIR)/ebcl-qemuarm64-modified/ &&\ - $(location run_qemu.sh) $(RULEDIR)/ebcl-qemuarm64-modified -pidfile $(RULEDIR)/qemu.pid > $(RULEDIR)/qemu_upload.log &\ - sleep 30 ; \ - sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location @score_persistency//tests/cpp_test_scenarios:cpp_test_scenarios) root@localhost:/usr/bin/cpp_tests_persistency &&\ - sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location scripts/cpp_tests_persistency.sh) root@localhost:/usr/bin/cpp_tests_persistency.sh &&\ - sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost sync &&\ - sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost crinit-ctl poweroff || true \ - sleep 5 \ - ", - outs = [ - "qemu_upload.log", - "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic", - "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux" - ], -) - -genrule( - name = "run", - srcs = [ - "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic", - "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux", - "run_qemu.sh" - ], - cmd = " \ - $(location run_qemu.sh) $(RULEDIR)/ebcl-qemuarm64-modified -pidfile $(RULEDIR)/qemu.pid > $(RULEDIR)/qemu_run.log &\ - sleep 10 ; \ - sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost cpp_tests_persistency.sh > $(RULEDIR)/ssh_persistency_test_scenarios_run.log && \ - sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost crinit-ctl poweroff || true \ - sleep 5 \ - ", - outs = [ - "qemu_run.log", - "ssh_persistency_test_scenarios_run.log", - ], -) diff --git a/ebclfsa/persistency_integration/run_qemu.sh b/ebclfsa/persistency_integration/run_qemu.sh deleted file mode 100755 index 2b2e30349b..0000000000 --- a/ebclfsa/persistency_integration/run_qemu.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -set -xu - -if [ -z "$1" ]; then - echo "Usage: $0 " - exit 1 -fi -BASEFOLDER=$1 -IMAGE="${BASEFOLDER}/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic" -KERNEL="${BASEFOLDER}/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux" -if [ ! -d "${BASEFOLDER}" ] || [ ! -f "${IMAGE}" ] || [ ! -f "${KERNEL}" ] ; then - echo "Run \"bazel build --config=aarch64-ebclfsa //persistency_integration:fastdev-image\" first to fetch the image" -fi - -MACHINE="virt,virtualization=true,gic-version=3" -CPU="cortex-a53" -SMP="8" -MEM="4G" -KERNEL_ARGS=("-append" "root=/dev/vda1 sdk_enable lisa_syscall_whitelist=2026 rw sharedmem.enable_sharedmem=0 init=/usr/bin/ebclfsa-cflinit") -DISK_ARGS="-device virtio-blk-device,drive=vd0 -drive if=none,format=raw,file=${IMAGE},id=vd0" -NETWORK_ARGS="-netdev user,id=net0,net=192.168.7.0/24,dhcpstart=192.168.7.2,dns=192.168.7.3,host=192.168.7.5,hostfwd=tcp::2222-:22,hostfwd=tcp::3333-:3333 -device virtio-net-device,netdev=net0 " - -if ! command -v qemu-system-aarch64 > /dev/null; then - echo "Please install qemu-system-aarch64" - exit 1 -fi - -chmod +w ${IMAGE} - -exec qemu-system-aarch64 -m "${MEM}" -machine "${MACHINE}" -cpu "${CPU}" \ - -smp "${SMP}" -kernel "${KERNEL}" "${KERNEL_ARGS[@]}" ${DISK_ARGS} \ - ${NETWORK_ARGS} -nographic ${@:2} diff --git a/ebclfsa/persistency_integration/scripts/cpp_tests_persistency.sh b/ebclfsa/persistency_integration/scripts/cpp_tests_persistency.sh deleted file mode 100755 index 0dd092d139..0000000000 --- a/ebclfsa/persistency_integration/scripts/cpp_tests_persistency.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -# Script to run C++ persistency tests inside the QEMU environment -# Wrapper due to quoting issues when calling directly from Bazel -cpp_tests_persistency --name basic.basic --input '{"kvs_parameters":{"instance_id":0}}' diff --git a/ebclfsa/scrample_integration/BUILD b/ebclfsa/scrample_integration/BUILD deleted file mode 100644 index a8393c3dda..0000000000 --- a/ebclfsa/scrample_integration/BUILD +++ /dev/null @@ -1,118 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -load("@score_baselibs//score/language/safecpp:toolchain_features.bzl", "COMPILER_WARNING_FEATURES") - -genrule( - name = "scrample_sil", - srcs = ["@score_scrample//src:scrample"], - outs = ["scrample_sil"], - cmd = "cp $(SRCS) $@ && \ - chmod ugo+w $@ && \ - $(execpath @gcc_toolchain_gcc//:elf-enabler) $@ && \ - chmod ugo-w $@", - tools = ["@gcc_toolchain_gcc//:elf-enabler"], -) - -genrule( - name = "hi_app", - srcs = [ - ":scrample_sil_wrapper", - ":scrample_sil" - ], - outs = ["hi_app"], - cmd = "cp $(location :scrample_sil_wrapper) $@ && \ - chmod ugo+w $@ && \ - $(execpath @gcc_toolchain_gcc//:elf-enabler) $@ && \ - chmod ugo-w $@", - tools = ["@gcc_toolchain_gcc//:elf-enabler"], -) - -cc_binary( - name = "scrample_sil_wrapper", - srcs = [ - "src/main.cc", - ], - features = COMPILER_WARNING_FEATURES, - deps = [ - "@score_scrample//src:scrample", - ], -) - -genrule( - name = "fetch-fastdev-archive", - srcs = [], - outs = ["fastdev-archive.tgz"], - cmd = "wget -O $@ https://github.com/elektrobit-contrib/eclipse-score_toolchains_gcc/releases/download/0.5.0-beta/fastdev-ubuntu-ebcl-deb-qemu-arm64.tgz" -) - -genrule( - name = "fastdev-image", - srcs = [":fetch-fastdev-archive"], - outs = [ - "ebcl-qemuarm64/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic", - "ebcl-qemuarm64/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux" - ], - cmd = "tar xzf $(location :fetch-fastdev-archive) -C $(RULEDIR)", -) - -genrule( - name = "upload", - srcs = [ - "@score_scrample//src:scrample", - ":scrample_sil", - ":hi_app", - ":fastdev-image", - "etc/mw_com_config.json", - "etc/logging.json", - "run_qemu.sh", - ], - cmd = " \ - mkdir -p $(RULEDIR)/ebcl-qemuarm64-modified &&\ - cp $(RULEDIR)/ebcl-qemuarm64/* $(RULEDIR)/ebcl-qemuarm64-modified/ &&\ - $(location run_qemu.sh) $(RULEDIR)/ebcl-qemuarm64-modified -pidfile $(RULEDIR)/qemu.pid > $(RULEDIR)/qemu_upload.log &\ - sleep 30 ; \ - sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location :scrample_sil) root@localhost:/usr/bin &&\ - sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location @score_scrample//src:scrample) root@localhost:/usr/bin &&\ - sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location :hi_app) root@localhost:/usr/bin &&\ - sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location etc/mw_com_config.json) root@localhost:/etc/ &&\ - sshpass -p linux scp -o StrictHostKeyChecking=no -P 2222 $(location etc/logging.json) root@localhost:/etc/ &&\ - sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost sync &&\ - sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost crinit-ctl poweroff || true \ - sleep 5 \ - ", - outs = [ - "qemu_upload.log", - "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic", - "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux" - ], -) - -genrule( - name = "run", - srcs = [ - "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic", - "ebcl-qemuarm64-modified/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux", - "run_qemu.sh" - ], - cmd = " \ - $(location run_qemu.sh) $(RULEDIR)/ebcl-qemuarm64-modified -pidfile $(RULEDIR)/qemu.pid > $(RULEDIR)/qemu_run.log &\ - sleep 10 ; \ - sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost scrample -n 10 -m send -t 200 -s /etc/mw_com_config.json > $(RULEDIR)/ssh_scrample_run.log && \ - sshpass -p linux ssh -o StrictHostKeyChecking=no -p 2222 root@localhost crinit-ctl poweroff || true \ - sleep 5 \ - ", - outs = [ - "qemu_run.log", - "ssh_scrample_run.log", - ], -) diff --git a/ebclfsa/scrample_integration/etc/logging.json b/ebclfsa/scrample_integration/etc/logging.json deleted file mode 100644 index 8b3d1eacc8..0000000000 --- a/ebclfsa/scrample_integration/etc/logging.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "appId": "IPBR", - "appDesc": "ipc_bridge", - "logLevel": "kDebug", - "logLevelThresholdConsole": "kInfo", - "logMode": "kConsole", - "dynamicDatarouterIdentifiers" : true -} diff --git a/ebclfsa/scrample_integration/etc/mw_com_config.json b/ebclfsa/scrample_integration/etc/mw_com_config.json deleted file mode 100644 index 1e104bd484..0000000000 --- a/ebclfsa/scrample_integration/etc/mw_com_config.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "serviceTypes": [ - { - "serviceTypeName": "/score/MapApiLanesStamped", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 6432, - "events": [ - { - "eventName": "map_api_lanes_stamped", - "eventId": 1 - }, - { - "eventName": "dummy_data_stamped", - "eventId": 2 - } - ] - } - ] - } - ], - "serviceInstances": [ - { - "instanceSpecifier": "score/MapApiLanesStamped", - "serviceTypeName": "/score/MapApiLanesStamped", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 1, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "map_api_lanes_stamped", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - } - ] -} diff --git a/ebclfsa/scrample_integration/run_qemu.sh b/ebclfsa/scrample_integration/run_qemu.sh deleted file mode 100755 index 3817c374f9..0000000000 --- a/ebclfsa/scrample_integration/run_qemu.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -set -xu - -if [ -z "$1" ]; then - echo "Usage: $0 " - exit 1 -fi -BASEFOLDER=$1 -IMAGE="${BASEFOLDER}/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64.wic" -KERNEL="${BASEFOLDER}/fastdev-ubuntu-ebclfsa-ebcl-qemuarm64-vmlinux" -if [ ! -d "${BASEFOLDER}" ] || [ ! -f "${IMAGE}" ] || [ ! -f "${KERNEL}" ] ; then - echo "Run \"bazel build --config=aarch64-ebclfsa //scrample_integration:fastdev-image\" first to fetch the image" -fi - -MACHINE="virt,virtualization=true,gic-version=3" -CPU="cortex-a53" -SMP="8" -MEM="4G" -KERNEL_ARGS=("-append" "root=/dev/vda1 sdk_enable lisa_syscall_whitelist=2026 rw sharedmem.enable_sharedmem=0 init=/usr/bin/ebclfsa-cflinit") -DISK_ARGS="-device virtio-blk-device,drive=vd0 -drive if=none,format=raw,file=${IMAGE},id=vd0" -NETWORK_ARGS="-netdev user,id=net0,net=192.168.7.0/24,dhcpstart=192.168.7.2,dns=192.168.7.3,host=192.168.7.5,hostfwd=tcp::2222-:22,hostfwd=tcp::3333-:3333 -device virtio-net-device,netdev=net0 " - -if ! command -v qemu-system-aarch64 > /dev/null; then - echo "Please install qemu-system-aarch64" - exit 1 -fi - -chmod +w ${IMAGE} - -exec qemu-system-aarch64 -m "${MEM}" -machine "${MACHINE}" -cpu "${CPU}" \ - -smp "${SMP}" -kernel "${KERNEL}" "${KERNEL_ARGS[@]}" ${DISK_ARGS} \ - ${NETWORK_ARGS} -nographic ${@:2} diff --git a/ebclfsa/scrample_integration/src/main.cc b/ebclfsa/scrample_integration/src/main.cc deleted file mode 100644 index 72d6400215..0000000000 --- a/ebclfsa/scrample_integration/src/main.cc +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2025 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ -#include -#include -#include - -int main() { - std::cout << "HI_App: Starting scrample_sil" << std::endl; - - const char *c_args[] = { - "/usr/bin/scrample_sil", - "-n", "10", - "-m", "recv", - "-t", "200", - "-s", "/etc/mw_com_config.json", - nullptr - }; - - execve("/usr/bin/scrample_sil", const_cast(c_args), nullptr); - - std::cerr << "execve failed, sleeping... Reason: " << strerror(errno) - << std::endl; - while (true) { - sleep(10); - } - return 0; -} - From 318e5a38750ffb65fdca5d0fc57cb96a211f6493 Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Mon, 9 Feb 2026 15:36:15 +0100 Subject: [PATCH 19/22] Align autosd and workflows --- .github/workflows/build_and_test_autosd.yml | 4 +- .github/workflows/build_and_test_ebclfsa.yml | 6 +- .../workflows/build_and_test_on_every_pr.yml | 56 -------------- .github/workflows/build_and_test_qnx.yml | 67 +++++++++++++++++ README.md | 30 ++------ integration/.bazelrc | 1 + integration/README.md | 5 ++ integration/bazel_common/bundlers.bzl | 17 ++++- .../{autosd => autosd_x86_64}/BUILD.bazel | 0 .../build/.gitignore | 0 .../{autosd => autosd_x86_64}/build/README.md | 0 .../build/files/bluechi-agent-main.conf | 0 .../build/files/bluechi-agent-qm.conf | 0 .../build/files/bluechi-controller.conf | 0 .../build/files/lola-ipc-pub.service | 0 .../build/files/lola-ipc-sub.service | 0 .../build/files/lola-ipc-test | 0 .../build/files/lola-ipc-test.service | 0 .../build/image.aib.yml | 0 .../build/scripts/run_qemu | 0 .../build/vars-devel.yml | 0 .../{autosd => autosd_x86_64}/build/vars.yml | 0 integration/score_starter | 73 ++++++++++++++----- integration/scripts/qnx_credential_helper.py | 1 + integration/showcases/cli/README.md | 27 +++++++ 25 files changed, 182 insertions(+), 105 deletions(-) delete mode 100644 .github/workflows/build_and_test_on_every_pr.yml create mode 100644 .github/workflows/build_and_test_qnx.yml create mode 100644 integration/README.md rename integration/images/{autosd => autosd_x86_64}/BUILD.bazel (100%) rename integration/images/{autosd => autosd_x86_64}/build/.gitignore (100%) rename integration/images/{autosd => autosd_x86_64}/build/README.md (100%) rename integration/images/{autosd => autosd_x86_64}/build/files/bluechi-agent-main.conf (100%) rename integration/images/{autosd => autosd_x86_64}/build/files/bluechi-agent-qm.conf (100%) rename integration/images/{autosd => autosd_x86_64}/build/files/bluechi-controller.conf (100%) rename integration/images/{autosd => autosd_x86_64}/build/files/lola-ipc-pub.service (100%) rename integration/images/{autosd => autosd_x86_64}/build/files/lola-ipc-sub.service (100%) rename integration/images/{autosd => autosd_x86_64}/build/files/lola-ipc-test (100%) rename integration/images/{autosd => autosd_x86_64}/build/files/lola-ipc-test.service (100%) rename integration/images/{autosd => autosd_x86_64}/build/image.aib.yml (100%) rename integration/images/{autosd => autosd_x86_64}/build/scripts/run_qemu (100%) rename integration/images/{autosd => autosd_x86_64}/build/vars-devel.yml (100%) rename integration/images/{autosd => autosd_x86_64}/build/vars.yml (100%) create mode 120000 integration/scripts/qnx_credential_helper.py create mode 100644 integration/showcases/cli/README.md diff --git a/.github/workflows/build_and_test_autosd.yml b/.github/workflows/build_and_test_autosd.yml index 656e549449..beb1a9b12a 100644 --- a/.github/workflows/build_and_test_autosd.yml +++ b/.github/workflows/build_and_test_autosd.yml @@ -44,8 +44,8 @@ jobs: - name: Build Lola Demo run: | - bazel build --config=bl-x86_64-linux-autosd //:lola-demo - working-directory: ./autosd + bazel build --config=autosd-x86_64 //images/autosd_x86_64:lola-demo + working-directory: ./integration - name: Copy RPMs run: | diff --git a/.github/workflows/build_and_test_ebclfsa.yml b/.github/workflows/build_and_test_ebclfsa.yml index f7159ed20a..389ebb146a 100644 --- a/.github/workflows/build_and_test_ebclfsa.yml +++ b/.github/workflows/build_and_test_ebclfsa.yml @@ -38,9 +38,9 @@ jobs: - name: Build for EB corbos Linux for Safety Applications and run tests run: | - bazel build --config=aarch64-ebclfsa //scrample_integration:run - bazel build --config=aarch64-ebclfsa //persistency_integration:run - working-directory: ./ebclfsa + bazel build --config=eb-aarch64 //images/ebclfsa_aarch64/scrample_integration:run + bazel build --config=eb-aarch64 //images/ebclfsa_aarch64/persistency_integration:run + working-directory: ./integration - name: Upload test logs uses: actions/upload-artifact@v5 diff --git a/.github/workflows/build_and_test_on_every_pr.yml b/.github/workflows/build_and_test_on_every_pr.yml deleted file mode 100644 index 9cb19b46d5..0000000000 --- a/.github/workflows/build_and_test_on_every_pr.yml +++ /dev/null @@ -1,56 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -name: Test reference integration -on: - pull_request: - types: [opened, reopened, synchronize] - merge_group: - types: [checks_requested] - -permissions: - contents: write - -jobs: - test_reference_integration: - runs-on: ubuntu-22.04 - steps: - - name: Checkout repository - uses: actions/checkout@v4.2.2 - - name: Setup Bazel - uses: bazel-contrib/setup-bazel@0.9.1 - - name: Setup QNX License - env: - SCORE_QNX_LICENSE: ${{ secrets.SCORE_QNX_LICENSE }} - run: | - mkdir -p /opt/score_qnx/license - echo "${SCORE_QNX_LICENSE}" | base64 --decode > /opt/score_qnx/license/licenses - - name: Install qemu - run: | - sudo apt-get update - sudo apt-get install -y qemu-system - - name: Enable KVM group perms - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - - name: Bazel execute showcase examples - run: | - set -e - bazel build --config x86_64-linux //feature_showcase:all_examples - while read -r target; do - bazel run --config x86_64-linux "$target" - done < ci/showcase_targets_run.txt - - name: Feature Integration Tests - run: | - bazel test --config x86_64-linux //feature_integration_tests/test_cases:fit diff --git a/.github/workflows/build_and_test_qnx.yml b/.github/workflows/build_and_test_qnx.yml new file mode 100644 index 0000000000..c9eb92c820 --- /dev/null +++ b/.github/workflows/build_and_test_qnx.yml @@ -0,0 +1,67 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +name: QNX8 Build +on: + pull_request: + types: [opened, reopened, synchronize] + merge_group: + types: [checks_requested] + +jobs: + qnx-build-x86_64: + name: Build QNX target + runs-on: ${{ vars.REPO_RUNNER_LABELS && fromJSON(vars.REPO_RUNNER_LABELS) || 'ubuntu-latest' }} + environment: ${{ inputs.environment-name }} + permissions: + contents: read + pull-requests: read + + steps: + - name: Checkout repository (Handle all events) + uses: actions/checkout@v4.2.2 + with: + ref: ${{ github.head_ref || github.event.pull_request.head.ref || github.ref }} + repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} + + - name: Setup Bazel with shared caching + uses: bazel-contrib/setup-bazel@0.18.0 + with: + disk-cache: ${{ inputs.bazel-disk-cache }} + repository-cache: true + bazelisk-cache: true + cache-save: ${{ github.event_name == 'push' }} + + - name: Prepare QNX license + env: + SCORE_QNX_LICENSE: ${{ secrets.score-qnx-license }} + run: | + set -euo pipefail + + LICENSE_DIR="/opt/score_qnx/license" + sudo mkdir -p "${LICENSE_DIR}" + echo "${SCORE_QNX_LICENSE}" | base64 --decode | sudo tee "${LICENSE_DIR}/licenses" >/dev/null + + - name: Build with QNX toolchain + env: + SCORE_QNX_USER: ${{ secrets.score-qnx-user }} + SCORE_QNX_PASSWORD: ${{ secrets.score-qnx-password }} + run: | + set -euo pipefail + + bazel run --config qnx-x86_64 //images/qnx_x86_64:image + working-directory: ./integration + + - name: Cleanup QNX license + if: always() + run: sudo rm -rf /opt/score_qnx \ No newline at end of file diff --git a/README.md b/README.md index 8fc566e4d4..ad093657bb 100644 --- a/README.md +++ b/README.md @@ -11,27 +11,9 @@ The reference integration workspace serves as a single Bazel build environment t - Prepare for release validation workflows -## Structure +## Structure of integration folder -Repository structure - -``` -- bazel_common -- showcases -- images - - image1 - - showcases (symlink to ../../showcases) - - bazel_common (symlink to ../../bazel_common) - - runners - - runner1 (symlink to ../../../runners/runner1) - - image2 - ... -- runners - - runner1 - - runner2 -``` - -The basic idea is that we use `symlinks` to share all common functionalities to achieve `DRY` rule. +Intention for each folder is described below ### bazel_common Used to keep a common bazel functionalities for `images` like: @@ -46,14 +28,16 @@ Used to keep `S-CORE` wide **showcases** implementation to showcase S-CORE in ce - proxy target bundling all `standalone` examples from all `S-CORE` repos to deploy then as single bazel target into image - implementation of certain **showcases** that shall be deployed into images +#### cli + +Contains a CLI tool to be used on runner that is showcasing the S-CORE functionality. It will provide superior user experience and will guide user to run examples. +How to use it in Your image, look [here](./integration/showcases/cli/README.md) ### images Used to keep concrete `images` for given target platform as bazel modules. Each platform shall have it's own folder with name `{platform}_{arch}` ie. `qnx_aarch64`. This `images` shall: - - symlink other shared folders (`bazel_common`, `showcases`) to receive common functionality. - - symlink supported `runner` (if any) - - deploy all `usecases` into image so they can be run inside + - deploy all `showcases` into image so they can be run inside - other specific code for given `image` ### runners diff --git a/integration/.bazelrc b/integration/.bazelrc index 119db2e912..71229875f7 100644 --- a/integration/.bazelrc +++ b/integration/.bazelrc @@ -1,5 +1,6 @@ common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ common --registry=https://bcr.bazel.build +common --credential_helper=*.qnx.com=%workspace%/scripts/qnx_credential_helper.py build:_common --@score_baselibs//score/mw/log/detail/flags:KUse_Stub_Implementation_Only=False build:_common --@score_baselibs//score/mw/log/flags:KRemote_Logging=False diff --git a/integration/README.md b/integration/README.md new file mode 100644 index 0000000000..d9cd398267 --- /dev/null +++ b/integration/README.md @@ -0,0 +1,5 @@ +# Integration directory + +## Get started + +Simply run `./score_starter` and select which integration You want to run. Once running, You will be guided by our welcome cli to run selected examples. \ No newline at end of file diff --git a/integration/bazel_common/bundlers.bzl b/integration/bazel_common/bundlers.bzl index fbd29d4f82..4f769c18d2 100644 --- a/integration/bazel_common/bundlers.bzl +++ b/integration/bazel_common/bundlers.bzl @@ -3,7 +3,22 @@ load("@rules_pkg//pkg:mappings.bzl", "pkg_files") def score_pkg_bundle(name, bins, config_data= None, package_dir = None, other_package_files = []): - """Creates a reusable bundle: pkg_files → pkg_tar → untar""" + """ + Creates a reusable bundle by chaining Bazel packaging rules: + - Collects binaries and config files into a pkg_files target, renaming them into subdirectories. + - Packs them into a tar archive using pkg_tar, optionally with additional package files and a custom package directory. + - Extracts the tar archive using a custom untar rule. + Why: + - Group related binaries and config files into a single package for distribution or deployment. + - Group files from multiple targets into one package so deploying them into image is easy, consistent and same for each image. + Args: + name: Base name for all generated targets. + bins: List of binary file labels to include in the bundle (placed in 'bin/'). + config_data: Optional list of config file labels to include (placed in 'configs/'). + package_dir: Optional directory path for the package root inside the tar archive. + other_package_files: Optional list of additional `NAME_pkg_files` to include in the tar archive that was created by other `score_pkg_bundle` targets. + + """ all_files_name = name + "_pkg_files" bundle_name = name + "_pkg_tar" diff --git a/integration/images/autosd/BUILD.bazel b/integration/images/autosd_x86_64/BUILD.bazel similarity index 100% rename from integration/images/autosd/BUILD.bazel rename to integration/images/autosd_x86_64/BUILD.bazel diff --git a/integration/images/autosd/build/.gitignore b/integration/images/autosd_x86_64/build/.gitignore similarity index 100% rename from integration/images/autosd/build/.gitignore rename to integration/images/autosd_x86_64/build/.gitignore diff --git a/integration/images/autosd/build/README.md b/integration/images/autosd_x86_64/build/README.md similarity index 100% rename from integration/images/autosd/build/README.md rename to integration/images/autosd_x86_64/build/README.md diff --git a/integration/images/autosd/build/files/bluechi-agent-main.conf b/integration/images/autosd_x86_64/build/files/bluechi-agent-main.conf similarity index 100% rename from integration/images/autosd/build/files/bluechi-agent-main.conf rename to integration/images/autosd_x86_64/build/files/bluechi-agent-main.conf diff --git a/integration/images/autosd/build/files/bluechi-agent-qm.conf b/integration/images/autosd_x86_64/build/files/bluechi-agent-qm.conf similarity index 100% rename from integration/images/autosd/build/files/bluechi-agent-qm.conf rename to integration/images/autosd_x86_64/build/files/bluechi-agent-qm.conf diff --git a/integration/images/autosd/build/files/bluechi-controller.conf b/integration/images/autosd_x86_64/build/files/bluechi-controller.conf similarity index 100% rename from integration/images/autosd/build/files/bluechi-controller.conf rename to integration/images/autosd_x86_64/build/files/bluechi-controller.conf diff --git a/integration/images/autosd/build/files/lola-ipc-pub.service b/integration/images/autosd_x86_64/build/files/lola-ipc-pub.service similarity index 100% rename from integration/images/autosd/build/files/lola-ipc-pub.service rename to integration/images/autosd_x86_64/build/files/lola-ipc-pub.service diff --git a/integration/images/autosd/build/files/lola-ipc-sub.service b/integration/images/autosd_x86_64/build/files/lola-ipc-sub.service similarity index 100% rename from integration/images/autosd/build/files/lola-ipc-sub.service rename to integration/images/autosd_x86_64/build/files/lola-ipc-sub.service diff --git a/integration/images/autosd/build/files/lola-ipc-test b/integration/images/autosd_x86_64/build/files/lola-ipc-test similarity index 100% rename from integration/images/autosd/build/files/lola-ipc-test rename to integration/images/autosd_x86_64/build/files/lola-ipc-test diff --git a/integration/images/autosd/build/files/lola-ipc-test.service b/integration/images/autosd_x86_64/build/files/lola-ipc-test.service similarity index 100% rename from integration/images/autosd/build/files/lola-ipc-test.service rename to integration/images/autosd_x86_64/build/files/lola-ipc-test.service diff --git a/integration/images/autosd/build/image.aib.yml b/integration/images/autosd_x86_64/build/image.aib.yml similarity index 100% rename from integration/images/autosd/build/image.aib.yml rename to integration/images/autosd_x86_64/build/image.aib.yml diff --git a/integration/images/autosd/build/scripts/run_qemu b/integration/images/autosd_x86_64/build/scripts/run_qemu similarity index 100% rename from integration/images/autosd/build/scripts/run_qemu rename to integration/images/autosd_x86_64/build/scripts/run_qemu diff --git a/integration/images/autosd/build/vars-devel.yml b/integration/images/autosd_x86_64/build/vars-devel.yml similarity index 100% rename from integration/images/autosd/build/vars-devel.yml rename to integration/images/autosd_x86_64/build/vars-devel.yml diff --git a/integration/images/autosd/build/vars.yml b/integration/images/autosd_x86_64/build/vars.yml similarity index 100% rename from integration/images/autosd/build/vars.yml rename to integration/images/autosd_x86_64/build/vars.yml diff --git a/integration/score_starter b/integration/score_starter index 3a6f290c8f..88cd23f03d 100755 --- a/integration/score_starter +++ b/integration/score_starter @@ -4,15 +4,18 @@ import sys import termios import tty import subprocess +import argparse # ================== CONFIG ================== -# Each entry: (description, command) +# Each entry: (description, command, name) mEntries = [ - ("Run QNX x86_64 QEMU", "bazel run --config qnx-x86_64 //images/qnx_x86_64:run"), - ("Run Linux x86_64 Docker", "bazel run --config linux-x86_64 //images/linux_x86_64:run"), + ("Run QNX x86_64 QEMU", "bazel run --config qnx-x86_64 //images/qnx_x86_64:run", "qnx-x86_64"), + ("Run Linux x86_64 Docker", "bazel run --config linux-x86_64 //images/linux_x86_64:run", "linux-x86_64"), ("Run Elektrobit Corbos aarch64 QEMU", - "bazel build --config eb-aarch64 //images/ebclfsa_aarch64/scrample_integration:run"), - ("Exit", "exit 0"), + "bazel build --config eb-aarch64 //images/ebclfsa_aarch64/scrample_integration:run", "eb-aarch64"), + ("Build Autosd x86_64 RPM", + "bazel build --config autosd-x86_64 //images/autosd_x86_64:lola-demo", "autosd-x86_64"), + ("Exit", "exit 0", "exit"), ] # ================== INTERNAL ================== @@ -27,7 +30,7 @@ def clear(): def draw_menu(): clear() print("Use ↑ ↓ to navigate, Enter to run, q to quit\n") - for i, (desc, _) in enumerate(mEntries): + for i, (desc, _, _) in enumerate(mEntries): if i == mSelected: # inverse video print(f" \033[7m {desc} \033[0m") @@ -35,9 +38,9 @@ def draw_menu(): print(f" {desc}") -def run_selected(): +def run_entry(entry): + desc, cmd, _ = entry clear() - desc, cmd = mEntries[mSelected] print(f"▶ {desc}\n") if cmd.startswith("exit"): @@ -63,16 +66,46 @@ def read_key(): termios.tcsetattr(fd, termios.TCSADRAIN, old) -# ================== LOOP ================== -while True: - draw_menu() - key = read_key() +def interactive_loop(): + global mSelected + while True: + draw_menu() + key = read_key() - if key == "\x1b[A": # Up - mSelected = (mSelected - 1) % mCount - elif key == "\x1b[B": # Down - mSelected = (mSelected + 1) % mCount - elif key in ("\r", "\n"): # Enter - run_selected() - elif key == "q": - sys.exit(0) + if key == "\x1b[A": # Up + mSelected = (mSelected - 1) % mCount + elif key == "\x1b[B": # Down + mSelected = (mSelected + 1) % mCount + elif key in ("\r", "\n"): # Enter + run_entry(mEntries[mSelected]) + elif key == "q": + sys.exit(0) + + +# ================== MAIN ================== +def main(): + parser = argparse.ArgumentParser( + description="Interactive build/run menu script", + epilog="Use -r NAME to run a specific entry directly." + ) + parser.add_argument( + "-r", "--run", + help="Run a specific menu entry by name", + choices=[name for _, _, name in mEntries] + ) + + args = parser.parse_args() + + if args.run: + # Find the entry by name and run it + entry = next((e for e in mEntries if e[2] == args.run), None) + if entry is None: + print(f"Unknown entry: {args.run}") + sys.exit(1) + run_entry(entry) + else: + interactive_loop() + + +if __name__ == "__main__": + main() diff --git a/integration/scripts/qnx_credential_helper.py b/integration/scripts/qnx_credential_helper.py new file mode 120000 index 0000000000..6b0b73f578 --- /dev/null +++ b/integration/scripts/qnx_credential_helper.py @@ -0,0 +1 @@ +../../.github/tools/qnx_credential_helper.py \ No newline at end of file diff --git a/integration/showcases/cli/README.md b/integration/showcases/cli/README.md new file mode 100644 index 0000000000..2ce3b2696d --- /dev/null +++ b/integration/showcases/cli/README.md @@ -0,0 +1,27 @@ +# CLI + +CLI written in rust to provide user experience in runners. + +## Abilities + +### Auto detect examples + +When run, it will auto detect all examples in image and provide to user `multiselect` choice to run examples. +To make this work each example shall deploy configuration file `name.score.json` which below layout. + +```json +{ + "name": "Name of example", + "description": "Extensive description", + "path": "exec_path", + "args": [ + // args to be used when running + ], + "env": { + // env to be used when running + } +} + +``` + +You can customize where to look for examples using env `SCORE_CLI_INIT_DIR`. \ No newline at end of file From 2b9c9ae760d711bc7a5e4e70c5a81b96d7fccbce Mon Sep 17 00:00:00 2001 From: Piotr Korkus Date: Tue, 10 Feb 2026 08:51:39 +0100 Subject: [PATCH 20/22] fix docs build --- MODULE.bazel | 9 --------- known_good.json | 6 +++--- score_modules.MODULE.bazel | 12 ++++++------ 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index ec3c107dd4..74ca244810 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -33,15 +33,6 @@ python.toolchain( ) use_repo(python) -pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip", dev_dependency = True) -pip.parse( - hub_name = "pip_score_venv_test", - python_version = PYTHON_VERSION, - requirements_lock = "//feature_integration_tests/test_cases:requirements.txt.lock", -) - -use_repo(pip, "pip_score_venv_test") - # Special imports for certain modules # communication module dependencies diff --git a/known_good.json b/known_good.json index d82f02b0f6..fe4f2701d2 100644 --- a/known_good.json +++ b/known_good.json @@ -31,11 +31,11 @@ }, "score_tooling": { "repo": "https://github.com/eclipse-score/tooling.git", - "hash": "8894fe5440436a8c6d9e214c97b18d619c7f7eac" + "hash": "fe54d6aa717eb695298a4f0ca938f19e7fd18051" }, "score_platform": { "repo": "https://github.com/eclipse-score/score.git", - "hash": "f4769c4b86bfe46b29b56b6c3e262c5b82db334b" + "hash": "6ef2b8c740eb538d9b9b44fabd3dea5e0a888da6" }, "score_bazel_platforms": { "repo": "https://github.com/eclipse-score/bazel_platforms.git", @@ -47,7 +47,7 @@ }, "score_docs_as_code": { "repo": "https://github.com/eclipse-score/docs-as-code.git", - "hash": "a9babc30a7ab1ac43c75415b9784b2bc81ed0f9d" + "hash": "e8622001d597ebc12244f006dde2e0a58c203ef0" }, "score_process": { "repo": "https://github.com/eclipse-score/process_description.git", diff --git a/score_modules.MODULE.bazel b/score_modules.MODULE.bazel index 93a4fb3c0b..47c2b5a11a 100644 --- a/score_modules.MODULE.bazel +++ b/score_modules.MODULE.bazel @@ -11,14 +11,14 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -# Generated from known_good.json at 2026-01-26T16:26:12+00:00Z +# Generated from known_good.json at 2026-01-26T11:01:36+00:00Z # Do not edit manually - use scripts/known_good/update_module_from_known_good.py bazel_dep(name = "score_baselibs") git_override( module_name = "score_baselibs", remote = "https://github.com/eclipse-score/baselibs.git", - commit = "efc061359d159244a9bd31a6f1dc74f9246c07b6", + commit = "fe74ff32f2cb8b2c99af019e7907ad9486e70b09", ) bazel_dep(name = "score_communication") @@ -39,7 +39,7 @@ bazel_dep(name = "score_persistency") git_override( module_name = "score_persistency", remote = "https://github.com/eclipse-score/persistency.git", - commit = "0037034bf853e5f955f028fab54ed319fb0441c3", + commit = "69356def0bd731fda9aedc8c65336d8c2ca499da", ) bazel_dep(name = "score_orchestrator") @@ -67,14 +67,14 @@ bazel_dep(name = "score_tooling") git_override( module_name = "score_tooling", remote = "https://github.com/eclipse-score/tooling.git", - commit = "8894fe5440436a8c6d9e214c97b18d619c7f7eac", + commit = "fe54d6aa717eb695298a4f0ca938f19e7fd18051", ) bazel_dep(name = "score_platform") git_override( module_name = "score_platform", remote = "https://github.com/eclipse-score/score.git", - commit = "a853a294f3fda8d40fde3ac76f60bd03fcdc6a4a", + commit = "6ef2b8c740eb538d9b9b44fabd3dea5e0a888da6", ) bazel_dep(name = "score_bazel_platforms") @@ -95,7 +95,7 @@ bazel_dep(name = "score_docs_as_code") git_override( module_name = "score_docs_as_code", remote = "https://github.com/eclipse-score/docs-as-code.git", - commit = "f784d4370240cc0eafce779e5c317f6bf8988fb2", + commit = "e8622001d597ebc12244f006dde2e0a58c203ef0", ) bazel_dep(name = "score_process") From 7c8cd769423b4639e809c907f7acca0623d192a3 Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Tue, 10 Feb 2026 09:09:16 +0100 Subject: [PATCH 21/22] Fix workflows --- .github/workflows/build_and_test_autosd.yml | 39 ++++++++++---------- .github/workflows/build_and_test_ebclfsa.yml | 20 ++++------ .github/workflows/build_and_test_qnx.yml | 18 +++++---- .github/workflows/test_integration.yml | 1 + integration/.bazelrc | 1 + known_good.json | 6 +-- 6 files changed, 42 insertions(+), 43 deletions(-) diff --git a/.github/workflows/build_and_test_autosd.yml b/.github/workflows/build_and_test_autosd.yml index beb1a9b12a..46b1d47087 100644 --- a/.github/workflows/build_and_test_autosd.yml +++ b/.github/workflows/build_and_test_autosd.yml @@ -11,23 +11,22 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -name: Build and Test AutoSD +name: AutoSD - Build & Test on: pull_request: + types: [opened, reopened, synchronize] paths: - - 'autosd/**' - push: - branches: - - main - release: - types: [created] - workflow_dispatch: + - 'integration/**' + merge_group: + types: [checks_requested] + paths: + - 'integration/**' jobs: build: - name: build-and-test-autosd + name: x86_64 runs-on: ubuntu-latest steps: @@ -50,12 +49,12 @@ jobs: - name: Copy RPMs run: | set -e - mkdir -p ./build/rpms - cp bazel-out/k8-fastbuild/bin/lola-demo-1.0.0-1.x86_64.rpm ./build/rpms - cp bazel-out/k8-fastbuild/bin/lola-demo-1.0.0-1.src.rpm ./build/rpms - createrepo_c ./build/rpms/ - ls -l ./build/rpms/ - working-directory: ./autosd + mkdir -p ./images/autosd_x86_64/build/rpms + cp bazel-out/k8-fastbuild/bin/images/autosd_x86_64/lola-demo-1.0.0-1.x86_64.rpm ./images/autosd_x86_64/build/rpms + cp bazel-out/k8-fastbuild/bin/images/autosd_x86_64/lola-demo-1.0.0-1.src.rpm ./images/autosd_x86_64/build/rpms + createrepo_c ./images/autosd_x86_64/build/rpms/ + ls -l ./images/autosd_x86_64/build/rpms/ + working-directory: ./integration - name: Install AIB Tools run: | @@ -64,7 +63,7 @@ jobs: curl -o automotive-image-runner "https://gitlab.com/CentOS/automotive/src/automotive-image-builder/-/raw/main/automotive-image-runner" chmod +x automotive-image-runner - working-directory: ./autosd/build + working-directory: ./integration/images/autosd_x86_64/build - name: Build lola-demo.aib.yml run: | @@ -79,7 +78,7 @@ jobs: disk.qcow2 sudo chown $(id -u) disk.qcow2 - working-directory: ./autosd/build + working-directory: ./integration/images/autosd_x86_64/build - name: Enable KVM group perms run: | @@ -97,8 +96,8 @@ jobs: sleep 10 sshcmd 'bluechictl start agent-qm lola-ipc-sub.service' sleep 5 - sshcmd '/usr/bin/lola-ipc-test' - working-directory: ./autosd/build + # sshcmd '/usr/bin/lola-ipc-test' Disabled until correct exmaples deployed + working-directory: ./integration/images/autosd_x86_64/build env: SSH_PASSWORD: password @@ -106,4 +105,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: autosd10-score-reference_integration-x86_64.qcow2 - path: autosd/build/disk.qcow2 + path: integration/images/autosd_x86_64/build/disk.qcow2 diff --git a/.github/workflows/build_and_test_ebclfsa.yml b/.github/workflows/build_and_test_ebclfsa.yml index 389ebb146a..1d644ab69d 100644 --- a/.github/workflows/build_and_test_ebclfsa.yml +++ b/.github/workflows/build_and_test_ebclfsa.yml @@ -11,23 +11,21 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -name: Build for and Test on EB corbos Linux for Safety Applications +name: EB Corbos Linux for Safety Applications - Build & Test on: pull_request: + types: [opened, reopened, synchronize] paths: - - "ebclfsa/**" - - ".github/workflows/build_and_test_ebclfsa.yml" - push: - branches: - - main - release: - types: [created] - workflow_dispatch: + - 'integration/**' + merge_group: + types: [checks_requested] + paths: + - 'integration/**' jobs: build: - name: build-and-test-ebclfsa + name: aarch64 runs-on: ubuntu-latest container: image: ghcr.io/eclipse-score/devcontainer:v1.1.0 @@ -39,7 +37,6 @@ jobs: - name: Build for EB corbos Linux for Safety Applications and run tests run: | bazel build --config=eb-aarch64 //images/ebclfsa_aarch64/scrample_integration:run - bazel build --config=eb-aarch64 //images/ebclfsa_aarch64/persistency_integration:run working-directory: ./integration - name: Upload test logs @@ -48,4 +45,3 @@ jobs: name: test-logs path: | ebclfsa/bazel-bin/scrample_integration/*.log - ebclfsa/bazel-bin/persistency_integration/*.log diff --git a/.github/workflows/build_and_test_qnx.yml b/.github/workflows/build_and_test_qnx.yml index c9eb92c820..a26add8f6f 100644 --- a/.github/workflows/build_and_test_qnx.yml +++ b/.github/workflows/build_and_test_qnx.yml @@ -11,16 +11,20 @@ # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* -name: QNX8 Build +name: QNX8 - Build & Test on: pull_request: types: [opened, reopened, synchronize] + paths: + - 'integration/**' merge_group: types: [checks_requested] + paths: + - 'integration/**' jobs: qnx-build-x86_64: - name: Build QNX target + name: x86_64 runs-on: ${{ vars.REPO_RUNNER_LABELS && fromJSON(vars.REPO_RUNNER_LABELS) || 'ubuntu-latest' }} environment: ${{ inputs.environment-name }} permissions: @@ -44,7 +48,7 @@ jobs: - name: Prepare QNX license env: - SCORE_QNX_LICENSE: ${{ secrets.score-qnx-license }} + SCORE_QNX_LICENSE: ${{ secrets.SCORE_QNX_LICENSE }} run: | set -euo pipefail @@ -54,12 +58,10 @@ jobs: - name: Build with QNX toolchain env: - SCORE_QNX_USER: ${{ secrets.score-qnx-user }} - SCORE_QNX_PASSWORD: ${{ secrets.score-qnx-password }} + SCORE_QNX_USER: ${{ secrets.SCORE_QNX_USER }} + SCORE_QNX_PASSWORD: ${{ secrets.SCORE_QNX_PASSWORD }} run: | - set -euo pipefail - - bazel run --config qnx-x86_64 //images/qnx_x86_64:image + bazel build --config qnx-x86_64 //images/qnx_x86_64:image working-directory: ./integration - name: Cleanup QNX license diff --git a/.github/workflows/test_integration.yml b/.github/workflows/test_integration.yml index f1e67e95ab..57bc156a9d 100644 --- a/.github/workflows/test_integration.yml +++ b/.github/workflows/test_integration.yml @@ -23,6 +23,7 @@ on: # - cron: '30 2 * * *' # Every night at 02:30 UTC on main branch jobs: integration_test: + if: false # Disable job as now latest greatest main loop does not work uses: ./.github/workflows/reusable_smoke-test.yml secrets: inherit with: diff --git a/integration/.bazelrc b/integration/.bazelrc index 71229875f7..f03197f6ef 100644 --- a/integration/.bazelrc +++ b/integration/.bazelrc @@ -1,6 +1,7 @@ common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ common --registry=https://bcr.bazel.build common --credential_helper=*.qnx.com=%workspace%/scripts/qnx_credential_helper.py +common --credential_helper_timeout="60s" build:_common --@score_baselibs//score/mw/log/detail/flags:KUse_Stub_Implementation_Only=False build:_common --@score_baselibs//score/mw/log/flags:KRemote_Logging=False diff --git a/known_good.json b/known_good.json index fe4f2701d2..d82f02b0f6 100644 --- a/known_good.json +++ b/known_good.json @@ -31,11 +31,11 @@ }, "score_tooling": { "repo": "https://github.com/eclipse-score/tooling.git", - "hash": "fe54d6aa717eb695298a4f0ca938f19e7fd18051" + "hash": "8894fe5440436a8c6d9e214c97b18d619c7f7eac" }, "score_platform": { "repo": "https://github.com/eclipse-score/score.git", - "hash": "6ef2b8c740eb538d9b9b44fabd3dea5e0a888da6" + "hash": "f4769c4b86bfe46b29b56b6c3e262c5b82db334b" }, "score_bazel_platforms": { "repo": "https://github.com/eclipse-score/bazel_platforms.git", @@ -47,7 +47,7 @@ }, "score_docs_as_code": { "repo": "https://github.com/eclipse-score/docs-as-code.git", - "hash": "e8622001d597ebc12244f006dde2e0a58c203ef0" + "hash": "a9babc30a7ab1ac43c75415b9784b2bc81ed0f9d" }, "score_process": { "repo": "https://github.com/eclipse-score/process_description.git", From 91b1b457a624d2387809091ab59b3b445c61ff81 Mon Sep 17 00:00:00 2001 From: Pawel Rutka Date: Tue, 10 Feb 2026 12:02:55 +0100 Subject: [PATCH 22/22] Remove qnx_qemu as it was moved to images --- qnx_qemu/.bazelrc | 22 - qnx_qemu/.bazelversion | 1 - qnx_qemu/BUILD | 135 --- qnx_qemu/MODULE.bazel | 114 -- qnx_qemu/README.md | 1029 ----------------- qnx_qemu/build/BUILD | 73 -- qnx_qemu/build/init.build | 99 -- qnx_qemu/build/system.build | 283 ----- qnx_qemu/configs/BUILD | 31 - qnx_qemu/configs/dhcpcd.conf | 42 - qnx_qemu/configs/group | 16 - qnx_qemu/configs/hostname | 1 - qnx_qemu/configs/network_capture.sh | 225 ---- qnx_qemu/configs/network_setup.sh | 33 - qnx_qemu/configs/network_setup_dhcp.sh | 92 -- qnx_qemu/configs/passwd | 17 - qnx_qemu/configs/pci_hw.cfg | 9 - qnx_qemu/configs/pci_server.cfg | 7 - qnx_qemu/configs/profile | 18 - qnx_qemu/configs/qcrypto.conf | 1 - qnx_qemu/configs/ssh_host_rsa_key | 38 - qnx_qemu/configs/ssh_host_rsa_key.pub | 1 - qnx_qemu/configs/sshd_config | 64 - qnx_qemu/configs/startup.sh | 84 -- qnx_qemu/scrample_integration/BUILD | 27 - .../scrample_integration/etc/logging.json | 8 - .../etc/mw_com_config.json | 63 - qnx_qemu/scripts/qnx_wireshark.sh | 276 ----- qnx_qemu/scripts/run_qemu.sh | 33 - qnx_qemu/scripts/run_qemu_portforward.sh | 34 - qnx_qemu/target_config.json | 30 - qnx_qemu/test/itf/test_persistency.py | 38 - qnx_qemu/test/itf/test_scrample.py | 39 - qnx_qemu/test/itf/test_ssh.py | 46 - qnx_qemu/test/test_qnx_qemu_bridge.sh | 509 -------- qnx_qemu/test/test_qnx_qemu_portforward.sh | 406 ------- 36 files changed, 3944 deletions(-) delete mode 100644 qnx_qemu/.bazelrc delete mode 100644 qnx_qemu/.bazelversion delete mode 100644 qnx_qemu/BUILD delete mode 100644 qnx_qemu/MODULE.bazel delete mode 100644 qnx_qemu/README.md delete mode 100644 qnx_qemu/build/BUILD delete mode 100644 qnx_qemu/build/init.build delete mode 100644 qnx_qemu/build/system.build delete mode 100644 qnx_qemu/configs/BUILD delete mode 100755 qnx_qemu/configs/dhcpcd.conf delete mode 100644 qnx_qemu/configs/group delete mode 100644 qnx_qemu/configs/hostname delete mode 100644 qnx_qemu/configs/network_capture.sh delete mode 100644 qnx_qemu/configs/network_setup.sh delete mode 100644 qnx_qemu/configs/network_setup_dhcp.sh delete mode 100644 qnx_qemu/configs/passwd delete mode 100644 qnx_qemu/configs/pci_hw.cfg delete mode 100644 qnx_qemu/configs/pci_server.cfg delete mode 100644 qnx_qemu/configs/profile delete mode 100644 qnx_qemu/configs/qcrypto.conf delete mode 100644 qnx_qemu/configs/ssh_host_rsa_key delete mode 100644 qnx_qemu/configs/ssh_host_rsa_key.pub delete mode 100644 qnx_qemu/configs/sshd_config delete mode 100644 qnx_qemu/configs/startup.sh delete mode 100644 qnx_qemu/scrample_integration/BUILD delete mode 100644 qnx_qemu/scrample_integration/etc/logging.json delete mode 100644 qnx_qemu/scrample_integration/etc/mw_com_config.json delete mode 100755 qnx_qemu/scripts/qnx_wireshark.sh delete mode 100755 qnx_qemu/scripts/run_qemu.sh delete mode 100755 qnx_qemu/scripts/run_qemu_portforward.sh delete mode 100644 qnx_qemu/target_config.json delete mode 100644 qnx_qemu/test/itf/test_persistency.py delete mode 100644 qnx_qemu/test/itf/test_scrample.py delete mode 100644 qnx_qemu/test/itf/test_ssh.py delete mode 100755 qnx_qemu/test/test_qnx_qemu_bridge.sh delete mode 100755 qnx_qemu/test/test_qnx_qemu_portforward.sh diff --git a/qnx_qemu/.bazelrc b/qnx_qemu/.bazelrc deleted file mode 100644 index f5f02ea756..0000000000 --- a/qnx_qemu/.bazelrc +++ /dev/null @@ -1,22 +0,0 @@ -common --registry=https://raw.githubusercontent.com/eclipse-score/bazel_registry/main/ -common --registry=https://bcr.bazel.build - -build:_common --@score_baselibs//score/mw/log/detail/flags:KUse_Stub_Implementation_Only=False -build:_common --@score_baselibs//score/mw/log/flags:KRemote_Logging=False -build:_common --@score_baselibs//score/json:base_library=nlohmann -build:_common --@score_baselibs//score/memory/shared/flags:use_typedshmd=False -build:_common --@score_communication//score/mw/com/flags:tracing_library=stub -build:_common --cxxopt=-Wno-error=mismatched-new-delete - -build:x86_64-qnx --config=_common -build:x86_64-qnx --noexperimental_merged_skyframe_analysis_execution -build:x86_64-qnx --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 -build:x86_64-qnx --incompatible_enable_cc_toolchain_resolution -build:x86_64-qnx --incompatible_strict_action_env -build:x86_64-qnx --platforms=@score_toolchains_qnx//platforms:x86_64-qnx -build:x86_64-qnx --sandbox_writable_path=/var/tmp - -build:qemu-integration --config=x86_64-qnx -build:qemu-integration --run_under=@score_itf//scripts:run_under_qemu -build:qemu-integration --test_arg="--qemu" -build:qemu-integration --test_arg="--os=qnx" diff --git a/qnx_qemu/.bazelversion b/qnx_qemu/.bazelversion deleted file mode 100644 index 8104cabd36..0000000000 --- a/qnx_qemu/.bazelversion +++ /dev/null @@ -1 +0,0 @@ -8.1.0 diff --git a/qnx_qemu/BUILD b/qnx_qemu/BUILD deleted file mode 100644 index 0ee32b983b..0000000000 --- a/qnx_qemu/BUILD +++ /dev/null @@ -1,135 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -load("@rules_shell//shell:sh_binary.bzl", "sh_binary") -load("@score_itf//:defs.bzl", "py_itf_test") - - -sh_binary( - name = "run_qemu", - srcs = ["scripts/run_qemu.sh"], - args = [ - "$(location @toolchains_qnx_sdp//:host_dir)", - "$(location //build:init)", - ], - data = [ - "//build:init", - "@toolchains_qnx_sdp//:host_all", - "@toolchains_qnx_sdp//:host_dir", - ], -) - -sh_binary( - name = "run_qemu_portforward", - srcs = ["scripts/run_qemu_portforward.sh"], - args = [ - "$(location @toolchains_qnx_sdp//:host_dir)", - "$(location //build:init)", - ], - data = [ - "//build:init", - "@toolchains_qnx_sdp//:host_all", - "@toolchains_qnx_sdp//:host_dir", - ], -) - - -sh_binary( - name = "test_qemu_bridge", - srcs = ["test/test_qnx_qemu_bridge.sh"], - args = [ - "$(location @toolchains_qnx_sdp//:host_dir)", - "$(location //build:init)", - "--timeout=90", - "--ssh-port=2222", - "--boot-wait=15", - ], - data = [ - "//build:init", - "@toolchains_qnx_sdp//:host_all", - "@toolchains_qnx_sdp//:host_dir", - ], -) - -sh_binary( - name = "test_qemu_portforward", - srcs = ["test/test_qnx_qemu_portforward.sh"], - args = [ - "$(location @toolchains_qnx_sdp//:host_dir)", - "$(location //build:init)", - "--timeout=90", - "--ssh-port=2222", - "--boot-wait=15", - ], - data = [ - "//build:init", - "@toolchains_qnx_sdp//:host_all", - "@toolchains_qnx_sdp//:host_dir", - ], -) - -py_itf_test( - name = "test_ssh_qemu", - srcs = [ - "test/itf/test_ssh.py", - ], - args = [ - "--target_config=$(location target_config.json)", - "--ecu=s_core_ecu_qemu", - "--qemu_image=$(location //build:init)", - ], - plugins = [ - "itf.plugins.base.base_plugin", - ], - data = [ - "//build:init", - "target_config.json", - ], -) - -py_itf_test( - name = "test_scrample_qemu", - srcs = [ - "test/itf/test_scrample.py", - ], - args = [ - "--target_config=$(location target_config.json)", - "--ecu=s_core_ecu_qemu", - "--qemu_image=$(location //build:init)", - ], - plugins = [ - "itf.plugins.base.base_plugin", - ], - data = [ - "//build:init", - "target_config.json", - ], -) - -py_itf_test( - name = "test_persistency_qemu", - srcs = [ - "test/itf/test_persistency.py", - ], - args = [ - "--target_config=$(location target_config.json)", - "--ecu=s_core_ecu_qemu", - "--qemu_image=$(location //build:init)", - ], - plugins = [ - "itf.plugins.base.base_plugin", - ], - data = [ - "//build:init", - "target_config.json", - ], -) diff --git a/qnx_qemu/MODULE.bazel b/qnx_qemu/MODULE.bazel deleted file mode 100644 index 7ff86edeb4..0000000000 --- a/qnx_qemu/MODULE.bazel +++ /dev/null @@ -1,114 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -module( - name = "score_ri_qnx_qemu", - version = "0.0.1", - compatibility_level = 0, -) - -############################################################################### -# -# Shell dependency -# -############################################################################### -bazel_dep(name = "rules_shell", version = "0.6.0") - -############################################################################### -# -# Python version -# -############################################################################### -bazel_dep(name = "rules_python", version = "1.0.0") - -PYTHON_VERSION = "3.12" - -python = use_extension("@rules_python//python/extensions:python.bzl", "python") -python.toolchain( - configure_coverage_tool = True, - is_default = True, - python_version = PYTHON_VERSION, -) -use_repo(python) - -############################################################################### -# -# GCC Toolchains -# -############################################################################### -# Configure the host toolchain. -bazel_dep(name = "score_toolchains_gcc", version = "0.5", dev_dependency=True) -gcc = use_extension("@score_toolchains_gcc//extentions:gcc.bzl", "gcc", dev_dependency=True) -gcc.toolchain( - url = "https://github.com/eclipse-score/toolchains_gcc_packages/releases/download/0.0.1/x86_64-unknown-linux-gnu_gcc12.tar.gz", - sha256 = "457f5f20f57528033cb840d708b507050d711ae93e009388847e113b11bf3600", - strip_prefix = "x86_64-unknown-linux-gnu", -) -gcc.extra_features( - features = [ - "minimal_warnings", - "treat_warnings_as_errors", - ], -) -gcc.warning_flags( - minimal_warnings = ["-Wall", "-Wno-error=deprecated-declarations", "-Wno-error=narrowing"], - strict_warnings = ["-Wextra", "-Wpedantic"], -) -use_repo(gcc, "gcc_toolchain", "gcc_toolchain_gcc") - -# register_toolchains("@gcc_toolchain//:all") -# register_toolchains("@toolchains_qnx_qcc//:qcc_x86_64") -# register_toolchains("@toolchains_qnx_ifs//:ifs_x86_64") -# Configure target toolchain for QNX build. -bazel_dep(name = "score_toolchains_qnx", version = "0.0.3") -toolchains_qnx = use_extension("@score_toolchains_qnx//:extensions.bzl", "toolchains_qnx", dev_dependency=True) -toolchains_qnx.sdp( - sha256 = "f2e0cb21c6baddbcb65f6a70610ce498e7685de8ea2e0f1648f01b327f6bac63", - strip_prefix = "installation", - url = "https://www.qnx.com/download/download/79858/installation.tgz", -) -use_repo(toolchains_qnx, "toolchains_qnx_sdp") -use_repo(toolchains_qnx, "toolchains_qnx_qcc") -use_repo(toolchains_qnx, "toolchains_qnx_ifs") - -# register_toolchains("@toolchains_qnx_qcc//:qcc_x86_64") -# register_toolchains("@toolchains_qnx_ifs//:ifs_x86_64") - -############################################################################### -# -# Other dependencies -# -############################################################################### -bazel_dep(name = "rules_cc", version = "0.1.1") -bazel_dep(name = "score_itf", version = "0.1.0") -# bazel_dep(name = "score_baselibs", version = "0.1.3") - -# bazel_dep(name = "score_communication", version = "0.1.1") - -# bazel_dep(name = "score_scrample", version = "0.1.0") - -# bazel_dep(name = "score_persistency", version = "0.2.1") - -bazel_dep(name = "rules_boost", repo_name = "com_github_nelhage_rules_boost") -archive_override( - module_name = "rules_boost", - urls = ["https://github.com/nelhage/rules_boost/archive/refs/heads/master.tar.gz"], - strip_prefix = "rules_boost-master", -) - -# TRLC dependency for requirements traceability -bazel_dep(name = "trlc", version = "0.0.0") -git_override( - module_name = "trlc", - commit = "650b51a47264a4f232b3341f473527710fc32669", # trlc-2.0.2 release - remote = "https://github.com/bmw-software-engineering/trlc.git", -) \ No newline at end of file diff --git a/qnx_qemu/README.md b/qnx_qemu/README.md deleted file mode 100644 index 39a7e8d273..0000000000 --- a/qnx_qemu/README.md +++ /dev/null @@ -1,1029 +0,0 @@ -# QNX QEMU x86 Minimal Image - -## Overview - -This project provides a minimal QNX 8.0 image designed to run on x86_64 QEMU virtual machines. It's specifically configured for the Eclipse SCORE (Safety Critical Object-Oriented Real-time Embedded) project, offering a lightweight yet functional QNX environment suitable for development, testing, and demonstration purposes. - -## Quick Start Guide - -### 1. Prerequisites - -Before starting, ensure the following tools are available on your Linux host: - -- **Bazel** -- **QEMU** (with `qemu-bridge-helper` installed at `/usr/lib/qemu/qemu-bridge-helper`) -- Valid **QNX SDP 8.0 license** from . See this YT video for more info - -### 2. Installation/ Configuration - -- **Clone the integration & toolchain repos** - -```bash -git clone https://github.com/eclipse-score/reference_integration.git -git clone https://github.com/eclipse-score/toolchains_qnx.git -cd reference_integration/qnx_qemu -``` - -Toolchain repo contains the Bazel rules and credential helper used to download and register the QNX SDP toolchain. - -- **Provide QNX download credentials** - -You can pass credentials via environment variables. - -```bash -export SCORE_QNX_USER="" -export SCORE_QNX_PASSWORD="" -``` - -- **Download QNX Software Center for Linux** - -**Using GUI:** - -Download **QNX Software Center 2.0.4 Build 202501021438 - Linux Hosts** from the [QNX Software Center page](https://www.qnx.com/download/group.html?programid=29178), then install it. - -**Using CLI:** - -URL to installer must be determined manually: - -- Go to [QNX page] and log in using "SIGN IN". - -- Go to [QNX Software Center page]. - -- Scroll down and click the link labeled `QNX Software Center Build - Linux Hosts`. - -- Right-click "Download Now" button and copy the installer URL. - -- Verify installer checksum after download! - -```bash -# Create directory. -mkdir ~/.qnx -# Log-in and download installer. -curl -v --cookie-jar ~/.qnx/myqnxcookies.auth --form "userlogin=$SCORE_QNX_USER" --form "password=$SCORE_QNX_PASSWORD" https://www.qnx.com/account/login.html -o login_response.html -curl -v -L --cookie ~/.qnx/myqnxcookies.auth installer_URL > qnx-setup-lin.run -# Verify checksum. -sha256sum qnx-setup-lin.run -# Make the installer executable. -chmod +x ./qnx-setup-lin.run -# Run installer. -~/qnx-setup-lin.run force-override disable-auto-start agree-to-license-terms ~/qnxinstall -``` - -- **Download QNX SDP 8.0** - -**Using GUI:** - -Using **QNX Software Center - Linux Hosts** we previously installed , install **QNX Software Development Platform 8.0**. - -**Using CLI:** - -```bash -cd ~/qnxinstall/qnxsoftwarecenter -./qnxsoftwarecenter_clt -syncLicenseKeys -myqnx.user="$SCORE_QNX_USER" -myqnx.password="$SCORE_QNX_PASSWORD" -addLicenseKey license_key -listLicenseKeys -./qnxsoftwarecenter_clt -mirrorBaseline="qnx800" -myqnx.user="$SCORE_QNX_USER" -myqnx.password="$SCORE_QNX_PASSWORD" -./qnxsoftwarecenter_clt -cleanInstall -destination ~/qnx800 -installBaseline com.qnx.qnx800 -myqnx.user="$SCORE_QNX_USER" -myqnx.password="$SCORE_QNX_PASSWORD" -cd - > /dev/null -``` - -This contains the toolchains and `license` folder required for activation. -check this QNX link for more info - -- **Source SDP environment** - -```bash -source ~/qnx800/qnxsdp-env.sh -#The commands below confirm the environment was sourced successfully. -echo "$QNX_HOST" "$QNX_TARGET" -``` - -- **Register QNX license** - -```bash -sudo mkdir -p /opt/score_qnx/license -sudo cp ~/.qnx/license/licenses /opt/score_qnx/license/licenses -sudo chmod 644 /opt/score_qnx/license/licenses -``` - -OR we can use symbolic linking - -```bash -sudo install -d -m 755 /opt/score_qnx/license -LIC_SRC="$(readlink -f "$HOME/.qnx/license/licenses")" -sudo ln -sfn "$LIC_SRC" /opt/score_qnx/license/licenses -chmod 644 "$LIC_SRC" -``` - -- **Configure QEMU networking** - -to allow QEMU bridge helper to create TAP devices and to make sure **TUN** is available: - -Give qemu-bridge-helper the required capabilities. - -Make sure that bridge virbr0 is installed for successful QEMU startup - -```bash -sudo apt update -sudo apt install -y libvirt-daemon-system qemu-kvm -sudo systemctl enable --now libvirtd -sudo virsh net-define /usr/share/libvirt/networks/default.xml || true -sudo virsh net-autostart default -sudo virsh net-start default -``` - -Create /etc/qemu if it doesn’t exist. - -```bash -sudo install -d -m 755 /etc/qemu -echo "allow virbr0" | sudo tee /etc/qemu/bridge.conf -``` - -On Debian/Ubuntu (most common path): - -```bash -sudo setcap cap_net_admin,cap_net_raw+ep /usr/lib/qemu/qemu-bridge-helper -``` - -Verify: - -```bash -getcap /usr/lib/qemu/qemu-bridge-helper -# or -getcap /usr/libexec/qemu-bridge-helper -``` - -You should see: - -```bash -/usr/lib/qemu/qemu-bridge-helper = cap_net_admin,cap_net_raw+ep -``` - -Enable TUN device - -Make sure the TUN kernel module is loaded: - -```bash -sudo modprobe tun -``` - -Check that the device exists: - -```bash -ls -l /dev/net/tun -``` - -If successful, you’ll see: - -```bash -crw-rw-rw- 1 root root 10, 200 ... /dev/net/tun -``` - -### 3. Build & run the QNX image on qemu - -Run Bazel with the credential helper: - -```bash -bazel build --config=x86_64-qnx \ - --credential_helper=*.qnx.com=$(pwd)/../toolchains_qnx/tools/qnx_credential_helper.py \ - //build:init -``` - -- First run downloads ~1.6 GiB of QNX SDP - -- Resulting IFS: `bazel-bin/build/init.ifs` - -at this stage Build shall succeed. - -- **Run QNX in QEMU** - -verify bridge virbr0 is up and running - -```bash -ip link show virbr0 -``` - -- QEMU can use KVM for near-native performance. The wrapper below auto-enables **KVM** when available and falls back to **TCG** with a visible warning if /dev/kvm isn’t accessible - -```bash -sudo tee /usr/local/bin/qemu-system-x86_64 >/dev/null <<'EOF' -#!/usr/bin/env bash -# Smart QEMU shim: auto-enable KVM when possible; warn & fall back otherwise. -set -euo pipefail -REAL="${QEMU_BIN:-/usr/bin/qemu-system-x86_64}" - -have_kvm() { - [[ -e /dev/kvm && -r /dev/kvm && -w /dev/kvm ]] || return 1 - [[ -d /sys/module/kvm ]] && { [[ -d /sys/module/kvm_intel || -d /sys/module/kvm_amd ]] ; } || true -} - -args=("$@") -want_kvm=false -for a in "${args[@]}"; do - [[ "$a" == "--enable-kvm" ]] && want_kvm=true -done - -if have_kvm; then - $want_kvm || args+=(--enable-kvm) -else - # Strip any --enable-kvm and warn - filtered=() - for a in "${args[@]}"; do - [[ "$a" == "--enable-kvm" ]] && continue - filtered+=("$a") - done - args=("${filtered[@]}") - echo "Warning: KVM not available: /dev/kvm missing or not accessible; using software emulation (TCG)." >&2 - sleep 2 # fixed 2s pause so the warning is visible -fi - -exec "$REAL" "${args[@]}" -EOF -``` - -make the script executable - -```bash -sudo chmod +x /usr/local/bin/qemu-system-x86_64 -``` - -Tip: ensure /usr/local/bin comes before /usr/bin so the wrapper is used: - -```bash -export PATH=/usr/local/bin:$PATH -hash -r -``` - -- Run QEMU - -```bash -bazel run --config=x86_64-qnx //:run_qemu -``` - -## Features - -### Core System Components - -- **QNX 8.0 Neutrino RTOS** - Real-time operating system with SMP support -- **x86_64 Architecture** - Optimized for modern 64-bit Intel/AMD processors -- **Multiboot Support** - Compatible with GRUB and other multiboot loaders -- **56MB Image Size** - Compact footprint while maintaining essential functionality -- **Host: Ubuntu 24.04** - Developed and tested on Ubuntu 24.04 as host machine - -### Networking Capabilities - -- **VirtIO Network Driver** - High-performance virtualized networking -- **Bridge Networking** - Direct network access with configurable IP -- **Port Forwarding** - Alternative NAT-based networking mode -- **SSH Server** - Remote access with passwordless authentication -- **DHCP Client** - Automatic IP configuration with dhcpcd -- **Network Packet Capture** - tcpdump integration with Wireshark support -- **ICMP Support** - Ping connectivity for network testing -- **SFTP Server** - Secure file transfer capabilities - -### Development Tools - -- **Toybox Utilities** - Comprehensive set of Unix command-line tools -- **Shell Environment** - Korn shell (ksh) with standard Unix tools -- **SSH Client/Server** - Full SSH stack for remote development -- **OpenSSL** - Cryptographic libraries and tools -- **File System Support** - QNX6 and DOS file systems - -### Storage and I/O - -- **RAM Disk** - 10MB temporary storage with 512KB cache -- **IDE/SATA Support** - Block device access for persistent storage -- **Serial Console** - 115200 baud serial interface for debugging -- **PCI Hardware Support** - Comprehensive PCI device management - -### Security Features - -- **User Management** - Root and regular user accounts -- **SSH Key Authentication** - RSA host keys pre-configured -- **File Permissions** - Standard Unix-style permissions -- **Chroot Environment** - SSH privilege separation - -## Directory Structure - -```text -qnx_qemu/ -├── README.md # This documentation file -├── BUILD # Bazel build configuration with multiple run targets -├── MODULE.bazel # Bazel module configuration -├── .bazelrc # Bazel configuration file -│ -├── build/ # Image build definitions -│ ├── BUILD # Build targets for QNX image creation -│ ├── init.build # IFS (Image FileSystem) definition -│ └── system.build # System content definition (libraries, tools, configs) -│ -├── configs/ # Configuration files and scripts -│ ├── BUILD # Build configuration for config files -│ ├── startup.sh # Main system startup script -│ ├── network_setup.sh # Standard network configuration -│ ├── network_setup_dhcp.sh # DHCP-based network configuration -│ ├── network_capture.sh # Network packet capture utility -│ ├── dhcpcd.conf # DHCP client configuration -│ ├── sshd_config # SSH daemon configuration (passwordless) -│ ├── ssh_host_rsa_key # SSH server private key -│ ├── ssh_host_rsa_key.pub # SSH server public key -│ ├── pci_server.cfg # PCI bus server configuration -│ ├── pci_hw.cfg # PCI hardware configuration -│ ├── qcrypto.conf # Cryptographic library configuration -│ ├── passwd # User account database -│ ├── group # Group membership database -│ ├── hostname # System hostname definition -│ └── profile # Shell environment configuration -│ -├── scripts/ # Utility scripts -│ ├── run_qemu.sh # QEMU launcher with bridge networking -│ ├── run_qemu_portforward.sh # QEMU launcher with port forwarding -│ └── qnx_wireshark.sh # Wireshark integration for network analysis -│ -└── test/ # Testing framework - ├── test_qnx_qemu_bridge.sh # Bridge networking integration tests - └── test_qnx_qemu_portforward.sh # Port forwarding integration tests -``` - -### Key Files Explained - -- **`init.build`** - Defines the bootable image structure, kernel parameters, and essential boot-time utilities -- **`system.build`** - Specifies all system libraries, tools, and configuration files for the running system -- **`startup.sh`** - Orchestrates system service initialization (logging, PCI, networking, SSH) -- **`network_setup.sh`** - Configures network interfaces with static IP addressing -- **`network_setup_dhcp.sh`** - Configures network interfaces with DHCP -- **`network_capture.sh`** - Network packet capture tool with Wireshark integration -- **`run_qemu.sh`** - Launches QEMU with bridge networking for direct IP access -- **`run_qemu_portforward.sh`** - Launches QEMU with port forwarding (NAT networking) -- **`qnx_wireshark.sh`** - Host-side script for Wireshark network analysis integration -- **`test_qnx_qemu_bridge.sh`** - Automated testing for bridge networking mode -- **`test_qnx_qemu_portforward.sh`** - Automated testing for port forwarding mode - -## Building the Image - -### Prerequisites - -- Bazel build system -- QNX SDP (Software Development Platform) toolchain -- Linux host system with KVM support - -### Build Commands - -```bash -# Build the QNX image -bazel build --config=x86_64-qnx //build:init - -# Build and run QEMU with bridge networking -bazel run --config=x86_64-qnx //:run_qemu - -# Build and run QEMU with port forwarding -bazel run --config=x86_64-qnx //:run_qemu_portforward - -# Run integration tests for bridge networking -bazel run --config=x86_64-qnx //:test_qemu_bridge - -# Run integration tests for port forwarding -bazel run --config=x86_64-qnx //:test_qemu_portforward - -# Run ITF tests for ssh -bazel test --config=qemu-integration //:test_ssh_qemu --test_output=streamed -``` - -In order to provide credentials for qnx.com pass to bazel command: - -```bash ---credential_helper=*.qnx.com=/tools/qnx_credential_helper.py -``` - -See more in [toolchains_qnx README](https://github.com/eclipse-score/toolchains_qnx?tab=readme-ov-file#using-pre-packaged-qnx-80-sdp). - -## Running the System - -### Using Bazel (Recommended) - -#### Bridge Networking Mode - -```bash -# Start the QNX system with bridge networking (direct IP access) -bazel run --config=x86_64-qnx //:run_qemu -``` - -This mode provides: - -- Direct IP access to QNX system -- Ping connectivity from host -- SSH access via direct IP e.g.: `ssh root@192.168.122.100` - -#### Port Forwarding Mode - -```bash -# Start the QNX system with port forwarding (NAT networking) -bazel run --config=x86_64-qnx //:run_qemu_portforward -``` - -This mode provides: - -- SSH access via port forwarding: `ssh -p 2222 root@localhost` -- HTTP port forwarding: `localhost:8080` → `guest:80` -- HTTPS port forwarding: `localhost:8443` → `guest:443` -- Packet capture port: `localhost:9999` → `guest:9999` - -### Manual QEMU Execution - -#### Bridge Networking - -```bash -qemu-system-x86_64 \ - -smp 2 \ - --enable-kvm \ - -cpu Cascadelake-Server-v5 \ - -m 1G \ - -nographic \ - -kernel path/to/ifs_image \ - -serial mon:stdio \ - -object rng-random,filename=/dev/urandom,id=rng0 \ - -netdev bridge,id=net0,br=virbr0 \ - -device virtio-net-pci,netdev=net0 \ - -device virtio-rng-pci,rng=rng0 -``` - -#### Port Forwarding - -```bash -qemu-system-x86_64 \ - -smp 2 \ - --enable-kvm \ - -cpu Cascadelake-Server-v5 \ - -m 1G \ - -nographic \ - -kernel path/to/ifs_image \ - -serial mon:stdio \ - -object rng-random,filename=/dev/urandom,id=rng0 \ - -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80,hostfwd=tcp::8443-:443,hostfwd=tcp::9999-:9999 \ - -device virtio-net-pci,netdev=net0 \ - -device virtio-rng-pci,rng=rng0 -``` - -### QEMU Parameters Explained - -- **`-smp 2`** - Enable 2 CPU cores for SMP support -- **`--enable-kvm`** - Use hardware virtualization for better performance -- **`-cpu Cascadelake-Server-v5`** - Emulate modern Intel CPU features for older Ubuntu versions change that to `-cpu host` in case of errors -- **`-m 1G`** - Allocate 1GB of RAM -- **`-nographic`** - Disable graphical display (console-only) -- **`-netdev bridge`** - Connect to host bridge network for direct IP access -- **`-device virtio-net-pci`** - Use VirtIO network driver for optimal performance -- **`-device virtio-rng-pci`** - Provide hardware random number generation - -## Network Configuration - -### Default Network Settings - -#### Bridge Network Configuration - -- **IP Address**: DHCP client for QNX SDP 8.0 is dhcpcd. It also provides the IPv4 Link Local addressing and IPv6 Router Solicitation functionality that was previously provided by autoipd -- **Subnet Mask**: `255.255.255.0` -- **Network Interface**: `vtnet0` (VirtIO network) -- **SSH Port**: `22` - -#### Port Forward Network Configuration - -- **IP Address**: `10.0.2.15` (QEMU user networking) -- **Subnet Mask**: `255.255.255.0` -- **Network Interface**: `vtnet0` (VirtIO network) -- **SSH Port**: `22` (forwarded to host port `2222`) - -### Changing the IP Address - -To modify the default IP address, edit the network configuration: - -1. **Edit network setup script**: - - ```bash - vim configs/network_setup.sh - ``` - -2. **Example on modify the IP configuration line**: - - ```bash - # Change this line to your desired IP - ifconfig vtnet0 192.168.122.100 netmask 255.255.255.0 - - # Example: Change to 192.168.1.50 - ifconfig vtnet0 192.168.1.50 netmask 255.255.255.0 - ``` - -3. **Update test script IP** (if using tests): - - ```bash - vim test/test_qnx_qemu_bridge.sh - ``` - - Change the default IP in the bridge test script: - - ```bash - QNX_IP=${QNX_IP:-192.168.1.50} # Update default IP - ``` - -4. **Rebuild the image**: - - ```bash - bazel build --config=x86_64-qnx //build:init - ``` - -### Network Bridge Setup (Host) - -For direct IP access, ensure your host has a bridge network configured: - -```bash -# Create bridge (if not exists) -sudo ip link add name virbr0 type bridge -sudo ip link set virbr0 up -sudo ip addr add 192.168.122.1/24 dev virbr0 - -# Enable IP forwarding -echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward -``` - -In case of failed to parse default acl file /etc/qemu/bridge.conf' - -1. Check acl of `/etc/qemu/bridge.conf` -2. If file does not exist; create that file and add the following line in it -`allow virbr0` -3. Run qemu with Sudo as debug option in case of failure with acl - -In case of error "Operation not permitted" for `qemu-bridge-helper` run - -```bash -sudo chmod u+s /usr/lib/qemu/qemu-bridge-helper -``` - -## User Accounts and Access - -### Available Users - -| Username | UID | GID | Home Directory | Shell | Password | -|----------|-----|-----|----------------|-------|----------| -| root | 0 | 0 | / | /bin/sh | None (passwordless) | -| qnxuser | 1000 | 1000 | / | /bin/sh | None (passwordless) | -| sshd | 15 | 6 | / | /bin/false | N/A (service account) | - -### SSH Access - -The system is configured for passwordless SSH access: - -#### SSH via Bridge Network - -```bash -# Connect via bridge network (DHCP or fallback IP) -ssh root@192.168.122.100 # If using fallback IP -# OR check actual DHCP-assigned IP first: -# ssh root@ - -# Connect as regular user -ssh qnxuser@192.168.122.100 # If using fallback IP -``` - -#### SSH via Port Forwarding - -```bash -# Connect via port forwarding (recommended for NAT networking) -ssh -p 2222 root@localhost - -# Connect as regular user via port forwarding -ssh -p 2222 qnxuser@localhost -``` - -**Note**: No password is required. The system accepts empty passwords for simplicity in development environments. - -## Testing - -### Automated Test Suite - -The project includes comprehensive test suites for both networking modes that validate: - -- System boot and initialization -- Network connectivity (ping tests for bridge mode) -- SSH server functionality -- System service status -- File system operations -- Network-specific features - -### Running Tests - -#### Bridge Networking Tests - -```bash -# Run bridge networking test suite -bazel run --config=x86_64-qnx //:test_qemu_bridge - -# Run with custom parameters -bazel run --config=x86_64-qnx //:test_qemu_bridge -- --timeout=120 --boot-wait=20 --qnx-ip=192.168.1.50 -``` - -#### Port Forwarding Tests - -```bash -# Run port forwarding test suite -bazel run --config=x86_64-qnx //:test_qemu_portforward - -# Run with custom parameters -bazel run --config=x86_64-qnx //:test_qemu_portforward -- --timeout=120 --boot-wait=20 -``` - -### Test Script Options - -#### Bridge Networking Test Options - -```bash -./test_qnx_qemu_bridge.sh [options] - -Options: - --timeout=N Boot timeout in seconds (default: 120) - --ssh-port=N SSH port for testing (default: 2222) - --ssh-user=USER SSH user for testing (default: root) - --boot-wait=N Additional wait after boot (default: 15) - --qnx-ip=IP QNX system IP for ping test (default: 192.168.122.100) - --no-ssh Skip SSH connectivity test - --no-ping Skip ping connectivity test - --help Show help message -``` - -#### Port Forwarding Test Options - -```bash -./test_qnx_qemu_portforward.sh [options] - -Options: - --timeout=N Boot timeout in seconds (default: 120) - --ssh-port=N SSH port for testing (default: 2222) - --ssh-user=USER SSH user for testing (default: root) - --boot-wait=N Additional wait after boot (default: 15) - --no-ssh Skip SSH connectivity test - --help Show help message - -Note: Port forwarding mode does not support ping tests due to NAT networking. -``` - -### Expected Test Output - -```text -============================================================ -QNX QEMU Integration Test -============================================================ -QNX Host: /path/to/qnx/host -IFS Image: /path/to/ifs/image -Timeout: 90s -QNX IP: 192.168.122.100 -SSH Port: 2222 -SSH User: root -Ping Test: Enabled -Boot Wait: 15s - -1. Starting QEMU with bridge networking... -✓ QEMU started (PID: 12345) -✓ Bridge networking: 192.168.122.100 (for ping test) -✓ SSH port forwarding: localhost:2222 -> guest:22 - -2. Waiting for boot completion (timeout: 90s)... -Waiting for hostname confirmation: 'Hostname set to: Qnx_S-core' -✓ Boot completion detected: Found hostname confirmation -✓ System fully booted and hostname configured - -3. Waiting for system stabilization (15s)... -✓ Stabilization wait completed - -4. Testing ping connectivity to QNX system... -Testing ping to 192.168.122.100... -✓ Ping test successful - QNX system is reachable at 192.168.122.100 -Ping statistics: -PING 192.168.122.100 (192.168.122.100) 56(84) bytes of data. -64 bytes from 192.168.122.100: icmp_seq=1 ttl=64 time=0.234 ms -64 bytes from 192.168.122.100: icmp_seq=2 ttl=64 time=0.187 ms -64 bytes from 192.168.122.100: icmp_seq=3 ttl=64 time=0.198 ms - -5. Testing system functionality... -✓ QEMU process is still running -✓ Found system indicator: qnx -✓ Found system indicator: Welcome -✓ Found system indicator: startup -✓ System functionality indicators found (3) - -6. Testing SSH connectivity... -Testing SSH port connectivity on localhost:2222... -✓ SSH port 2222 is open on localhost -Testing direct SSH connection to QNX system... -Attempting SSH connection to root@192.168.122.100... -✓ SSH connection to 192.168.122.100 successful -✓ Checked /tmp/hostname contents - -7. Final system status... -✓ QEMU process is running (PID: 12345) - -Recent system output: ----------------------------------------- ----> Starting sshd -Hostname set to: Qnx_S-core -# ----------------------------------------- - -============================================================ -✓ ALL TESTS PASSED -QNX QEMU integration is working correctly! -QEMU is running on PID: 12345 -QNX system IP: 192.168.122.100 (pingable) -SSH port forwarding: localhost:2222 -> guest:22 -============================================================ -``` - -### Test Failure Scenarios - -If tests fail, check: - -1. **Boot Timeout**: Increase `--timeout` value -2. **Network Issues**: Verify bridge setup and IP configuration -3. **SSH Problems**: Check SSH daemon startup and port forwarding -4. **Host Permissions**: Ensure user can access KVM and bridge networking - -## System Capabilities - -### Available Commands - -The system includes a comprehensive set of Unix-like utilities through Toybox: - -**File Operations**: `ls`, `cp`, `mv`, `rm`, `cat`, `grep`, `find`, `chmod`, `chown` -**Text Processing**: `awk`, `sed`, `sort`, `cut`, `tr`, `wc`, `head`, `tail` -**System Info**: `ps` (pidin), `uname`, `whoami`, `id`, `hostname` -**Network Tools**: `ifconfig`, `ssh`, `scp`, `ping` (through system), `tcpdump` -**Network Analysis**: `network_capture` - Packet capture with Wireshark integration -**Compression**: `gzip`, `gunzip`, `tar`, `bzip2` -**Development**: `openssl`, `hexdump`, `od`, `strings` - -### System Services - -- **System Logger** (`slogger2`) - Centralized logging with 4KB buffer -- **PCI Server** - Hardware device management -- **SSH Daemon** - Remote access service -- **File System Event Manager** - File change notifications -- **Message Queues** - POSIX IPC support -- **Random Number Generator** - Entropy service -- **Network Stack** - TCP/IP with VirtIO drivers - -### File Systems - -- **Root File System** - Image File System (IFS) in memory -- **QNX6 File System** - On RAM disk (`/tmp_ram`) -- **DOS File System** - For compatibility -- **Pseudo File Systems** - `/proc`, `/dev`, `/tmp` - -## Network Trace Collection - -### Network Analysis Overview - -The QNX system includes comprehensive network packet capture capabilities with Wireshark integration. This enables real-time analysis of network traffic for debugging, security analysis, and performance monitoring. - -### Packet Capture Methods - -#### 1. Direct Capture on QNX System - -Access the QNX system and use the built-in capture tool: - -```bash -# SSH into QNX system -ssh -p 2222 root@localhost - -# Start packet capture (saves to file) -network_capture start - -# Capture with filter (e.g., SSH traffic only) -network_capture start "tcp port 22" - -# Check capture status -network_capture status - -# List captured files -network_capture list - -# Stop capture -network_capture stop -``` - -#### 2. Real-time Streaming to Wireshark - -Stream packets directly to Wireshark running on the host system: - -```bash -# On QNX system: Start packet streaming -network_capture stream - -# On host system: Launch Wireshark with remote capture -# Method 1: Use integration script (recommended) -./scripts/qnx_wireshark.sh wireshark - -# Method 2: Manual Wireshark configuration -# 1. Open Wireshark -# 2. Go to Capture -> Options -> Manage Interfaces -# 3. Add remote interface: TCP@localhost:9999 -# 4. Start capture -``` - -### Host Integration Script - -The `scripts/qnx_wireshark.sh` script provides seamless integration: - -```bash -# Launch Wireshark with live QNX capture -./scripts/qnx_wireshark.sh wireshark - -# Start streaming (manual Wireshark setup) -./scripts/qnx_wireshark.sh stream - -# Download saved capture files -./scripts/qnx_wireshark.sh list -./scripts/qnx_wireshark.sh download capture_20250129_143022.pcap - -# Check QNX capture status -./scripts/qnx_wireshark.sh status - -# Stop all captures -./scripts/qnx_wireshark.sh stop -``` - -### Network Filtering Examples - -Common packet filters for targeted analysis: - -```bash -# SSH traffic analysis -network_capture start "tcp port 22" - -# ICMP/ping analysis -network_capture start "icmp" - -# All TCP traffic -network_capture start "tcp" - -# Traffic to/from gateway -network_capture start "host 10.0.2.2" - -# HTTP/HTTPS traffic -network_capture start "tcp port 80 or tcp port 443" - -# DNS queries -network_capture start "udp port 53" -``` - -### Port Forwarding Configuration - -The system is configured with port forwarding for network analysis: - -- **SSH**: `localhost:2222` → `guest:22` -- **HTTP**: `localhost:8080` → `guest:80` -- **HTTPS**: `localhost:8443` → `guest:443` -- **Packet Stream**: `localhost:9999` → `guest:9999` - -### Wireshark Analysis Workflow - -1. **Start QNX System**: - - ```bash - bazel run --config=x86_64-qnx //:run_qemu_portforward - ``` - -2. **Launch Live Capture**: - - ```bash - ./scripts/qnx_wireshark.sh wireshark "tcp" - ``` - -3. **Generate Traffic**: - - - SSH connections: `ssh -p 2222 root@localhost` - - Network tests: `ping` from within QNX - - Application traffic through port forwarding - -4. **Analyze in Wireshark**: - - Real-time packet inspection - - Protocol analysis - - Network performance metrics - - Security analysis - -### Saved Capture Analysis - -For offline analysis of saved captures: - -```bash -# List available captures -./scripts/qnx_wireshark.sh list - -# Download specific capture -./scripts/qnx_wireshark.sh download capture_20250129_143022.pcap - -# Open in Wireshark -wireshark capture_20250129_143022.pcap -``` - -### Troubleshooting Network Capture - -**Connection Issues**: - -- Verify SSH connectivity: `ssh -p 2222 root@localhost` -- Check port forwarding: `netstat -tlnp | grep 9999` -- Ensure QNX system is running: `./scripts/qnx_wireshark.sh status` - -**Wireshark Integration**: - -- Install Wireshark: `sudo apt install wireshark` (Ubuntu/Debian) -- Add user to wireshark group: `sudo usermod -a -G wireshark $USER` -- Verify remote capture support in Wireshark - -**Packet Loss**: - -- Reduce capture load with specific filters -- Use file-based capture for high-throughput analysis -- Monitor system resources on QNX - -### Network Security Considerations - -- Packet captures may contain sensitive data -- Use filters to limit captured data scope -- Secure transfer of capture files from QNX system -- Regular cleanup of capture files in `/tmp_ram/var/capture` - -## Troubleshooting - -### Common Issues - -1. **System Won't Boot** - - Check QNX SDP toolchain installation - - Verify image file permissions - - Ensure KVM is available and accessible - -2. **Network Connectivity Issues** - - Verify bridge network configuration on host - - Check IP address conflicts - - Ensure firewall allows bridge traffic - -3. **SSH Connection Refused** - - Wait for full system boot (look for "Hostname set to: Qnx_S-core") - - Check SSH daemon startup in console output - - Verify port forwarding configuration - -4. **Performance Issues** - - Enable KVM acceleration (`--enable-kvm`) - - Increase memory allocation (`-m 2G`) - - Use VirtIO drivers for I/O - -### Debug Information - -- **Boot Messages**: Monitor serial console for startup progress -- **System Logs**: Use `slog2info` within the system -- **Process List**: Use `pidin` to see running processes -- **Network Status**: Use `ifconfig` to check interface configuration - -### Host Requirements - -- **Linux Distribution**: Ubuntu 20.04+ or equivalent -- **Virtualization**: KVM support enabled -- **Memory**: Minimum 4GB host RAM (1GB allocated to guest) -- **Network**: Bridge networking capability -- **Privileges**: Access to `/dev/kvm` and bridge creation - -## Development and Customization - -### Adding New Software - -1. **Edit system.build**: Add new binaries and libraries -2. **Update dependencies**: Include required shared libraries -3. **Rebuild image**: `bazel build --config=x86_64-qnx //build:init` - -### Modifying Services - -1. **Edit startup.sh**: Modify service startup sequence -2. **Add configuration files**: Place in `configs/` directory -3. **Update BUILD file**: Include new configuration files - -### Security Considerations - -This image is configured for development convenience with: - -- Passwordless SSH access -- Root login enabled -- Relaxed security policies - -For production use, implement: - -- Strong authentication mechanisms -- User privilege restrictions -- Network access controls -- Audit logging - -## Contributing - -This project is part of the Eclipse SCORE initiative. Contributions should follow Eclipse Foundation guidelines and maintain compatibility with the SCORE architecture. - -## License - -This project is licensed under the Apache License 2.0. See the LICENSE file for details. - ---- - -**Eclipse SCORE** - Safety Critical Object-Oriented Real-time Embedded Systems diff --git a/qnx_qemu/build/BUILD b/qnx_qemu/build/BUILD deleted file mode 100644 index 6e64a8a835..0000000000 --- a/qnx_qemu/build/BUILD +++ /dev/null @@ -1,73 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -load("@score_toolchains_qnx//rules/fs:ifs.bzl", "qnx_ifs") - -filegroup( - name = "scripts", - srcs = [ - "//configs:startup.sh", - ], - visibility = ["//visibility:private"], -) - -filegroup( - name = "configs", - srcs = [ - "//configs:pci_server.cfg", - "//configs:pci_hw.cfg", - "//configs:qcrypto.conf", - "//configs:passwd", - "//configs:group", - "//configs:sshd_config", - "//configs:ssh_host_rsa_key", - "//configs:ssh_host_rsa_key.pub", - "//configs:hostname", - "//configs:network_setup.sh", - "//configs:network_capture.sh", - "//configs:profile", - "//configs:dhcpcd.conf", - "//configs:network_setup_dhcp.sh", - ], - visibility = ["//visibility:private"], -) - -qnx_ifs( - name = "init", - build_file = "init.build", - srcs = [ - ":system.build", - ":system_dir", - ":scripts", - ":configs", - "@score_scrample//src:scrample", - "//scrample_integration:etc_configs", - "@score_persistency//tests/cpp_test_scenarios:cpp_test_scenarios", - ], - ext_repo_maping = { - "SCRAMPLE_PATH": "$(location @score_scrample//src:scrample)", - "CPP_TEST_SCENARIOS_PATH": "$(location @score_persistency//tests/cpp_test_scenarios:cpp_test_scenarios)", - }, - visibility = [ - "//visibility:public", - ], -) - -filegroup( - name = "system_dir", - srcs = [ - "system.build", - "init.build", - ], -) - diff --git a/qnx_qemu/build/init.build b/qnx_qemu/build/init.build deleted file mode 100644 index bbec098e03..0000000000 --- a/qnx_qemu/build/init.build +++ /dev/null @@ -1,99 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - - -############################################################################### -# -# Example image built based on minimal configuration from QNX -# -############################################################################### - -[-optional] - -[image=0x3600000] # Set image size to 56MB (0x3600000 bytes) -[virtual=x86_64,multiboot] boot = { # Configure for x86_64 architecture with multiboot support - # Use startup-x86 by default - startup-x86 -v -D8250..115200 -zz # Start x86 kernel with verbose output, serial console at 115200 baud - PATH=/proc/boot # Set executable search path to boot directory - LD_LIBRARY_PATH=/proc/boot # Set library search path to boot directory - [+keeplinked] procnto-smp-instr # Keep process manager linked and instrumented for SMP -} - -[+script] startup-script = { # Define startup script that runs during boot - procmgr_symlink /dev/shmem /tmp # Create symbolic link from shared memory to /tmp - # /tmp will be mounted later as a proper RAM disk - - display_msg Welcome to QNX OS 8.0 on x86_64 tweaked for S-CORE! # Display welcome message - - # These env variables get inherited by all programs which follow - SYSNAME=nto # Set system name to "nto" (Neutrino) - TERM=qansi # Set terminal type to QNX ANSI - - devc-ser8250 & # Start serial driver in background - waitfor /dev/ser1 # Wait for serial device to be available - reopen /dev/ser1 # Reopen serial device for console I/O - - display_msg Placeholder for startup script # Display startup message - etc/startup.sh # Execute main startup script - - [+session] /bin/sh & # Start shell session in background -} - -# Essential utilities - core system commands needed for basic operation -# These binaries provide fundamental system functionality and process management - -# Process and system management utilities -on # Command execution utility - runs commands with specific options -[type=link] waitfor=on # Create symbolic link: waitfor -> on (waits for resources to become available) -[type=link] ability=on # Create symbolic link: ability -> on (manages process abilities/privileges) - -# Shell and command interpreter -ksh # Korn shell - provides command-line interface and scripting -pidin # Process information display - shows running processes (like 'ps' on Linux) -[type=link] /bin/sh=/proc/boot/ksh # Create symbolic link: sh -> ksh (standard shell link) - -# File system utilities -mount # File system mount utility - mounts/unmounts file systems -getconf # System configuration query utility - retrieves system parameters -[type=link] setconf=getconf # Create symbolic link: setconf -> getconf (sets configuration parameters) - -# Device drivers for hardware access -devc-ser8250 # Serial port driver for 8250/16550 UART controllers (console access) - -# System logging utilities -slog2info # System log viewer - displays logged messages -slogger2 # System logging daemon - collects and manages log messages - -# Essential libraries - core runtime libraries required for system operation -# These libraries provide fundamental services like C runtime, networking, and logging - -# Standard C library - provides basic C runtime functions -libc.so.6 # Main C library (malloc, printf, file I/O, etc.) - -# Dynamic linker/loader - handles dynamic library loading at runtime -/usr/lib/ldqnx-64.so.2=ldqnx-64.so.2 # 64-bit QNX dynamic linker (loads shared libraries) - -# Networking library - provides socket and network communication functions -libsocket.so.4 # Socket library (TCP/IP, UDP, network I/O functions) -[type=link] libsocket.so=libsocket.so.4 # Create version-neutral symbolic link - -# System logging library - provides logging services for applications -libslog2.so.1 # System logging library (slog2_* functions) -[type=link] libslog2.so=libslog2.so.1 # Create version-neutral symbolic link - -# Storage driver - provides access to IDE/SATA block devices -devb-eide # Block device driver for IDE/SATA hard drives and SSDs - # Required for mounting QNX6 file systems from disk partitions - - -[+include] ${MAIN_BUILD_FILE_DIR}/system.build # Include additional system build configurations diff --git a/qnx_qemu/build/system.build b/qnx_qemu/build/system.build deleted file mode 100644 index d80c838afa..0000000000 --- a/qnx_qemu/build/system.build +++ /dev/null @@ -1,283 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - - -# ============================================================================ -# QNX System Build File - Defines system partition contents -# ============================================================================ -# This file defines the contents of the QNX system partition, including -# essential utilities, libraries, configuration files, and system services -# needed for a minimal QNX QEMU environment. - -############################################# -### SHARED LIBRARIES ### -############################################# -# Essential shared libraries for system operation - -libfsnotify.so.1 # File system notification library -cam-cdrom.so # CAM (Common Access Method) CD-ROM driver -cam-disk.so # CAM disk driver for storage devices -fs-dos.so # DOS file system support -fs-qnx6.so # QNX6 file system support -io-blk.so # Block I/O manager -libbz2.so.1 # BZip2 compression library -libc++.so.2 # C++ standard library -libc.so # C standard library (essential) -libcam.so.2 # CAM library for device access -libcatalog.so.1 # Message catalog support -libcrypto.so.3 # OpenSSL crypto library (disabled) -libfscrypto.so.1 # File system encryption support -libgcc_s.so.1 # GCC runtime support library -libiconv.so.1 # Character encoding conversion -liblzma.so.5 # LZMA compression library -libm.so # Math library -libpci.so.3.0 # PCI library v3.0 for hardware access -libqcrypto.so.1.0 # QNX cryptographic library -libqh.so # QNX helper library -libregex.so.1 # Regular expression library -libsecpol.so.1 # Security policy library -libslog2parse.so.1 # System log parsing library -libssl.so.3 # OpenSSL SSL/TLS library (disabled) -libtracelog.so.1 # Trace logging library -libxml2.so.2 # XML parsing library -libz.so # Zlib compression library -libexpat.so.2 # Expat XML parser library -libjail.so.1 # QNX jail library for process containment -qcrypto-openssl-3.so # QNX cryptographic library with OpenSSL 3 support -libpam.so.2 # Pluggable Authentication Modules library - - -############################################# -### FILE MANIPULATION UTILITIES ### -############################################# -# Core file system utilities - most are provided by toybox (minimal Unix utilities) - -[type=link] /bin/ls=/proc/boot/ls # Link ls to IFS version for compatibility -# Note: /bin/sh symlink already defined in init.build as /proc/boot/ksh -toybox # Minimal Unix utilities collection (replaces many GNU tools) -[type=link] cp=toybox # Copy files and directories -[type=link] ls=toybox # List directory contents -[type=link] cat=toybox # Display file contents -[type=link] chmod=toybox # Change file permissions -[type=link] rm=toybox # Remove files and directories -[type=link] dd=toybox # Convert and copy files with specified I/O block size -[type=link] echo=toybox # Display text -[type=link] grep=toybox # Search text patterns in files -[type=link] mkdir=toybox # Create directories -[type=link] ascii=toybox # Display ASCII character set -[type=link] base64=toybox # Base64 encoding/decoding utility -[type=link] basename=toybox # Extract filename from path -[type=link] bc=toybox # Basic calculator -[type=link] bunzip2=toybox # Decompress bzip2 files -[type=link] bzcat=toybox # Display contents of bzip2 files -[type=link] cal=toybox # Display calendar -[type=link] chgrp=toybox # Change group ownership -[type=link] chown=toybox # Change file ownership -[type=link] cksum=toybox # Calculate checksums -[type=link] clear=toybox # Clear terminal screen -[type=link] cmp=toybox # Compare files byte by byte -[type=link] comm=toybox # Compare sorted files line by line -[type=link] cpio=toybox # Copy files to/from archives -[type=link] crc32=toybox # Calculate CRC32 checksums -[type=link] cut=toybox # Extract columns from files -[type=link] date=toybox # Display or set system date -[type=link] diff=toybox # Compare files line by line -[type=link] dirname=toybox # Extract directory from path -[type=link] dos2unix=toybox # Convert DOS line endings to Unix -[type=link] du=toybox # Display disk usage -[type=link] egrep=toybox # Extended grep with regular expressions -[type=link] env=toybox # Display or set environment variables -[type=link] expand=toybox # Convert tabs to spaces -[type=link] expr=toybox # Evaluate expressions -[type=link] false=toybox # Return false status -[type=link] fgrep=toybox # Fast grep for fixed strings -[type=link] file=toybox # Determine file type -[type=link] find=toybox # Search for files and directories -[type=link] fmt=toybox # Format text paragraphs -[type=link] groups=toybox # Display user group membership -[type=link] gunzip=toybox # Decompress gzip files -[type=link] gzip=toybox # Compress files with gzip -[type=link] hd=toybox # Hexadecimal dump (alias for hexdump) -[type=link] head=toybox # Display first lines of files -[type=link] hexdump=toybox # Display files in hexadecimal format -[type=link] id=toybox # Display user and group IDs -[type=link] install=toybox # Copy files and set attributes -[type=link] link=toybox # Create hard links -[type=link] logname=toybox # Display login name -[type=link] md5sum=toybox # Calculate MD5 checksums -[type=link] mkfifo=toybox # Create named pipes (FIFOs) -[type=link] mktemp=toybox # Create temporary files/directories -[type=link] more=toybox # Display files page by page -[type=link] mv=toybox # Move/rename files and directories -[type=link] nl=toybox # Number lines in files -[type=link] nohup=toybox # Run commands immune to hangups -[type=link] od=toybox # Dump files in octal format -[type=link] paste=toybox # Merge lines from files -[type=link] patch=toybox # Apply patches to files -[type=link] printenv=toybox # Print environment variables -[type=link] printf=toybox # Format and print data -[type=link] pwd=toybox # Print working directory -[type=link] readlink=toybox # Display target of symbolic links -[type=link] realpath=toybox # Display absolute path -[type=link] rmdir=toybox # Remove empty directories -[type=link] sed=toybox # Stream editor for filtering/transforming text -[type=link] seq=toybox # Generate sequences of numbers -[type=link] sha1sum=toybox # Calculate SHA1 checksums -[type=link] sleep=toybox # Suspend execution for specified time -[type=link] sort=toybox # Sort lines in text files -[type=link] split=toybox # Split files into pieces -[type=link] stat=toybox # Display file/filesystem status -[type=link] strings=toybox # Extract printable strings from files -[type=link] tail=toybox # Display last lines of files -[type=link] tee=toybox # Copy input to files and stdout -[type=link] test=toybox # Evaluate conditional expressions -[type=link] time=toybox # Time command execution -[type=link] timeout=toybox # Run command with time limit -[type=link] touch=toybox # Update file timestamps -[type=link] tr=toybox # Translate or delete characters -[type=link] true=toybox # Return true status -[type=link] truncate=toybox # Truncate files to specified size -[type=link] tty=toybox # Display terminal name -[type=link] uname=toybox # Display system information -[type=link] uniq=toybox # Remove duplicate lines -[type=link] unix2dos=toybox # Convert Unix line endings to DOS -[type=link] unlink=toybox # Remove files (system call interface) -[type=link] uudecode=toybox # Decode uuencoded files -[type=link] uuencode=toybox # Encode files using uuencoding -[type=link] uuidgen=toybox # Generate UUIDs -[type=link] wc=toybox # Count lines, words, and characters -[type=link] which=toybox # Locate commands in PATH -[type=link] whoami=toybox # Display current username -[type=link] xargs=toybox # Execute commands from standard input -[type=link] xxd=toybox # Make hexdump or reverse -[type=link] yes=toybox # Output string repeatedly -[type=link] zcat=toybox # Display contents of compressed files -[type=link] nc=toybox # Netcat for network connections and packet streaming -[type=link] netcat=toybox # Netcat alias for network connections - - -############################################# -### Tools ### -############################################# -awk # Text processing and pattern scanning -devb-ram # RAM disk block device manager -devc-pty # Pseudo-terminal device manager -fsencrypt # File system encryption utility -fsevmgr # File system event manager -if_up # Network interface configuration -ifconfig # Network interface configuration tool -ln # Create file links -mkqnx6fs # Create QNX6 file systems -mount_ifs # Mount Image File System (IFS) -mqueue # POSIX message queue manager -openssl # SSL/TLS cryptographic toolkit -pci-server # PCI bus server -pdebug # Process debugger -pfctl # Packet filter control utility -pipe # Named pipe manager -random # Random number generator service -shutdown # System shutdown utility -sync # Synchronize file system buffers to disk -tar # Archive utility for creating/extracting tar files -umount # Unmount file systems -sysctl # Configure kernel parameters at runtime -sshd # SSH daemon for remote access -ssh # SSH client for remote connections -ssh-keygen # SSH key generation utility -hostname # Set or display system hostname -route -dhcpcd # DHCP client daemon for automatic network configuration -tcpdump # Network packet capture tool for Wireshark analysis -/usr/lib/ssh/sftp-server=${QNX_TARGET}/${PROCESSOR}/usr/libexec/sftp-server # File transfer server to enable scp - -############################################# -### NETWORKING COMPONENTS ### -############################################# -io-sock # Network socket manager -mods-pci.so # PCI module support for network hardware -mods-phy.so # Physical layer module for network interfaces -mods-usb.so # USB module support -libfdt.so.1 # Flattened Device Tree library -libusbdci.so.2 # USB device controller interface library -devs-vtnet_pci.so # VirtIO network device driver for QEMU/KVM -librpc.so.2 # For TCP dump - - -############################################# -### PCI COMPONENTS ### -############################################# -# PCI-related shared libraries and modules -pci/pci_hw-Intel_x86.so # Intel x86 PCI hardware support -pci/pci_slog2.so # PCI system logging support -pci/pci_cap-0x05.so # PCI capability handler for MSI -pci/pci_cap-0x10.so # PCI Express capability handler -pci/pci_cap-0x11.so # MSI-X capability handler -pci/pci_strings.so # PCI device string database -pci/pci_bkwd_compat.so # Backward compatibility support -pci/pci_debug2.so # Enhanced PCI debugging support - - -############################################# -### SYSTEM DIRECTORIES ### -############################################# -# Create SSH and system directories with appropriate permissions -[gid=0 uid=0 dperms=755 type=dir] /var/chroot/sshd # SSH chroot directory for privilege separation -[gid=0 uid=0 dperms=700 type=dir] /var/ssh # SSH configuration and key storage directory - - -############################################# -### SCRIPTS ### -############################################# -# System startup and initialization scripts -[perms=700] /etc/startup.sh = ${MAIN_BUILD_FILE_DIR}/../configs/startup.sh # Main system startup script -[perms=700] /etc/network_setup.sh = ${MAIN_BUILD_FILE_DIR}/../configs/network_setup.sh # Network configuration script -[perms=700] /etc/network_setup_dhcp.sh = ${MAIN_BUILD_FILE_DIR}/../configs/network_setup_dhcp.sh # Network configuration script -[perms=755] /etc/network_capture = ${MAIN_BUILD_FILE_DIR}/../configs/network_capture.sh # Network packet capture utility - - -############################################# -### CONFIGURATION FILES ### -############################################# -# This section defines critical configuration files that control system -# behavior, hardware access, security policies, and user environment setup. - -[perms=0444] pci_server.cfg = ${MAIN_BUILD_FILE_DIR}/../configs/pci_server.cfg # PCI server configuration -[perms=0444] pci_hw.cfg = ${MAIN_BUILD_FILE_DIR}/../configs/pci_hw.cfg # PCI hardware configuration -[perms=0444] qcrypto.conf = ${MAIN_BUILD_FILE_DIR}/../configs/qcrypto.conf # QNX cryptographic library configuration - -# System hostname configuration -/etc/hostname = ${MAIN_BUILD_FILE_DIR}/../configs/hostname # System hostname definition file -/etc/profile = ${MAIN_BUILD_FILE_DIR}/../configs/profile - -# System user and group databases -/etc/passwd = ${MAIN_BUILD_FILE_DIR}/../configs/passwd # User account database with login information -/etc/group = ${MAIN_BUILD_FILE_DIR}/../configs/group # Group membership database - - -############################################# -### SSH CONFIGURATION ### -############################################# -# SSH server configuration (no static host keys - generated at runtime) -[perms=444] /var/ssh/sshd_config = ${MAIN_BUILD_FILE_DIR}/../configs/sshd_config # SSH daemon configuration file - -[uid=0 gid=0 perms=400] /var/ssh/ssh_host_rsa_key = ${MAIN_BUILD_FILE_DIR}/../configs/ssh_host_rsa_key # SSH server private key -[uid=0 gid=0 perms=400] /var/ssh/ssh_host_rsa_key.pub = ${MAIN_BUILD_FILE_DIR}/../configs/ssh_host_rsa_key.pub # SSH server public key - -# DHCP client configuration -[perms=644] /etc/dhcpcd.conf = ${MAIN_BUILD_FILE_DIR}/../configs/dhcpcd.conf # DHCP client configuration file - -[perms=777] /etc/logging.json = ${MAIN_BUILD_FILE_DIR}/../scrample_integration/etc/logging.json # DHCP client configuration file -[perms=777] /etc/mw_com_config.json = ${MAIN_BUILD_FILE_DIR}/../scrample_integration/etc/mw_com_config.json # DHCP client configuration file - -[perms=777] /scrample = ${SCRAMPLE_PATH} -[perms=777] /cpp_tests_persistency = ${CPP_TEST_SCENARIOS_PATH} diff --git a/qnx_qemu/configs/BUILD b/qnx_qemu/configs/BUILD deleted file mode 100644 index 40d52d113d..0000000000 --- a/qnx_qemu/configs/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - - -exports_files([ - "startup.sh", - "network_setup.sh", - "network_setup_dhcp.sh", - "dhcpcd.conf", - "pci_server.cfg", - "pci_hw.cfg", - "qcrypto.conf", - "passwd", - "group", - "sshd_config", - "ssh_host_rsa_key", - "ssh_host_rsa_key.pub", - "hostname", - "profile", - "network_capture.sh" -]) diff --git a/qnx_qemu/configs/dhcpcd.conf b/qnx_qemu/configs/dhcpcd.conf deleted file mode 100755 index 8a2ce0b86a..0000000000 --- a/qnx_qemu/configs/dhcpcd.conf +++ /dev/null @@ -1,42 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - - -# ******************************************************************************* -# Minimal DHCP Client Configuration for QNX QEMU System -# ******************************************************************************* -# This is a minimal dhcpcd.conf file for basic DHCP functionality - -# Allow all interfaces starting with vtnet -allowinterfaces vtnet0 - -# Use the hardware address of the interface for the Client ID -duid - -# Request essential network configuration -option routers -option domain_name_servers -option subnet_mask -option broadcast_address - -# Set timeout for DHCP requests (30 seconds) -timeout 30 - -# Disable IPv6 to simplify configuration -noipv6 - -# Don't send hostname for privacy -nohook hostname - -# Background after getting lease -background diff --git a/qnx_qemu/configs/group b/qnx_qemu/configs/group deleted file mode 100644 index 925ba062f3..0000000000 --- a/qnx_qemu/configs/group +++ /dev/null @@ -1,16 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -root::0:root -qnxuser::1000:qnxuser -sshd::6:sshd diff --git a/qnx_qemu/configs/hostname b/qnx_qemu/configs/hostname deleted file mode 100644 index c98f8c67fd..0000000000 --- a/qnx_qemu/configs/hostname +++ /dev/null @@ -1 +0,0 @@ -Qnx_S-core diff --git a/qnx_qemu/configs/network_capture.sh b/qnx_qemu/configs/network_capture.sh deleted file mode 100644 index b0d187cbd4..0000000000 --- a/qnx_qemu/configs/network_capture.sh +++ /dev/null @@ -1,225 +0,0 @@ -#!/bin/sh - -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - - -# Network Packet Capture Script for QNX -# Provides tcpdump-based packet capture with remote access via netcat - -# Configuration -CAPTURE_INTERFACE="vtnet0" -CAPTURE_PORT="9999" -LOG_DIR="/tmp_ram/capture" -MAX_PACKETS="10000" -CAPTURE_FILTER="" - -usage() { - echo "Network Packet Capture for QNX" - echo "Usage: $0 [command] [options]" - echo "" - echo "Commands:" - echo " start [filter] - Start packet capture (optionally with filter)" - echo " stop - Stop all running captures" - echo " status - Show capture status" - echo " stream [filter] - Start real-time streaming to port $CAPTURE_PORT" - echo " list - List saved capture files" - echo " help - Show this help" - echo "" - echo "Examples:" - echo " $0 start # Capture all packets" - echo " $0 start \"tcp port 22\" # Capture SSH traffic only" - echo " $0 start \"icmp\" # Capture ping traffic only" - echo " $0 stream \"tcp\" # Stream TCP traffic to port $CAPTURE_PORT" - echo "" - echo "For Wireshark analysis:" - echo " 1. Run: $0 stream [filter]" - echo " 2. In Wireshark: Capture -> Options -> Manage Interfaces" - echo " 3. Add remote interface: TCP@:$CAPTURE_PORT" - echo " 4. Or with port forwarding: TCP@localhost:" - echo "" - echo "Saved captures: $LOG_DIR" - echo "Network interface: $CAPTURE_INTERFACE" -} - -# Ensure capture directory exists -mkdir -p "$LOG_DIR" - -case "${1:-help}" in - start) - CAPTURE_FILTER="${2:-}" - TIMESTAMP=$(date +%Y%m%d_%H%M%S) - CAPTURE_FILE="$LOG_DIR/capture_${TIMESTAMP}.pcap" - - echo "Starting packet capture..." - echo "Interface: $CAPTURE_INTERFACE" - echo "File: $CAPTURE_FILE" - echo "Max packets: $MAX_PACKETS" - if [ -n "$CAPTURE_FILTER" ]; then - echo "Filter: $CAPTURE_FILTER" - else - echo "Filter: none (capturing all traffic)" - fi - echo "" - - # Start tcpdump in background - if [ -n "$CAPTURE_FILTER" ]; then - tcpdump -i "$CAPTURE_INTERFACE" -w "$CAPTURE_FILE" -c "$MAX_PACKETS" "$CAPTURE_FILTER" & - else - tcpdump -i "$CAPTURE_INTERFACE" -w "$CAPTURE_FILE" -c "$MAX_PACKETS" & - fi - - TCPDUMP_PID=$! - echo "Capture started with PID: $TCPDUMP_PID" - echo "Capture file: $CAPTURE_FILE" - echo "" - echo "To stop: $0 stop" - echo "To check status: $0 status" - ;; - - stream) - CAPTURE_FILTER="${2:-}" - - echo "Starting real-time packet streaming..." - echo "Interface: $CAPTURE_INTERFACE" - echo "Streaming port: $CAPTURE_PORT" - if [ -n "$CAPTURE_FILTER" ]; then - echo "Filter: $CAPTURE_FILTER" - else - echo "Filter: none (streaming all traffic)" - fi - echo "" - echo "Connect Wireshark to: TCP@:$CAPTURE_PORT" - echo "With port forwarding: TCP@localhost:" - echo "" - echo "Press Ctrl+C to stop streaming" - echo "" - - # Create named pipe for tcpdump output - PIPE_FILE="/tmp_ram/tcpdump_pipe" - mkfifo "$PIPE_FILE" 2>/dev/null || true - - # Start tcpdump writing to pipe in background - if [ -n "$CAPTURE_FILTER" ]; then - tcpdump -i "$CAPTURE_INTERFACE" -w "$PIPE_FILE" -U "$CAPTURE_FILTER" & - else - tcpdump -i "$CAPTURE_INTERFACE" -w "$PIPE_FILE" -U & - fi - TCPDUMP_PID=$! - - # Stream pipe content via netcat - # Note: This requires netcat to be available - if command -v nc >/dev/null 2>&1; then - nc -l -p "$CAPTURE_PORT" < "$PIPE_FILE" & - NC_PID=$! - echo "Streaming via netcat (PID: $NC_PID)" - else - echo "Warning: netcat not available - streaming not possible" - echo "Install netcat or use file-based capture instead" - kill $TCPDUMP_PID 2>/dev/null - rm -f "$PIPE_FILE" - exit 1 - fi - - # Wait for user interruption - trap 'echo ""; echo "Stopping streaming..."; kill $TCPDUMP_PID $NC_PID 2>/dev/null; rm -f "$PIPE_FILE"; exit 0' INT TERM - - echo "Streaming active - tcpdump PID: $TCPDUMP_PID, netcat PID: $NC_PID" - wait - ;; - - stop) - echo "Stopping all packet captures..." - - # Find and kill tcpdump processes - TCPDUMP_PIDS=$(pidin arg | grep tcpdump | awk '{print $1}') - if [ -n "$TCPDUMP_PIDS" ]; then - for pid in $TCPDUMP_PIDS; do - echo "Killing tcpdump process: $pid" - kill "$pid" 2>/dev/null || true - done - else - echo "No tcpdump processes found" - fi - - # Find and kill netcat processes on capture port - NC_PIDS=$(pidin arg | grep nc | awk '{print $1}') - if [ -n "$NC_PIDS" ]; then - for pid in $NC_PIDS; do - echo "Killing netcat process: $pid" - kill "$pid" 2>/dev/null || true - done - fi - - # Clean up pipes - rm -f /tmp_ram/tcpdump_pipe - - echo "All captures stopped" - ;; - - status) - echo "Packet Capture Status" - echo "====================" - echo "" - - # Check for running tcpdump processes - TCPDUMP_PIDS=$(pidin arg | grep tcpdump | awk '{print $1}') - if [ -n "$TCPDUMP_PIDS" ]; then - echo "Active tcpdump processes:" - for pid in $TCPDUMP_PIDS; do - echo " PID: $pid" - done - else - echo "No tcpdump processes running" - fi - - # Check for netcat processes - NC_PIDS=$(pidin arg | grep nc | awk '{print $1}') - if [ -n "$NC_PIDS" ]; then - echo "Active netcat processes:" - for pid in $NC_PIDS; do - echo " PID: $pid" - done - fi - - echo "" - echo "Network interface status:" - ifconfig "$CAPTURE_INTERFACE" 2>/dev/null || echo "Interface $CAPTURE_INTERFACE not found" - - echo "" - echo "Capture files:" - if [ -d "$LOG_DIR" ] && [ "$(ls -A $LOG_DIR 2>/dev/null)" ]; then - ls -la "$LOG_DIR" - else - echo "No capture files found" - fi - ;; - - list) - echo "Saved capture files in $LOG_DIR:" - echo "" - if [ -d "$LOG_DIR" ] && [ "$(ls -A $LOG_DIR 2>/dev/null)" ]; then - ls -la "$LOG_DIR" - echo "" - echo "To analyze with Wireshark:" - echo "1. Copy files from QNX: scp -P 2222 root@localhost:$LOG_DIR/*.pcap ." - echo "2. Open in Wireshark: wireshark .pcap" - else - echo "No capture files found" - fi - ;; - - help|*) - usage - ;; -esac diff --git a/qnx_qemu/configs/network_setup.sh b/qnx_qemu/configs/network_setup.sh deleted file mode 100644 index b40af8b3e7..0000000000 --- a/qnx_qemu/configs/network_setup.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - - -# ******************************************************************************* -# Network Configuration Script -# Configures networking interfaces and settings for QNX system -# ******************************************************************************* - -echo "---> Starting Networking" -io-sock -m phy -m pci -d vtnet_pci # Start network stack with PHY and PCI modules, load VirtIO network driver -waitfor /dev/socket # Wait for socket device to become available before proceeding - -echo "---> Configuring network interface" -# Bring up the interface and configure with bridge-accessible IP for direct ping -if_up -p vtnet0 # Bring up the vtnet0 network interface in promiscuous mode -ifconfig vtnet0 10.0.2.15 netmask 255.255.255.0 # Configure IP address and subnet mask for vtnet0 - -# Configure system network settings -sysctl -w net.inet.icmp.bmcastecho=1 > /dev/null # Enable ICMP broadcast echo (responds to broadcast pings) -sysctl -w qnx.sec.droproot=33:33 > /dev/null # Set user/group ID (33:33) for dropping root privileges diff --git a/qnx_qemu/configs/network_setup_dhcp.sh b/qnx_qemu/configs/network_setup_dhcp.sh deleted file mode 100644 index 1b88acf568..0000000000 --- a/qnx_qemu/configs/network_setup_dhcp.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/sh - -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - - -# ******************************************************************************* -# Simple DHCP Network Configuration Script -# Configures networking using DHCP with minimal configuration -# ******************************************************************************* - -echo "---> Starting Networking with simple DHCP" -io-sock -m phy -m pci -d vtnet_pci # Start network stack with PHY and PCI modules, load VirtIO network driver -waitfor /dev/socket # Wait for socket device to become available before proceeding - -echo "---> Bringing up network interface" -if_up -p vtnet0 # Bring up the vtnet0 network interface in promiscuous mode - -echo "---> Starting DHCP client with minimal config" -# Start DHCP client with minimal configuration -dhcpcd -b -f /etc/dhcpcd.conf vtnet0 & -DHCP_PID=$! # Store DHCP process ID - -# Wait for DHCP to complete (up to 30 seconds) -echo "---> Waiting for DHCP lease acquisition..." -sleep 3 # Initial wait for DHCP negotiation - -# Check if we got an IP address -RETRY_COUNT=0 -MAX_RETRIES=10 # 10 retries * 3 seconds = 30 seconds total - -while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do - # Get current IP address for vtnet0 - IP_ADDR=$(ifconfig vtnet0 | grep 'inet ' | awk '{print $2}') - - if [ -n "$IP_ADDR" ] && [ "$IP_ADDR" != "0.0.0.0" ]; then - echo "---> DHCP successful! Acquired IP" - # Get additional network info - NETMASK=$(ifconfig vtnet0 | grep 'inet ' | awk '{print $4}') - echo "---> Network configuration:" - - # Save basic DHCP status - echo "DHCP_SUCCESS" > /tmp_ram/dhcp_status - IP_ADDR=$(ifconfig vtnet0 | grep 'inet ' | awk '{print $2}') - echo "IP address set to: $IP_ADDR" - echo "IP: $IP_ADDR" >> /tmp_ram/dhcp_status - echo "Date: $(date)" >> /tmp_ram/dhcp_status - break - fi - - echo "---> Still waiting for DHCP lease... (attempt $((RETRY_COUNT + 1))/$MAX_RETRIES)" - sleep 3 - RETRY_COUNT=$((RETRY_COUNT + 1)) -done - -# Check final status -IP_ADDR=$(ifconfig vtnet0 | grep 'inet ' | awk '{print $2}') -if [ -z "$IP_ADDR" ] || [ "$IP_ADDR" = "0.0.0.0" ]; then - echo "---> DHCP failed! Falling back to static IP configuration..." - # Kill DHCP client if still running - if kill -0 $DHCP_PID 2>/dev/null; then - kill $DHCP_PID 2>/dev/null - fi - - # Configure static IP as fallback - echo "---> Configuring static IP fallback: 192.168.122.100" - ifconfig vtnet0 192.168.122.100 netmask 255.255.255.0 - route add default 192.168.122.1 # Add default gateway - - # Save fallback status - echo "DHCP_FAILED_STATIC_FALLBACK" > /tmp_ram/dhcp_status - echo "IP address set to: 192.168.122.100" - echo "IP: 192.168.122.100" >> /tmp_ram/dhcp_status - echo "Date: $(date)" >> /tmp_ram/dhcp_status -else - echo "---> DHCP configuration completed successfully" -fi - -# Configure system network settings -sysctl -w net.inet.icmp.bmcastecho=1 > /dev/null # Enable ICMP broadcast echo (responds to broadcast pings) - -echo "---> Network configuration completed" \ No newline at end of file diff --git a/qnx_qemu/configs/passwd b/qnx_qemu/configs/passwd deleted file mode 100644 index bcd2c60854..0000000000 --- a/qnx_qemu/configs/passwd +++ /dev/null @@ -1,17 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - - -root::0:0:Superuser:/:/bin/sh -qnxuser::1000:1000:QNX User:/:/bin/sh -sshd::15:6:sshd:/:/bin/false diff --git a/qnx_qemu/configs/pci_hw.cfg b/qnx_qemu/configs/pci_hw.cfg deleted file mode 100644 index 4a619d5ee2..0000000000 --- a/qnx_qemu/configs/pci_hw.cfg +++ /dev/null @@ -1,9 +0,0 @@ -[interrupts] -B0:D17:F0 A 18 -B0:D17:F0 B 19 -B0:D17:F0 C 16 -B0:D17:F0 D 17 -B3:D0:F0 A 18 -B3:D0:F0 B 19 -B3:D0:F0 C 16 -B3:D0:F0 D 17 diff --git a/qnx_qemu/configs/pci_server.cfg b/qnx_qemu/configs/pci_server.cfg deleted file mode 100644 index 899a56ba9f..0000000000 --- a/qnx_qemu/configs/pci_server.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[buscfg] -DO_BUS_CONFIG=no - -[envars] -PCI_DEBUG_MODULE=pci_debug2.so -PCI_HW_MODULE=pci_hw-Intel_x86.so -PCI_HW_CONFIG_FILE=/proc/boot/pci_hw.cfg diff --git a/qnx_qemu/configs/profile b/qnx_qemu/configs/profile deleted file mode 100644 index 97e7e7ef30..0000000000 --- a/qnx_qemu/configs/profile +++ /dev/null @@ -1,18 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - - -export TERM=qansi -export PATH=/proc/boot -export LD_LIBRARY_PATH=/proc/boot -export MAGIC=/system/etc/magic diff --git a/qnx_qemu/configs/qcrypto.conf b/qnx_qemu/configs/qcrypto.conf deleted file mode 100644 index b65b4c4a0e..0000000000 --- a/qnx_qemu/configs/qcrypto.conf +++ /dev/null @@ -1 +0,0 @@ -openssl-3 tags=* diff --git a/qnx_qemu/configs/ssh_host_rsa_key b/qnx_qemu/configs/ssh_host_rsa_key deleted file mode 100644 index aff51a2418..0000000000 --- a/qnx_qemu/configs/ssh_host_rsa_key +++ /dev/null @@ -1,38 +0,0 @@ ------BEGIN OPENSSH PRIVATE KEY----- -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 -Fu+/MLbJQuA1zpAAAAAAEC ------END OPENSSH PRIVATE KEY----- diff --git a/qnx_qemu/configs/ssh_host_rsa_key.pub b/qnx_qemu/configs/ssh_host_rsa_key.pub deleted file mode 100644 index eee47d4f30..0000000000 --- a/qnx_qemu/configs/ssh_host_rsa_key.pub +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCtHgsqk8ZLaaqaeP53hj/QMt1hRVDuEFpH9pic1tkVS87ec4WLFri7ymNFBs0WwRG9jyjdDX5ISD/Gr5YLi/GFL1uN8w7E7b2dyJy9wNlH2RU5z900Iu/pqZ07L1X/A3ytvu/LkqE8oX+65uP8eZzBFhkBhXeylHsLg6k3W1JkUG7+tw5hhgLtXEpyyESPxi3xBfsGKX4wgkc8u7sdOS2DENKnhjc1Q5GhX0ifWoz6tMmzEMeveB8I5o3g6dASXBLtF9fHYEVy8Dd3gmt7KcehyktZQ7quuzWqMKxBkU+pDAELtIOfx6IrLRcf7I+mKhRonov5gWquTdwrGKNYo/n9oO4JCvDbfSYu1Zq2ykek1RdBI3UVBvLqSotRJXyBdfuVL3UAyN1veyon15vEnEYBFunyjDXJG1N+qTofTirZCBVBn8h2yjdPNCiS3Qr994R2PtLAfcuxoB4xY/KjRYtQ6TXyPjotQRrKW4XhRwibx2eOhPLBb0D8xLUL7anh5Ns= diff --git a/qnx_qemu/configs/sshd_config b/qnx_qemu/configs/sshd_config deleted file mode 100644 index 4be18c46ba..0000000000 --- a/qnx_qemu/configs/sshd_config +++ /dev/null @@ -1,64 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - - -# Port number for SSH -Port 22 - -# Protocol version -Protocol 2 - -# Host key location -HostKey /var/ssh/ssh_host_rsa_key - -# Enable port forwarding -AllowTcpForwarding yes - -# Enable SCP/SFTP -Subsystem sftp /usr/lib/ssh/sftp-server - -# AUTHENTICATION SETTINGS - Simple passwordless authentication -# Enable password authentication to check for empty passwords -PasswordAuthentication yes - -# Allow empty passwords (no password required) -PermitEmptyPasswords yes - -# Disable all other authentication methods completely -PubkeyAuthentication no -ChallengeResponseAuthentication no -HostbasedAuthentication no - -# Allow root login without authentication -PermitRootLogin yes - -# Allow user environment variables -PermitUserEnvironment yes - -# Don't create PID file -PidFile none - -# Log level for debugging -LogLevel DEBUG - -# Disable strict modes for easier setup -StrictModes no - -# Disable DNS lookups for faster connection -UseDNS no - -# Maximum authentication attempts -MaxAuthTries 3 - -# Disable login grace time -LoginGraceTime 30 diff --git a/qnx_qemu/configs/startup.sh b/qnx_qemu/configs/startup.sh deleted file mode 100644 index ce9a5c1b5e..0000000000 --- a/qnx_qemu/configs/startup.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/sh - -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - - -# ******************************************************************************* -# System Startup Script -# Executed during system initialization to start essential services -# ******************************************************************************* -echo "---> Starting slogger2" -slogger2 -s 4096 # Start system logger with 4KB buffer size for log messages -waitfor /dev/slog # Wait for system log device to become available - -echo "---> Starting PCI Services" -pci-server --config=/proc/boot/pci_server.cfg # Start PCI server with configuration file -waitfor /dev/pci # Wait for PCI device manager to initialize - -echo "---> Starting Pipe" -pipe # Start named pipe resource manager for IPC -waitfor /dev/pipe # Wait for pipe device to become available - -echo "---> Starting Random" -random # Start random number generator device -waitfor /dev/random # Wait for random device to become available - -echo "---> Starting fsevmgr" -fsevmgr # Start file system event manager for file notifications -waitfor /dev/fsnotify # Wait for filesystem notification device - -echo "---> Starting devb-ram" -devb-ram ram capacity=1 blk ramdisk=10m,cache=512k,vnode=256 2>/dev/null # Create 10MB RAM disk with 512KB cache -waitfor /dev/ram0 # Wait for RAM disk device to be ready - -echo "---> mounting ram disk" -mkqnx6fs -q /dev/ram0 # Create QNX6 filesystem on RAM disk (quiet mode) -waitfor /dev/ram0 # Wait for filesystem creation to complete -mount -t qnx6 /dev/ram0 /tmp_ram # Mount RAM disk as QNX6 filesystem at /tmp_ram - -echo "---> Starting mqueue" -mqueue # Start POSIX message queue resource manager -waitfor /dev/mqueue # Wait for message queue device to be available - -echo "---> Starting devc-pty" -devc-pty -n 32 # Start pseudo-terminal driver with 32 PTY pairs - -echo "---> Starting devb-eide" -devb-eide cam user=20:20 blk cache=64M,auto=partition,vnode=2000,ncache=2000,commit=low # Start IDE/SATA block driver -waitfor /dev/hd0 # Wait for first hard disk to be detected - -echo "---> Configuring network" -# /etc/network_setup.sh # fixed IP setup --> commented out as dhcp is now in use -mkdir -p /tmp_ram/var/run/dhcpcd -mkdir -p /tmp_ram/var/db -ln -sP /tmp_ram/var/db /var/db -ln -sP /tmp_ram/var/run/dhcpcd /var/run/dhcpcd -/etc/network_setup_dhcp.sh # Execute network configuration script - -echo "---> Setting hostname" -if [ -f /etc/hostname ]; then # Check if hostname file exists - HOSTNAME=$(cat /etc/hostname) # Read hostname from file - hostname "$HOSTNAME" # Set system hostname - echo "Hostname set to: $HOSTNAME" -else - hostname qnx-score # Set default hostname if no file exists - echo "Qnx_S-core" > /tmp/hostname # Create temporary hostname file - echo "Default hostname set to: Qnx_S-core" -fi - -echo "---> adding /tmp_discovery folder" -mkdir -p /tmp_ram/tmp_discovery -ln -sP /tmp_ram/tmp_discovery /tmp_discovery - -/proc/boot/sshd -f /var/ssh/sshd_config # Start SSH daemon with specified configuration file diff --git a/qnx_qemu/scrample_integration/BUILD b/qnx_qemu/scrample_integration/BUILD deleted file mode 100644 index 765f9898c5..0000000000 --- a/qnx_qemu/scrample_integration/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - - -exports_files([ - "etc/logging.json", - "etc/mw_com_config.json", -]) - -filegroup( - name = "etc_configs", - srcs = [ - "etc/logging.json", - "etc/mw_com_config.json", - ], - visibility = ["//visibility:public"], -) \ No newline at end of file diff --git a/qnx_qemu/scrample_integration/etc/logging.json b/qnx_qemu/scrample_integration/etc/logging.json deleted file mode 100644 index 8b3d1eacc8..0000000000 --- a/qnx_qemu/scrample_integration/etc/logging.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "appId": "IPBR", - "appDesc": "ipc_bridge", - "logLevel": "kDebug", - "logLevelThresholdConsole": "kInfo", - "logMode": "kConsole", - "dynamicDatarouterIdentifiers" : true -} diff --git a/qnx_qemu/scrample_integration/etc/mw_com_config.json b/qnx_qemu/scrample_integration/etc/mw_com_config.json deleted file mode 100644 index 1e104bd484..0000000000 --- a/qnx_qemu/scrample_integration/etc/mw_com_config.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "serviceTypes": [ - { - "serviceTypeName": "/score/MapApiLanesStamped", - "version": { - "major": 1, - "minor": 0 - }, - "bindings": [ - { - "binding": "SHM", - "serviceId": 6432, - "events": [ - { - "eventName": "map_api_lanes_stamped", - "eventId": 1 - }, - { - "eventName": "dummy_data_stamped", - "eventId": 2 - } - ] - } - ] - } - ], - "serviceInstances": [ - { - "instanceSpecifier": "score/MapApiLanesStamped", - "serviceTypeName": "/score/MapApiLanesStamped", - "version": { - "major": 1, - "minor": 0 - }, - "instances": [ - { - "instanceId": 1, - "allowedConsumer": { - "QM": [ - 4002, - 0 - ] - }, - "allowedProvider": { - "QM": [ - 4001, - 0 - ] - }, - "asil-level": "QM", - "binding": "SHM", - "events": [ - { - "eventName": "map_api_lanes_stamped", - "numberOfSampleSlots": 10, - "maxSubscribers": 3 - } - ] - } - ] - } - ] -} diff --git a/qnx_qemu/scripts/qnx_wireshark.sh b/qnx_qemu/scripts/qnx_wireshark.sh deleted file mode 100755 index 2b6f3822f8..0000000000 --- a/qnx_qemu/scripts/qnx_wireshark.sh +++ /dev/null @@ -1,276 +0,0 @@ -#!/bin/bash - -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -# QNX Network Trace Collection Script -# Provides easy integration between QNX tcpdump and Wireshark - -set -euo pipefail - -# Configuration -QNX_HOST=${QNX_HOST:-localhost} -SSH_PORT=${SSH_PORT:-2222} -CAPTURE_PORT=${CAPTURE_PORT:-9999} -SSH_USER=${SSH_USER:-root} -SSH_OPTIONS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=10" - -usage() { - echo "QNX Network Trace Collection for Wireshark" - echo "===========================================" - echo "" - echo "Usage: $0 [command] [options]" - echo "" - echo "Commands:" - echo " capture [filter] - Start local packet capture and save to file" - echo " stream [filter] - Start real-time streaming to Wireshark" - echo " wireshark [filter] - Launch Wireshark with live capture" - echo " list - List captured files on QNX system" - echo " download [file] - Download capture file from QNX" - echo " status - Show capture status on QNX" - echo " stop - Stop all captures on QNX" - echo " help - Show this help" - echo "" - echo "Filter examples:" - echo " \"tcp port 22\" - SSH traffic only" - echo " \"icmp\" - Ping traffic only" - echo " \"tcp\" - All TCP traffic" - echo " \"host 10.0.2.2\" - Traffic to/from host gateway" - echo "" - echo "Environment variables:" - echo " QNX_HOST=$QNX_HOST # QNX system IP/hostname" - echo " SSH_PORT=$SSH_PORT # SSH port (forwarded)" - echo " CAPTURE_PORT=$CAPTURE_PORT # Packet streaming port (forwarded)" - echo " SSH_USER=$SSH_USER # SSH username" - echo "" - echo "Prerequisites:" - echo " - QNX system running with SSH access" - echo " - Port forwarding configured: localhost:$SSH_PORT -> guest:22" - echo " - Port forwarding configured: localhost:$CAPTURE_PORT -> guest:9999" - echo " - Wireshark installed on host system" -} - -check_qnx_connection() { - echo "Checking QNX connection..." - if ! ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "echo 'QNX connection successful'" >/dev/null 2>&1; then - echo "Error: Cannot connect to QNX system at $SSH_USER@$QNX_HOST:$SSH_PORT" - echo "Please ensure:" - echo " 1. QNX system is running" - echo " 2. SSH is working: ssh -p $SSH_PORT $SSH_USER@$QNX_HOST" - echo " 3. Port forwarding is configured correctly" - return 1 - fi - echo "✓ QNX connection verified" -} - -check_network_capture_tool() { - echo "Checking network capture tool on QNX..." - if ! ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "test -x /etc/network_capture" 2>/dev/null; then - echo "Error: network_capture tool not found on QNX system" - echo "Please ensure the QNX image includes the network capture script" - return 1 - fi - echo "✓ Network capture tool available" -} - -check_wireshark() { - if ! command -v wireshark >/dev/null 2>&1; then - echo "Warning: Wireshark not found on host system" - echo "To install Wireshark:" - echo " Ubuntu/Debian: sudo apt install wireshark" - echo " RHEL/CentOS: sudo yum install wireshark" - echo " macOS: brew install wireshark" - return 1 - fi - echo "✓ Wireshark available" - return 0 -} - -case "${1:-help}" in - capture) - FILTER="${2:-}" - - check_qnx_connection - check_network_capture_tool - - echo "" - echo "Starting packet capture on QNX system..." - if [ -n "$FILTER" ]; then - echo "Filter: $FILTER" - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture start '$FILTER'" - else - echo "Filter: none (all packets)" - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture start" - fi - - echo "" - echo "Capture started on QNX system" - echo "To stop: $0 stop" - echo "To check status: $0 status" - echo "To list files: $0 list" - ;; - - stream) - FILTER="${2:-}" - - check_qnx_connection - check_network_capture_tool - - echo "" - echo "Starting real-time packet streaming from QNX..." - if [ -n "$FILTER" ]; then - echo "Filter: $FILTER" - else - echo "Filter: none (all packets)" - fi - echo "Stream endpoint: localhost:$CAPTURE_PORT" - echo "" - echo "Starting stream on QNX system..." - - # Start streaming on QNX in background - if [ -n "$FILTER" ]; then - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream '$FILTER'" & - else - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream" & - fi - - QNX_STREAM_PID=$! - - echo "QNX streaming started (PID: $QNX_STREAM_PID)" - echo "" - echo "To capture in Wireshark:" - echo " 1. Open Wireshark" - echo " 2. Go to Capture -> Options" - echo " 3. Click 'Manage Interfaces'" - echo " 4. Go to 'Remote Interfaces' tab" - echo " 5. Add interface: TCP@localhost:$CAPTURE_PORT" - echo " 6. Start capture" - echo "" - echo "Or use: $0 wireshark" - echo "" - echo "Press Ctrl+C to stop streaming" - - # Wait for stream process - trap 'echo ""; echo "Stopping stream..."; kill $QNX_STREAM_PID 2>/dev/null; ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" 2>/dev/null; exit 0' INT TERM - wait $QNX_STREAM_PID - ;; - - wireshark) - FILTER="${2:-}" - - check_qnx_connection - check_network_capture_tool - - if ! check_wireshark; then - exit 1 - fi - - echo "" - echo "Launching Wireshark with QNX live capture..." - if [ -n "$FILTER" ]; then - echo "Filter: $FILTER" - else - echo "Filter: none (all packets)" - fi - - # Start streaming on QNX - echo "Starting packet stream on QNX..." - if [ -n "$FILTER" ]; then - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream '$FILTER'" & - else - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stream" & - fi - - QNX_STREAM_PID=$! - - # Give stream time to start - sleep 3 - - echo "Launching Wireshark..." - # Launch Wireshark with remote capture - wireshark -k -i TCP@localhost:$CAPTURE_PORT & - WIRESHARK_PID=$! - - echo "" - echo "Wireshark launched (PID: $WIRESHARK_PID)" - echo "QNX streaming (PID: $QNX_STREAM_PID)" - echo "" - echo "Press Ctrl+C to stop both Wireshark and QNX streaming" - - # Wait and cleanup - trap 'echo ""; echo "Stopping Wireshark and QNX stream..."; kill $WIRESHARK_PID $QNX_STREAM_PID 2>/dev/null; ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" 2>/dev/null; exit 0' INT TERM - - # Wait for either process to end - wait $WIRESHARK_PID 2>/dev/null || wait $QNX_STREAM_PID 2>/dev/null - - # Cleanup remaining processes - kill $QNX_STREAM_PID $WIRESHARK_PID 2>/dev/null || true - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" 2>/dev/null || true - ;; - - list) - check_qnx_connection - check_network_capture_tool - - echo "Listing capture files on QNX system..." - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture list" - ;; - - download) - FILENAME="${2:-}" - - if [ -z "$FILENAME" ]; then - echo "Error: Filename required" - echo "Usage: $0 download " - echo "Use '$0 list' to see available files" - exit 1 - fi - - check_qnx_connection - - echo "Downloading capture file from QNX..." - echo "Remote file: /tmp_ram/capture/$FILENAME" - echo "Local file: ./$FILENAME" - - if scp $SSH_OPTIONS -P "$SSH_PORT" "$SSH_USER@$QNX_HOST:/tmp_ram/capture/$FILENAME" "./$FILENAME"; then - echo "✓ File downloaded successfully" - echo "" - echo "To analyze in Wireshark:" - echo " wireshark ./$FILENAME" - else - echo "✗ Download failed" - exit 1 - fi - ;; - - status) - check_qnx_connection - check_network_capture_tool - - echo "QNX network capture status:" - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture status" - ;; - - stop) - check_qnx_connection - check_network_capture_tool - - echo "Stopping all network captures on QNX..." - ssh $SSH_OPTIONS -p "$SSH_PORT" "$SSH_USER@$QNX_HOST" "network_capture stop" - echo "✓ All captures stopped" - ;; - - help|*) - usage - ;; -esac diff --git a/qnx_qemu/scripts/run_qemu.sh b/qnx_qemu/scripts/run_qemu.sh deleted file mode 100755 index a23f117b53..0000000000 --- a/qnx_qemu/scripts/run_qemu.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -set -euo pipefail - -QNX_HOST=$1 - -IFS_IMAGE=$2 - -qemu-system-x86_64 \ - -smp 2 \ - --enable-kvm \ - -cpu Cascadelake-Server-v5 \ - -m 1G \ - -pidfile /tmp/qemu.pid \ - -nographic \ - -kernel "${IFS_IMAGE}" \ - -serial mon:stdio \ - -object rng-random,filename=/dev/urandom,id=rng0 \ - -netdev bridge,id=net0,br=virbr0 -device virtio-net-pci,netdev=net0 \ - -device virtio-rng-pci,rng=rng0 \ No newline at end of file diff --git a/qnx_qemu/scripts/run_qemu_portforward.sh b/qnx_qemu/scripts/run_qemu_portforward.sh deleted file mode 100755 index e523bc969a..0000000000 --- a/qnx_qemu/scripts/run_qemu_portforward.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -set -euo pipefail - -QNX_HOST=$1 - -IFS_IMAGE=$2 - -qemu-system-x86_64 \ - -smp 2 \ - --enable-kvm \ - -cpu Cascadelake-Server-v5 \ - -m 1G \ - -pidfile /tmp/qemu.pid \ - -nographic \ - -kernel "${IFS_IMAGE}" \ - -serial mon:stdio \ - -object rng-random,filename=/dev/urandom,id=rng0 \ - -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80,hostfwd=tcp::8443-:443,hostfwd=tcp::9999-:9999 \ - -device virtio-net-pci,netdev=net0 \ - -device virtio-rng-pci,rng=rng0 diff --git a/qnx_qemu/target_config.json b/qnx_qemu/target_config.json deleted file mode 100644 index e90afd9081..0000000000 --- a/qnx_qemu/target_config.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "S_CORE_ECU_QEMU": { - "performance_processor": { - "name": "S_CORE_ECU_QEMU_PP", - "ip_address": "169.254.158.190", - "ext_ip_address": "169.254.158.190", - "ssh_port": 22, - "diagnostic_ip_address": "169.254.158.190", - "diagnostic_address": "0x91", - "serial_device": "", - "network_interfaces": [], - "ecu_name": "s_core_ecu_qemu_pp", - "data_router_config": { - "vlan_address": "127.0.0.1", - "multicast_addresses": [] - }, - "qemu_num_cores": 2, - "qemu_ram_size": "1G" - }, - "safety_processor": { - "name": "S_CORE_ECU_QEMU_SC", - "ip_address": "169.254.158.190", - "diagnostic_ip_address": "169.254.158.190", - "diagnostic_address": "0x90", - "serial_device": "", - "use_doip": true - }, - "other_processors": {} - } -} diff --git a/qnx_qemu/test/itf/test_persistency.py b/qnx_qemu/test/itf/test_persistency.py deleted file mode 100644 index 96c16fc165..0000000000 --- a/qnx_qemu/test/itf/test_persistency.py +++ /dev/null @@ -1,38 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -from itf.plugins.com.ping import ping -from itf.plugins.com.ssh import execute_command_output -import logging - -logger = logging.getLogger(__name__) - - -def test_persistency_test_app_is_deployed(target_fixture): - with target_fixture.sut.ssh() as ssh: - exit_code, stdout, stderr = execute_command_output( - ssh, "test -f cpp_tests_persistency" - ) - assert exit_code == 0, "SSH command failed" - -def test_persistency_test_app_is_running(target_fixture): - with target_fixture.sut.ssh() as ssh: - exit_code, stdout, stderr = execute_command_output( - ssh, "./cpp_tests_persistency --name basic.basic --input '{\"kvs_parameters\":{\"instance_id\":0}}'", - timeout = 30, max_exec_time = 180, - logger_in = logger, verbose = True, - ) - - logger.info (stdout) - logger.info (stderr) - - assert exit_code == 0, "SSH command failed" diff --git a/qnx_qemu/test/itf/test_scrample.py b/qnx_qemu/test/itf/test_scrample.py deleted file mode 100644 index e9533f6645..0000000000 --- a/qnx_qemu/test/itf/test_scrample.py +++ /dev/null @@ -1,39 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -from itf.plugins.com.ping import ping -from itf.plugins.com.ssh import execute_command_output -import logging - -logger = logging.getLogger(__name__) - - -def test_scrample_app_is_deployed(target_fixture): - with target_fixture.sut.ssh() as ssh: - exit_code, stdout, stderr = execute_command_output( - ssh, "test -f scrample" - ) - assert exit_code == 0, "SSH command failed" - - -def test_scrample_app_is_running(target_fixture): - with target_fixture.sut.ssh() as ssh: - exit_code, stdout, stderr = execute_command_output( - ssh, "./scrample -n 10 -t 100 -m send & ./scrample -n 5 -t 100 -m recv", - timeout = 30, max_exec_time = 180, - logger_in = logger, verbose = True, - ) - - logger.info (stdout) - logger.info (stderr) - - assert exit_code == 0, "SSH command failed" diff --git a/qnx_qemu/test/itf/test_ssh.py b/qnx_qemu/test/itf/test_ssh.py deleted file mode 100644 index 6fe77281d6..0000000000 --- a/qnx_qemu/test/itf/test_ssh.py +++ /dev/null @@ -1,46 +0,0 @@ -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* -from itf.plugins.com.ping import ping -from itf.plugins.com.ssh import execute_command_output - - -def test_ssh_with_default_user(target_fixture): - with target_fixture.sut.ssh() as ssh: - exit_code, stdout, stderr = execute_command_output( - ssh, "echo 'Username:' $USER && uname -a" - ) - assert exit_code == 0, "SSH command failed" - assert "Username: root" in stdout[0], "Expected username not found in output" - assert "QNX Qnx_S-core 8.0.0" in stdout[1], ( - "Expected QNX kernel information not found in output" - ) - assert stderr == [], "Expected no error output" - - -def test_ssh_with_qnx_user(target_fixture): - user = "qnxuser" - with target_fixture.sut.ssh(username=user) as ssh: - exit_code, stdout, stderr = execute_command_output( - ssh, "echo 'Username:' $USER && uname -a" - ) - assert exit_code == 0, "SSH command failed" - assert f"Username: {user}" in stdout[0], "Expected username not found in output" - assert "QNX Qnx_S-core 8.0.0" in stdout[1], ( - "Expected QNX kernel information not found in output" - ) - assert stderr == [], "Expected no error output" - - -def test_ping_ok(target_fixture): - is_reachable = ping(target_fixture.sut.ip_address) - assert is_reachable, "QNX Target is not reachable via ping" diff --git a/qnx_qemu/test/test_qnx_qemu_bridge.sh b/qnx_qemu/test/test_qnx_qemu_bridge.sh deleted file mode 100755 index f7b8468fd0..0000000000 --- a/qnx_qemu/test/test_qnx_qemu_bridge.sh +++ /dev/null @@ -1,509 +0,0 @@ -#!/bin/bash - -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -set -euo pipefail - -# QNX QEMU Bridge Network Test Script -# Tests QNX QEMU image with bridge networking and fixed IP - -# Default configuration -TIMEOUT=${TIMEOUT:-120} -SSH_PORT=${SSH_PORT:-2222} -SSH_USER=${SSH_USER:-root} -BOOT_WAIT=${BOOT_WAIT:-15} -QNX_IP=${QNX_IP:-192.168.122.100} -QNX_HOST="" -IFS_IMAGE="" - -# Parse command line arguments -usage() { - echo "Usage: $0 [options]" - echo "Options:" - echo " --timeout=N Boot timeout in seconds (default: 120)" - echo " --ssh-port=N SSH port for testing (default: 2222)" - echo " --ssh-user=USER SSH user for testing (default: root)" - echo " --boot-wait=N Additional wait after boot (default: 15)" - echo " --qnx-ip=IP QNX system IP for ping test (default: 192.168.122.100)" - echo " --no-ssh Skip SSH connectivity test" - echo " --no-ping Skip ping connectivity test" - echo " --help Show this help" - echo "" - echo "Note: This test uses bridge networking with fixed IP" - exit 1 -} - -# Parse arguments -TEST_SSH=true -TEST_PING=true -while [[ $# -gt 0 ]]; do - case $1 in - --timeout=*) - TIMEOUT="${1#*=}" - shift - ;; - --ssh-port=*) - SSH_PORT="${1#*=}" - shift - ;; - --ssh-user=*) - SSH_USER="${1#*=}" - shift - ;; - --boot-wait=*) - BOOT_WAIT="${1#*=}" - shift - ;; - --qnx-ip=*) - QNX_IP="${1#*=}" - shift - ;; - --no-ssh) - TEST_SSH=false - shift - ;; - --no-ping) - TEST_PING=false - shift - ;; - --help) - usage - ;; - -*) - echo "Unknown option: $1" - usage - ;; - *) - if [ -z "$QNX_HOST" ]; then - QNX_HOST="$1" - elif [ -z "$IFS_IMAGE" ]; then - IFS_IMAGE="$1" - else - echo "Too many arguments" - usage - fi - shift - ;; - esac -done - -# Validate required arguments -if [ -z "$QNX_HOST" ] || [ -z "$IFS_IMAGE" ]; then - echo "Error: Missing required arguments" - usage -fi - -# Validate files exist -if [ ! -d "$QNX_HOST" ]; then - echo "Error: QNX host directory not found: $QNX_HOST" - exit 1 -fi - -if [ ! -f "$IFS_IMAGE" ]; then - echo "Error: IFS image not found: $IFS_IMAGE" - exit 1 -fi - -# Global variables -QEMU_PID="" -OUTPUT_LOG="/tmp/qnx_qemu_bridge_test_$$.log" - -echo "============================================================" -echo "QNX QEMU Bridge Network Test" -echo "============================================================" -echo "QNX Host: $QNX_HOST" -echo "IFS Image: $IFS_IMAGE" -echo "Timeout: ${TIMEOUT}s" -echo "QNX IP: $QNX_IP (bridge network)" -if [ "$TEST_SSH" = true ]; then - echo "SSH Test: Enabled (direct connection)" - echo "SSH User: $SSH_USER" -else - echo "SSH Test: Disabled" -fi -if [ "$TEST_PING" = true ]; then - echo "Ping Test: Enabled" -else - echo "Ping Test: Disabled" -fi -echo "Boot Wait: ${BOOT_WAIT}s" -echo "Network Mode: Bridge (virbr0)" -echo "" - -# Cleanup function -cleanup() { - echo "" - echo "Cleaning up..." - - # Kill QEMU process - if [ -n "$QEMU_PID" ] && kill -0 "$QEMU_PID" 2>/dev/null; then - echo "Terminating QEMU process (PID: $QEMU_PID)" - kill "$QEMU_PID" 2>/dev/null || true - sleep 3 - if kill -0 "$QEMU_PID" 2>/dev/null; then - echo "Force killing QEMU process" - kill -9 "$QEMU_PID" 2>/dev/null || true - fi - fi - - # Clean up files - rm -f "/tmp/qemu.pid" "$OUTPUT_LOG" 2>/dev/null || true - - echo "Cleanup completed" -} - -# Set trap for cleanup -trap cleanup EXIT INT TERM - -# Function to start QEMU with bridge networking -start_qemu() { - echo "1. Starting QEMU with bridge networking..." - - # Start QEMU in background with bridge networking only (no port forwarding) - qemu-system-x86_64 \ - -smp 2 \ - --enable-kvm \ - -cpu Cascadelake-Server-v5 \ - -m 1G \ - -pidfile /tmp/qemu.pid \ - -nographic \ - -kernel "$IFS_IMAGE" \ - -serial mon:stdio \ - -object rng-random,filename=/dev/urandom,id=rng0 \ - -device virtio-rng-pci,rng=rng0 \ - -netdev bridge,id=net0,br=virbr0 \ - -device virtio-net-pci,netdev=net0 \ - > "$OUTPUT_LOG" 2>&1 & - - QEMU_PID=$! - echo "✓ QEMU started (PID: $QEMU_PID)" - echo "✓ Bridge networking enabled (DHCP with fallback: $QNX_IP)" - echo "✓ Direct network access via bridge interface" -} - -# Function to wait for boot completion -wait_for_boot() { - echo "" - echo "2. Waiting for boot completion (timeout: ${TIMEOUT}s)..." - - local start_time=$(date +%s) - local boot_complete=false - - # Look specifically for hostname confirmation message - local hostname_pattern="Hostname set to: Qnx_S-core" - - echo "Waiting for hostname confirmation: '$hostname_pattern'" - - while [ $(($(date +%s) - start_time)) -lt "$TIMEOUT" ]; do - # Check if QEMU process is still running - if ! kill -0 "$QEMU_PID" 2>/dev/null; then - echo "✗ QEMU process terminated unexpectedly" - echo "Last output:" - tail -20 "$OUTPUT_LOG" 2>/dev/null || echo "No output available" - return 1 - fi - - # Check for hostname confirmation message - if grep -q "$hostname_pattern" "$OUTPUT_LOG" 2>/dev/null; then - echo "✓ Boot completion detected: Found hostname confirmation" - boot_complete=true - break - fi - - # Show progress every 10 seconds - local elapsed=$(($(date +%s) - start_time)) - if [ $((elapsed % 10)) -eq 0 ] && [ $elapsed -gt 0 ]; then - echo " ... still waiting (${elapsed}s elapsed)" - fi - - sleep 2 - done - - if [ "$boot_complete" = true ]; then - echo "✓ System fully booted and hostname configured" - return 0 - else - echo "✗ Boot timeout reached - hostname confirmation not found" - echo "Recent QEMU output:" - echo "----------------------------------------" - tail -20 "$OUTPUT_LOG" 2>/dev/null || echo "No output available" - echo "----------------------------------------" - return 1 - fi -} - -# Function to wait additional time for system stabilization -wait_for_stabilization() { - if [ "$BOOT_WAIT" -gt 0 ]; then - echo "" - echo "3. Waiting for system stabilization (${BOOT_WAIT}s)..." - sleep "$BOOT_WAIT" - echo "✓ Stabilization wait completed" - fi -} - -# Function to detect actual QNX IP address -detect_qnx_ip() { - echo "" - echo "4. Detecting QNX system IP address..." - - local detected_ip="" - local dhcp_status="" - - # Try to get DHCP status from the system - local dhcp_pattern="DHCP_SUCCESS\|DHCP_FAILED_STATIC_FALLBACK" - local dhcp_wait=30 - local dhcp_start=$(date +%s) - - echo "Waiting for network configuration to complete..." - - while [ $(($(date +%s) - dhcp_start)) -lt "$dhcp_wait" ]; do - if grep -q "$dhcp_pattern" "$OUTPUT_LOG" 2>/dev/null; then - dhcp_status=$(grep "$dhcp_pattern" "$OUTPUT_LOG" | tail -1) - echo "✓ Network configuration detected: $dhcp_status" - break - fi - sleep 2 - echo " ... waiting for network setup" - done - - # Try to extract IP from DHCP status in logs - local ip_pattern="IP address set to: [0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" - if grep -q "$ip_pattern" "$OUTPUT_LOG" 2>/dev/null; then - detected_ip=$(grep "$ip_pattern" "$OUTPUT_LOG" | tail -1 | sed 's/.*IP address set to: \([0-9.]*\).*/\1/') - if [ -n "$detected_ip" ] && [ "$detected_ip" != "0.0.0.0" ]; then - echo "✓ Detected QNX IP address from logs: $detected_ip" - QNX_IP="$detected_ip" - return 0 - fi - fi - - # If we couldn't detect IP from logs, use the fallback IP - echo "⚠ Could not detect actual IP from logs, using fallback: $QNX_IP" - echo " (System may be using DHCP or static fallback)" - - return 0 -} - -# Function to test ping connectivity -test_ping_connectivity() { - if [ "$TEST_PING" != true ]; then - echo "" - echo "5. Ping test skipped (disabled)" - return 0 - fi - - echo "" - echo "5. Testing ping connectivity to QNX system..." - - # Test ping connectivity to the QNX system - echo "Testing ping to $QNX_IP..." - - if command -v ping >/dev/null 2>&1; then - # Try ping with different approaches (some systems use different flags) - local ping_success=false - - # Try standard ping (3 packets) - if ping -c 3 -W 5 "$QNX_IP" >/dev/null 2>&1; then - ping_success=true - elif ping -c 3 -w 5 "$QNX_IP" >/dev/null 2>&1; then - ping_success=true - fi - - if [ "$ping_success" = true ]; then - echo "✓ Ping test successful - QNX system is reachable at $QNX_IP" - - # Show ping statistics - echo "Ping statistics:" - ping -c 3 "$QNX_IP" 2>/dev/null || echo " (statistics not available)" - else - echo "✗ Ping test failed - QNX system not reachable at $QNX_IP" - echo "This could indicate:" - echo " - Bridge networking not properly configured" - echo " - QNX network setup failed or still in progress" - echo " - Host firewall blocking ICMP" - echo " - IP address detection was incorrect" - return 1 - fi - else - echo "⚠ Ping command not available, skipping ping test" - fi - - return 0 -} - -# Function to test system functionality -test_system_functionality() { - echo "" - echo "6. Testing system functionality..." - - # Check if QEMU is still running - if ! kill -0 "$QEMU_PID" 2>/dev/null; then - echo "✗ QEMU process is not running" - return 1 - fi - echo "✓ QEMU process is still running" - - # Check for system indicators in output - local system_indicators=( - "qnx" - "Welcome" - "shell" - "startup" - ) - - local found_indicators=0 - for indicator in "${system_indicators[@]}"; do - if grep -i -q "$indicator" "$OUTPUT_LOG" 2>/dev/null; then - echo "✓ Found system indicator: $indicator" - ((found_indicators++)) - fi - done - - if [ "$found_indicators" -gt 0 ]; then - echo "✓ System functionality indicators found ($found_indicators)" - return 0 - else - echo "✗ No system functionality indicators found" - return 1 - fi -} - -# Function to test SSH connectivity -test_ssh_connectivity() { - if [ "$TEST_SSH" != true ]; then - echo "" - echo "7. SSH test skipped (disabled)" - return 0 - fi - - echo "" - echo "7. Testing SSH connectivity..." - - # Test direct SSH connection to QNX system IP without key authentication - echo "Testing direct SSH connection to QNX system..." - if command -v ssh >/dev/null 2>&1; then - echo "Attempting SSH connection to $SSH_USER@$QNX_IP..." - - # Try SSH connection with password authentication (no keys, empty password) - if timeout 15 ssh -o ConnectTimeout=10 \ - -o StrictHostKeyChecking=no \ - -o UserKnownHostsFile=/dev/null \ - -o PreferredAuthentications=password \ - -o PubkeyAuthentication=no \ - -o PasswordAuthentication=yes \ - -o BatchMode=yes \ - "$SSH_USER@$QNX_IP" \ - "echo 'SSH connection successful'; hostname 2>/dev/null || echo 'hostname command not available'; ifconfig vtnet0 2>/dev/null | grep 'inet ' || echo 'Network info not available'" 2>/dev/null; then - echo "✓ SSH connection to $QNX_IP successful" - echo "✓ Executed remote commands successfully" - else - echo "✗ SSH connection to $QNX_IP failed" - echo "This could indicate:" - echo " - SSH daemon not yet started" - echo " - Network connectivity issues" - echo " - SSH authentication problems" - echo " - Firewall blocking SSH port" - return 1 - fi - else - echo "⚠ SSH client not available, skipping SSH connection test" - fi - - return 0 -} - -# Function to show final system status -show_system_status() { - echo "" - echo "8. Final system status..." - - if kill -0 "$QEMU_PID" 2>/dev/null; then - echo "✓ QEMU process is running (PID: $QEMU_PID)" - else - echo "✗ QEMU process is not running" - fi - - echo "" - echo "Recent system output:" - echo "----------------------------------------" - tail -15 "$OUTPUT_LOG" 2>/dev/null || echo "No output available" - echo "----------------------------------------" -} - -# Main execution -main() { - local all_tests_passed=true - - # Start QEMU - if ! start_qemu; then - echo "✗ Failed to start QEMU" - return 1 - fi - - # Wait for boot - if ! wait_for_boot; then - echo "✗ Boot test failed" - all_tests_passed=false - fi - - # Wait for stabilization - wait_for_stabilization - - # Detect actual QNX IP address - if ! detect_qnx_ip; then - echo "✗ IP detection failed" - all_tests_passed=false - fi - - # Test ping connectivity - if ! test_ping_connectivity; then - echo "✗ Ping connectivity test failed" - all_tests_passed=false - fi - - # Test system functionality - if ! test_system_functionality; then - echo "✗ System functionality test failed" - all_tests_passed=false - fi - - # Test SSH connectivity - if ! test_ssh_connectivity; then - echo "✗ SSH connectivity test failed" - all_tests_passed=false - fi - - # Show final status - show_system_status - - # Results - echo "" - echo "============================================================" - if [ "$all_tests_passed" = true ]; then - echo "✓ ALL TESTS PASSED" - echo "QNX QEMU bridge network integration is working correctly!" - echo "QEMU is running on PID: $QEMU_PID" - echo "QNX system IP: $QNX_IP (detected via bridge networking)" - echo "SSH access: ssh $SSH_USER@$QNX_IP (direct bridge connection)" - return 0 - else - echo "✗ SOME TESTS FAILED" - echo "Check the output above for details." - return 1 - fi -} - -# Run main function -main "$@" diff --git a/qnx_qemu/test/test_qnx_qemu_portforward.sh b/qnx_qemu/test/test_qnx_qemu_portforward.sh deleted file mode 100755 index 5309ae808f..0000000000 --- a/qnx_qemu/test/test_qnx_qemu_portforward.sh +++ /dev/null @@ -1,406 +0,0 @@ -#!/bin/bash -# ******************************************************************************* -# Copyright (c) 2025 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Apache License Version 2.0 which is available at -# https://www.apache.org/licenses/LICENSE-2.0 -# -# SPDX-License-Identifier: Apache-2.0 -# ******************************************************************************* - -set -euo pipefail - -# QNX QEMU Port Forwarding Test Script -# Tests QNX QEMU image with port forwarding (NAT networking) - -# Default configuration -TIMEOUT=${TIMEOUT:-120} -SSH_PORT=${SSH_PORT:-2222} -SSH_USER=${SSH_USER:-root} -BOOT_WAIT=${BOOT_WAIT:-15} -QNX_HOST="" -IFS_IMAGE="" - -# Parse command line arguments -usage() { - echo "Usage: $0 [options]" - echo "Options:" - echo " --timeout=N Boot timeout in seconds (default: 120)" - echo " --ssh-port=N SSH port for testing (default: 2222)" - echo " --ssh-user=USER SSH user for testing (default: root)" - echo " --boot-wait=N Additional wait after boot (default: 15)" - echo " --no-ssh Skip SSH connectivity test" - echo " --help Show this help" - echo "" - echo "Note: This test uses port forwarding (NAT networking) - no ping test available" - exit 1 -} - -# Parse arguments -TEST_SSH=true -while [[ $# -gt 0 ]]; do - case $1 in - --timeout=*) - TIMEOUT="${1#*=}" - shift - ;; - --ssh-port=*) - SSH_PORT="${1#*=}" - shift - ;; - --ssh-user=*) - SSH_USER="${1#*=}" - shift - ;; - --boot-wait=*) - BOOT_WAIT="${1#*=}" - shift - ;; - --no-ssh) - TEST_SSH=false - shift - ;; - --help) - usage - ;; - -*) - echo "Unknown option: $1" - usage - ;; - *) - if [ -z "$QNX_HOST" ]; then - QNX_HOST="$1" - elif [ -z "$IFS_IMAGE" ]; then - IFS_IMAGE="$1" - else - echo "Too many arguments" - usage - fi - shift - ;; - esac -done - -# Validate required arguments -if [ -z "$QNX_HOST" ] || [ -z "$IFS_IMAGE" ]; then - echo "Error: Missing required arguments" - usage -fi - -# Validate files exist -if [ ! -d "$QNX_HOST" ]; then - echo "Error: QNX host directory not found: $QNX_HOST" - exit 1 -fi - -if [ ! -f "$IFS_IMAGE" ]; then - echo "Error: IFS image not found: $IFS_IMAGE" - exit 1 -fi - -# Global variables -QEMU_PID="" -OUTPUT_LOG="/tmp/qnx_qemu_portforward_test_$$.log" - -echo "============================================================" -echo "QNX QEMU Port Forwarding Test" -echo "============================================================" -echo "QNX Host: $QNX_HOST" -echo "IFS Image: $IFS_IMAGE" -echo "Timeout: ${TIMEOUT}s" -echo "SSH Port: $SSH_PORT (forwarded from localhost)" -echo "SSH User: $SSH_USER" -if [ "$TEST_SSH" = true ]; then - echo "SSH Test: Enabled" -else - echo "SSH Test: Disabled" -fi -echo "Boot Wait: ${BOOT_WAIT}s" -echo "Network Mode: Port Forwarding (NAT)" -echo "" - -# Cleanup function -cleanup() { - echo "" - echo "Cleaning up..." - - # Kill QEMU process - if [ -n "$QEMU_PID" ] && kill -0 "$QEMU_PID" 2>/dev/null; then - echo "Terminating QEMU process (PID: $QEMU_PID)" - kill "$QEMU_PID" 2>/dev/null || true - sleep 3 - if kill -0 "$QEMU_PID" 2>/dev/null; then - echo "Force killing QEMU process" - kill -9 "$QEMU_PID" 2>/dev/null || true - fi - fi - - # Clean up files - rm -f "/tmp/qemu.pid" "$OUTPUT_LOG" 2>/dev/null || true - - echo "Cleanup completed" -} - -# Set trap for cleanup -trap cleanup EXIT INT TERM - -# Function to start QEMU with port forwarding -start_qemu() { - echo "1. Starting QEMU with port forwarding..." - - # Start QEMU in background with port forwarding (NAT networking) - qemu-system-x86_64 \ - -smp 2 \ - --enable-kvm \ - -cpu Cascadelake-Server-v5 \ - -m 1G \ - -pidfile /tmp/qemu.pid \ - -nographic \ - -kernel "$IFS_IMAGE" \ - -serial mon:stdio \ - -object rng-random,filename=/dev/urandom,id=rng0 \ - -device virtio-rng-pci,rng=rng0 \ - -netdev user,id=net0,hostfwd=tcp::${SSH_PORT}-:22,hostfwd=tcp::8080-:80,hostfwd=tcp::8443-:443,hostfwd=tcp::9999-:9999 \ - -device virtio-net-pci,netdev=net0 \ - > "$OUTPUT_LOG" 2>&1 & - - QEMU_PID=$! - echo "✓ QEMU started (PID: $QEMU_PID)" - echo "✓ Port forwarding: SSH($SSH_PORT->22), HTTP(8080->80), HTTPS(8443->443), Capture(9999->9999)" - echo "✓ Guest uses NAT networking (10.0.2.x subnet)" -} - -# Function to wait for boot completion -wait_for_boot() { - echo "" - echo "2. Waiting for boot completion (timeout: ${TIMEOUT}s)..." - - local start_time=$(date +%s) - local boot_complete=false - - # Look specifically for hostname confirmation message - local hostname_pattern="Hostname set to: Qnx_S-core" - - echo "Waiting for hostname confirmation: '$hostname_pattern'" - - while [ $(($(date +%s) - start_time)) -lt "$TIMEOUT" ]; do - # Check if QEMU process is still running - if ! kill -0 "$QEMU_PID" 2>/dev/null; then - echo "✗ QEMU process terminated unexpectedly" - echo "Last output:" - tail -20 "$OUTPUT_LOG" 2>/dev/null || echo "No output available" - return 1 - fi - - # Check for hostname confirmation message - if grep -q "$hostname_pattern" "$OUTPUT_LOG" 2>/dev/null; then - echo "✓ Boot completion detected: Found hostname confirmation" - boot_complete=true - break - fi - - # Show progress every 10 seconds - local elapsed=$(($(date +%s) - start_time)) - if [ $((elapsed % 10)) -eq 0 ] && [ $elapsed -gt 0 ]; then - echo " ... still waiting (${elapsed}s elapsed)" - fi - - sleep 2 - done - - if [ "$boot_complete" = true ]; then - echo "✓ System fully booted and hostname configured" - return 0 - else - echo "✗ Boot timeout reached - hostname confirmation not found" - echo "Recent QEMU output:" - echo "----------------------------------------" - tail -20 "$OUTPUT_LOG" 2>/dev/null || echo "No output available" - echo "----------------------------------------" - return 1 - fi -} - -# Function to wait additional time for system stabilization -wait_for_stabilization() { - if [ "$BOOT_WAIT" -gt 0 ]; then - echo "" - echo "3. Waiting for system stabilization (${BOOT_WAIT}s)..." - sleep "$BOOT_WAIT" - echo "✓ Stabilization wait completed" - fi -} - -# Function to test system functionality -test_system_functionality() { - echo "" - echo "4. Testing system functionality..." - - # Check if QEMU is still running - if ! kill -0 "$QEMU_PID" 2>/dev/null; then - echo "✗ QEMU process is not running" - return 1 - fi - echo "✓ QEMU process is still running" - - # Check for system indicators in output - local system_indicators=( - "qnx" - "Welcome" - "shell" - "startup" - ) - - local found_indicators=0 - for indicator in "${system_indicators[@]}"; do - if grep -i -q "$indicator" "$OUTPUT_LOG" 2>/dev/null; then - echo "✓ Found system indicator: $indicator" - ((found_indicators++)) - fi - done - - if [ "$found_indicators" -gt 0 ]; then - echo "✓ System functionality indicators found ($found_indicators)" - return 0 - else - echo "✗ No system functionality indicators found" - return 1 - fi -} - -# Function to test SSH connectivity -test_ssh_connectivity() { - if [ "$TEST_SSH" != true ]; then - echo "" - echo "5. SSH test skipped (disabled)" - return 0 - fi - - echo "" - echo "5. Testing SSH connectivity via port forwarding..." - - # Test if SSH port is open on localhost (port forwarding) - echo "Testing SSH port connectivity on localhost:$SSH_PORT..." - if command -v nc >/dev/null 2>&1; then - if nc -z -w5 localhost "$SSH_PORT"; then - echo "✓ SSH port $SSH_PORT is open on localhost" - else - echo "✗ SSH port $SSH_PORT is not accessible on localhost" - return 1 - fi - elif command -v telnet >/dev/null 2>&1; then - if timeout 5 telnet localhost "$SSH_PORT" /dev/null 2>&1; then - echo "✓ SSH port $SSH_PORT is open on localhost" - else - echo "✗ SSH port $SSH_PORT is not accessible on localhost" - return 1 - fi - else - echo "⚠ No network testing tools available (nc or telnet)" - echo "Skipping port connectivity test" - fi - - # Test SSH connection via port forwarding - echo "Testing SSH connection via port forwarding..." - if command -v ssh >/dev/null 2>&1; then - echo "Attempting SSH connection to $SSH_USER@localhost:$SSH_PORT..." - - # Try SSH connection with password authentication (no keys, empty password) - if timeout 15 ssh -o ConnectTimeout=10 \ - -o StrictHostKeyChecking=no \ - -o UserKnownHostsFile=/dev/null \ - -o PreferredAuthentications=password \ - -o PubkeyAuthentication=no \ - -o PasswordAuthentication=yes \ - -o BatchMode=yes \ - -p "$SSH_PORT" \ - "$SSH_USER@localhost" \ - "echo 'SSH connection successful via port forwarding'; hostname 2>/dev/null || echo 'hostname command not available'; ifconfig vtnet0 2>/dev/null | grep 'inet ' || echo 'Network info not available'" 2>/dev/null; then - echo "✓ SSH connection via port forwarding successful" - echo "✓ Retrieved system information from guest" - else - echo "✗ SSH connection via port forwarding failed" - return 1 - fi - else - echo "⚠ SSH client not available, skipping SSH connection test" - fi - - return 0 -} - -# Function to show final system status -show_system_status() { - echo "" - echo "6. Final system status..." - - if kill -0 "$QEMU_PID" 2>/dev/null; then - echo "✓ QEMU process is running (PID: $QEMU_PID)" - else - echo "✗ QEMU process is not running" - fi - - echo "" - echo "Recent system output:" - echo "----------------------------------------" - tail -15 "$OUTPUT_LOG" 2>/dev/null || echo "No output available" - echo "----------------------------------------" -} - -# Main execution -main() { - local all_tests_passed=true - - # Start QEMU - if ! start_qemu; then - echo "✗ Failed to start QEMU" - return 1 - fi - - # Wait for boot - if ! wait_for_boot; then - echo "✗ Boot test failed" - all_tests_passed=false - fi - - # Wait for stabilization - wait_for_stabilization - - # Test system functionality - if ! test_system_functionality; then - echo "✗ System functionality test failed" - all_tests_passed=false - fi - - # Test SSH connectivity - if ! test_ssh_connectivity; then - echo "✗ SSH connectivity test failed" - all_tests_passed=false - fi - - # Show final status - show_system_status - - # Results - echo "" - echo "============================================================" - if [ "$all_tests_passed" = true ]; then - echo "✓ ALL TESTS PASSED" - echo "QNX QEMU port forwarding integration is working correctly!" - echo "QEMU is running on PID: $QEMU_PID" - echo "SSH access: ssh -p $SSH_PORT $SSH_USER@localhost" - echo "Network mode: Port forwarding (NAT) - guest uses 10.0.2.x subnet" - return 0 - else - echo "✗ SOME TESTS FAILED" - echo "Check the output above for details." - return 1 - fi -} - -# Run main function -main "$@"