Skip to content

feat(kubevirt): add vm_troubleshoot as an MCP Tool#365

Closed
sradco wants to merge 4 commits into
openshift:mainfrom
sradco:feat/vm-troubleshoot-tool
Closed

feat(kubevirt): add vm_troubleshoot as an MCP Tool#365
sradco wants to merge 4 commits into
openshift:mainfrom
sradco:feat/vm-troubleshoot-tool

Conversation

@sradco

@sradco sradco commented Jun 29, 2026

Copy link
Copy Markdown

Summary

  • Adds vm_troubleshoot as a proper MCP Tool (in addition to the existing vm-troubleshoot Prompt)
  • Enriches the diagnostic report with DataVolume/PVC status and cloud-init configuration extraction
  • Includes comprehensive unit tests (25 test cases)
  • Improves tool description for better LLM tool selection/filtering

Motivation

The existing vm-troubleshoot is registered only as an MCP Prompt. MCP Prompts are user-facing templates that must be explicitly selected — LLMs cannot autonomously call them during conversations. When a user asks OLS "why is my VM not starting?", the LLM has no way to invoke the troubleshooting logic unless the user manually selects the prompt.

By exposing the same diagnostic functionality as a Tool, the LLM can proactively gather VM diagnostic data when it determines troubleshooting is needed, enabling a much better user experience.

Testing Results (OLS + Troubleshooting Mode)

Tested against 3 broken VM scenarios with the kubevirt toolset enabled:

Model Scenario Root Cause Found
gpt-5.2 VM stuck Provisioning (missing StorageClass) Yes — identified premium-nvme-storage doesn't exist
gpt-5.2 VM crashloop (cloud-init shutdown -h now) Yes — found the runcmd entry
gpt-5.2 Migration failure (nodeSelector pinning) Yes — identified hostname nodeSelector
gpt-4o-mini Same scenarios (with explicit tool hint) 2/3 (missed cloud-init)

The DataVolume/PVC and cloud-init enrichment directly addresses the gpt-4o-mini gap — the data is now in the report without needing separate tool calls.

Changes

File Change
pkg/toolsets/kubevirt/vm/troubleshoot/tool.go New tool + DataVolume/PVC status + cloud-init extraction
pkg/toolsets/kubevirt/vm/troubleshoot/tool_test.go 25 unit tests covering all helpers
pkg/toolsets/kubevirt/toolset.go Register the new tool in GetTools()
pkg/mcp/testdata/toolsets-kubevirt-tools.json Updated snapshot with new description

Diagnostic Report Sections

The tool returns a structured markdown report with:

  1. VirtualMachine Status — conditions, printableStatus
  2. VirtualMachineInstance Status — phase, nodeName, conditions
  3. Volumes — configured disk volumes
  4. DataVolume/PVC Status — binding state, StorageClass, CDI errors
  5. Cloud-Init Configuration — userData/networkData content
  6. virt-launcher Pod — pod state and container status
  7. Pod Logs — last 50 lines from compute container
  8. Events — VM/VMI related events

Backward Compatibility

The existing vm-troubleshoot Prompt is preserved unchanged for clients that use the MCP prompts interface.

Test plan

  • Unit tests for tool registration, schema, and annotations
  • Unit tests for all helper functions (fetchVMStatus, fetchVMIStatus, fetchVolumes, fetchVirtLauncherPod, fetchVirtLauncherPodLogs, fetchDataVolumeStatus, extractCloudInit)
  • Verified OLS in mode: troubleshooting proactively invokes the tool when asked about VM issues
  • Tested with gpt-5.2 and gpt-4o-mini against real broken VM scenarios
  • CI integration tests (envtest)

@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@sradco, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 41 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 7c1c38bd-c2ae-4314-9471-b9ba19043063

📥 Commits

Reviewing files that changed from the base of the PR and between 66a319c and 82e6e6d.

📒 Files selected for processing (2)
  • pkg/toolsets/kubevirt/vm/troubleshoot/tool.go
  • pkg/toolsets/kubevirt/vm/troubleshoot/tool_test.go
📝 Walkthrough

Walkthrough

Adds a new vm_troubleshoot KubeVirt tool that collects VM diagnostics into one markdown report. It is registered in the kubevirt toolset, snapshot-tested in JSON, and covered by a new suite for metadata and helper behavior.

Changes

VM troubleshooting tool

Layer / File(s) Summary
Tool registration and snapshot
pkg/toolsets/kubevirt/vm/troubleshoot/tool.go, pkg/toolsets/kubevirt/toolset.go, pkg/mcp/testdata/toolsets-kubevirt-tools.json
Defines vm_troubleshoot metadata, wires it into Toolset.GetTools(), and updates the tool snapshot.
Report assembly and status/volume helpers
pkg/toolsets/kubevirt/vm/troubleshoot/tool.go
Builds the troubleshooting report from VM and VMI status plus volume data, including fallback handling and markdown rendering.
Pods, logs, events, and data volumes
pkg/toolsets/kubevirt/vm/troubleshoot/tool.go
Adds virt-launcher pod discovery, pod logs, related event aggregation, DataVolume/PVC lookup, and cloud-init extraction.
Troubleshooting tool tests
pkg/toolsets/kubevirt/vm/troubleshoot/tool_test.go
Covers registration and helper outputs across found, missing, and empty-state cases.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

Poem

🐇 A bunny peeks at pods and logs,
And follows events through KubeVirt fogs.
One markdown report, crisp and bright,
With VM clues gathered left and right.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: adding the vm_troubleshoot MCP tool for KubeVirt.
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ 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 commented Jun 29, 2026

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: sradco
Once this PR has been reviewed and has the lgtm label, please assign matzew for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found 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

The existing vm-troubleshoot functionality is registered only as an
MCP Prompt, which requires explicit user invocation. LLMs connected
via OLS cannot autonomously call Prompts during conversations.

Add vm_troubleshoot as a proper MCP Tool so that LLMs can proactively
invoke it when a user asks about VM issues. The tool collects the same
diagnostic data (VM status, VMI status, volumes, virt-launcher pod,
pod logs, and events) and returns a structured diagnostic report.

The Prompt is preserved for backward compatibility with clients that
use the MCP prompts interface.

Signed-off-by: Shirly Radco <sradco@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@sradco
sradco force-pushed the feat/vm-troubleshoot-tool branch from 41bf6a8 to 1dece99 Compare June 29, 2026 09:23
@Cali0707

Copy link
Copy Markdown

Hey @sradco any reasons this PR isn't going to the upstream repo?

Cover tool registration, schema validation, and all helper functions:
- fetchVMStatus: VM found, not found, no status field
- fetchVMIStatus: VMI found, not found
- fetchVolumes: from VM, fallback to VMI, nil/empty
- fetchVirtLauncherPod: pod found, not found
- fetchVirtLauncherPodLogs: nil/empty pod names

Signed-off-by: Shirly Radco <sradco@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 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 `@pkg/toolsets/kubevirt/vm/troubleshoot/tool_test.go`:
- Around line 55-112: The suite is testing private helpers like fetchVMStatus
directly instead of the public MCP entrypoint. Rewrite these cases to invoke
Tools()[0].Handler and assert on the returned report/output so the tests cover
the real surface area and final assembly. Keep the same scenarios (VM exists,
not found, no status) but drive them through the tool handler and its public
inputs/outputs rather than unexported functions.

In `@pkg/toolsets/kubevirt/vm/troubleshoot/tool.go`:
- Around line 217-225: The log collection in the VM troubleshooting flow is
hardcoded to the compute container, so it misses the failing virt-launcher
container when compute never starts. Update the logic in the troubleshooting
tool’s pod log loop to target the actual failing virt-launcher containers
instead of only using containerName := "compute", and make sure the output still
labels each pod/container clearly when calling core.PodsLog and formatting the
result.
- Around line 252-265: The current fetchEvents path in troubleshoot/tool.go
scans all namespace events with core.EventsList and filters client-side, which
is too broad. Update fetchEvents to accept the known VM/VMI/virt-launcher object
names from the caller and use those names to query events directly instead of
iterating every event in the namespace. Keep the related event filtering logic
tied to the existing symbols fetchEvents, core.EventsList, vmName, and
relatedEvents, but narrow the lookup to the specific objects being troubleshot.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 443b67f7-5dcc-477c-8fd5-9de9d72a0c14

📥 Commits

Reviewing files that changed from the base of the PR and between dc9c67b and e03699b.

📒 Files selected for processing (4)
  • pkg/mcp/testdata/toolsets-kubevirt-tools.json
  • pkg/toolsets/kubevirt/toolset.go
  • pkg/toolsets/kubevirt/vm/troubleshoot/tool.go
  • pkg/toolsets/kubevirt/vm/troubleshoot/tool_test.go

Comment on lines +55 to +112
func (s *TroubleshootToolSuite) TestFetchVMStatus() {
ctx := context.Background()
gvrToListKind := map[schema.GroupVersionResource]string{
kubevirt.VirtualMachineGVR: "VirtualMachineList",
}

s.Run("returns status when VM exists", func() {
testVM := &unstructured.Unstructured{}
testVM.SetUnstructuredContent(map[string]interface{}{
"apiVersion": "kubevirt.io/v1",
"kind": "VirtualMachine",
"metadata": map[string]interface{}{
"name": "test-vm",
"namespace": "test-ns",
},
"status": map[string]interface{}{
"printableStatus": "Running",
"ready": true,
},
})

client := fake.NewSimpleDynamicClientWithCustomListKinds(runtime.NewScheme(), gvrToListKind, testVM)
result, vm := fetchVMStatus(ctx, client, "test-ns", "test-vm")

s.Contains(result, "## VirtualMachine Status: test-ns/test-vm")
s.Contains(result, "printableStatus")
s.Contains(result, "Running")
s.NotNil(vm)
})

s.Run("returns error when VM not found", func() {
client := fake.NewSimpleDynamicClientWithCustomListKinds(runtime.NewScheme(), gvrToListKind)
result, vm := fetchVMStatus(ctx, client, "test-ns", "nonexistent")

s.Contains(result, "## VirtualMachine")
s.Contains(result, "Error")
s.Nil(vm)
})

s.Run("handles VM with no status field", func() {
testVM := &unstructured.Unstructured{}
testVM.SetUnstructuredContent(map[string]interface{}{
"apiVersion": "kubevirt.io/v1",
"kind": "VirtualMachine",
"metadata": map[string]interface{}{
"name": "test-vm",
"namespace": "test-ns",
},
"spec": map[string]interface{}{},
})

client := fake.NewSimpleDynamicClientWithCustomListKinds(runtime.NewScheme(), gvrToListKind, testVM)
result, vm := fetchVMStatus(ctx, client, "test-ns", "test-vm")

s.Contains(result, "No status found")
s.NotNil(vm)
})
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟠 Major | 🏗️ Heavy lift

Drive this suite through Tools()[0].Handler, not the private helpers.

Most of this file is white-box testing fetchVMStatus, fetchVMIStatus, fetchVolumes, and the other unexported helpers directly. That couples the suite to implementation details while leaving the actual MCP surface and final report assembly uncovered.

As per coding guidelines, "**/*_test.go: Test the public API only - tests should be black-box and not access internal/private functions`."

Also applies to: 114-152, 154-261, 263-316

🤖 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 `@pkg/toolsets/kubevirt/vm/troubleshoot/tool_test.go` around lines 55 - 112,
The suite is testing private helpers like fetchVMStatus directly instead of the
public MCP entrypoint. Rewrite these cases to invoke Tools()[0].Handler and
assert on the returned report/output so the tests cover the real surface area
and final assembly. Keep the same scenarios (VM exists, not found, no status)
but drive them through the tool handler and its public inputs/outputs rather
than unexported functions.

Source: Coding guidelines

Comment on lines +217 to +225
containerName := "compute"
for _, podName := range podNames {
logs, err := core.PodsLog(ctx, namespace, podName, containerName, false, 50)
if err != nil {
fmt.Fprintf(&result, "### %s\n\n*Error fetching logs: %v*\n\n", podName, err)
continue
}
fmt.Fprintf(&result, "### %s (container: %s)\n\n```\n%s\n```\n\n", podName, containerName, logs)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Collect logs from the failing virt-launcher containers, not just compute.

When the VM never reaches the compute container, this path returns no actionable logs for the exact "not starting" cases the tool is supposed to diagnose. Init/sidecar containers are often where the failure is.

🤖 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 `@pkg/toolsets/kubevirt/vm/troubleshoot/tool.go` around lines 217 - 225, The
log collection in the VM troubleshooting flow is hardcoded to the compute
container, so it misses the failing virt-launcher container when compute never
starts. Update the logic in the troubleshooting tool’s pod log loop to target
the actual failing virt-launcher containers instead of only using containerName
:= "compute", and make sure the output still labels each pod/container clearly
when calling core.PodsLog and formatting the result.

Comment thread pkg/toolsets/kubevirt/vm/troubleshoot/tool.go Outdated
… diagnostics

Add two targeted diagnostic sections to the vm_troubleshoot report:

- DataVolume/PVC status: shows binding state, StorageClass references,
  and CDI error conditions (e.g., ErrClaimNotValid for missing
  StorageClasses)
- Cloud-init configuration: extracts and displays userData/networkData
  content from cloudInitNoCloud and cloudInitConfigDrive volumes

These additions address gaps identified during OLS testing where
gpt-4o-mini could not identify root causes (missing StorageClass,
shutdown command in cloud-init) because the data wasn't in the
diagnostic report.

Also improves the tool description to better signal its value for
tool filtering/ranking by smaller models.

Signed-off-by: Shirly Radco <sradco@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 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 `@pkg/toolsets/kubevirt/vm/troubleshoot/tool.go`:
- Around line 391-397: Redact the inline cloud-init payloads in the report
generation path: in the code that reads ciData["userData"] and
ciData["networkData"] inside the troubleshooting report builder, stop embedding
the raw YAML contents in the result. Instead, replace the current fmt.Fprintf
output with a safe summary that reports presence and size (or a
redacted/filtered summary of sensitive keys) so userData and networkData are
never returned verbatim.
- Around line 310-316: Gate the PVC lookup in the DataVolume troubleshooting
path on apierrors.IsNotFound(err) inside the kubevirt VM troubleshoot flow,
rather than retrying on every Get failure. In the block around
dynamicClient.Resource(...).Get and the subsequent PVC fetch, only fall back to
PersistentVolumeClaimGVR when the DataVolume error is a true NotFound; for RBAC,
timeout, or transport errors, report the original error directly and skip the
PVC retry. Use the existing dv, err, pvcErr variables in troubleshoot handling
to keep the logic localized.
- Around line 291-293: In fetchDataVolumeStatus and extractCloudInit, do not
treat unstructured.NestedSlice extraction/type errors as empty state; handle the
err return from NestedSlice separately before the !found/len==0 fallback. If the
vm.Object or VMI volume data is malformed, return a schema/type error message
instead of “No dataVolumeTemplates defined…” or “No volumes found,” and keep the
existing empty-state text only for the true no-data case.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: f9a71ad6-3688-47fd-9b97-1c68198bea52

📥 Commits

Reviewing files that changed from the base of the PR and between e03699b and 66a319c.

📒 Files selected for processing (3)
  • pkg/mcp/testdata/toolsets-kubevirt-tools.json
  • pkg/toolsets/kubevirt/vm/troubleshoot/tool.go
  • pkg/toolsets/kubevirt/vm/troubleshoot/tool_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • pkg/mcp/testdata/toolsets-kubevirt-tools.json

Comment on lines +291 to +293
dvTemplates, found, err := unstructured.NestedSlice(vm.Object, "spec", "dataVolumeTemplates")
if err != nil || !found || len(dvTemplates) == 0 {
return "## DataVolume/PVC Status\n\n*No dataVolumeTemplates defined in VM spec*"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="pkg/toolsets/kubevirt/vm/troubleshoot/tool.go"

echo "== line count =="
wc -l "$FILE"

echo "== around 260-320 =="
sed -n '260,320p' "$FILE" | cat -n

echo "== around 340-390 =="
sed -n '340,390p' "$FILE" | cat -n

echo "== NestedSlice occurrences =="
rg -n "NestedSlice|No dataVolumeTemplates defined|No volumes found|dataVolumeTemplates|volumes" "$FILE"

Repository: openshift/openshift-mcp-server

Length of output: 6335


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="pkg/toolsets/kubevirt/vm/troubleshoot/tool.go"

echo "== around 140-180 =="
sed -n '140,180p' "$FILE" | cat -n

echo "== around 400-412 =="
sed -n '400,412p' "$FILE" | cat -n

Repository: openshift/openshift-mcp-server

Length of output: 2196


🌐 Web query:

kubectl unstructured.NestedSlice error returns malformed type intermediate field documentation

💡 Result:

The error message related to unstructured.NestedSlice typically manifests as an accessor error when the data structure at the specified path does not match the expected type, specifically when it is not a []interface{} [1][2]. When using functions like NestedSlice from the k8s.io/apimachinery/pkg/apis/meta/v1/unstructured package, the function performs a type assertion on the retrieved value [1][3]. If the value exists but is not of type []interface{}, the function returns an error formatted as: %v accessor error: %v is of the type %T, expected []interface{} [1][2] This indicates that while the path was traversed, the leaf node (or intermediate node if incorrectly identified) contains a different Go type than what is required for a slice [1][2]. Common causes for this type mismatch include: 1. Data type inconsistency: The data may have been unmarshaled using a standard JSON library (which often defaults numbers to float64) instead of the Kubernetes-specific apimachinery JSON decoder, leading to type expectation failures [4]. 2. Incorrect pathing: The provided field path might be targeting a field that is not a slice, or the path structure in the map[string]interface{} object does not align with the expected schema [1][2]. 3. Intermediate field issues: The error specifically arises when the target field is reached but fails the final type assertion. While documentation refers to this as an accessor error, it confirms that the target location holds data incompatible with slice operations [1]. To resolve this, inspect the underlying map[string]interface{} structure to verify the actual type stored at the target path, or use NestedFieldNoCopy to retrieve the interface{} value directly and perform a manual type assertion [4].

Citations:


Handle NestedSlice errors before empty-state fallbacks. fetchDataVolumeStatus currently turns extraction/type errors into “No dataVolumeTemplates defined…”, and extractCloudInit drops the error entirely before falling back to “No volumes found.” Malformed VM/VMI objects should surface the schema/type problem instead of looking empty.

🤖 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 `@pkg/toolsets/kubevirt/vm/troubleshoot/tool.go` around lines 291 - 293, In
fetchDataVolumeStatus and extractCloudInit, do not treat
unstructured.NestedSlice extraction/type errors as empty state; handle the err
return from NestedSlice separately before the !found/len==0 fallback. If the
vm.Object or VMI volume data is malformed, return a schema/type error message
instead of “No dataVolumeTemplates defined…” or “No volumes found,” and keep the
existing empty-state text only for the true no-data case.

Source: Coding guidelines

Comment thread pkg/toolsets/kubevirt/vm/troubleshoot/tool.go
Comment thread pkg/toolsets/kubevirt/vm/troubleshoot/tool.go Outdated
- Replace namespace-wide event scan with targeted field selectors
- Gate PVC fallback on apierrors.IsNotFound only
- Redact sensitive cloud-init fields (passwords, SSH keys, tokens)

Signed-off-by: Sagi Radco <sradco@redhat.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@sradco

sradco commented Jun 29, 2026

Copy link
Copy Markdown
Author

Good point @Cali0707 — you're right that the kubevirt toolset isn't OpenShift-specific and should live upstream.

I've moved this work to the upstream repo: containers#1239

That PR includes the same functionality plus additional fixes based on CodeRabbit feedback:

  • Targeted event collection using field selectors (no namespace-wide scan)
  • PVC fallback gated on NotFound only (not all errors)
  • Cloud-init sensitive field redaction (passwords, SSH keys, tokens)

I'll close this PR once the upstream one is reviewed/merged and flows back downstream. Thanks for the guidance!

@sradco

sradco commented Jun 29, 2026

Copy link
Copy Markdown
Author

Closing in favor of the upstream PR: containers#1239

@sradco sradco closed this Jun 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants