Hcp kubevirt oz ci - #83224
Conversation
- Add openshift-e2e-libvirt-upi-ipv6-disconnected (VPN path) mirroring VPN install/test/post plus optional oc adm release mirror from CI. - Add upi-libvirt-s390x-ipv6-disconnected-release-mirror ref and s390x dir. - Add IPV6_SINGLESTACK support in upi-conf-libvirt and network steps for IPv6-only lease-driven install-config and network.xml. - Wire ocp-e2e-ovn-upi-remote-libvirt-ipv6-disconnected-s390x periodic in openshift-multiarch-main__nightly-4.22 with image-ecosystem and USE_EXTERNAL_DNS. Made-with: Cursor
Align workflow and ref names with ci-operator path-derived prefixes: - Rename openshift-e2e-libvirt-upi-ipv6-disconnected to openshift-e2e-libvirt-vpn-ipv6-disconnected under vpn/ipv6-disconnected. - Rename upi-libvirt-s390x-ipv6-disconnected-release-mirror ref and use upi-libvirt-s390x-ipv6-disconnected-commands.sh per registry rules. Update multiarch nightly config and regenerate periodic jobs.
Ipv6 registry naming fix
Signed-off-by: Sumit Solanki <sumit.solanki@ibm.com>
WalkthroughAdded scheduled s390x IPv6-disconnected and HCP libvirt tests. Added IPv6 single-stack UPI network generation, agent-install validation, and optional disconnected release mirroring. Changess390x libvirt test coverage
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant ScheduledJob
participant IPv6Workflow
participant UPIIPv6Step
participant ReleaseMirror
participant SharedStorage
ScheduledJob->>IPv6Workflow: Start scheduled IPv6-disconnected test
IPv6Workflow->>UPIIPv6Step: Run UPI preparation
UPIIPv6Step->>ReleaseMirror: Execute oc adm release mirror
ReleaseMirror-->>UPIIPv6Step: Return mirrored release pullspec and log
UPIIPv6Step->>SharedStorage: Write pullspec and install-config fragments
IPv6Workflow->>UPIIPv6Step: Continue IPv6 libvirt installation and testing
Possibly related PRs
Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 error, 1 warning, 1 inconclusive)
✅ Passed checks (12 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: isumitsolanki The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
|
/ok-to-test |
|
[REHEARSALNOTIFIER]
A total of 166 jobs have been affected by this change. The above listing is non-exhaustive and limited to 25 jobs. A full list of affected jobs can be found here Interacting with pj-rehearseComment: Once you are satisfied with the results of the rehearsals, comment: |
There was a problem hiding this comment.
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/config/openshift/multiarch/openshift-multiarch-main__nightly-4.22.yaml`:
- Around line 467-475: Add IPV6_SINGLESTACK set to "true" in the environment for
the job using the openshift-e2e-libvirt-vpn-ipv6-disconnected workflow,
alongside the existing ARCH and network configuration variables.
In
`@ci-operator/step-registry/upi/libvirt/s390x/ipv6-disconnected/upi-libvirt-s390x-ipv6-disconnected-commands.sh`:
- Around line 58-77: Update the workflow after the mirror fragments are
generated so the later configuration step consumes them before installation:
ensure upi-conf-libvirt applies the mirrored release image from
mirrored-release-image.txt and merges install-config-mirror-fragment.yaml into
install-config.yaml, while preserving the existing behavior when
ENABLE_RELEASE_MIRROR is false. Keep upi-install-libvirt’s copy-only behavior
unchanged.
🪄 Autofix
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: fae0a518-614c-425c-8c70-aca13bd6f33e
⛔ Files ignored due to path filters (1)
ci-operator/jobs/openshift/multiarch/openshift-multiarch-main-periodics.yamlis excluded by!ci-operator/jobs/**
📒 Files selected for processing (16)
ci-operator/config/openshift/multiarch/openshift-multiarch-main__nightly-4.22.yamlci-operator/config/openshift/multiarch/openshift-multiarch-main__nightly-5.0.yamlci-operator/step-registry/openshift/e2e/libvirt/vpn/hcp/OWNERSci-operator/step-registry/openshift/e2e/libvirt/vpn/hcp/openshift-e2e-libvirt-vpn-hcp-workflow.metadata.jsonci-operator/step-registry/openshift/e2e/libvirt/vpn/hcp/openshift-e2e-libvirt-vpn-hcp-workflow.yamlci-operator/step-registry/openshift/e2e/libvirt/vpn/ipv6-disconnected/OWNERSci-operator/step-registry/openshift/e2e/libvirt/vpn/ipv6-disconnected/openshift-e2e-libvirt-vpn-ipv6-disconnected-workflow.metadata.jsonci-operator/step-registry/openshift/e2e/libvirt/vpn/ipv6-disconnected/openshift-e2e-libvirt-vpn-ipv6-disconnected-workflow.yamlci-operator/step-registry/upi/conf/libvirt/network/upi-conf-libvirt-network-commands.shci-operator/step-registry/upi/conf/libvirt/network/upi-conf-libvirt-network-ref.yamlci-operator/step-registry/upi/conf/libvirt/upi-conf-libvirt-commands.shci-operator/step-registry/upi/conf/libvirt/upi-conf-libvirt-ref.yamlci-operator/step-registry/upi/libvirt/s390x/ipv6-disconnected/OWNERSci-operator/step-registry/upi/libvirt/s390x/ipv6-disconnected/upi-libvirt-s390x-ipv6-disconnected-commands.shci-operator/step-registry/upi/libvirt/s390x/ipv6-disconnected/upi-libvirt-s390x-ipv6-disconnected-ref.metadata.jsonci-operator/step-registry/upi/libvirt/s390x/ipv6-disconnected/upi-libvirt-s390x-ipv6-disconnected-ref.yaml
| env: | ||
| ARCH: s390x | ||
| BRANCH: "4.22" | ||
| ENABLE_RELEASE_MIRROR: "false" | ||
| ETCD_DISK_SPEED: slow | ||
| NODE_TUNING: "true" | ||
| TEST_TYPE: image-ecosystem | ||
| USE_EXTERNAL_DNS: "true" | ||
| workflow: openshift-e2e-libvirt-vpn-ipv6-disconnected |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Enable IPv6 for this IPv6 periodic.
upi-conf-libvirt and upi-conf-libvirt-network default IPV6_SINGLESTACK to "false". This job does not override that value. The workflow therefore uses the IPv4 install-config and network paths.
Add IPV6_SINGLESTACK: "true" to this job environment.
Proposed fix
env:
ARCH: s390x
BRANCH: "4.22"
ENABLE_RELEASE_MIRROR: "false"
ETCD_DISK_SPEED: slow
+ IPV6_SINGLESTACK: "true"
NODE_TUNING: "true"📝 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.
| env: | |
| ARCH: s390x | |
| BRANCH: "4.22" | |
| ENABLE_RELEASE_MIRROR: "false" | |
| ETCD_DISK_SPEED: slow | |
| NODE_TUNING: "true" | |
| TEST_TYPE: image-ecosystem | |
| USE_EXTERNAL_DNS: "true" | |
| workflow: openshift-e2e-libvirt-vpn-ipv6-disconnected | |
| env: | |
| ARCH: s390x | |
| BRANCH: "4.22" | |
| ENABLE_RELEASE_MIRROR: "false" | |
| ETCD_DISK_SPEED: slow | |
| IPV6_SINGLESTACK: "true" | |
| NODE_TUNING: "true" | |
| TEST_TYPE: image-ecosystem | |
| USE_EXTERNAL_DNS: "true" | |
| workflow: openshift-e2e-libvirt-vpn-ipv6-disconnected |
🤖 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/config/openshift/multiarch/openshift-multiarch-main__nightly-4.22.yaml`
around lines 467 - 475, Add IPV6_SINGLESTACK set to "true" in the environment
for the job using the openshift-e2e-libvirt-vpn-ipv6-disconnected workflow,
alongside the existing ARCH and network configuration variables.
There was a problem hiding this comment.
@ibm-adarsh, thank you.
You are interacting with an AI system.
| echo "${target_release_image}" > "${SHARED_DIR}/mirrored-release-image.txt" | ||
| echo "Mirrored release image pullspec written to SHARED_DIR/mirrored-release-image.txt" | ||
|
|
||
| install_patch="${SHARED_DIR}/install-config-mirror-fragment.yaml" | ||
| line_num=$(grep -n "To use the new mirrored repository for upgrades" "${mirror_log}" | head -1 | cut -d: -f1 || true) | ||
| if [[ -n "${line_num}" ]] && [[ "${line_num}" =~ ^[0-9]+$ ]]; then | ||
| install_end_line_num=$((line_num - 3)) | ||
| upgrade_start_line_num=$((line_num + 2)) | ||
| if [[ ${install_end_line_num} -gt 0 ]]; then | ||
| sed -n "/^${regex_keyword}/,${install_end_line_num}p" "${mirror_log}" > "${install_patch}" || true | ||
| fi | ||
| sed -n "${upgrade_start_line_num},\$p" "${mirror_log}" > "${SHARED_DIR}/cluster-mirror-upgrade-fragment.txt" || true | ||
| else | ||
| echo "Could not parse mirror log for install-config fragment; see ${mirror_log}" | ||
| cp "${mirror_log}" "${SHARED_DIR}/release-mirror-full.log" | ||
| fi | ||
|
|
||
| if [[ -f "${install_patch}" ]] && [[ -s "${install_patch}" ]]; then | ||
| echo "--- install-config mirror fragment ---" | ||
| cat "${install_patch}" |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
rg -n -C 4 \
'mirrored-release-image\.txt|install-config-mirror-fragment\.yaml|cluster-mirror-upgrade-fragment\.txt|OPENSHIFT_INSTALL_RELEASE_IMAGE_OVERRIDE|imageContentSources' \
ci-operator/step-registryRepository: openshift/release
Length of output: 50374
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
target='ci-operator/step-registry/upi/libvirt/s390x/ipv6-disconnected/upi-libvirt-s390x-ipv6-disconnected-commands.sh'
printf '%s\n' '--- target references and workflow chain ---'
rg -n -C 5 \
'mirrored-release-image\.txt|install-config-mirror-fragment\.yaml|cluster-mirror-upgrade-fragment\.txt|upi-conf-libvirt|upi-install-libvirt|install-config\.yaml|imageContentSources|imageDigestSources|OPENSHIFT_INSTALL_RELEASE_IMAGE_OVERRIDE' \
"$target" ci-operator/step-registry/upi/libvirt ci-operator/step-registry/upi/conf/libvirt ci-operator/step-registry/upi/install/libvirt 2>/dev/null || true
printf '%s\n' '--- matching files ---'
fd -i 'libvirt|mirror' ci-operator/step-registry/upi | head -200Repository: openshift/release
Length of output: 46485
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' '--- exact output-file consumers across the repository ---'
rg -n -C 3 \
'mirrored-release-image\.txt|install-config-mirror-fragment\.yaml|cluster-mirror-upgrade-fragment\.txt|release-mirror-full\.log' \
. --glob '!*.metadata.json' || true
printf '%s\n' '--- references to the disconnected step and relevant chains ---'
rg -n -C 5 \
'upi-libvirt-s390x-ipv6-disconnected|ipv6-disconnected|upi-conf-libvirt|upi-install-libvirt' \
ci-operator/config ci-operator/jobs ci-operator/step-registry 2>/dev/null || true
printf '%s\n' '--- target script tail ---'
cat -n ci-operator/step-registry/upi/libvirt/s390x/ipv6-disconnected/upi-libvirt-s390x-ipv6-disconnected-commands.sh | sed -n '70,120p'
printf '%s\n' '--- configuration and install tails ---'
cat -n ci-operator/step-registry/upi/conf/libvirt/upi-conf-libvirt-commands.sh | sed -n '110,190p'
cat -n ci-operator/step-registry/upi/install/libvirt/upi-install-libvirt-commands.sh | sed -n '160,230p'Repository: openshift/release
Length of output: 50373
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
python3 - <<'PY'
from pathlib import Path
import re
root = Path(".")
producer = root / "ci-operator/step-registry/upi/libvirt/s390x/ipv6-disconnected/upi-libvirt-s390x-ipv6-disconnected-commands.sh"
workflow = root / "ci-operator/step-registry/openshift/e2e/libvirt/vpn/ipv6-disconnected/openshift-e2e-libvirt-vpn-ipv6-disconnected-workflow.yaml"
conf = root / "ci-operator/step-registry/upi/conf/libvirt/upi-conf-libvirt-commands.sh"
install = root / "ci-operator/step-registry/upi/install/libvirt/upi-install-libvirt-commands.sh"
outputs = [
"mirrored-release-image.txt",
"install-config-mirror-fragment.yaml",
"cluster-mirror-upgrade-fragment.txt",
]
tracked = {p: {"producer": [], "consumer": []} for p in outputs}
files = [p for p in root.rglob("*") if p.is_file() and ".git" not in p.parts]
for path in files:
try:
text = path.read_text(errors="replace")
except OSError:
continue
for name in outputs:
if name not in text:
continue
for line_no, line in enumerate(text.splitlines(), 1):
if name in line:
role = "producer" if path == producer and (">" in line or ">" in line) else "consumer"
if path != producer:
role = "consumer"
tracked[name][role].append(f"{path}:{line_no}: {line.strip()}")
print("OUTPUT_USAGE")
for name, roles in tracked.items():
print(f"{name}")
print(f" producers={len(roles['producer'])}")
for item in roles["producer"]:
print(f" {item}")
print(f" consumers={len(roles['consumer'])}")
for item in roles["consumer"]:
print(f" {item}")
workflow_lines = workflow.read_text(errors="replace").splitlines()
mirror_line = next((i + 1 for i, line in enumerate(workflow_lines)
if "upi-libvirt-s390x-ipv6-disconnected" in line), None)
conf_line = next((i + 1 for i, line in enumerate(workflow_lines)
if "chain: upi-conf-libvirt" in line), None)
install_line = next((i + 1 for i, line in enumerate(workflow_lines)
if "chain: upi-install-libvirt" in line), None)
print("WORKFLOW_ORDER")
print(f" mirror={mirror_line}")
print(f" conf={conf_line}")
print(f" install={install_line}")
print(f" mirror_before_conf={mirror_line is not None and conf_line is not None and mirror_line < conf_line}")
for label, path in [("CONF", conf), ("INSTALL", install)]:
text = path.read_text(errors="replace")
print(f"{label}_REFERENCES")
for name in outputs:
print(f" {name}={name in text}")
print(f" writes_install_config={'install-config.yaml' in text}")
PYRepository: openshift/release
Length of output: 1584
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
python3 - <<'PY'
from pathlib import Path
root = Path(".")
producer = root / "ci-operator/step-registry/upi/libvirt/s390x/ipv6-disconnected/upi-libvirt-s390x-ipv6-disconnected-commands.sh"
workflow = root / "ci-operator/step-registry/openshift/e2e/libvirt/vpn/ipv6-disconnected/openshift-e2e-libvirt-vpn-ipv6-disconnected-workflow.yaml"
conf = root / "ci-operator/step-registry/upi/conf/libvirt/upi-conf-libvirt-commands.sh"
install = root / "ci-operator/step-registry/upi/install/libvirt/upi-install-libvirt-commands.sh"
outputs = [
"mirrored-release-image.txt",
"install-config-mirror-fragment.yaml",
"cluster-mirror-upgrade-fragment.txt",
]
tracked = {p: {"producer": [], "consumer": []} for p in outputs}
files = [p for p in root.rglob("*") if p.is_file() and ".git" not in p.parts]
for path in files:
try:
text = path.read_text(errors="replace")
except OSError:
continue
for name in outputs:
for line_no, line in enumerate(text.splitlines(), 1):
if name in line:
role = "producer" if path == producer else "consumer"
tracked[name][role].append(f"{path}:{line_no}: {line.strip()}")
print("OUTPUT_USAGE")
for name, roles in tracked.items():
print(name)
print(f" producers={len(roles['producer'])}")
for item in roles["producer"]:
print(f" {item}")
print(f" consumers={len(roles['consumer'])}")
for item in roles["consumer"]:
print(f" {item}")
workflow_lines = workflow.read_text(errors="replace").splitlines()
mirror_line = next((i + 1 for i, line in enumerate(workflow_lines)
if "upi-libvirt-s390x-ipv6-disconnected" in line), None)
conf_line = next((i + 1 for i, line in enumerate(workflow_lines)
if "chain: upi-conf-libvirt" in line), None)
install_line = next((i + 1 for i, line in enumerate(workflow_lines)
if "chain: upi-install-libvirt" in line), None)
print("WORKFLOW_ORDER")
print(f" mirror={mirror_line}")
print(f" conf={conf_line}")
print(f" install={install_line}")
print(f" mirror_before_conf={mirror_line is not None and conf_line is not None and mirror_line < conf_line}")
for label, path in [("CONF", conf), ("INSTALL", install)]:
text = path.read_text(errors="replace")
print(f"{label}_REFERENCES")
for name in outputs:
print(f" {name}={name in text}")
print(f" writes_install_config={'install-config.yaml' in text}")
PYRepository: openshift/release
Length of output: 1584
Apply the mirror outputs during configuration
When ENABLE_RELEASE_MIRROR=true, no later step reads the mirrored release or configuration fragments. upi-conf-libvirt creates install-config.yaml after the mirror step, and upi-install-libvirt only copies it. Consume these files before installation; otherwise the install uses the original release and lacks imageContentSources.
🤖 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/upi/libvirt/s390x/ipv6-disconnected/upi-libvirt-s390x-ipv6-disconnected-commands.sh`
around lines 58 - 77, Update the workflow after the mirror fragments are
generated so the later configuration step consumes them before installation:
ensure upi-conf-libvirt applies the mirrored release image from
mirrored-release-image.txt and merges install-config-mirror-fragment.yaml into
install-config.yaml, while preserving the existing behavior when
ENABLE_RELEASE_MIRROR is false. Keep upi-install-libvirt’s copy-only behavior
unchanged.
|
@isumitsolanki: The following tests failed, say
Full PR test history. Your PR dashboard. DetailsInstructions 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. |
Summary
openshift-e2e-libvirt-vpn-hcpworkflow (same install/test/cleanup path asopenshift-e2e-libvirt-vpn) for HCP kubevirt CI on IBM Zocp-e2e-ovn-remote-libvirt-multi-z-z-hcp(cron: 0 15 * * 6) usinglibvirt-s390x-vpnFollows Boskos/profile work in #83082 / #83138 for dedicated HCP libvirt capacity.
Test plan
make update/ generated jobs match the config targetci-operator-config/pj-rehearseas needed for the new periodiclibvirt-s390x-vpnand complete installSummary by CodeRabbit
nightly-5.0HCP testing with thelibvirt-s390x-vpncapacity pool.