Skip to content

DPF: Run network tests directly from Prow - #82742

Open
josecastillolema wants to merge 3 commits into
openshift:mainfrom
josecastillolema:tft-nobastion
Open

DPF: Run network tests directly from Prow#82742
josecastillolema wants to merge 3 commits into
openshift:mainfrom
josecastillolema:tft-nobastion

Conversation

@josecastillolema

@josecastillolema josecastillolema commented Jul 31, 2026

Copy link
Copy Markdown
Member

This will allow to test the openshift-dpf image and be able to /test network PRs in openshift-dpf that makes changes to the networking testing.

Summary by CodeRabbit

  • Enables /test network for OpenShift DPF pull requests that modify networking tests.
  • Loads the DPF hypervisor kubeconfig and .env file before network tests.
  • Runs traffic-flow tests directly against the DPF cluster on two worker-dpu nodes.
  • Removes SSH-based setup, remote execution, log retrieval, and Vault secret usage.

Signed-off-by: Jose Castillo Lema <josecastillolema@gmail.com>

    gitleaks.version: 8.30.0
    gitleaks.check-secrets: ENABLED
@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

The network test jobs now load a shared kubeconfig and .env file before execution. The test step verifies cluster access, selects two worker-dpu nodes, and runs traffic-flow tests locally.

Changes

DPF network test execution

Layer / File(s) Summary
Load shared credentials
ci-operator/config/rh-ecosystem-edge/openshift-dpf/*.yaml, ci-operator/step-registry/dpf/hypervisor/load-kubeconfig/dpf-hypervisor-load-kubeconfig-commands.sh
Both network test jobs run the kubeconfig loader first. The loader writes the kubeconfig and .env file to shared storage.
Run local network tests
ci-operator/step-registry/dpf/hypervisor/network-tests/*
The script verifies cluster access, selects two worker-dpu nodes, and runs make run-traffic-flow-tests. The step documentation describes the shared kubeconfig and dpf-ci workflow.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant CIJob
  participant KubeconfigLoader
  participant NetworkTestStep
  participant DPFCluster
  participant TrafficFlowTests
  CIJob->>KubeconfigLoader: Load kubeconfig and .env
  KubeconfigLoader->>NetworkTestStep: Provide shared credentials
  NetworkTestStep->>DPFCluster: Verify access and select worker-dpu nodes
  NetworkTestStep->>TrafficFlowTests: Run make run-traffic-flow-tests
Loading

Suggested reviewers: linoyaslan, tsorya, hector-vido


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error)

Check name Status Explanation Resolution
No-Sensitive-Data-In-Logs ❌ Error The network step sends oc get nodes output and explicit TFT_*_NODE names to Prow logs; the load step also logs REMOTE_HOST and the cluster API hostname/IP. Do not print node names or endpoint values. Use redacted status checks and keep host, API, and node identifiers out of job logs.
✅ Passed checks (14 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: running DPF network tests directly from Prow.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Stable And Deterministic Test Names ✅ Passed The changed files contain no Ginkgo It, Describe, Context, or When declarations; they only configure and invoke the static job step network-tests.
Test Structure And Quality ✅ Passed The diff changes only CI YAML, shell, and step documentation; it adds no Ginkgo test code or It/BeforeEach/AfterEach/Eventually calls to review.
Microshift Test Compatibility ✅ Passed The change adds CI YAML, shell commands, and step documentation only; no Ginkgo test declarations or new e2e tests were added, so this check is not applicable.
Single Node Openshift (Sno) Test Compatibility ✅ Passed The PR changes only CI YAML and shell/reference files; no new Ginkgo It/Describe/Context/When tests or multi-node test assumptions were added.
Topology-Aware Scheduling Compatibility ✅ Passed The PR changes only CI job configuration, step documentation, and test shell scripts; it adds no deployment manifests, operator/controller code, or workload scheduling constraints.
Ote Binary Stdout Contract ✅ Passed The PR changes only YAML and Bash step wiring; no OTE Go binary or process-level lifecycle code was added or changed, so the stdout contract is not applicable.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed The pull request changes only CI YAML and shell/ref files; it adds no Ginkgo e2e tests or new test networking code.
No-Weak-Crypto ✅ Passed The PR adds no MD5, SHA1, DES, RC4, Blowfish, ECB, custom crypto, or secret/token comparisons; changes only copy .env, select nodes, and invoke tests.
Container-Privileges ✅ Passed Affected Prow configs, step references, and scripts contain no privileged, hostPID, hostNetwork, hostIPC, SYS_ADMIN, or allowPrivilegeEscalation settings.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@openshift-ci
openshift-ci Bot requested review from linoyaslan and tsorya July 31, 2026 16:16
@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Jul 31, 2026
@openshift-merge-bot openshift-merge-bot Bot added the rehearsals-ack Signifies that rehearsal jobs have been acknowledged label Jul 31, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@ci-operator/step-registry/dpf/hypervisor/network-tests/dpf-hypervisor-network-tests-commands.sh`:
- Around line 4-7: Set KUBECONFIG to the DPF kubeconfig at
${SHARED_DIR}/kubeconfig before the first oc invocation in the DPF Kubernetes
traffic flow test step. Update the shell flow around the initial “Verifying
cluster access...” and oc get nodes commands, matching the sibling
test-full-suite step’s explicit kubeconfig export so subsequent node selection
targets the correct cluster.
- Around line 9-12: Update the TFT_SERVER_NODE and TFT_CLIENT_NODE setup to
assign the command results separately, then validate both variables are
non-empty before running make run-traffic-flow-tests. Exit immediately with an
appropriate error when fewer than two worker-dpu nodes are available, while
preserving the existing node-selection and logging behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 922859e1-c17f-4a87-833d-3f6535e94b5d

📥 Commits

Reviewing files that changed from the base of the PR and between 4313230 and cbafa98.

📒 Files selected for processing (4)
  • ci-operator/config/rh-ecosystem-edge/openshift-dpf/rh-ecosystem-edge-openshift-dpf-main.yaml
  • ci-operator/config/rh-ecosystem-edge/openshift-dpf/rh-ecosystem-edge-openshift-dpf-release-4.22.yaml
  • ci-operator/step-registry/dpf/hypervisor/network-tests/dpf-hypervisor-network-tests-commands.sh
  • ci-operator/step-registry/dpf/hypervisor/network-tests/dpf-hypervisor-network-tests-ref.yaml

Comment on lines +4 to +7
echo "=== Run DPF Kubernetes Traffic Flow Tests ==="

echo "Setting up SSH access to DPF hypervisor: ${REMOTE_HOST}"
echo "Verifying cluster access..."
oc get nodes

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win

Export KUBECONFIG before you use oc.

The step never sets KUBECONFIG, so oc uses the default CI cluster credentials instead of the DPF cluster kubeconfig written by dpf-hypervisor-load-kubeconfig. The ref.yaml documentation states that this step consumes ${SHARED_DIR}/kubeconfig, and the sibling step ci-operator/step-registry/dpf/hypervisor/test-full-suite/dpf-hypervisor-test-full-suite-commands.sh (line 6) exports it explicitly. Without the export, oc get nodes queries the wrong cluster and the node selection below silently yields empty values.

🐛 Proposed fix
 echo "=== Run DPF Kubernetes Traffic Flow Tests ==="
 
+export KUBECONFIG="${SHARED_DIR}/kubeconfig"
+
 echo "Verifying cluster access..."
 oc get nodes
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
echo "=== Run DPF Kubernetes Traffic Flow Tests ==="
echo "Setting up SSH access to DPF hypervisor: ${REMOTE_HOST}"
echo "Verifying cluster access..."
oc get nodes
echo "=== Run DPF Kubernetes Traffic Flow Tests ==="
export KUBECONFIG="${SHARED_DIR}/kubeconfig"
echo "Verifying cluster access..."
oc get nodes
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@ci-operator/step-registry/dpf/hypervisor/network-tests/dpf-hypervisor-network-tests-commands.sh`
around lines 4 - 7, Set KUBECONFIG to the DPF kubeconfig at
${SHARED_DIR}/kubeconfig before the first oc invocation in the DPF Kubernetes
traffic flow test step. Update the shell flow around the initial “Verifying
cluster access...” and oc get nodes commands, matching the sibling
test-full-suite step’s explicit kubeconfig export so subsequent node selection
targets the correct cluster.

Comment on lines +9 to +12
export TFT_SERVER_NODE=$(oc get nodes --no-headers | grep worker-dpu | awk 'NR==1 {print $1}')
echo "TFT_SERVER_NODE: ${TFT_SERVER_NODE}"
export TFT_CLIENT_NODE=$(oc get nodes --no-headers | grep worker-dpu | awk 'NR==2 {print $1}')
echo "TFT_CLIENT_NODE: ${TFT_CLIENT_NODE}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find how other DPF steps select worker-dpu nodes.
fd -t f -e sh . ci-operator/step-registry/dpf | xargs rg -n -C3 'worker-dpu|TFT_SERVER_NODE|TFT_CLIENT_NODE'

Repository: openshift/release

Length of output: 2110


🏁 Script executed:

#!/bin/bash
set -u

printf 'Repository files around DPF step registry:\n'
git ls-files 'ci-operator/step-registry/dpf/**/*-commands.sh' 2>/dev/null | sed -n '1,80p'

printf '\nFile header and node selection lines:\n'
FILE="ci-operator/step-registry/dpf/hypervisor/network-tests/dpf-hypervisor-network-tests-commands.sh"
if [ -f "$FILE" ]; then
  wc -l "$FILE"
  cat -n "$FILE" | sed -n '1,40p'
else
  printf 'MISSING: %s\n' "$FILE"
fi

printf '\nAll worker-dpu references in tracked files:\n'
rg -n -C3 'worker-dpu|TFT_SERVER_NODE|TFT_CLIENT_NODE' . --glob '!*.png' --glob '!*.jpg' --glob '!*.svg' --glob '!node_modules/**' 2>/dev/null | sed -n '1,220p'

Repository: openshift/release

Length of output: 3145


🏁 Script executed:

#!/bin/bash
set -u

printf 'Shell pipeline/substitution behavior probe:\n'
tmpdir="$(mktemp -d)"
cd "$tmpdir" || exit 1
cat >probe.sh <<'SH'
set -euo pipefail
export TFT_SERVER_NODE=$(false | true | true; printf 'ok')
echo "TFT_SERVER_NODE='${TFT_SERVER_NODE}'"
echo "shell exited"
SH
if bash probe.sh 2>/tmp/err.txt; then
  printf 'script succeeded\n'
else
  printf 'script failed\n'
fi
cat /tmp/err.txt 2>/dev/null || true

cat >probe2.sh <<'SH'
set -euo pipefail
export TFT_SERVER_NODE=$(grep worker-dpu /dev/null | awk 'NR==1 {print $1}')
echo "TFT_SERVER_NODE='${TFT_SERVER_NODE}'"
echo "shell exited"
SH
if bash probe2.sh 2>/tmp/err2.txt; then
  printf 'script succeeded\n'
else
  printf 'script failed\n'
fi
cat /tmp/err2.txt 2>/dev/null || true

printf '\nCluster metadata references in step registry configs/data:\n'
rg -n -i -C2 'dpu|worker-dpu' ci-operator/step-registry/dpf ci-operator 2>/dev/null | sed -n '1,240p'

Repository: openshift/release

Length of output: 359


Validate the DPU node selection before running traffic-flow tests.

export VAR=$(...) masks the pipeline exit status, so this can finish with empty TFT_SERVER_NODE or TFT_CLIENT_NODE when fewer than two worker-dpu nodes are returned by oc get nodes. Set the variables separately and exit fast if either one is empty, before make run-traffic-flow-tests.

🧰 Tools
🪛 Shellcheck (0.11.0)

[warning] 9-9: Declare and assign separately to avoid masking return values.

(SC2155)


[warning] 11-11: Declare and assign separately to avoid masking return values.

(SC2155)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@ci-operator/step-registry/dpf/hypervisor/network-tests/dpf-hypervisor-network-tests-commands.sh`
around lines 9 - 12, Update the TFT_SERVER_NODE and TFT_CLIENT_NODE setup to
assign the command results separately, then validate both variables are
non-empty before running make run-traffic-flow-tests. Exit immediately with an
appropriate error when fewer than two worker-dpu nodes are available, while
preserving the existing node-selection and logging behavior.

Source: Linters/SAST tools

Signed-off-by: Jose Castillo Lema <josecastillolema@gmail.com>

    gitleaks.version: 8.30.0
    gitleaks.check-secrets: ENABLED
@mukrishn

Copy link
Copy Markdown
Member

/pj-rehearse network-access-allowed

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

@mukrishn: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

@josecastillolema

Copy link
Copy Markdown
Member Author

/pj-rehearse pull-ci-rh-ecosystem-edge-openshift-dpf-main-network-tests

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

@josecastillolema: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

@josecastillolema

Copy link
Copy Markdown
Member Author

/assign @wabouhamad

Signed-off-by: Jose Castillo Lema <josecastillolema@gmail.com>

    gitleaks.version: 8.30.0
    gitleaks.check-secrets: ENABLED
@openshift-ci

openshift-ci Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: josecastillolema

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
ci-operator/step-registry/dpf/hypervisor/load-kubeconfig/dpf-hypervisor-load-kubeconfig-commands.sh (1)

49-49: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Use an argument array and quote the scp operands.

SSH_OPTS is intentionally split into multiple arguments, but the current unquoted expansions also allow word splitting and glob expansion in REMOTE_HOST and LAST_OPENSHIFT_DPF. Define SSH_OPTS as an array and quote the remote source path. Apply the same array form to the other SSH and SCP calls.

Proposed fix
-SSH_OPTS="-i /tmp/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -o ConnectTimeout=30 -o ServerAliveInterval=10 -o ServerAliveCountMax=3 -o BatchMode=yes"
+SSH_OPTS=(
+    -i /tmp/id_rsa
+    -o StrictHostKeyChecking=no
+    -o UserKnownHostsFile=/dev/null
+    -o LogLevel=ERROR
+    -o ConnectTimeout=30
+    -o ServerAliveInterval=10
+    -o ServerAliveCountMax=3
+    -o BatchMode=yes
+)
...
-scp ${SSH_OPTS} root@${REMOTE_HOST}:${LAST_OPENSHIFT_DPF}/.env "${SHARED_DIR}/.env"
+scp "${SSH_OPTS[@]}" "root@${REMOTE_HOST}:${LAST_OPENSHIFT_DPF}/.env" "${SHARED_DIR}/.env"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@ci-operator/step-registry/dpf/hypervisor/load-kubeconfig/dpf-hypervisor-load-kubeconfig-commands.sh`
at line 49, Update the SSH/SCP invocations in the load-kubeconfig script to use
an argument array for SSH_OPTS, preserving intentional option splitting while
preventing word splitting and glob expansion elsewhere. Apply the array form
consistently to all SSH and SCP calls, and quote the REMOTE_HOST and
LAST_OPENSHIFT_DPF-based operands, including the remote source path in the shown
scp command.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In
`@ci-operator/step-registry/dpf/hypervisor/load-kubeconfig/dpf-hypervisor-load-kubeconfig-commands.sh`:
- Line 49: Update the SSH/SCP invocations in the load-kubeconfig script to use
an argument array for SSH_OPTS, preserving intentional option splitting while
preventing word splitting and glob expansion elsewhere. Apply the array form
consistently to all SSH and SCP calls, and quote the REMOTE_HOST and
LAST_OPENSHIFT_DPF-based operands, including the remote source path in the shown
scp command.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: eda4f423-d9f8-470f-b37a-894eb53440e9

📥 Commits

Reviewing files that changed from the base of the PR and between 7bf25fb and b147e38.

📒 Files selected for processing (2)
  • ci-operator/step-registry/dpf/hypervisor/load-kubeconfig/dpf-hypervisor-load-kubeconfig-commands.sh
  • ci-operator/step-registry/dpf/hypervisor/network-tests/dpf-hypervisor-network-tests-commands.sh
🚧 Files skipped from review as they are similar to previous changes (1)
  • ci-operator/step-registry/dpf/hypervisor/network-tests/dpf-hypervisor-network-tests-commands.sh

@openshift-merge-bot openshift-merge-bot Bot removed the rehearsals-ack Signifies that rehearsal jobs have been acknowledged label Aug 3, 2026
@openshift-merge-bot

Copy link
Copy Markdown
Contributor

[REHEARSALNOTIFIER]
@josecastillolema: the pj-rehearse plugin accommodates running rehearsal tests for the changes in this PR. Expand 'Interacting with pj-rehearse' for usage details. The following rehearsable tests have been affected by this change:

Test name Repo Type Reason
pull-ci-rh-ecosystem-edge-openshift-dpf-main-conformance rh-ecosystem-edge/openshift-dpf presubmit Registry content changed
pull-ci-rh-ecosystem-edge-openshift-dpf-release-4.22-conformance rh-ecosystem-edge/openshift-dpf presubmit Registry content changed

The following jobs are not rehearsable without the network-access-rehearsals-ok, and approved labels present on this PR. This is due to the restrict_network_access field being set to false. The network-access-rehearsals-ok label can be added by any openshift org member other than the PR's author by commenting: /pj-rehearse network-access-allowed:

Test name
pull-ci-rh-ecosystem-edge-openshift-dpf-main-network-tests
pull-ci-rh-ecosystem-edge-openshift-dpf-release-4.22-network-tests
Interacting with pj-rehearse

Comment: /pj-rehearse to run up to 5 rehearsals
Comment: /pj-rehearse skip to opt-out of rehearsals
Comment: /pj-rehearse {test-name}, with each test separated by a space, to run one or more specific rehearsals
Comment: /pj-rehearse more to run up to 10 rehearsals
Comment: /pj-rehearse max to run up to 25 rehearsals
Comment: /pj-rehearse auto-ack to run up to 5 rehearsals, and add the rehearsals-ack label on success
Comment: /pj-rehearse list to get an up-to-date list of affected jobs
Comment: /pj-rehearse abort to abort all active rehearsals
Comment: /pj-rehearse network-access-allowed to allow rehearsals of tests that have the restrict_network_access field set to false. This must be executed by an openshift org member who is not the PR author

Once you are satisfied with the results of the rehearsals, comment: /pj-rehearse ack to unblock merge. When the rehearsals-ack label is present on your PR, merge will no longer be blocked by rehearsals.
If you would like the rehearsals-ack label removed, comment: /pj-rehearse reject to re-block merging.

@linoyaslan

Copy link
Copy Markdown
Contributor

/pj-rehearse network-access-allowed

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

@linoyaslan: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

@josecastillolema

Copy link
Copy Markdown
Member Author

/pj-rehearse pull-ci-rh-ecosystem-edge-openshift-dpf-main-network-tests

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

@josecastillolema: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

@josecastillolema

Copy link
Copy Markdown
Member Author

/pj-rehearse pull-ci-rh-ecosystem-edge-openshift-dpf-main-network-tests

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

@josecastillolema: now processing your pj-rehearse request. Please allow up to 10 minutes for jobs to trigger or cancel.

@openshift-ci

openshift-ci Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

@josecastillolema: The following test failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/rehearse/rh-ecosystem-edge/openshift-dpf/main/network-tests b147e38 link unknown /pj-rehearse pull-ci-rh-ecosystem-edge-openshift-dpf-main-network-tests

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. network-access-rehearsals-ok

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants