Skip to content

Implement Stream* RPCs (KEP-5825)#9761

Merged
openshift-merge-bot[bot] merged 1 commit into
cri-o:mainfrom
bitoku:kep5825
Apr 13, 2026
Merged

Implement Stream* RPCs (KEP-5825)#9761
openshift-merge-bot[bot] merged 1 commit into
cri-o:mainfrom
bitoku:kep5825

Conversation

@bitoku

@bitoku bitoku commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Add server-side streaming alternatives to all List* CRI RPCs, as defined in KEP-5825 (CRIListStreaming). These new RPCs stream results one item at a time instead of returning a single large response.

The following streaming RPCs are implemented:

  • StreamContainers (RuntimeService)
  • StreamContainerStats (RuntimeService)
  • StreamPodSandboxes (RuntimeService)
  • StreamPodSandboxStats (RuntimeService)
  • StreamPodSandboxMetrics (RuntimeService)
  • StreamImages (ImageService)

Each existing List handler is refactored to extract the core listing logic into an unexported helper (e.g. listContainers), which is then shared by both the unary List RPC and the new streaming RPC. The streaming handlers iterate over the helper's results and send each item individually via stream.Send.

Vendor dependencies are updated to pick up the new CRI API proto definitions and regenerated gRPC code from k8s.io/cri-api.

What type of PR is this?

/kind feature

What this PR does / why we need it:

This PR implements KEP-5825.

Which issue(s) this PR fixes:

https://kep.k8s.io/5825

Special notes for your reviewer:

Does this PR introduce a user-facing change?

Implement `StreamContainers`, `StreamContainerStats`, `StreamPodSandboxes`, `StreamPodSandboxStats`, `StreamPodSandboxMetrics`, `StreamImages`

Summary by CodeRabbit

Release Notes

  • New Features

    • Added streaming RPC endpoints for containers, images, pod sandboxes, and their associated metrics and statistics.
  • Chores

    • Updated gRPC, Protocol Buffers, and Kubernetes modules to latest versions.
    • Refreshed indirect dependencies for monitoring and observability instrumentation.

@bitoku bitoku requested a review from mrunalp as a code owner February 13, 2026 16:15
@openshift-ci openshift-ci Bot added release-note Denotes a PR that will be considered when it comes time to generate release notes. do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. dco-signoff: yes Indicates the PR's author has DCO signed all their commits. kind/feature Categorizes issue or PR as related to a new feature. labels Feb 13, 2026
@openshift-ci openshift-ci Bot requested review from QiWang19 and klihub February 13, 2026 16:16
@coderabbitai

coderabbitai Bot commented Feb 13, 2026

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR refactors resource listing operations by extracting shared filtering logic into internal helpers and introduces new streaming RPC methods for containers, images, and pod sandboxes across multiple server implementations. It also updates Kubernetes, gRPC, and protobuf dependencies, and adjusts health check context handling.

Changes

Cohort / File(s) Summary
Dependency Updates
go.mod
Updated core networking (gRPC v1.79.1v1.79.3, protobuf v1.36.11v1.36.12-0.20260120151049-f2248ac996af) and Kubernetes modules (k8s.io/* v0.35.xv0.36.0-beta.0); bumped logging, REST, Prometheus, and OpenTelemetry dependencies; removed indirect github.com/mxk/go-flowrate.
Container Streaming & Filtering
server/container_list.go, server/container_stats_list.go
Introduced StreamContainers and StreamContainerStats RPC methods; extracted listContainers() and listContainerStats() helpers returning filtered resource slices; refactored request handling to delegate filtering to helpers and stream results in fixed-size chunks.
Image Streaming & Filtering
server/image_list.go
Added StreamImages RPC method; extracted listImages() helper to centralize filtering and image construction; updated ListImages to use the shared helper instead of inline response building.
Pod Sandbox Streaming & Filtering
server/sandbox_list.go, server/sandbox_stats_list.go, server/sandbox_metrics_list.go
Introduced StreamPodSandboxes, StreamPodSandboxStats, and StreamPodSandboxMetrics RPC methods; extracted listPodSandboxes(), listPodSandboxStats(), and listPodSandboxMetrics() helpers to return filtered resource slices; refactored existing list methods to delegate to helpers and stream new methods to send results in chunks.
Infrastructure
server/server.go, server/health.go
Added streamChunkSize = 3000 package constant; updated checkCRIHealth to pass request context to cri.NewRemoteRuntimeService and context-aware Close() call.

Sequence Diagram

sequenceDiagram
    participant Client
    participant Server
    participant Helper
    participant Stream as gRPC Stream

    Client->>Server: StreamResource(filter)
    Server->>Helper: listResource(ctx, filter)
    Helper->>Helper: Apply filtering logic
    Helper-->>Server: []*Resource (filtered)
    loop Send in chunks (streamChunkSize)
        Server->>Stream: Send(Response{Resource: chunk})
        Stream-->>Client: Receives chunk
    end
    alt Error during Send
        Server-->>Client: Return error
    else Success
        Server-->>Client: Return nil
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested labels

lgtm, approved, kind/other

Suggested reviewers

  • mrunalp
  • klihub
  • hasan4791
  • QiWang19

Poem

🐰 Filtering helpers spring to life,
Streaming chunks flow without strife,
New methods dance in patterns bright,
Refactored code, a cozy sight!
Dependencies updated, all is well,
The pod sandboxes have stories to tell!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 60.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely identifies the primary change: implementing Stream* RPCs as specified in KEP-5825, which aligns perfectly with the changeset's focus on adding server-side streaming alternatives to List* CRI RPCs across multiple services.

✏️ Tip: You can configure your own custom pre-merge checks in the 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 and usage tips.

@bitoku bitoku marked this pull request as draft February 13, 2026 16:16
@codecov

codecov Bot commented Feb 13, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 40.41096% with 87 lines in your changes missing coverage. Please review.
✅ Project coverage is 67.56%. Comparing base (a55ce33) to head (ca4496c).
⚠️ Report is 8 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #9761      +/-   ##
==========================================
- Coverage   67.78%   67.56%   -0.23%     
==========================================
  Files         212      212              
  Lines       29366    29469     +103     
==========================================
+ Hits        19907    19910       +3     
- Misses       7763     7858      +95     
- Partials     1696     1701       +5     
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@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: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
server/sandbox_metrics_list.go (1)

35-49: ⚠️ Potential issue | 🔴 Critical

Fix the inverted condition: the else branch attempts to access fields from a nil result.

On line 36 you check if current := metrics.GetMetric(); current != nil and only enter the else branch when GetMetric() returns nil. Then on line 40 you call metrics.GetMetric().GetContainerMetrics() — but GetMetric() is nil, so this returns an empty slice and the for loop on line 41 never executes. Lines 42–46 are unreachable dead code.

The intended logic appears to be splitting a pod's container metrics into separate entries. However, you cannot retrieve container metrics from a nil GetMetric() result. Check whether the container metrics should be accessed directly from metrics or another source, and fix the condition to correctly distinguish between cases where you append the top-level metric versus when you need to iterate over container-level entries.

🤖 Fix all issues with AI agents
In `@go.mod`:
- Line 261: The go.mod replace directive currently points to a personal fork
(github.com/bitoku/kubernetes) for k8s.io/cri-api using a pseudo-version that is
unavailable and unacceptable for production; update this by either replacing the
directive with an official k8s.io/cri-api release version (preferred), or remove
the replace directive and vendor the dependency into the repo (go mod vendor) so
builds are reproducible, or upstream the streaming RPC changes to the official
Kubernetes repo and switch the replace to the resulting official version. Locate
the replace line for k8s.io/cri-api in go.mod and implement one of these
remedies, ensuring the chosen version is an official tag or vendored copy before
merging.
🧹 Nitpick comments (4)
server/container_stats_list.go (1)

23-41: Streaming collects all results into memory before sending.

The current implementation gathers every stat into a slice, then iterates to stream them. This is functionally correct but doesn't provide backpressure or reduce peak memory — the caller still buffers the full result set. For a WIP/initial implementation this is fine, but to realize the full benefit of KEP-5825 streaming, consider yielding items as they are produced (e.g., via a callback or channel-based approach in the helper) in a follow-up.

server/sandbox_metrics_list.go (1)

16-27: ctx unused — context not propagated to listPodSandboxMetrics.

listPodSandboxMetrics() takes no context.Context parameter, so the ctx extracted from the stream on line 18 (if it were extracted — it's actually not even extracted here) is unused. However, ListPodSandboxMetrics on line 10 receives a ctx but also doesn't pass it. If MetricsForPodSandboxList or ListSandboxes ever needs context (for tracing, cancellation, etc.), this will need updating. As a minor nit, the signature of listPodSandboxMetrics could accept context.Context for consistency with the other helpers (listContainerStats, listPodSandboxStats, listContainers, listImages all take ctx).

server/container_list.go (1)

87-105: StreamContainers doesn't propagate tracing spans unlike ListContainers.

ListContainers (line 74) starts a span via log.StartSpan(ctx), but StreamContainers doesn't. For observability parity, consider starting a span in the streaming path as well (or in the shared listContainers helper).

server/sandbox_list.go (1)

38-57: Duplicate filtering: Created(), state, and label checks run twice.

filterSandboxList (lines 61–114) already filters out sandboxes that aren't Created(), don't match the requested state, and don't match label selectors. Then listPodSandboxes re-checks Created() on line 45 and re-applies state+label filtering via filterSandbox on line 51. The second pass is redundant.

This appears to be pre-existing, but the helper extraction makes it a good time to clean it up — either remove the checks from listPodSandboxes or from filterSandboxList.

Comment thread go.mod Outdated
@openshift-merge-robot openshift-merge-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Feb 17, 2026
@bitoku bitoku force-pushed the kep5825 branch 2 times, most recently from 649c1bc to fc76d03 Compare March 12, 2026 12:14
@openshift-merge-robot openshift-merge-robot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Mar 12, 2026
@bitoku bitoku changed the title WIP: Implement Stream* RPCs (KEP-5825) Implement Stream* RPCs (KEP-5825) Mar 20, 2026
@bitoku bitoku marked this pull request as ready for review March 20, 2026 13:47
@openshift-ci openshift-ci Bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Mar 20, 2026
@openshift-ci openshift-ci Bot requested a review from hasan4791 March 20, 2026 13:47
@bitoku

bitoku commented Mar 20, 2026

Copy link
Copy Markdown
Contributor Author

I will follow up to create integration tests once cri-tools has implementations for them.

@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: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
internal/storage/image.go (1)

877-885: ⚠️ Potential issue | 🔴 Critical

Use new(uint) here.

Line 883 will not compile: new takes a type, not an expression like uint(0). Use new(uint) to allocate a pointer to a zero-initialized uint for the retry count.

Proposed fix
-			MaxRetries:       new(uint(0)),
+			MaxRetries:       new(uint),
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/storage/image.go` around lines 877 - 885, The MaxRetries field in
the libimage.CopyOptions passed to artifactStore.Pull is using an invalid
expression (`new(uint(0))`) which won't compile; change it to allocate a pointer
to a zero-initialized uint (use `new(uint)`) when setting MaxRetries in the
CopyOptions struct passed to artifactStore.Pull so MaxRetries is a *uint
pointing to 0.
server/inspect.go (1)

117-131: ⚠️ Potential issue | 🔴 Critical

Take the address of the HostNetwork value.

Line 130 will not compile. The new() builtin expects a type argument, but sb.HostNetwork() is a method call returning a bool value. Capture the bool value in a local variable and return its address instead.

Proposed fix
 	imageRef := ctr.CRIContainer().GetImageRef()
+	hostNetwork := sb.HostNetwork()
 
 	return types.ContainerInfo{
 		Name:            ctr.Name(),
 		Pid:             pidToReturn,
@@
 		LogPath:         ctr.LogPath(),
 		Sandbox:         ctr.Sandbox(),
 		IPs:             sb.IPs(),
-		HostNetwork:     new(sb.HostNetwork()),
+		HostNetwork:     &hostNetwork,
 	}, nil
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/inspect.go` around lines 117 - 131, The returned ContainerInfo
currently tries to call new(sb.HostNetwork()) which is invalid because new
expects a type and sb.HostNetwork() is a method returning a bool; fix by calling
sb.HostNetwork() into a local bool (e.g., hostNet := sb.HostNetwork()) and then
set HostNetwork: &hostNet in the types.ContainerInfo literal (update the struct
construction in the function that returns types.ContainerInfo so HostNetwork
receives the address of that local variable).
♻️ Duplicate comments (1)
go.mod (1)

267-267: ⚠️ Potential issue | 🔴 Critical

The replace directive still blocks the verify job.

CI is already failing on Line 267 because gomoddirectives forbids this override, so the branch cannot merge with this line present. If the streaming CRI API has to stay ahead of upstream for now, vendor the generated API instead of overriding module resolution.

#!/bin/bash
set -euo pipefail
# Show the replace directive and search repo config for the gomoddirectives rule.
sed -n '262,267p' go.mod
printf '\nGolangCI configuration referencing gomoddirectives:\n'
fd -t f 'golangci.*' . -H | xargs -r rg -n 'gomoddirectives|replace'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@go.mod` at line 267, The replace directive "replace k8s.io/cri-api =>
github.com/bitoku/kubernetes/staging/src/k8s.io/cri-api
v0.0.0-20260311153604-3ba7af3bb754" in go.mod violates the repository's
gomoddirectives policy and blocks CI; remove that replace and instead vendor the
streaming CRI API sources into the repo (e.g., commit the generated API package
under your module tree or vendor/), update imports if needed to point to the
vendored package, regenerate modules (so go.mod/go.sum no longer contain the
replace) and ensure the gomoddirectives rule no longer flags the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Makefile`:
- Line 8: Add an inline comment next to the G703 entry in the gosec exclusion
list (the GOSEC_EXCLUDE/GOSEC_FLAGS setting) explaining why G703 is being
suppressed (e.g., documented false positives for deferred error handling, a
referenced issue/PR, or an explicit policy decision) and include a pointer to
the justification (issue/PR URL or team doc) so future reviewers can validate
the rationale; update the Makefile's gosec exclusion block to include that brief
comment adjacent to "G703".

In `@pkg/config/config.go`:
- Around line 836-842: In SetSystemContext, the code wrongly uses new() with
constant names (ShortNameModeEnforcing/ShortNameModeDisabled); create a variable
of type types.ShortNameMode initialized to the appropriate constant and assign
its pointer to c.SystemContext.ShortNameMode (or take the address of a
short-lived variable with the constant value) instead of calling new() on the
constant; update the assignments in tomlConfig.SetSystemContext that set
c.SystemContext.ShortNameMode based on c.ShortNameMode accordingly.

---

Outside diff comments:
In `@internal/storage/image.go`:
- Around line 877-885: The MaxRetries field in the libimage.CopyOptions passed
to artifactStore.Pull is using an invalid expression (`new(uint(0))`) which
won't compile; change it to allocate a pointer to a zero-initialized uint (use
`new(uint)`) when setting MaxRetries in the CopyOptions struct passed to
artifactStore.Pull so MaxRetries is a *uint pointing to 0.

In `@server/inspect.go`:
- Around line 117-131: The returned ContainerInfo currently tries to call
new(sb.HostNetwork()) which is invalid because new expects a type and
sb.HostNetwork() is a method returning a bool; fix by calling sb.HostNetwork()
into a local bool (e.g., hostNet := sb.HostNetwork()) and then set HostNetwork:
&hostNet in the types.ContainerInfo literal (update the struct construction in
the function that returns types.ContainerInfo so HostNetwork receives the
address of that local variable).

---

Duplicate comments:
In `@go.mod`:
- Line 267: The replace directive "replace k8s.io/cri-api =>
github.com/bitoku/kubernetes/staging/src/k8s.io/cri-api
v0.0.0-20260311153604-3ba7af3bb754" in go.mod violates the repository's
gomoddirectives policy and blocks CI; remove that replace and instead vendor the
streaming CRI API sources into the repo (e.g., commit the generated API package
under your module tree or vendor/), update imports if needed to point to the
vendored package, regenerate modules (so go.mod/go.sum no longer contain the
replace) and ensure the gomoddirectives rule no longer flags the change.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ee156c51-420c-4667-a6cd-5c6ab3dbeb11

📥 Commits

Reviewing files that changed from the base of the PR and between 0dc5d00 and 5910e64.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (24)
  • .github/workflows/nixpkgs.yml
  • .github/workflows/test.yml
  • Makefile
  • dependencies.yaml
  • go.mod
  • internal/hostport/hostport_nftables.go
  • internal/oci/runtime_oci.go
  • internal/storage/image.go
  • nix/derivation.nix
  • nix/nixpkgs.json
  • pkg/config/config.go
  • pkg/config/workloads_test.go
  • server/container_list.go
  • server/container_stats_list.go
  • server/container_status_test.go
  • server/container_update_resources.go
  • server/image_list.go
  • server/inspect.go
  • server/sandbox_list.go
  • server/sandbox_metrics_list.go
  • server/sandbox_stats_list.go
  • server/server.go
  • test/docs-validation/main.go
  • utils/utils.go
💤 Files with no reviewable changes (1)
  • utils/utils.go
✅ Files skipped from review due to trivial changes (10)
  • nix/derivation.nix
  • server/server.go
  • .github/workflows/test.yml
  • nix/nixpkgs.json
  • server/container_status_test.go
  • server/container_update_resources.go
  • dependencies.yaml
  • pkg/config/workloads_test.go
  • .github/workflows/nixpkgs.yml
  • internal/hostport/hostport_nftables.go
🚧 Files skipped from review as they are similar to previous changes (4)
  • server/sandbox_metrics_list.go
  • server/container_stats_list.go
  • server/container_list.go
  • server/image_list.go

Comment thread Makefile
Comment thread pkg/config/config.go

@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: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
server/sandbox_metrics_list.go (1)

31-53: ⚠️ Potential issue | 🟠 Major

The fallback branch currently drops every nil-metric entry.

else only runs when metrics.GetMetric() is nil, but inside that branch the code reads GetContainerMetrics() and GetPodSandboxId() from the same nil metric again. On CRI generated getters that yields zero values, so nothing is appended and that case disappears from both the unary and stream responses.

Based on learnings "protobuf-generated Get* methods for k8s.io/cri-api types are nil-safe: if the receiver is nil, GetX() returns the zero value instead of panicking."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/sandbox_metrics_list.go` around lines 31 - 53, The code in
listPodSandboxMetrics calls metrics.GetMetric() twice and tries to access
container fields inside the else branch when GetMetric() is nil, which results
in zero-values and drops entries; change the logic to only access container
metrics from a non-nil PodSandboxMetrics: in listPodSandboxMetrics call current
:= metrics.GetMetric(); if current != nil append current to responseMetricsList
and, if you need to expand per-container entries, iterate
current.GetContainerMetrics() and use current.GetPodSandboxId() there; remove
the else branch that dereferences a nil metric and ensure all accesses to
GetContainerMetrics()/GetPodSandboxId() are performed on the non-nil current.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@server/container_stats_list.go`:
- Around line 24-42: StreamContainerStats currently calls listContainerStats
which builds the entire []*types.ContainerStats before sending, causing high
memory/latency and preventing early cancellation; change to a streaming approach
by adding a streaming variant (e.g., listContainerStatsStream(ctx, filter, emit
func([]*types.ContainerStats) error)) or modify listContainerStats to accept a
callback/iterator, then update StreamContainerStats to invoke that streamer and
directly call stream.Send(&types.StreamContainerStatsResponse{ContainerStats:
batch}) for each emitted batch (use existing streamChunkSize batching inside the
streamer or emit per-item), and ensure you respect the stream.Context() and
propagate errors from stream.Send to stop iteration immediately.

In `@server/sandbox_metrics_list.go`:
- Around line 10-14: The helper listPodSandboxMetrics currently ignores the
caller's context so cancellation isn't observed; modify listPodSandboxMetrics to
accept a context.Context parameter (e.g., func (s *Server)
listPodSandboxMetrics(ctx context.Context) ...) and update callers
ListPodSandboxMetrics and StreamPodSandboxMetrics to pass their ctx through
(call s.listPodSandboxMetrics(ctx)), ensuring any internal loops or blocking
operations in listPodSandboxMetrics periodically check ctx.Done() and return
early on cancellation or propagate context-aware calls.

---

Outside diff comments:
In `@server/sandbox_metrics_list.go`:
- Around line 31-53: The code in listPodSandboxMetrics calls metrics.GetMetric()
twice and tries to access container fields inside the else branch when
GetMetric() is nil, which results in zero-values and drops entries; change the
logic to only access container metrics from a non-nil PodSandboxMetrics: in
listPodSandboxMetrics call current := metrics.GetMetric(); if current != nil
append current to responseMetricsList and, if you need to expand per-container
entries, iterate current.GetContainerMetrics() and use current.GetPodSandboxId()
there; remove the else branch that dereferences a nil metric and ensure all
accesses to GetContainerMetrics()/GetPodSandboxId() are performed on the non-nil
current.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: aca66e23-32a0-479f-80e4-1ba1f74ed30d

📥 Commits

Reviewing files that changed from the base of the PR and between 5910e64 and a5b6610.

⛔ Files ignored due to path filters (20)
  • go.sum is excluded by !**/*.sum
  • vendor/google.golang.org/grpc/internal/envconfig/envconfig.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/internal/transport/client_stream.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/internal/transport/http2_client.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/internal/transport/transport.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/server.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/stream.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/version.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/encoding/protojson/decode.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/encoding/prototext/decode.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/internal/descfmt/stringer.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/internal/version/version.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go is excluded by !vendor/**
  • vendor/k8s.io/cri-api/pkg/apis/runtime/v1/api.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/cri-api/pkg/apis/runtime/v1/api.proto is excluded by !vendor/**
  • vendor/k8s.io/cri-api/pkg/apis/runtime/v1/api_grpc.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/cri-api/pkg/apis/services.go is excluded by !vendor/**
  • vendor/modules.txt is excluded by !vendor/**
📒 Files selected for processing (8)
  • go.mod
  • server/container_list.go
  • server/container_stats_list.go
  • server/image_list.go
  • server/sandbox_list.go
  • server/sandbox_metrics_list.go
  • server/sandbox_stats_list.go
  • server/server.go
✅ Files skipped from review due to trivial changes (1)
  • server/server.go
🚧 Files skipped from review as they are similar to previous changes (2)
  • go.mod
  • server/image_list.go

Comment thread server/container_stats_list.go
Comment thread server/sandbox_metrics_list.go

@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: 1

♻️ Duplicate comments (1)
server/sandbox_metrics_list.go (1)

10-18: ⚠️ Potential issue | 🟠 Major

Keep ctx on the shared metrics helper.

ListPodSandboxMetrics and StreamPodSandboxMetrics still drop the caller's ctx at listPodSandboxMetrics(), so a canceled request will keep collecting the full metrics slice anyway.

As per coding guidelines "Propagate context.Context through function calls in Go code".

Also applies to: 31-32

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/sandbox_metrics_list.go` around lines 10 - 18, Both RPC handlers
discard the incoming context when calling listPodSandboxMetrics(), so
cancellation/timeout signals are lost; update the helper to accept a context and
propagate it: change listPodSandboxMetrics to listPodSandboxMetrics(ctx
context.Context) and update both ListPodSandboxMetrics (pass ctx) and
StreamPodSandboxMetrics (pass the incoming ctx from the stream or request
handling function) to call the new signature, and adjust any internal calls
within listPodSandboxMetrics to use the provided ctx for cancellable operations.
🧹 Nitpick comments (3)
server/health.go (1)

27-27: Handle deferred Close() errors instead of dropping them.

Line 27 ignores the returned error from rrs.Close(ctx), which can hide connection teardown problems in health diagnostics. The log package is already imported and used elsewhere in the file, so error logging is straightforward.

♻️ Proposed change
-	defer rrs.Close(ctx)
+	defer func() {
+		if cerr := rrs.Close(ctx); cerr != nil {
+			log.Warnf(ctx, "close remote runtime service: %v", cerr)
+		}
+	}()
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/health.go` at line 27, The deferred call to rrs.Close(ctx) currently
discards its returned error; change the defer to wrap the close in a closure
that captures and logs any error (e.g., defer func() { if err := rrs.Close(ctx);
err != nil { log.Printf("rrs.Close error: %v", err) } }()), referencing the
existing rrs and ctx variables so connection teardown errors are reported via
the package log.
server/image_list.go (1)

52-53: Drop the redundant nil check on the proto getter.

filter.GetImage().GetImage() is already nil-safe for these generated CRI types, so filterImage != nil is just extra branching.

♻️ Proposed simplification
 	if filter != nil {
-		if filterImage := filter.GetImage(); filterImage != nil && filterImage.GetImage() != "" {
+		if filterImage := filter.GetImage(); filterImage.GetImage() != "" {
Based on learnings "In the cri-o/cri-o repository, protobuf-generated Get* methods for k8s.io/cri-api types are nil-safe: if the receiver is nil, GetX() returns the zero value instead of panicking. Do not add explicit nil checks before chaining calls on such getters."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/image_list.go` around lines 52 - 53, Remove the redundant nil check on
the protobuf getter: replace the conditional that does "if filterImage :=
filter.GetImage(); filterImage != nil && filterImage.GetImage() != "" {" with a
nil-safe check using the generated getters directly such as "if
filter.GetImage().GetImage() != "" {" (or capture the string with "if img :=
filter.GetImage().GetImage(); img != "" {") so you rely on the proto-generated
GetImage() being nil-safe and eliminate the unnecessary filterImage != nil
branch.
server/sandbox_list.go (1)

41-53: Avoid filtering sandboxes twice in listPodSandboxes.

filterSandboxList already applies Id, State, and LabelSelector, so the extra filterSandbox(pod, filter) branch just repeats the same work and leaves two filter paths to keep in sync.

♻️ Proposed simplification
 func (s *Server) listPodSandboxes(ctx context.Context, filter *types.PodSandboxFilter) []*types.PodSandbox {
 	podList := s.filterSandboxList(ctx, filter, s.ListSandboxes())
 	respList := make([]*types.PodSandbox, 0, len(podList))

 	for _, sb := range podList {
 		// Skip sandboxes that aren't created yet
 		if !sb.Created() {
 			continue
 		}

-		pod := sb.CRISandbox()
-		// Filter by other criteria such as state and labels.
-		if filterSandbox(pod, filter) {
-			respList = append(respList, pod)
-		}
+		respList = append(respList, sb.CRISandbox())
 	}

 	return respList
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/sandbox_list.go` around lines 41 - 53, listPodSandboxes duplicates
filtering: remove the inner call to filterSandbox(pod, filter) inside
Server.listPodSandboxes since filterSandboxList already applies Id, State and
LabelSelector. Keep the Created() check and simply append sb.CRISandbox() to
respList for each sb in podList; reference functions: Server.listPodSandboxes,
filterSandboxList, and filterSandbox to locate and remove the redundant branch
so there aren’t two separate filter paths to maintain.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@server/image_list.go`:
- Around line 30-33: StreamImages currently calls listImages which builds the
full []*types.Image before any stream.Send happens, causing eager buffering;
change the implementation to stream results incrementally by adding a
visitor/callback or channel-based API (e.g., listImagesWalk or listImagesStream)
that accepts a context and a func(*types.Image) error and calls that callback
for each image as it's produced, then update StreamImages (and the other Stream*
handlers with the same pattern) to pass a callback that calls stream.Send for
each image and respects cancellation/errors returned from the callback so items
are emitted as they become available rather than accumulated.

---

Duplicate comments:
In `@server/sandbox_metrics_list.go`:
- Around line 10-18: Both RPC handlers discard the incoming context when calling
listPodSandboxMetrics(), so cancellation/timeout signals are lost; update the
helper to accept a context and propagate it: change listPodSandboxMetrics to
listPodSandboxMetrics(ctx context.Context) and update both ListPodSandboxMetrics
(pass ctx) and StreamPodSandboxMetrics (pass the incoming ctx from the stream or
request handling function) to call the new signature, and adjust any internal
calls within listPodSandboxMetrics to use the provided ctx for cancellable
operations.

---

Nitpick comments:
In `@server/health.go`:
- Line 27: The deferred call to rrs.Close(ctx) currently discards its returned
error; change the defer to wrap the close in a closure that captures and logs
any error (e.g., defer func() { if err := rrs.Close(ctx); err != nil {
log.Printf("rrs.Close error: %v", err) } }()), referencing the existing rrs and
ctx variables so connection teardown errors are reported via the package log.

In `@server/image_list.go`:
- Around line 52-53: Remove the redundant nil check on the protobuf getter:
replace the conditional that does "if filterImage := filter.GetImage();
filterImage != nil && filterImage.GetImage() != "" {" with a nil-safe check
using the generated getters directly such as "if filter.GetImage().GetImage() !=
"" {" (or capture the string with "if img := filter.GetImage().GetImage(); img
!= "" {") so you rely on the proto-generated GetImage() being nil-safe and
eliminate the unnecessary filterImage != nil branch.

In `@server/sandbox_list.go`:
- Around line 41-53: listPodSandboxes duplicates filtering: remove the inner
call to filterSandbox(pod, filter) inside Server.listPodSandboxes since
filterSandboxList already applies Id, State and LabelSelector. Keep the
Created() check and simply append sb.CRISandbox() to respList for each sb in
podList; reference functions: Server.listPodSandboxes, filterSandboxList, and
filterSandbox to locate and remove the redundant branch so there aren’t two
separate filter paths to maintain.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 16041f60-d64c-4638-819e-e8459af34166

📥 Commits

Reviewing files that changed from the base of the PR and between a5b6610 and 75df7a9.

⛔ Files ignored due to path filters (81)
  • go.sum is excluded by !**/*.sum
  • vendor/github.com/prometheus/client_golang/prometheus/collectors/collectors.go is excluded by !vendor/**
  • vendor/github.com/prometheus/client_golang/prometheus/collectors/dbstats_collector.go is excluded by !vendor/**
  • vendor/github.com/prometheus/client_golang/prometheus/collectors/expvar_collector.go is excluded by !vendor/**
  • vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_go116.go is excluded by !vendor/**
  • vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_latest.go is excluded by !vendor/**
  • vendor/github.com/prometheus/client_golang/prometheus/collectors/process_collector.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/internal/envconfig/envconfig.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/internal/transport/client_stream.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/internal/transport/http2_client.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/internal/transport/transport.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/server.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/stream.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/version.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/encoding/protojson/decode.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/encoding/prototext/decode.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/internal/descfmt/stringer.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/internal/version/version.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/featuregate/OWNERS is excluded by !vendor/**
  • vendor/k8s.io/component-base/featuregate/feature_gate.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/OWNERS is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/buckets.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/collector.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/counter.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/desc.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/gauge.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/histogram.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/http.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/labels.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/legacyregistry/registry.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/metric.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/options.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/opts.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/processstarttime.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/processstarttime_others.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/processstarttime_windows.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/prometheus/feature/metrics.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/prometheusextension/timing_histogram.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/prometheusextension/timing_histogram_vec.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/prometheusextension/weighted_histogram.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/prometheusextension/weighted_histogram_vec.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/registry.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/summary.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/timing_histogram.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/value.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/version.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/version_parser.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/metrics/wrappers.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/tracing/OWNERS is excluded by !vendor/**
  • vendor/k8s.io/component-base/tracing/api/v1/config.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/tracing/api/v1/doc.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/tracing/api/v1/types.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/tracing/api/v1/zz_generated.deepcopy.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/tracing/api/v1/zz_generated.model_name.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/tracing/tracing.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/tracing/utils.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/version/OWNERS is excluded by !vendor/**
  • vendor/k8s.io/component-base/version/base.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/version/dynamic.go is excluded by !vendor/**
  • vendor/k8s.io/component-base/version/version.go is excluded by !vendor/**
  • vendor/k8s.io/cri-api/pkg/apis/runtime/v1/api.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/cri-api/pkg/apis/runtime/v1/api.proto is excluded by !vendor/**
  • vendor/k8s.io/cri-api/pkg/apis/runtime/v1/api_grpc.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/cri-api/pkg/apis/services.go is excluded by !vendor/**
  • vendor/k8s.io/cri-client/pkg/internal/log.go is excluded by !vendor/**
  • vendor/k8s.io/cri-client/pkg/remote_image.go is excluded by !vendor/**
  • vendor/k8s.io/cri-client/pkg/remote_runtime.go is excluded by !vendor/**
  • vendor/k8s.io/cri-client/pkg/util/util_unix.go is excluded by !vendor/**
  • vendor/k8s.io/cri-client/pkg/util/util_unsupported.go is excluded by !vendor/**
  • vendor/k8s.io/cri-client/pkg/util/util_windows.go is excluded by !vendor/**
  • vendor/k8s.io/klog/v2/README.md is excluded by !vendor/**
  • vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go is excluded by !vendor/**
  • vendor/k8s.io/klog/v2/internal/serialize/keyvalues_no_slog.go is excluded by !vendor/**
  • vendor/k8s.io/klog/v2/internal/serialize/keyvalues_slog.go is excluded by !vendor/**
  • vendor/k8s.io/klog/v2/klog.go is excluded by !vendor/**
  • vendor/k8s.io/klog/v2/klogr.go is excluded by !vendor/**
  • vendor/k8s.io/klog/v2/klogr_slog.go is excluded by !vendor/**
  • vendor/modules.txt is excluded by !vendor/**
📒 Files selected for processing (9)
  • go.mod
  • server/container_list.go
  • server/container_stats_list.go
  • server/health.go
  • server/image_list.go
  • server/sandbox_list.go
  • server/sandbox_metrics_list.go
  • server/sandbox_stats_list.go
  • server/server.go
✅ Files skipped from review due to trivial changes (1)
  • server/server.go
🚧 Files skipped from review as they are similar to previous changes (2)
  • server/container_stats_list.go
  • go.mod

Comment thread server/image_list.go
@openshift-ci openshift-ci Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Mar 27, 2026
Add server-side streaming alternatives to all List* CRI RPCs, as
defined in KEP-5825 (CRIListStreaming). These new RPCs stream results
one item at a time instead of returning a single large response.

The following streaming RPCs are implemented:
- StreamContainers (RuntimeService)
- StreamContainerStats (RuntimeService)
- StreamPodSandboxes (RuntimeService)
- StreamPodSandboxStats (RuntimeService)
- StreamPodSandboxMetrics (RuntimeService)
- StreamImages (ImageService)

Each existing List handler is refactored to extract the core listing
logic into an unexported helper (e.g. listContainers), which is then
shared by both the unary List RPC and the new streaming RPC. The
streaming handlers iterate over the helper's results and send each
item individually via stream.Send.

Vendor dependencies are updated to pick up the new CRI API proto
definitions and regenerated gRPC code from k8s.io/cri-api.

Signed-off-by: Ayato Tokubi <atokubi@redhat.com>
Co-authored-by: Claude <noreply@anthropic.com>
Signed-off-by: Ayato Tokubi <atokubi@redhat.com>
@openshift-ci openshift-ci Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Apr 1, 2026

@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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
server/sandbox_metrics_list.go (1)

38-50: ⚠️ Potential issue | 🔴 Critical

Critical: Nil pointer dereference in the else branch.

When metrics.GetMetric() returns nil (line 38 condition fails), the else branch at line 42 calls metrics.GetMetric().GetContainerMetrics() on the same nil value, causing a panic.

🐛 Proposed fix
 for _, metrics := range metricsList {
-    if current := metrics.GetMetric(); current != nil {
-        responseMetricsList = append(responseMetricsList, current)
-    } else {
-        // Iterate over container metrics within each PodSandboxMetrics.
-        containerMetricsList := metrics.GetMetric().GetContainerMetrics()
-        for _, containerMetrics := range containerMetricsList {
-            containerPodSandboxMetrics := &types.PodSandboxMetrics{
-                PodSandboxId:     metrics.GetMetric().GetPodSandboxId(),
-                ContainerMetrics: []*types.ContainerMetrics{containerMetrics},
-            }
-            responseMetricsList = append(responseMetricsList, containerPodSandboxMetrics)
-        }
+    current := metrics.GetMetric()
+    if current == nil {
+        continue
+    }
+    // If the metric has container metrics, expand them; otherwise add as-is.
+    containerMetricsList := current.GetContainerMetrics()
+    if len(containerMetricsList) == 0 {
+        responseMetricsList = append(responseMetricsList, current)
+    } else {
+        for _, containerMetrics := range containerMetricsList {
+            containerPodSandboxMetrics := &types.PodSandboxMetrics{
+                PodSandboxId:     current.GetPodSandboxId(),
+                ContainerMetrics: []*types.ContainerMetrics{containerMetrics},
+            }
+            responseMetricsList = append(responseMetricsList, containerPodSandboxMetrics)
+        }
     }
 }

Note: The original logic intent is unclear—please verify whether the else branch should expand container metrics or if the entire block should simply skip nil metrics.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/sandbox_metrics_list.go` around lines 38 - 50, The code dereferences
metrics.GetMetric() in the else branch causing a nil pointer panic; fix by
capturing the result once and guarding it, e.g. assign m := metrics.GetMetric()
and then if m == nil { continue } else inspect m.GetContainerMetrics(): if it
has 1 or 0 containers append m to responseMetricsList, otherwise iterate
m.GetContainerMetrics() and for each containerMetrics build a
&types.PodSandboxMetrics{PodSandboxId: m.GetPodSandboxId(), ContainerMetrics:
[]*types.ContainerMetrics{containerMetrics}} and append; ensure all references
use the local m variable (and keep symbols responseMetricsList,
metrics.GetMetric(), GetContainerMetrics, GetPodSandboxId, PodSandboxMetrics,
ContainerMetrics).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@server/sandbox_metrics_list.go`:
- Around line 38-50: The code dereferences metrics.GetMetric() in the else
branch causing a nil pointer panic; fix by capturing the result once and
guarding it, e.g. assign m := metrics.GetMetric() and then if m == nil {
continue } else inspect m.GetContainerMetrics(): if it has 1 or 0 containers
append m to responseMetricsList, otherwise iterate m.GetContainerMetrics() and
for each containerMetrics build a &types.PodSandboxMetrics{PodSandboxId:
m.GetPodSandboxId(), ContainerMetrics:
[]*types.ContainerMetrics{containerMetrics}} and append; ensure all references
use the local m variable (and keep symbols responseMetricsList,
metrics.GetMetric(), GetContainerMetrics, GetPodSandboxId, PodSandboxMetrics,
ContainerMetrics).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 5199c705-e493-4c31-921d-5686aa23c871

📥 Commits

Reviewing files that changed from the base of the PR and between 75df7a9 and ca4496c.

⛔ Files ignored due to path filters (236)
  • go.sum is excluded by !**/*.sum
  • vendor/github.com/emicklei/go-restful/v3/.travis.yml is excluded by !vendor/**
  • vendor/github.com/emicklei/go-restful/v3/CHANGES.md is excluded by !vendor/**
  • vendor/github.com/emicklei/go-restful/v3/README.md is excluded by !vendor/**
  • vendor/github.com/emicklei/go-restful/v3/curly.go is excluded by !vendor/**
  • vendor/github.com/emicklei/go-restful/v3/custom_verb.go is excluded by !vendor/**
  • vendor/github.com/emicklei/go-restful/v3/doc.go is excluded by !vendor/**
  • vendor/github.com/mxk/go-flowrate/LICENSE is excluded by !vendor/**
  • vendor/github.com/mxk/go-flowrate/flowrate/flowrate.go is excluded by !vendor/**
  • vendor/github.com/mxk/go-flowrate/flowrate/io.go is excluded by !vendor/**
  • vendor/github.com/mxk/go-flowrate/flowrate/util.go is excluded by !vendor/**
  • vendor/github.com/prometheus/client_golang/prometheus/collectors/collectors.go is excluded by !vendor/**
  • vendor/github.com/prometheus/client_golang/prometheus/collectors/dbstats_collector.go is excluded by !vendor/**
  • vendor/github.com/prometheus/client_golang/prometheus/collectors/expvar_collector.go is excluded by !vendor/**
  • vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_go116.go is excluded by !vendor/**
  • vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_latest.go is excluded by !vendor/**
  • vendor/github.com/prometheus/client_golang/prometheus/collectors/process_collector.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/.golangci.yml is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/Makefile is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/Makefile.common is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/arp.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/buddyinfo.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/cmdline.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/cpuinfo.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/cpuinfo_armx.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/cpuinfo_loong64.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/cpuinfo_mipsx.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/cpuinfo_others.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/cpuinfo_ppcx.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/cpuinfo_riscvx.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/cpuinfo_s390x.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/cpuinfo_x86.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/crypto.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/doc.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/fs.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/fs_statfs_notype.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/fs_statfs_type.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/fscache.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/internal/fs/fs.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/internal/util/parse.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/internal/util/readfile.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/internal/util/valueparser.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/ipvs.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/kernel_hung.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/kernel_random.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/loadavg.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/mdstat.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/meminfo.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/mountinfo.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/mountstats.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_conntrackstat.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_dev.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_dev_snmp6.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_ip_socket.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_protocols.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_route.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_sockstat.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_softnet.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_tcp.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_tls_stat.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_udp.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_unix.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_wireless.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/net_xfrm.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/netstat.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/nfnetlink_queue.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_cgroup.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_cgroups.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_environ.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_fdinfo.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_interrupts.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_io.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_limits.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_maps.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_netstat.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_ns.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_psi.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_smaps.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_snmp.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_snmp6.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_stat.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_statm.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_status.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/proc_sys.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/schedstat.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/slab.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/softirqs.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/stat.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/swaps.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/thread.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/vm.go is excluded by !vendor/**
  • vendor/github.com/prometheus/procfs/zoneinfo.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/client.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/common.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/doc.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/client.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/env.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/gen.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/httpconv.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/server.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/util.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/transport.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go is excluded by !vendor/**
  • vendor/go.opentelemetry.io/otel/semconv/v1.39.0/httpconv/metric.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/internal/envconfig/envconfig.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/internal/transport/client_stream.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/internal/transport/http2_client.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/internal/transport/transport.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/server.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/stream.go is excluded by !vendor/**
  • vendor/google.golang.org/grpc/version.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/encoding/protojson/decode.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/encoding/prototext/decode.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/internal/descfmt/stringer.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/internal/version/version.go is excluded by !vendor/**
  • vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1/generated.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1/register.go is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1/types_swagger_doc_generated.go is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1/zz_generated.deepcopy.go is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1/zz_generated.model_name.go is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1/zz_generated.prerelease-lifecycle.go is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1alpha1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1alpha1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1alpha1/types_swagger_doc_generated.go is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1beta1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1beta1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go is excluded by !vendor/**
  • vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.prerelease-lifecycle.go is excluded by !vendor/**
  • vendor/k8s.io/api/apidiscovery/v2/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/apidiscovery/v2/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/apidiscovery/v2/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/apidiscovery/v2beta1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/apidiscovery/v2beta1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/apidiscovery/v2beta1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/apiserverinternal/v1alpha1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/apiserverinternal/v1alpha1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/apiserverinternal/v1alpha1/types_swagger_doc_generated.go is excluded by !vendor/**
  • vendor/k8s.io/api/apps/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/apps/v1beta1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/apps/v1beta1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/apps/v1beta1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/apps/v1beta2/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/apps/v1beta2/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/apps/v1beta2/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/authentication/v1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/authentication/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/authentication/v1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go is excluded by !vendor/**
  • vendor/k8s.io/api/authentication/v1alpha1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/authentication/v1alpha1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/authentication/v1alpha1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/authentication/v1alpha1/types_swagger_doc_generated.go is excluded by !vendor/**
  • vendor/k8s.io/api/authentication/v1beta1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/authentication/v1beta1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/authentication/v1beta1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/authentication/v1beta1/types_swagger_doc_generated.go is excluded by !vendor/**
  • vendor/k8s.io/api/authorization/v1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/authorization/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/authorization/v1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go is excluded by !vendor/**
  • vendor/k8s.io/api/authorization/v1beta1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/authorization/v1beta1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/authorization/v1beta1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/authorization/v1beta1/types_swagger_doc_generated.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/autoscaling/v1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/autoscaling/v2/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta1/doc.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta1/register.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta1/types_swagger_doc_generated.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.deepcopy.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.model_name.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.prerelease-lifecycle.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta2/doc.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta2/generated.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta2/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta2/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta2/register.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta2/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta2/types_swagger_doc_generated.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta2/zz_generated.deepcopy.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta2/zz_generated.model_name.go is excluded by !vendor/**
  • vendor/k8s.io/api/autoscaling/v2beta2/zz_generated.prerelease-lifecycle.go is excluded by !vendor/**
  • vendor/k8s.io/api/batch/v1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/batch/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/batch/v1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/batch/v1beta1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/batch/v1beta1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/batch/v1beta1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/certificates/v1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/certificates/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/certificates/v1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/certificates/v1alpha1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/certificates/v1beta1/generated.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/certificates/v1beta1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/certificates/v1beta1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/certificates/v1beta1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/certificates/v1beta1/types_swagger_doc_generated.go is excluded by !vendor/**
  • vendor/k8s.io/api/certificates/v1beta1/zz_generated.deepcopy.go is excluded by !vendor/**
  • vendor/k8s.io/api/certificates/v1beta1/zz_generated.prerelease-lifecycle.go is excluded by !vendor/**
  • vendor/k8s.io/api/coordination/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/coordination/v1alpha2/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/coordination/v1alpha2/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/coordination/v1alpha2/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/coordination/v1beta1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/coordination/v1beta1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/coordination/v1beta1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/core/v1/generated.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/core/v1/generated.proto is excluded by !vendor/**
  • vendor/k8s.io/api/core/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !vendor/**
  • vendor/k8s.io/api/core/v1/types.go is excluded by !vendor/**
  • vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go is excluded by !vendor/**
  • vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go is excluded by !vendor/**
  • vendor/k8s.io/api/core/v1/zz_generated.model_name.go is excluded by !vendor/**
  • vendor/k8s.io/api/discovery/v1/generated.proto is excluded by !vendor/**
📒 Files selected for processing (9)
  • go.mod
  • server/container_list.go
  • server/container_stats_list.go
  • server/health.go
  • server/image_list.go
  • server/sandbox_list.go
  • server/sandbox_metrics_list.go
  • server/sandbox_stats_list.go
  • server/server.go
✅ Files skipped from review due to trivial changes (1)
  • server/server.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • go.mod

@bitoku

bitoku commented Apr 8, 2026

Copy link
Copy Markdown
Contributor Author

@cri-o/cri-o-maintainers PTAL

@haircommander

Copy link
Copy Markdown
Member

/approve
/lgtm

would be good to add streams to cri-tools as well eventually to test in integration

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label Apr 10, 2026
@openshift-ci

openshift-ci Bot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: bitoku, haircommander

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:
  • OWNERS [bitoku,haircommander]

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

@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Apr 10, 2026
@bitoku

bitoku commented Apr 11, 2026

Copy link
Copy Markdown
Contributor Author

/retest

2 similar comments
@bitoku

bitoku commented Apr 11, 2026

Copy link
Copy Markdown
Contributor Author

/retest

@bitoku

bitoku commented Apr 13, 2026

Copy link
Copy Markdown
Contributor Author

/retest

@openshift-merge-bot openshift-merge-bot Bot merged commit c17ee8b into cri-o:main Apr 13, 2026
67 of 74 checks passed
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. dco-signoff: yes Indicates the PR's author has DCO signed all their commits. kind/feature Categorizes issue or PR as related to a new feature. lgtm Indicates that a PR is ready to be merged. release-note Denotes a PR that will be considered when it comes time to generate release notes.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants