Skip to content

WIP: do not merge - jacob's 1.36 tests#2654

Draft
jacobsee wants to merge 2928 commits intoopenshift:masterfrom
jacobsee:rebase-1.36-jacob
Draft

WIP: do not merge - jacob's 1.36 tests#2654
jacobsee wants to merge 2928 commits intoopenshift:masterfrom
jacobsee:rebase-1.36-jacob

Conversation

@jacobsee
Copy link
Copy Markdown
Member

@jacobsee jacobsee commented Apr 24, 2026

What type of PR is this?

What this PR does / why we need it:

Which issue(s) this PR is related to:

Special notes for your reviewer:

Does this PR introduce a user-facing change?


Additional documentation e.g., KEPs (Kubernetes Enhancement Proposals), usage docs, etc.:


Summary by CodeRabbit

  • New Features

    • New API resources: MutatingAdmissionPolicy, MutatingAdmissionPolicyBinding, PodGroup, DeviceTaintRule, ResourcePoolStatusRequest.
    • Sharded list/watch support: ShardInfo metadata and shardSelector query parameter.
    • PodSchedulingGroup and Pod scheduling/grouping additions; PodCertificateRequestSpec adds stubPKCS10Request.
  • API Changes

    • Several schemas now require top-level fields (e.g., CronJob.spec, HPA.spec, TokenReview.spec).
  • Documentation

    • Extensive changelogs and OpenAPI docs added/updated.
  • Chores

    • Go toolchain bumped to 1.26.2; CI build image tag and ignore rules updated.

nmn3m and others added 30 commits March 19, 2026 16:50
Implement the RPSR controller that watches ResourcePoolStatusRequest
objects and aggregates pool status from DRA drivers. Add the API server
registry (strategy, storage), handwritten validation, RBAC bootstrap
policy for the controller, kube-controller-manager wiring, table
printer columns, and storage factory registration.
Add unit tests for handwritten and declarative validation, controller
logic, metrics, table printer output, controller-manager registration,
etcd storage round-trip, and an integration test for the full RPSR
lifecycle. Also add an e2e test exercising the DRA test driver with
RPSR and the example manifest.
…00, maxLength=128) for etcd safety, add Errors printer column

Signed-off-by: Nour <nurmn3m@gmail.com>
Signed-off-by: Nour <nurmn3m@gmail.com>
…ify retry logic and metric tests

Signed-off-by: Nour <nurmn3m@gmail.com>
…op unnecessary Feature:DynamicResourceAllocation tag, fix indentation

Signed-off-by: Nour <nurmn3m@gmail.com>
…generate the code

Signed-off-by: Nour <nurmn3m@gmail.com>
* Add admission for podGroup

Signed-off-by: helayoty <heelayot@microsoft.com>

* Create workload object before podgroup

Signed-off-by: helayoty <heelayot@microsoft.com>

---------

Signed-off-by: helayoty <heelayot@microsoft.com>
…econcile

Remove reconcilePodMemoryProtection that resets pod cgroup values on systemd
…and container ID instead of StartTime

The expectation that StartTime changes on kubelet restart for static pods is no longer reliable due to faked init container status logic. This change updates the tests to assert on the specific behavior introduced by that logic.
Signed-off-by: Anish Ramasekar <anish.ramasekar@gmail.com>
test: fix flaky static pod tests by asserting on termination message …
Remove PodGroupTemplateRef from the PodGroup e2e CRUD test. The
PodGroupWorkloadExists admission plugin (introduced in kubernetes#137464)
rejects PodGroups that reference a non-existent Workload, causing
the test to fail. The workload reference is not needed to test
basic PodGroup API CRUD operations.
Signed-off-by: Maciej Szulik <soltysh@gmail.com>
…ist-default-to-false-for-1.36

Switch PLEGOnDemandRelist default to `false` for 1.36
…ure actuated pod-level resources are updated
…heduler-events

scheduler: use contextual logging for event emission
…to ResourceSliceMaxDevicesWithAdvancedFeatures and add testcases with max devices with list attributes
KEP-961: demote maxUnavailable feature in statefulset to off by default
…oad-api

test: Fix PodGroup CRUD test failing due to missing Workload reference
…ources that inherit changes due to pod-level modifications
jluhrsen and others added 15 commits May 4, 2026 15:46
…imary clusters

  Detect cluster's primary IP family by querying kubernetes.default service
  ClusterIP instead of using HasIPv4/HasIPv6 flags. The previous logic
  incorrectly returned ipv4 for dual-stack v6-primary clusters because
  both HasIPv4 and HasIPv6 were true.

  This matches the upstream approach in test/e2e/e2e.go and fixes DNS tests
  that were querying for A records instead of AAAA records in v6-primary
  environments.
After openshift/origin#30786 added ibmcloud to the provider switch in
openshift-tests, the provider name is now correctly passed through to
k8s-tests-ext. However, k8s-tests-ext only registers upstream Kubernetes
providers (aws, azure, gce, kubemark, openstack, vsphere) via the
test/e2e/providers.go import. OpenShift-specific providers like ibmcloud
are not registered, causing framework.AfterReadingAllFlags to call
SetupProviderConfig which fails with "Unknown provider" and Exit(1),
crashing every test process.

This registers all OpenShift-specific cloud providers (baremetal, ovirt,
kubevirt, alibabacloud, nutanix, ibmcloud, external) as NullProviders in
k8s-tests-ext. These providers don't require special setup for upstream
kube e2e tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…e2e test

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: jubittajohn <jujohn@redhat.com>
To be squashed with the following commit later:"UPSTREAM: <carry>: Add OpenShift tooling, images, configs and docs"

Signed-off-by: jubittajohn <jujohn@redhat.com>
…er_manager_linux_test.go

Squash into: UPSTREAM: <carry>: disable load balancing on created cgroups when managed is enabled
…s in flagz_test.go and statusz_test.go

Squash into: UPSTREAM: <carry>: apiserver: add system_client=kube-{apiserver,cm,s} to apiserver_request_total
Signed-off-by: Shaza Aldawamneh <shaza.aldawamneh@hotmail.com>
…e when claims.email is used in username expression

Signed-off-by: Shaza Aldawamneh <shaza.aldawamneh@hotmail.com>
Signed-off-by: jubittajohn <jujohn@redhat.com>
Signed-off-by: jubittajohn <jujohn@redhat.com>
Signed-off-by: jubittajohn <jujohn@redhat.com>
…acheGC is enabled

Squash into UPSTREAM: <carry>: create termination events
@jacobsee jacobsee force-pushed the rebase-1.36-jacob branch from 86a6356 to 2af6682 Compare May 4, 2026 23:58
@openshift-ci-robot
Copy link
Copy Markdown

@jacobsee: the contents of this pull request could not be automatically validated.

The following commits are valid:

The following commits could not be validated and must be approved by a top-level approver:

Comment /validate-backports to re-evaluate validity of the upstream PRs, for example when they are merged upstream.

@jacobsee
Copy link
Copy Markdown
Member Author

jacobsee commented May 4, 2026

/test integration

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 7

♻️ Duplicate comments (1)
api/openapi-spec/v3/apis__certificates.k8s.io__v1beta1_openapi.json (1)

273-281: ⚠️ Potential issue | 🟠 Major

Don't require stubPKCS10Request unconditionally.

This still makes the OpenAPI schema reject legacy-valid requests that send pkixPublicKey plus proofOfPossession without stubPKCS10Request. The contract needs an either/or constraint here, not a top-level required entry for stubPKCS10Request.

Schema shape to target
         "required": [
           "signerName",
           "podName",
           "podUID",
           "serviceAccountName",
           "serviceAccountUID",
           "nodeName",
-          "nodeUID",
-          "stubPKCS10Request"
+          "nodeUID"
         ],
+        "oneOf": [
+          {
+            "required": [
+              "stubPKCS10Request"
+            ]
+          },
+          {
+            "required": [
+              "pkixPublicKey",
+              "proofOfPossession"
+            ]
+          }
+        ],
         "type": "object"
#!/bin/bash
set -euo pipefail

echo "## Current validation logic"
rg -n -C4 --type=go 'Validate.*PodCertificateRequest|validate.*PodCertificateRequest|stubPKCS10Request|pkixPublicKey|proofOfPossession'

echo
echo "## Type definitions / validation tags"
rg -n -C4 --type=go 'type\s+PodCertificateRequestSpec\b|stubPKCS10Request|pkixPublicKey|proofOfPossession'
🤖 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 `@api/openapi-spec/v3/apis__certificates.k8s.io__v1beta1_openapi.json` around
lines 273 - 281, The OpenAPI schema erroneously lists "stubPKCS10Request" as a
top-level required property which forces rejection of legitimate requests that
supply "pkixPublicKey" + "proofOfPossession"; remove "stubPKCS10Request" from
the required array and instead express the either/or constraint using an OpenAPI
conditional (e.g. oneOf or anyOf with two schemas) on the
PodCertificateRequest/PodCertificateRequestSpec schema so that either the
stubPKCS10Request field is present OR the pair pkixPublicKey and
proofOfPossession are present; update the schema definitions referencing
"stubPKCS10Request", "pkixPublicKey", and "proofOfPossession" to match this
oneOf/anyOf conditional.
🧹 Nitpick comments (1)
CHANGELOG/CHANGELOG-1.3.md (1)

395-428: 💤 Low value

Optional: Fix heading level increment for better document structure.

The subsections under "Known Issues and Important Steps before Upgrading" skip from h2 to h4. Markdown best practice recommends incrementing heading levels by one at a time.

📋 Suggested heading structure
-#### ThirdPartyResource
+### ThirdPartyResource
 
-#### kubectl
+### kubectl
 
-#### kubernetes Core Known Issues
+### kubernetes Core Known Issues
 
-#### Docker runtime Known Issues
+### Docker runtime Known Issues
 
-#### Rkt runtime Known Issues
+### Rkt runtime Known Issues
🤖 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 `@CHANGELOG/CHANGELOG-1.3.md` around lines 395 - 428, The changelog jumps
heading levels (subsections under "Known Issues and Important Steps before
Upgrading" use ####), so adjust the markdown headings to increment by one level:
change the section headings "ThirdPartyResource", "kubectl", "kubernetes Core
Known Issues", "Docker runtime Known Issues", and "Rkt runtime Known Issues"
from #### to ### (or otherwise ensure they are one level deeper than their
parent) so the document structure is hierarchical and consistent.
🤖 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
`@api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json`:
- Around line 477-479: The description for the schema field
parameterNotFoundAction is using validation-specific wording; update its text to
use mutation-specific phrasing for MutatingAdmissionPolicyBinding (referencing
parameterNotFoundAction in the MutatingAdmissionPolicyBinding schema) so it
describes the behavior for mutation policies (e.g., explain how no matched
parameters affect mutation execution and failurePolicy) and replace "successful
validation" with appropriate mutation terminology; regenerate the openapi spec
from the corrected source comment so the public docs reflect the new wording.
- Around line 3374-3382: Remove the query parameter object named "shardSelector"
from the watch-by-name endpoints for mutatingadmissionpolicies and
mutatingadmissionpolicybindings (the GET paths ending with /watch/.../{name}) in
the generated OpenAPI spec; locate the parameter block with "name":
"shardSelector" / "in": "query" (the schema type "string" with "uniqueItems":
true) and ensure it is not emitted for endpoints whose path contains a {name}
path parameter, so single-object watch routes no longer include shardSelector in
their query params.

In `@api/openapi-spec/v3/apis__authentication.k8s.io__v1_openapi.json`:
- Around line 126-128: The OpenAPI schema marks spec.token as required but
there's no server-side validator; add a validation implementation under
pkg/apis/authentication/validation that enforces non-empty Token (e.g.,
implement ValidateTokenReview and/or ValidateTokenReviewSpec which check that
Token (pkg/apis/authentication/types.go) is not empty and return an appropriate
field.ErrorList), register these validators with the admission/validation entry
points for TokenReview resources, and/or add kubebuilder validation markers on
the Token field in types.go if you prefer code-gen'd OpenAPI + then regenerate
to keep schema and server-side checks in sync.

In `@api/openapi-spec/v3/apis__certificates.k8s.io__v1_openapi.json`:
- Around line 992-1000: Update the description for the query parameter
"shardSelector" (parameter name: shardSelector, schema type: string) to reflect
that this is used by deletecollection operations: replace the phrase "restricts
the list of returned objects" with wording that it "restricts which objects are
targeted for deletion" (or equivalent) and keep the rest of the explanation
about CEL shardRange syntax, supported field paths, hexStart/hexEnd bounds,
examples, and the note about the ShardedListAndWatch feature gate unchanged.

In `@api/openapi-spec/v3/apis__discovery.k8s.io__v1_openapi.json`:
- Around line 228-230: The OpenAPI schema made EndpointSlice.endpoints optional
while the Go type EndpointSlice.Endpoints (pkg/apis/discovery/types.go) remains
non-optional; to fix this, update the OpenAPI schema for the EndpointSlice
object by adding "endpoints" to its "required" array so the JSON contract
matches the Go model (or alternatively make the Go field optional/omitempty if
you intend the API to be optional) — ensure you modify the EndpointSlice
schema's "required" list in the OpenAPI file to include "endpoints" to restore
schema/type parity.

In `@CHANGELOG/CHANGELOG-1.2.md`:
- Line 270: Fix the typo in the changelog entry by replacing "recevied" with
"received" in the line that currently reads "* kubelet: send all recevied pods
in one update ([`#23141`], [`@yujuhong`])" so it becomes "* kubelet: send all
received pods in one update ([`#23141`], [`@yujuhong`])".

In `@CHANGELOG/CHANGELOG-1.3.md`:
- Line 948: Change the misspelled word "recevied" to "received" in the changelog
entry line that reads "* kubelet: send all recevied pods in one update
([`#23141`](https://github.com/kubernetes/kubernetes/pull/23141),
[`@yujuhong`](https://github.com/yujuhong))" so it reads "* kubelet: send all
received pods in one update (...)".

---

Duplicate comments:
In `@api/openapi-spec/v3/apis__certificates.k8s.io__v1beta1_openapi.json`:
- Around line 273-281: The OpenAPI schema erroneously lists "stubPKCS10Request"
as a top-level required property which forces rejection of legitimate requests
that supply "pkixPublicKey" + "proofOfPossession"; remove "stubPKCS10Request"
from the required array and instead express the either/or constraint using an
OpenAPI conditional (e.g. oneOf or anyOf with two schemas) on the
PodCertificateRequest/PodCertificateRequestSpec schema so that either the
stubPKCS10Request field is present OR the pair pkixPublicKey and
proofOfPossession are present; update the schema definitions referencing
"stubPKCS10Request", "pkixPublicKey", and "proofOfPossession" to match this
oneOf/anyOf conditional.

---

Nitpick comments:
In `@CHANGELOG/CHANGELOG-1.3.md`:
- Around line 395-428: The changelog jumps heading levels (subsections under
"Known Issues and Important Steps before Upgrading" use ####), so adjust the
markdown headings to increment by one level: change the section headings
"ThirdPartyResource", "kubectl", "kubernetes Core Known Issues", "Docker runtime
Known Issues", and "Rkt runtime Known Issues" from #### to ### (or otherwise
ensure they are one level deeper than their parent) so the document structure is
hierarchical and consistent.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 18c882ae-2c7a-44b4-b5cc-56e20fc591a1

📥 Commits

Reviewing files that changed from the base of the PR and between ffdd15f and 2af6682.

⛔ Files ignored due to path filters (25)
  • LICENSES/vendor/github.com/armon/circbuf/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/github.com/cenkalti/backoff/v4/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/github.com/cenkalti/backoff/v5/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/github.com/gregjones/httpcache/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/github.com/grpc-ecosystem/go-grpc-prometheus/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/github.com/karrick/godirwalk/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/github.com/libopenstorage/openstorage/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/github.com/mistifyio/go-zfs/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/github.com/mohae/deepcopy/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/github.com/mrunalp/fileutils/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/github.com/pkg/errors/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/go.opentelemetry.io/contrib/instrumentation/github.com/emicklei/go-restful/otelrestful/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/go.opentelemetry.io/otel/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/go.opentelemetry.io/otel/metric/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/go.opentelemetry.io/otel/sdk/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/go.opentelemetry.io/otel/trace/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/go.uber.org/zap/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/k8s.io/utils/third_party/forked/golang/LICENSE is excluded by !**/vendor/**
  • LICENSES/vendor/k8s.io/utils/third_party/forked/golang/btree/LICENSE is excluded by !**/vendor/**
  • cmd/kubeadm/app/discovery/token/testdata/ca-cert.pem is excluded by !**/*.pem
  • cmd/kubeadm/app/util/config/testdata/mynode.pem is excluded by !**/*.pem
📒 Files selected for processing (275)
  • .ci-operator.yaml
  • .github/PULL_REQUEST_TEMPLATE.md
  • .gitignore
  • .go-version
  • CHANGELOG/CHANGELOG-1.10.md
  • CHANGELOG/CHANGELOG-1.11.md
  • CHANGELOG/CHANGELOG-1.12.md
  • CHANGELOG/CHANGELOG-1.13.md
  • CHANGELOG/CHANGELOG-1.14.md
  • CHANGELOG/CHANGELOG-1.15.md
  • CHANGELOG/CHANGELOG-1.16.md
  • CHANGELOG/CHANGELOG-1.17.md
  • CHANGELOG/CHANGELOG-1.18.md
  • CHANGELOG/CHANGELOG-1.19.md
  • CHANGELOG/CHANGELOG-1.2.md
  • CHANGELOG/CHANGELOG-1.20.md
  • CHANGELOG/CHANGELOG-1.21.md
  • CHANGELOG/CHANGELOG-1.22.md
  • CHANGELOG/CHANGELOG-1.23.md
  • CHANGELOG/CHANGELOG-1.24.md
  • CHANGELOG/CHANGELOG-1.25.md
  • CHANGELOG/CHANGELOG-1.26.md
  • CHANGELOG/CHANGELOG-1.27.md
  • CHANGELOG/CHANGELOG-1.28.md
  • CHANGELOG/CHANGELOG-1.29.md
  • CHANGELOG/CHANGELOG-1.3.md
  • CHANGELOG/CHANGELOG-1.30.md
  • CHANGELOG/CHANGELOG-1.31.md
  • CHANGELOG/CHANGELOG-1.32.md
  • CHANGELOG/CHANGELOG-1.33.md
  • CHANGELOG/CHANGELOG-1.34.md
  • CHANGELOG/CHANGELOG-1.35.md
  • CHANGELOG/CHANGELOG-1.36.md
  • CHANGELOG/CHANGELOG-1.4.md
  • CHANGELOG/CHANGELOG-1.5.md
  • CHANGELOG/CHANGELOG-1.6.md
  • CHANGELOG/CHANGELOG-1.7.md
  • CHANGELOG/CHANGELOG-1.8.md
  • CHANGELOG/CHANGELOG-1.9.md
  • CHANGELOG/README.md
  • OWNERS_ALIASES
  • api/api-rules/sample_controller_violation_exceptions.list
  • api/api-rules/violation_exceptions.list
  • api/discovery/aggregated_v2.json
  • api/discovery/apis.json
  • api/discovery/apis__admissionregistration.k8s.io__v1.json
  • api/discovery/apis__resource.k8s.io__v1alpha3.json
  • api/discovery/apis__resource.k8s.io__v1beta2.json
  • api/discovery/apis__scheduling.k8s.io.json
  • api/discovery/apis__scheduling.k8s.io__v1alpha1.json
  • api/discovery/apis__scheduling.k8s.io__v1alpha2.json
  • api/discovery/apis__storage.k8s.io__v1.json
  • api/discovery/apis__storage.k8s.io__v1beta1.json
  • api/openapi-spec/README.md
  • api/openapi-spec/swagger.json
  • api/openapi-spec/v3/api__v1_openapi.json
  • api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1alpha1_openapi.json
  • api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json
  • api/openapi-spec/v3/apis__apiextensions.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__apiregistration.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__apps__v1_openapi.json
  • api/openapi-spec/v3/apis__authentication.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__authorization.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__autoscaling__v1_openapi.json
  • api/openapi-spec/v3/apis__autoscaling__v2_openapi.json
  • api/openapi-spec/v3/apis__batch__v1_openapi.json
  • api/openapi-spec/v3/apis__certificates.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__certificates.k8s.io__v1alpha1_openapi.json
  • api/openapi-spec/v3/apis__certificates.k8s.io__v1beta1_openapi.json
  • api/openapi-spec/v3/apis__coordination.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__coordination.k8s.io__v1alpha2_openapi.json
  • api/openapi-spec/v3/apis__coordination.k8s.io__v1beta1_openapi.json
  • api/openapi-spec/v3/apis__discovery.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__events.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__flowcontrol.apiserver.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__internal.apiserver.k8s.io__v1alpha1_openapi.json
  • api/openapi-spec/v3/apis__networking.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__networking.k8s.io__v1beta1_openapi.json
  • api/openapi-spec/v3/apis__node.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__policy__v1_openapi.json
  • api/openapi-spec/v3/apis__rbac.authorization.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__resource.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__resource.k8s.io__v1alpha3_openapi.json
  • api/openapi-spec/v3/apis__resource.k8s.io__v1beta1_openapi.json
  • api/openapi-spec/v3/apis__resource.k8s.io__v1beta2_openapi.json
  • api/openapi-spec/v3/apis__scheduling.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__scheduling.k8s.io__v1alpha1_openapi.json
  • api/openapi-spec/v3/apis__scheduling.k8s.io__v1alpha2_openapi.json
  • api/openapi-spec/v3/apis__storage.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__storage.k8s.io__v1beta1_openapi.json
  • api/openapi-spec/v3/apis__storagemigration.k8s.io__v1beta1_openapi.json
  • build/build-image/cross/VERSION
  • build/common.sh
  • build/dependencies.yaml
  • build/lib/release.sh
  • build/nsswitch.conf
  • build/pause/CHANGELOG.md
  • build/pause/Dockerfile.Rhel
  • build/pause/Makefile
  • build/server-image/Dockerfile
  • build/server-image/kube-apiserver/Dockerfile
  • build/tools.go
  • cluster/addons/dns/coredns/coredns.yaml.base
  • cluster/addons/dns/coredns/coredns.yaml.in
  • cluster/addons/dns/coredns/coredns.yaml.sed
  • cluster/addons/dns/kube-dns/kube-dns.yaml.base
  • cluster/addons/dns/kube-dns/kube-dns.yaml.in
  • cluster/addons/dns/kube-dns/kube-dns.yaml.sed
  • cluster/addons/dns/nodelocaldns/nodelocaldns.yaml
  • cluster/addons/kube-proxy/OWNERS
  • cluster/addons/kube-proxy/kube-proxy-ds.yaml
  • cluster/addons/kube-proxy/kube-proxy-rbac.yaml
  • cluster/addons/volumesnapshots/volume-snapshot-controller/volume-snapshot-controller-deployment.yaml
  • cluster/gce/addons/konnectivity-agent/konnectivity-agent-ds.yaml
  • cluster/gce/config-common.sh
  • cluster/gce/config-default.sh
  • cluster/gce/config-test.sh
  • cluster/gce/gci/configure-helper.sh
  • cluster/gce/gci/configure.sh
  • cluster/gce/gci/master.yaml
  • cluster/gce/gci/mounter/mounter.go
  • cluster/gce/gci/node.yaml
  • cluster/gce/manifests/cloud-controller-manager.manifest
  • cluster/gce/manifests/etcd.manifest
  • cluster/gce/manifests/konnectivity-server.yaml
  • cluster/gce/manifests/kube-proxy.manifest
  • cluster/gce/upgrade-aliases.sh
  • cluster/gce/util.sh
  • cluster/gce/windows/k8s-node-setup.psm1
  • cluster/gce/windows/smoke-test.sh
  • cluster/images/etcd/Dockerfile
  • cluster/images/etcd/Dockerfile.windows
  • cluster/images/etcd/Makefile
  • cluster/images/etcd/OWNERS
  • cluster/images/etcd/README.md
  • cluster/images/etcd/cloudbuild.yaml
  • cluster/images/etcd/migrate-if-needed.bat
  • cluster/images/etcd/migrate-if-needed.sh
  • cluster/images/etcd/migrate/copy_file.go
  • cluster/images/etcd/migrate/data_dir.go
  • cluster/images/etcd/migrate/data_dir_test.go
  • cluster/images/etcd/migrate/integration_test.go
  • cluster/images/etcd/migrate/migrate.go
  • cluster/images/etcd/migrate/migrate_client.go
  • cluster/images/etcd/migrate/migrate_server.go
  • cluster/images/etcd/migrate/migrator.go
  • cluster/images/etcd/migrate/options.go
  • cluster/images/etcd/migrate/options_test.go
  • cluster/images/etcd/migrate/testdata/datadir_with_version/version.txt
  • cluster/images/etcd/migrate/testdata/datadir_without_version/.placeholder
  • cluster/images/etcd/migrate/util_others.go
  • cluster/images/etcd/migrate/utils_windows.go
  • cluster/images/etcd/migrate/versions.go
  • cluster/images/etcd/migrate/versions_test.go
  • cmd/cloud-controller-manager/.import-restrictions
  • cmd/genfeaturegates/genfeaturegates.go
  • cmd/kube-apiserver/OWNERS
  • cmd/kube-apiserver/app/aggregator.go
  • cmd/kube-apiserver/app/testing/testserver.go
  • cmd/kube-controller-manager/app/batch.go
  • cmd/kube-controller-manager/app/controller_descriptor.go
  • cmd/kube-controller-manager/app/controllermanager.go
  • cmd/kube-controller-manager/app/controllermanager_test.go
  • cmd/kube-controller-manager/app/core.go
  • cmd/kube-controller-manager/app/options/options.go
  • cmd/kube-controller-manager/app/options/options_test.go
  • cmd/kube-controller-manager/app/options/resourceclaimcontroller.go
  • cmd/kube-controller-manager/app/plugins.go
  • cmd/kube-controller-manager/app/plugins_providers.go
  • cmd/kube-controller-manager/app/plugins_test.go
  • cmd/kube-controller-manager/app/resource.go
  • cmd/kube-controller-manager/app/scheduling.go
  • cmd/kube-controller-manager/app/scheduling_test.go
  • cmd/kube-controller-manager/app/storageversionmigrator.go
  • cmd/kube-controller-manager/app/testing/testserver.go
  • cmd/kube-controller-manager/names/controller_names.go
  • cmd/kube-proxy/app/conntrack.go
  • cmd/kube-proxy/app/init_linux.go
  • cmd/kube-proxy/app/init_other.go
  • cmd/kube-proxy/app/init_windows.go
  • cmd/kube-proxy/app/options.go
  • cmd/kube-proxy/app/server.go
  • cmd/kube-proxy/app/server_linux.go
  • cmd/kube-proxy/app/server_linux_test.go
  • cmd/kube-proxy/app/server_other.go
  • cmd/kube-proxy/app/server_test.go
  • cmd/kube-proxy/app/server_windows.go
  • cmd/kube-scheduler/app/options/options.go
  • cmd/kube-scheduler/app/options/options_test.go
  • cmd/kube-scheduler/app/server.go
  • cmd/kubeadm/app/apis/kubeadm/v1beta3/defaults_unix.go
  • cmd/kubeadm/app/apis/kubeadm/v1beta3/defaults_windows.go
  • cmd/kubeadm/app/apis/kubeadm/v1beta4/defaults_unix.go
  • cmd/kubeadm/app/apis/kubeadm/v1beta4/defaults_windows.go
  • cmd/kubeadm/app/apis/kubeadm/validation/util_unix.go
  • cmd/kubeadm/app/apis/kubeadm/validation/util_windows.go
  • cmd/kubeadm/app/cmd/certs_test.go
  • cmd/kubeadm/app/cmd/config.go
  • cmd/kubeadm/app/cmd/init.go
  • cmd/kubeadm/app/cmd/options/constant.go
  • cmd/kubeadm/app/cmd/phases/init/data.go
  • cmd/kubeadm/app/cmd/phases/init/data_test.go
  • cmd/kubeadm/app/cmd/phases/init/kubeletfinalize.go
  • cmd/kubeadm/app/cmd/phases/init/uploadconfig.go
  • cmd/kubeadm/app/cmd/phases/join/controlplanejoin.go
  • cmd/kubeadm/app/cmd/phases/join/data.go
  • cmd/kubeadm/app/cmd/phases/join/data_test.go
  • cmd/kubeadm/app/cmd/phases/join/kubelet.go
  • cmd/kubeadm/app/cmd/phases/reset/cleanupnode.go
  • cmd/kubeadm/app/cmd/phases/reset/data.go
  • cmd/kubeadm/app/cmd/phases/reset/data_test.go
  • cmd/kubeadm/app/cmd/phases/reset/removeetcdmember_test.go
  • cmd/kubeadm/app/cmd/phases/reset/testdata/etcd-pod-without-data-volume.yaml
  • cmd/kubeadm/app/cmd/phases/reset/testdata/etcd-pod.yaml
  • cmd/kubeadm/app/cmd/phases/reset/unmount.go
  • cmd/kubeadm/app/cmd/phases/reset/unmount_linux.go
  • cmd/kubeadm/app/cmd/phases/reset/unmount_linux_test.go
  • cmd/kubeadm/app/cmd/phases/upgrade/apply/uploadconfig.go
  • cmd/kubeadm/app/cmd/phases/upgrade/data.go
  • cmd/kubeadm/app/cmd/phases/upgrade/data_test.go
  • cmd/kubeadm/app/cmd/phases/upgrade/postupgrade.go
  • cmd/kubeadm/app/cmd/reset.go
  • cmd/kubeadm/app/cmd/testdata/token-config.yaml
  • cmd/kubeadm/app/cmd/token_test.go
  • cmd/kubeadm/app/cmd/upgrade/common_test.go
  • cmd/kubeadm/app/cmd/upgrade/plan.go
  • cmd/kubeadm/app/cmd/upgrade/testdata/config-token.yaml
  • cmd/kubeadm/app/cmd/util_other_test.go
  • cmd/kubeadm/app/cmd/util_windows_test.go
  • cmd/kubeadm/app/componentconfigs/kubelet_unix.go
  • cmd/kubeadm/app/componentconfigs/kubelet_unix_test.go
  • cmd/kubeadm/app/componentconfigs/kubelet_windows.go
  • cmd/kubeadm/app/componentconfigs/kubelet_windows_test.go
  • cmd/kubeadm/app/constants/constants.go
  • cmd/kubeadm/app/constants/constants_test.go
  • cmd/kubeadm/app/constants/constants_unix.go
  • cmd/kubeadm/app/constants/constants_windows.go
  • cmd/kubeadm/app/discovery/discovery.go
  • cmd/kubeadm/app/discovery/discovery_test.go
  • cmd/kubeadm/app/discovery/testdata/ca.crt
  • cmd/kubeadm/app/discovery/token/testdata/expected-kubeconfig.yaml
  • cmd/kubeadm/app/discovery/token/token_test.go
  • cmd/kubeadm/app/features/features.go
  • cmd/kubeadm/app/phases/addons/dns/dns_test.go
  • cmd/kubeadm/app/phases/controlplane/manifests_test.go
  • cmd/kubeadm/app/phases/controlplane/volumes.go
  • cmd/kubeadm/app/phases/controlplane/volumes_test.go
  • cmd/kubeadm/app/phases/copycerts/testutil_umask.go
  • cmd/kubeadm/app/phases/copycerts/testutil_umask_noop.go
  • cmd/kubeadm/app/phases/etcd/local.go
  • cmd/kubeadm/app/phases/etcd/local_test.go
  • cmd/kubeadm/app/phases/upgrade/health.go
  • cmd/kubeadm/app/preflight/checks.go
  • cmd/kubeadm/app/preflight/checks_darwin.go
  • cmd/kubeadm/app/preflight/checks_linux.go
  • cmd/kubeadm/app/preflight/checks_other.go
  • cmd/kubeadm/app/preflight/checks_unix.go
  • cmd/kubeadm/app/preflight/checks_windows.go
  • cmd/kubeadm/app/util/apiclient/wait.go
  • cmd/kubeadm/app/util/chroot_unix.go
  • cmd/kubeadm/app/util/chroot_windows.go
  • cmd/kubeadm/app/util/config/cluster_test.go
  • cmd/kubeadm/app/util/config/common.go
  • cmd/kubeadm/app/util/config/common_test.go
  • cmd/kubeadm/app/util/config/testdata/kubelet-with-embedded-cert.yaml
  • cmd/kubeadm/app/util/config/testdata/kubelet-with-invalid-context.yaml
  • cmd/kubeadm/app/util/config/testdata/kubelet-with-invalid-user.yaml
  • cmd/kubeadm/app/util/config/testdata/kubelet-with-linked-cert.yaml
  • cmd/kubeadm/app/util/config/testdata/kubelet-without-cert.yaml
  • cmd/kubeadm/app/util/config/upgradeconfiguration.go
  • cmd/kubeadm/app/util/copy_unix.go
  • cmd/kubeadm/app/util/copy_windows.go
  • cmd/kubeadm/app/util/etcd/etcd.go
  • cmd/kubeadm/app/util/initsystem/initsystem_unix.go
💤 Files with no reviewable changes (1)
  • api/discovery/apis__scheduling.k8s.io__v1alpha1.json
✅ Files skipped from review due to trivial changes (14)
  • .go-version
  • .ci-operator.yaml
  • api/discovery/apis__storage.k8s.io__v1beta1.json
  • api/discovery/apis__scheduling.k8s.io__v1alpha2.json
  • CHANGELOG/README.md
  • .github/PULL_REQUEST_TEMPLATE.md
  • .gitignore
  • api/discovery/apis.json
  • api/discovery/apis__scheduling.k8s.io.json
  • api/discovery/apis__resource.k8s.io__v1alpha3.json
  • api/api-rules/violation_exceptions.list
  • CHANGELOG/CHANGELOG-1.35.md
  • api/discovery/aggregated_v2.json
  • api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1alpha1_openapi.json
🚧 Files skipped from review as they are similar to previous changes (13)
  • api/discovery/apis__storage.k8s.io__v1.json
  • api/openapi-spec/README.md
  • api/discovery/apis__resource.k8s.io__v1beta2.json
  • api/discovery/apis__admissionregistration.k8s.io__v1.json
  • api/openapi-spec/v3/apis__authorization.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__autoscaling__v2_openapi.json
  • api/openapi-spec/v3/apis__autoscaling__v1_openapi.json
  • api/openapi-spec/v3/apis__coordination.k8s.io__v1_openapi.json
  • api/openapi-spec/v3/apis__coordination.k8s.io__v1beta1_openapi.json
  • api/openapi-spec/v3/apis__flowcontrol.apiserver.k8s.io__v1_openapi.json
  • OWNERS_ALIASES
  • api/openapi-spec/v3/apis__batch__v1_openapi.json
  • api/openapi-spec/v3/apis__apps__v1_openapi.json

Comment on lines 477 to 479
"parameterNotFoundAction": {
"description": "`parameterNotFoundAction` controls the behavior of the binding when the resource exists, and name or selector is valid, but there are no parameters matched by the binding. If the value is set to `Allow`, then no matched parameters will be treated as successful validation by the binding. If set to `Deny`, then no matched parameters will be subject to the `failurePolicy` of the policy.\n\nAllowed values are `Allow` or `Deny`\n\nRequired",
"description": "parameterNotFoundAction controls the behavior of the binding when the resource exists, and name or selector is valid, but there are no parameters matched by the binding. If the value is set to `Allow`, then no matched parameters will be treated as successful validation by the binding. If set to `Deny`, then no matched parameters will be subject to the `failurePolicy` of the policy.\n\nAllowed values are `Allow` or `Deny`\n\nRequired",
"type": "string"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use mutation-specific wording for parameterNotFoundAction.

This schema is for MutatingAdmissionPolicyBinding, but the new description still says “successful validation by the binding”. That will publish incorrect public docs unless the source comment is fixed and the spec is regenerated.

🤖 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 `@api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json`
around lines 477 - 479, The description for the schema field
parameterNotFoundAction is using validation-specific wording; update its text to
use mutation-specific phrasing for MutatingAdmissionPolicyBinding (referencing
parameterNotFoundAction in the MutatingAdmissionPolicyBinding schema) so it
describes the behavior for mutation policies (e.g., explain how no matched
parameters affect mutation execution and failurePolicy) and replace "successful
validation" with appropriate mutation terminology; regenerate the openapi spec
from the corrected source comment so the public docs reflect the new wording.

Comment on lines +3374 to +3382
{
"description": "shardSelector restricts the list of returned objects using a CEL-based shard selector expression. The format uses the shardRange() function combined with || (logical OR) to specify one or more hash ranges:\n\n shardRange(object.metadata.uid, '0x0', '0x8000000000000000')\n shardRange(object.metadata.uid, '0x0', '0x8000000000000000') || shardRange(object.metadata.uid, '0x8000000000000000', '0x10000000000000000')\n\nField paths use CEL-style object-rooted syntax (e.g. \"object.metadata.uid\"), NOT the fieldSelector format (\"metadata.uid\"). Currently supported paths:\n - object.metadata.uid\n - object.metadata.namespace\n\nhexStart and hexEnd are single-quoted CEL string literals with a '0x' prefix, defining the inclusive lower and exclusive upper bounds over the 64-bit FNV-1a hash space. The full range is [0x0, 0x10000000000000000), where the exclusive upper bound equals 2^64.\n\nExamples:\n 2-shard split:\n shard 0: shardRange(object.metadata.uid, '0x0000000000000000', '0x8000000000000000')\n shard 1: shardRange(object.metadata.uid, '0x8000000000000000', '0x10000000000000000')\n 4-shard split:\n shard 0: shardRange(object.metadata.uid, '0x0000000000000000', '0x4000000000000000')\n shard 1: shardRange(object.metadata.uid, '0x4000000000000000', '0x8000000000000000')\n shard 2: shardRange(object.metadata.uid, '0x8000000000000000', '0xc000000000000000')\n shard 3: shardRange(object.metadata.uid, '0xc000000000000000', '0x10000000000000000')\n\nThis is an alpha field and requires enabling the ShardedListAndWatch feature gate.",
"in": "query",
"name": "shardSelector",
"schema": {
"type": "string",
"uniqueItems": true
}
},
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
python3 <<'PY'
import json
from pathlib import Path

spec = json.loads(Path("api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json").read_text())

for path, item in spec["paths"].items():
    if "{name}" not in path:
        continue
    for method, op in item.items():
        if not isinstance(op, dict) or op.get("x-kubernetes-action") != "watch":
            continue
        params = [
            p.get("name")
            for p in (item.get("parameters", []) + op.get("parameters", []))
            if isinstance(p, dict)
        ]
        print(f"{method.upper()} {path} -> shardSelector={'shardSelector' in params}")
PY

Repository: openshift/kubernetes

Length of output: 286


🏁 Script executed:

# Check file exists and get line count
wc -l "api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json"

# Read lines around 3374-3382
echo "=== Lines 3374-3382 ==="
sed -n '3374,3382p' "api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json"

# Read lines around 3724-3732
echo "=== Lines 3724-3732 ==="
sed -n '3724,3732p' "api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json"

# Count all shardSelector occurrences
echo "=== Total shardSelector occurrences ==="
rg -c "shardSelector" "api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json"

Repository: openshift/kubernetes

Length of output: 3787


🏁 Script executed:

# Get context around line 3374
echo "=== Context around line 3374 (20 lines before) ==="
sed -n '3354,3374p' "api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json" | grep -E '"(path|x-kubernetes-action|operationId)"'

# Get broader context
echo "=== Broader context around line 3374 (50 lines before) ==="
sed -n '3324,3374p' "api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json" | tail -30

echo ""
echo "=== Context around line 3724 (50 lines before) ==="
sed -n '3674,3724p' "api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json" | tail -30

Repository: openshift/kubernetes

Length of output: 5372


🏁 Script executed:

# Search for "watch" and "{name}" in the JSON to identify the paths
python3 <<'PY'
import json
from pathlib import Path

spec = json.loads(Path("api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json").read_text())

# Find which paths contain named watch and note their position in the file
line_num = 1
for path, item in spec["paths"].items():
    if "{name}" not in path or "watch" not in path:
        continue
    for method, op in item.items():
        if not isinstance(op, dict) or op.get("x-kubernetes-action") != "watch":
            continue
        params = [p.get("name") for p in (item.get("parameters", []) + op.get("parameters", [])) if isinstance(p, dict)]
        has_shard = 'shardSelector' in params
        print(f"Path: {path}")
        print(f"Method: {method.upper()}")
        print(f"Has shardSelector: {has_shard}")
        print(f"All params: {params}")
        print()
PY

Repository: openshift/kubernetes

Length of output: 754


Drop shardSelector from watch-by-name endpoints.

These routes are already scoped by {name}, so a collection shard selector has no useful meaning here. Leaving it in the generated spec widens the public API with a parameter clients cannot meaningfully use on single-object watches.

The named watch endpoints currently expose shardSelector:

  • GET /apis/admissionregistration.k8s.io/v1beta1/watch/mutatingadmissionpolicies/{name}
  • GET /apis/admissionregistration.k8s.io/v1beta1/watch/mutatingadmissionpolicybindings/{name}
🤖 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 `@api/openapi-spec/v3/apis__admissionregistration.k8s.io__v1beta1_openapi.json`
around lines 3374 - 3382, Remove the query parameter object named
"shardSelector" from the watch-by-name endpoints for mutatingadmissionpolicies
and mutatingadmissionpolicybindings (the GET paths ending with
/watch/.../{name}) in the generated OpenAPI spec; locate the parameter block
with "name": "shardSelector" / "in": "query" (the schema type "string" with
"uniqueItems": true) and ensure it is not emitted for endpoints whose path
contains a {name} path parameter, so single-object watch routes no longer
include shardSelector in their query params.

Comment on lines +126 to +128
"required": [
"token"
],
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

❓ Verification inconclusive

Script executed:

#!/bin/bash
set -euo pipefail

echo "== TokenReviewSpec type and markers =="
rg -n -C3 'type TokenReviewSpec struct|Token string|\\+optional|\\+required|datapolicy:"token"' pkg/apis/authentication/types.go

echo
echo "== TokenReview validation paths =="
rg -n -C4 'func ValidateTokenReview|func ValidateTokenReviewSpec|spec\.Token|len\(.*Token' pkg/apis/authentication

echo
echo "== OpenAPI/swagger generation sources touching TokenReviewSpec token requiredness =="
rg -n -C3 'TokenReviewSpec|required|token' pkg/apis/authentication

Repository: openshift/kubernetes


Repository: openshift/kubernetes
Exit code: 1

stdout:

== TokenReviewSpec type and markers ==
56-}
57-
58-// TokenReviewSpec is a description of the token authentication request.
59:type TokenReviewSpec struct {
60-	// Token is the opaque bearer token.
61:	Token string `datapolicy:"token"`
62-	// Audiences is a list of the identifiers that the resource server presented
63-	// with the token identifies as. Audience-aware token authenticators will
64-	// verify that the token was intended for at least one of the audiences in
--
145-// TokenRequestStatus is the result of a token request.
146-type TokenRequestStatus struct {
147-	// Token is the opaque bearer token.
148:	Token string `datapolicy:"token"`
149-	// ExpirationTimestamp is the time of expiration of the returned token.
150-	ExpirationTimestamp metav1.Time
151-}

== TokenReview validation paths ==


Script executed:

# Check if the file is auto-generated or manually maintained
head -30 api/openapi-spec/v3/apis__authentication.k8s.io__v1_openapi.json | grep -i "generated\|auto\|do not edit"

Repository: openshift/kubernetes


Repository: openshift/kubernetes
Exit code: 1


Script executed:

# Search for OpenAPI schema generation tooling
fd -e 'go' -e 'sh' -e 'py' | xargs rg -l 'openapi|swagger.*gen|gen.*spec' | head -20

Repository: openshift/kubernetes


Repository: openshift/kubernetes
Exit code: 0

stdout:

vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.pb.go
vendor/go.etcd.io/etcd/server/v3/embed/config.go
vendor/go.opentelemetry.io/otel/semconv/v1.37.0/attribute_group.go
vendor/go.opentelemetry.io/otel/semconv/v1.17.0/event.go
vendor/go.opentelemetry.io/otel/semconv/v1.39.0/otelconv/metric.go
vendor/go.opentelemetry.io/otel/semconv/v1.17.0/trace.go
vendor/go.opentelemetry.io/otel/semconv/v1.39.0/httpconv/metric.go
vendor/go.opentelemetry.io/otel/semconv/v1.17.0/resource.go
vendor/go.opentelemetry.io/otel/semconv/v1.12.0/resource.go
vendor/go.opentelemetry.io/otel/semconv/v1.39.0/rpcconv/metric.go
vendor/go.opentelemetry.io/otel/semconv/v1.12.0/trace.go
vendor/go.opentelemetry.io/otel/semconv/v1.39.0/attribute_group.go
vendor/google.golang.org/grpc/dialoptions.go
vendor/google.golang.org/protobuf/internal/impl/codec_map.go
vendor/golang.org/x/net/html/parse.go
vendor/golang.org/x/net/html/const.go
vendor/golang.org/x/net/http2/frame.go
vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go
vendor/golang.org/x/tools/go/ast/astutil/imports.go
vendor/k8s.io/kube-openapi/pkg/common/doc.go


Script executed:

# Check if TokenReviewSpec validation happens via CEL rules or other mechanisms
rg -n 'TokenReviewSpec|token.*required|required.*token' --type go pkg/apis/authentication/ -A 5 | head -50

Repository: openshift/kubernetes


Repository: openshift/kubernetes
Exit code: 0

stdout:

pkg/apis/authentication/zz_generated.deepcopy.go:208:func (in *TokenReviewSpec) DeepCopyInto(out *TokenReviewSpec) {
pkg/apis/authentication/zz_generated.deepcopy.go-209-	*out = *in
pkg/apis/authentication/zz_generated.deepcopy.go-210-	if in.Audiences != nil {
pkg/apis/authentication/zz_generated.deepcopy.go-211-		in, out := &in.Audiences, &out.Audiences
pkg/apis/authentication/zz_generated.deepcopy.go-212-		*out = make([]string, len(*in))
pkg/apis/authentication/zz_generated.deepcopy.go-213-		copy(*out, *in)
--
pkg/apis/authentication/zz_generated.deepcopy.go:218:// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenReviewSpec.
pkg/apis/authentication/zz_generated.deepcopy.go:219:func (in *TokenReviewSpec) DeepCopy() *TokenReviewSpec {
pkg/apis/authentication/zz_generated.deepcopy.go-220-	if in == nil {
pkg/apis/authentication/zz_generated.deepcopy.go-221-		return nil
pkg/apis/authentication/zz_generated.deepcopy.go-222-	}
pkg/apis/authentication/zz_generated.deepcopy.go:223:	out := new(TokenReviewSpec)
pkg/apis/authentication/zz_generated.deepcopy.go-224-	in.DeepCopyInto(out)
pkg/apis/authentication/zz_generated.deepcopy.go-225-	return out
pkg/apis/authentication/zz_generated.deepcopy.go-226-}
pkg/apis/authentication/zz_generated.deepcopy.go-227-
pkg/apis/authentication/zz_generated.deepcopy.go-228-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
--
pkg/apis/authentication/v1beta1/zz_generated.conversion.go:71:	if err := s.AddGeneratedConversionFunc((*authenticationv1beta1.TokenReviewSpec)(nil), (*authentication.TokenReviewSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
pkg/apis/authentication/v1beta1/zz_generated.conversion.go:72:		return Convert_v1beta1_TokenReviewSpec_To_authentication_TokenReviewSpec(a.(*authenticationv1beta1.TokenReviewSpec), b.(*authentication.TokenReviewSpec), scope)
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-73-	}); err != nil {
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-74-		return err
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-75-	}
pkg/apis/authentication/v1beta1/zz_generated.conversion.go:76:	if err := s.AddGeneratedConversionFunc((*authentication.TokenReviewSpec)(nil), (*authenticationv1beta1.TokenReviewSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
pkg/apis/authentication/v1beta1/zz_generated.conversion.go:77:		return Convert_authentication_TokenReviewSpec_To_v1beta1_TokenReviewSpec(a.(*authentication.TokenReviewSpec), b.(*authenticationv1beta1.TokenReviewSpec), scope)
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-78-	}); err != nil {
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-79-		return err
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-80-	}
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-81-	if err := s.AddGeneratedConversionFunc((*authenticationv1beta1.TokenReviewStatus)(nil), (*authentication.TokenReviewStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-82-		return Convert_v1beta1_TokenReviewStatus_To_authentication_TokenReviewStatus(a.(*authenticationv1beta1.TokenReviewStatus), b.(*authentication.TokenReviewStatus), scope)
--
pkg/apis/authentication/v1beta1/zz_generated.conversion.go:156:	if err := Convert_v1beta1_TokenReviewSpec_To_authentication_TokenReviewSpec(&in.Spec, &out.Spec, s); err != nil {
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-157-		return err
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-158-	}
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-159-	if err := Convert_v1beta1_TokenReviewStatus_To_authentication_TokenReviewStatus(&in.Status, &out.Status, s); err != nil {
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-160-		return err
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-161-	}
--
pkg/apis/authentication/v1beta1/zz_generated.conversion.go:172:	if err := Convert_authentication_TokenReviewSpec_To_v1beta1_TokenReviewSpec(&in.Spec, &out.Spec, s); err != nil {
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-173-		return err
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-174-	}
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-175-	if err := Convert_authentication_TokenReviewStatus_To_v1beta1_TokenReviewStatus(&in.Status, &out.Status, s); err != nil {
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-176-		return err
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-177-	}
--
pkg/apis/authentication/v1beta1/zz_generated.conversion.go:186:func autoConvert_v1beta1_TokenReviewSpec_To_authentication_TokenReviewSpec(in *authenticationv1beta1.TokenReviewSpec, out *authentication.TokenReviewSpec, s conversion.Scope) error {
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-187-	out.Token = in.Token
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-188-	out.Audiences = *(*[]string)(unsafe.Pointer(&in.Audiences))
pkg/apis/authentication/v1beta1/zz_generated.conversion.go-189-	return nil


Script executed:

# Verify the actual behavior: does API server accept requests without token field?
rg -n 'token.*nil|Token.*empty|omitempty' pkg/apis/authentication/types.go -C 2

Repository: openshift/kubernetes


Repository: openshift/kubernetes
Exit code: 0

stdout:

81-	// spec.audiences field should validate that a compatible audience identifier
82-	// is returned in the status.audiences field to ensure that the TokenReview
83:	// server is audience aware. If a TokenReview returns an empty
84-	// status.audience field where status.authenticated is "true", the token is
85-	// valid against the audience of the Kubernetes API server.


Script executed:

# Check if validation rules exist in the OpenAPI schema itself (CEL validation)
rg -n 'validationRules|x-kubernetes-validations' api/openapi-spec/v3/apis__authentication.k8s.io__v1_openapi.json -A 5 | head -30

Repository: openshift/kubernetes


Repository: openshift/kubernetes
Exit code: 0


Script executed:

# Search for webhook/validation logic in authentication package
rg -n 'webhook|Validate|validation' pkg/apis/authentication/ --type go | grep -i token | head -20

Repository: openshift/kubernetes


Repository: openshift/kubernetes
Exit code: 0

stdout:

pkg/apis/authentication/validation/validation.go:28:// ValidateTokenRequest validates a TokenRequest.
pkg/apis/authentication/validation/validation.go:29:func ValidateTokenRequest(tr *authentication.TokenRequest) field.ErrorList {


Script executed:

# Check the actual TokenReview OpenAPI schema definition around the token field
sed -n '110,140p' api/openapi-spec/v3/apis__authentication.k8s.io__v1_openapi.json

Repository: openshift/kubernetes


Repository: openshift/kubernetes
Exit code: 0

stdout:

        "description": "TokenReviewSpec is a description of the token authentication request.",
        "properties": {
          "audiences": {
            "description": "audiences is a list of the identifiers that the resource server presented with the token identifies as. Audience-aware token authenticators will verify that the token was intended for at least one of the audiences in this list. If no audiences are provided, the audience will default to the audience of the Kubernetes apiserver.",
            "items": {
              "default": "",
              "type": "string"
            },
            "type": "array",
            "x-kubernetes-list-type": "atomic"
          },
          "token": {
            "description": "token is the opaque bearer token.",
            "type": "string"
          }
        },
        "required": [
          "token"
        ],
        "type": "object"
      },
      "io.k8s.api.authentication.v1.TokenReviewStatus": {
        "description": "TokenReviewStatus is the result of the token authentication request.",
        "properties": {
          "audiences": {
            "description": "audiences are audience identifiers chosen by the authenticator that are compatible with both the TokenReview and token. An identifier is any identifier in the intersection of the TokenReviewSpec audiences and the token's audiences. A client of the TokenReview API that sets the spec.audiences field should validate that a compatible audience identifier is returned in the status.audiences field to ensure that the TokenReview server is audience aware. If a TokenReview returns an empty status.audience field where status.authenticated is \"true\", the token is valid against the audience of the Kubernetes API server.",
            "items": {
              "default": "",
              "type": "string"
            },
            "type": "array",


Script executed:

# Check what ValidateTokenRequest actually validates
sed -n '28,60p' pkg/apis/authentication/validation/validation.go

Repository: openshift/kubernetes


Repository: openshift/kubernetes
Exit code: 0

stdout:

// ValidateTokenRequest validates a TokenRequest.
func ValidateTokenRequest(tr *authentication.TokenRequest) field.ErrorList {
	allErrs := field.ErrorList{}
	specPath := field.NewPath("spec")

	if tr.Spec.ExpirationSeconds < MinTokenAgeSec {
		allErrs = append(allErrs, field.Invalid(specPath.Child("expirationSeconds"), tr.Spec.ExpirationSeconds, "may not specify a duration less than 10 minutes"))
	}
	if tr.Spec.ExpirationSeconds > 1<<32 {
		allErrs = append(allErrs, field.Invalid(specPath.Child("expirationSeconds"), tr.Spec.ExpirationSeconds, "may not specify a duration larger than 2^32 seconds"))
	}
	return allErrs
}


Script executed:

# Search for any validation of Token field being required/non-empty
rg -n 'Token.*required|Token.*empty|len.*Token|Token.*nil' pkg/apis/authentication/validation/ -C 3

Repository: openshift/kubernetes


Repository: openshift/kubernetes
Exit code: 1


Script executed:

# Check if there's a ValidateTokenReviewSpec or ValidateTokenReview function
rg -n 'ValidateTokenReview' pkg/apis/authentication/validation/validation.go -A 10

Repository: openshift/kubernetes


Repository: openshift/kubernetes
Exit code: 1


Required spec.token lacks corresponding server-side validation.

Line 126 adds OpenAPI required: ["token"], but there is no ValidateTokenReview or ValidateTokenReviewSpec function in pkg/apis/authentication/validation/ to enforce this constraint. The Token field in pkg/apis/authentication/types.go has only a datapolicy tag and no validation markers. Without explicit server-side validation, the required constraint in the schema may not be enforced at runtime, creating drift between the API contract and actual behavior.

🤖 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 `@api/openapi-spec/v3/apis__authentication.k8s.io__v1_openapi.json` around
lines 126 - 128, The OpenAPI schema marks spec.token as required but there's no
server-side validator; add a validation implementation under
pkg/apis/authentication/validation that enforces non-empty Token (e.g.,
implement ValidateTokenReview and/or ValidateTokenReviewSpec which check that
Token (pkg/apis/authentication/types.go) is not empty and return an appropriate
field.ErrorList), register these validators with the admission/validation entry
points for TokenReview resources, and/or add kubebuilder validation markers on
the Token field in types.go if you prefer code-gen'd OpenAPI + then regenerate
to keep schema and server-side checks in sync.

Comment on lines +992 to +1000
{
"description": "shardSelector restricts the list of returned objects using a CEL-based shard selector expression. The format uses the shardRange() function combined with || (logical OR) to specify one or more hash ranges:\n\n shardRange(object.metadata.uid, '0x0', '0x8000000000000000')\n shardRange(object.metadata.uid, '0x0', '0x8000000000000000') || shardRange(object.metadata.uid, '0x8000000000000000', '0x10000000000000000')\n\nField paths use CEL-style object-rooted syntax (e.g. \"object.metadata.uid\"), NOT the fieldSelector format (\"metadata.uid\"). Currently supported paths:\n - object.metadata.uid\n - object.metadata.namespace\n\nhexStart and hexEnd are single-quoted CEL string literals with a '0x' prefix, defining the inclusive lower and exclusive upper bounds over the 64-bit FNV-1a hash space. The full range is [0x0, 0x10000000000000000), where the exclusive upper bound equals 2^64.\n\nExamples:\n 2-shard split:\n shard 0: shardRange(object.metadata.uid, '0x0000000000000000', '0x8000000000000000')\n shard 1: shardRange(object.metadata.uid, '0x8000000000000000', '0x10000000000000000')\n 4-shard split:\n shard 0: shardRange(object.metadata.uid, '0x0000000000000000', '0x4000000000000000')\n shard 1: shardRange(object.metadata.uid, '0x4000000000000000', '0x8000000000000000')\n shard 2: shardRange(object.metadata.uid, '0x8000000000000000', '0xc000000000000000')\n shard 3: shardRange(object.metadata.uid, '0xc000000000000000', '0x10000000000000000')\n\nThis is an alpha field and requires enabling the ShardedListAndWatch feature gate.",
"in": "query",
"name": "shardSelector",
"schema": {
"type": "string",
"uniqueItems": true
}
},
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Adjust shardSelector wording for deletecollection behavior.

On Line 993, the description says it “restricts the list of returned objects,” but this operation is deletecollection; the selector constrains which objects are targeted for deletion.

✏️ Suggested wording update
- "description": "shardSelector restricts the list of returned objects using a CEL-based shard selector expression. ...
+ "description": "shardSelector restricts the set of objects targeted by this delete collection request using a CEL-based shard selector expression. ...
🤖 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 `@api/openapi-spec/v3/apis__certificates.k8s.io__v1_openapi.json` around lines
992 - 1000, Update the description for the query parameter "shardSelector"
(parameter name: shardSelector, schema type: string) to reflect that this is
used by deletecollection operations: replace the phrase "restricts the list of
returned objects" with wording that it "restricts which objects are targeted for
deletion" (or equivalent) and keep the rest of the explanation about CEL
shardRange syntax, supported field paths, hexStart/hexEnd bounds, examples, and
the note about the ShardedListAndWatch feature gate unchanged.

Comment on lines 228 to 230
"required": [
"addressType",
"endpoints"
"addressType"
],
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Keep EndpointSlice.endpoints required unless the API type contract is also changed

Line 229 makes endpoints optional in OpenAPI, but pkg/apis/discovery/types.go:29-49 still models EndpointSlice.Endpoints as non-optional. This creates schema/type drift and can break generated-client expectations for create/replace payloads.

Suggested fix
         "required": [
-          "addressType"
+          "addressType",
+          "endpoints"
         ],
🤖 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 `@api/openapi-spec/v3/apis__discovery.k8s.io__v1_openapi.json` around lines 228
- 230, The OpenAPI schema made EndpointSlice.endpoints optional while the Go
type EndpointSlice.Endpoints (pkg/apis/discovery/types.go) remains non-optional;
to fix this, update the OpenAPI schema for the EndpointSlice object by adding
"endpoints" to its "required" array so the JSON contract matches the Go model
(or alternatively make the Go field optional/omitempty if you intend the API to
be optional) — ensure you modify the EndpointSlice schema's "required" list in
the OpenAPI file to include "endpoints" to restore schema/type parity.

* Add a rate limiter to the GCE cloudprovider ([#23019](https://github.com/kubernetes/kubernetes/pull/23019), [@alex-mohr](https://github.com/alex-mohr))
* Add a Deployment example for kubectl expose. ([#23222](https://github.com/kubernetes/kubernetes/pull/23222), [@madhusudancs](https://github.com/madhusudancs))
* Use versioned object when computing patch ([#23145](https://github.com/kubernetes/kubernetes/pull/23145), [@liggitt](https://github.com/liggitt))
* kubelet: send all recevied pods in one update ([#23141](https://github.com/kubernetes/kubernetes/pull/23141), [@yujuhong](https://github.com/yujuhong))
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix typo: "recevied" should be "received".

The word "recevied" is misspelled in the changelog entry.

📝 Proposed fix
-* kubelet: send all recevied pods in one update ([`#23141`](https://gi...
+* kubelet: send all received pods in one update ([`#23141`](https://gi...
📝 Committable suggestion

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

Suggested change
* kubelet: send all recevied pods in one update ([#23141](https://github.com/kubernetes/kubernetes/pull/23141), [@yujuhong](https://github.com/yujuhong))
* kubelet: send all received pods in one update ([`#23141`](https://github.com/kubernetes/kubernetes/pull/23141), [`@yujuhong`](https://github.com/yujuhong))
🧰 Tools
🪛 LanguageTool

[grammar] ~270-~270: Ensure spelling is correct
Context: ...ithub.com/liggitt)) * kubelet: send all recevied pods in one update ([#23141](https://gi...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 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 `@CHANGELOG/CHANGELOG-1.2.md` at line 270, Fix the typo in the changelog entry
by replacing "recevied" with "received" in the line that currently reads "*
kubelet: send all recevied pods in one update ([`#23141`], [`@yujuhong`])" so it
becomes "* kubelet: send all received pods in one update ([`#23141`],
[`@yujuhong`])".

* Add a rate limiter to the GCE cloudprovider ([#23019](https://github.com/kubernetes/kubernetes/pull/23019), [@alex-mohr](https://github.com/alex-mohr))
* Add a Deployment example for kubectl expose. ([#23222](https://github.com/kubernetes/kubernetes/pull/23222), [@madhusudancs](https://github.com/madhusudancs))
* Use versioned object when computing patch ([#23145](https://github.com/kubernetes/kubernetes/pull/23145), [@liggitt](https://github.com/liggitt))
* kubelet: send all recevied pods in one update ([#23141](https://github.com/kubernetes/kubernetes/pull/23141), [@yujuhong](https://github.com/yujuhong))
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix typo: "recevied" should be "received".

The word "recevied" is misspelled in the changelog entry. This is the same typo that appears in CHANGELOG-1.2.md line 270.

📝 Proposed fix
-* kubelet: send all recevied pods in one update ([`#23141`](https://gi...
+* kubelet: send all received pods in one update ([`#23141`](https://gi...
📝 Committable suggestion

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

Suggested change
* kubelet: send all recevied pods in one update ([#23141](https://github.com/kubernetes/kubernetes/pull/23141), [@yujuhong](https://github.com/yujuhong))
* kubelet: send all received pods in one update ([`#23141`](https://github.com/kubernetes/kubernetes/pull/23141), [`@yujuhong`](https://github.com/yujuhong))
🤖 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 `@CHANGELOG/CHANGELOG-1.3.md` at line 948, Change the misspelled word
"recevied" to "received" in the changelog entry line that reads "* kubelet: send
all recevied pods in one update
([`#23141`](https://github.com/kubernetes/kubernetes/pull/23141),
[`@yujuhong`](https://github.com/yujuhong))" so it reads "* kubelet: send all
received pods in one update (...)".

@jacobsee
Copy link
Copy Markdown
Member Author

jacobsee commented May 5, 2026

/test integration

@jacobsee jacobsee force-pushed the rebase-1.36-jacob branch from 2af6682 to 6cd04ee Compare May 5, 2026 01:34
@openshift-ci-robot
Copy link
Copy Markdown

@jacobsee: the contents of this pull request could not be automatically validated.

The following commits are valid:

The following commits could not be validated and must be approved by a top-level approver:

Comment /validate-backports to re-evaluate validity of the upstream PRs, for example when they are merged upstream.

@jacobsee
Copy link
Copy Markdown
Member Author

jacobsee commented May 5, 2026

/test integration

jacobsee added 2 commits May 5, 2026 11:52
Could squash into UPSTREAM: <carry>: emit event when readyz goes true
Squash into: UPSTREAM: <carry>: add management support to kubelet
@jacobsee jacobsee force-pushed the rebase-1.36-jacob branch from 6cd04ee to 2a71b56 Compare May 5, 2026 22:43
@openshift-ci-robot
Copy link
Copy Markdown

@jacobsee: the contents of this pull request could not be automatically validated.

The following commits are valid:

The following commits could not be validated and must be approved by a top-level approver:

Comment /validate-backports to re-evaluate validity of the upstream PRs, for example when they are merged upstream.

@jacobsee
Copy link
Copy Markdown
Member Author

jacobsee commented May 5, 2026

/test integration
/test unit

@openshift-ci
Copy link
Copy Markdown

openshift-ci Bot commented May 5, 2026

@jacobsee: all tests passed!

Full PR test history. Your PR dashboard.

Details

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

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

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. backports/unvalidated-commits Indicates that not all commits come to merged upstream PRs. do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. vendor-update Touching vendor dir or related files

Projects

None yet

Development

Successfully merging this pull request may close these issues.