Skip to content

migrate read only tests from otp to origin#31239

Open
sandeepknd wants to merge 1 commit into
openshift:mainfrom
sandeepknd:api-healthz
Open

migrate read only tests from otp to origin#31239
sandeepknd wants to merge 1 commit into
openshift:mainfrom
sandeepknd:api-healthz

Conversation

@sandeepknd
Copy link
Copy Markdown
Contributor

@sandeepknd sandeepknd commented May 31, 2026

Our intention is to migrate the read-only tests of control plane modules from openshift-tests-private to origin.
Started with test OCP-24698 .
Please find the execution logs, with the latest review comments addressed.

$ make openshift-tests
go build -mod=vendor -trimpath -ldflags "-X github.com/openshift/origin/pkg/version.versionFromGit="v4.1.0-11404-g4629f95" -X github.com/openshift/origin/pkg/version.commitFromGit="4629f95e16" -X github.com/openshift/origin/pkg/version.gitTreeState="dirty" -X github.com/openshift/origin/pkg/version.buildDate="2026-06-01T06:50:42Z" " github.com/openshift/origin/cmd/openshift-tests


$ ./openshift-tests run-test "[sig-api-machinery][Suite:openshift/controlplane] Control Plane [OTP] OCP-24698 should have accessible HTTP readyz endpoints for all kube-apiserver pods"
I0601 12:25:37.032189   41029 factory.go:195] Registered Plugin "containerd"
  I0601 12:25:37.486323   41029 binary.go:80] Found 8895 test specs
  I0601 12:25:37.489723   41029 binary.go:97] 1226 test specs remain, after filtering out k8s
openshift-tests v4.1.0-11404-g4629f95
  I0601 12:25:46.977193   41029 test_setup.go:125] Extended test version v4.1.0-11404-g4629f95
  I0601 12:25:46.977249   41029 test_context.go:558] Tolerating taints "node-role.kubernetes.io/control-plane" when considering if nodes are ready
  I0601 12:25:46.978634 41029 framework.go:2330] [precondition-check] checking if cluster is MicroShift
  I0601 12:25:47.275555 41029 framework.go:2353] IsMicroShiftCluster: microshift-version configmap not found, not MicroShift
  I0601 12:25:47.276331   41029 binary.go:124] Loaded test configuration: &framework.TestContextType{KubeConfig:"/home/skundu/Downloads/kubeconfig", KubeContext:"", KubeAPIContentType:"application/vnd.kubernetes.protobuf", KubeletRootDir:"/var/lib/kubelet", KubeletConfigDropinDir:"", CertDir:"", Host:"https://api.ppt-0106c.qe.devcluster.openshift.com:6443", BearerToken:"<redacted>", RepoRoot:"../../", ListImages:false, listTests:false, listLabels:false, ListConformanceTests:false, Provider:"aws", Tooling:"", timeouts:framework.TimeoutContext{Poll:2000000000, PodStart:300000000000, PodStartShort:120000000000, PodStartSlow:900000000000, PodDelete:300000000000, ClaimProvision:300000000000, DataSourceProvision:300000000000, ClaimProvisionShort:60000000000, ClaimBound:180000000000, PVReclaim:180000000000, PVBound:180000000000, PVCreate:180000000000, PVDelete:300000000000, PVDeleteSlow:1200000000000, SnapshotCreate:300000000000, SnapshotDelete:300000000000, SnapshotControllerMetrics:300000000000, SystemPodsStartup:600000000000, NodeSchedulable:1800000000000, SystemDaemonsetStartup:300000000000, NodeNotReady:180000000000}, CloudConfig:framework.CloudConfig{APIEndpoint:"", ProjectID:"", Zone:"us-east-2a", Zones:[]string{"us-east-2a", "us-east-2b", "us-east-2c"}, Region:"us-east-2", MultiZone:true, MultiMaster:true, Cluster:"", MasterName:"", NodeInstanceGroup:"", NumNodes:3, ClusterIPRange:"", ClusterTag:"", Network:"", ConfigFile:"", NodeTag:"", MasterTag:"", Provider:(*aws.Provider)(0x105e3280)}, KubectlPath:"kubectl", OutputDir:"/tmp", ReportDir:"", ReportPrefix:"", ReportCompleteGinkgo:false, ReportCompleteJUnit:false, Prefix:"e2e", MinStartupPods:-1, EtcdUpgradeStorage:"", EtcdUpgradeVersion:"", GCEUpgradeScript:"", ContainerRuntimeEndpoint:"unix:///run/containerd/containerd.sock", ContainerRuntimeProcessName:"containerd", ContainerRuntimePidFile:"/run/containerd/containerd.pid", SystemdServices:"containerd*", DumpSystemdJournal:false, ImageServiceEndpoint:"", MasterOSDistro:"custom", NodeOSDistro:"custom", NodeOSArch:"amd64", VerifyServiceAccount:true, DeleteNamespace:true, DeleteNamespaceOnFailure:true, AllowedNotReadyNodes:-1, CleanStart:false, GatherKubeSystemResourceUsageData:"false", GatherLogsSizes:false, GatherMetricsAfterTest:"false", GatherSuiteMetricsAfterTest:false, MaxNodesToGather:0, IncludeClusterAutoscalerMetrics:false, OutputPrintType:"json", CreateTestingNS:(framework.CreateTestingNSFn)(0x6b577a0), DumpLogsOnFailure:true, DisableLogDump:false, LogexporterGCSPath:"", NodeTestContextType:framework.NodeTestContextType{NodeE2E:false, NodeName:"", NodeConformance:false, PrepullImages:false, ImageDescription:"", RuntimeConfig:map[string]string(nil), SystemSpecName:"", RestartKubelet:false, ExtraEnvs:map[string]string(nil), StandaloneMode:false, CriProxyEnabled:false}, ClusterDNSDomain:"cluster.local", NodeKiller:framework.NodeKillerConfig{Enabled:false, FailureRatio:0.01, Interval:60000000000, JitterFactor:60, SimulatedDowntime:600000000000, NodeKillerStopCtx:context.Context(nil), NodeKillerStop:(func())(nil)}, IPFamily:"ipv4", NonblockingTaints:"node-role.kubernetes.io/control-plane", ProgressReportURL:"", SriovdpConfigMapFile:"", SpecSummaryOutput:"", DockerConfigFile:"", E2EDockerConfigFile:"", KubeTestRepoList:"", SnapshotControllerPodName:"", SnapshotControllerHTTPPort:0, RequireDevices:false, EnabledVolumeDrivers:[]string(nil)}
  Running Suite:  - /home/skundu/automation/origin
  ================================================
  Random Seed: 1780296937 - will randomize all specs

  Will run 1 of 1 specs
  ------------------------------
  [sig-api-machinery][Suite:openshift/controlplane] Control Plane [OTP] OCP-24698 should have accessible HTTP readyz endpoints for all kube-apiserver pods
  github.com/openshift/origin/test/extended/controlplane/controlplane_tests.go:54
    STEP: Creating a kubernetes client @ 06/01/26 12:25:47.315
  I0601 12:25:47.317784   41029 discovery.go:214] Invalidating discovery information
  I0601 12:25:47.319416 41029 framework.go:2330] [precondition-check] checking if cluster is MicroShift
  I0601 12:25:47.588942 41029 framework.go:2353] IsMicroShiftCluster: microshift-version configmap not found, not MicroShift
    STEP: discovering kube-apiserver pods @ 06/01/26 12:25:47.846
  I0601 12:25:48.814259 41029 controlplane_tests.go:75] Found 3 kube-apiserver pods to test
    STEP: testing HTTP readyz endpoint for pod kube-apiserver-ip-10-0-18-151.us-east-2.compute.internal @ 06/01/26 12:25:48.814
  I0601 12:25:48.814458 41029 controlplane_tests.go:95] Starting port-forward: /usr/local/sbin/oc port-forward -n openshift-kube-apiserver kube-apiserver-ip-10-0-18-151.us-east-2.compute.internal 38979:6080
    STEP: checking HTTP readyz endpoint for pod kube-apiserver-ip-10-0-18-151.us-east-2.compute.internal @ 06/01/26 12:25:48.815
  I0601 12:25:53.316340 41029 controlplane_tests.go:126] Pod kube-apiserver-ip-10-0-18-151.us-east-2.compute.internal readyz response: ok
  I0601 12:25:53.316425 41029 controlplane_tests.go:127] Successfully verified HTTP readyz endpoint for pod kube-apiserver-ip-10-0-18-151.us-east-2.compute.internal
    STEP: testing HTTP readyz endpoint for pod kube-apiserver-ip-10-0-33-57.us-east-2.compute.internal @ 06/01/26 12:25:53.316
  I0601 12:25:53.316725 41029 controlplane_tests.go:95] Starting port-forward: /usr/local/sbin/oc port-forward -n openshift-kube-apiserver kube-apiserver-ip-10-0-33-57.us-east-2.compute.internal 7331:6080
    STEP: checking HTTP readyz endpoint for pod kube-apiserver-ip-10-0-33-57.us-east-2.compute.internal @ 06/01/26 12:25:53.317
  I0601 12:25:57.582558 41029 controlplane_tests.go:126] Pod kube-apiserver-ip-10-0-33-57.us-east-2.compute.internal readyz response: ok
  I0601 12:25:57.582613 41029 controlplane_tests.go:127] Successfully verified HTTP readyz endpoint for pod kube-apiserver-ip-10-0-33-57.us-east-2.compute.internal
    STEP: testing HTTP readyz endpoint for pod kube-apiserver-ip-10-0-95-175.us-east-2.compute.internal @ 06/01/26 12:25:57.582
  I0601 12:25:57.582763 41029 controlplane_tests.go:95] Starting port-forward: /usr/local/sbin/oc port-forward -n openshift-kube-apiserver kube-apiserver-ip-10-0-95-175.us-east-2.compute.internal 17891:6080
    STEP: checking HTTP readyz endpoint for pod kube-apiserver-ip-10-0-95-175.us-east-2.compute.internal @ 06/01/26 12:25:57.583
  I0601 12:26:01.997914 41029 controlplane_tests.go:126] Pod kube-apiserver-ip-10-0-95-175.us-east-2.compute.internal readyz response: ok
  I0601 12:26:01.998015 41029 controlplane_tests.go:127] Successfully verified HTTP readyz endpoint for pod kube-apiserver-ip-10-0-95-175.us-east-2.compute.internal
  I0601 12:26:02.000535 41029 controlplane_tests.go:101] Cleaning up port-forward for pod kube-apiserver-ip-10-0-95-175.us-east-2.compute.internal
  I0601 12:26:02.000623 41029 controlplane_tests.go:101] Cleaning up port-forward for pod kube-apiserver-ip-10-0-33-57.us-east-2.compute.internal
  I0601 12:26:02.000705 41029 controlplane_tests.go:101] Cleaning up port-forward for pod kube-apiserver-ip-10-0-18-151.us-east-2.compute.internal
  • [14.724 seconds]
  ------------------------------

  Ran 1 of 1 Specs in 14.726 seconds
  SUCCESS! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped
[
  {
    "name": "[sig-api-machinery][Suite:openshift/controlplane] Control Plane [OTP] OCP-24698 should have accessible HTTP readyz endpoints for all kube-apiserver pods",
    "lifecycle": "blocking",
    "duration": 14726,
    "startTime": "2026-06-01 06:55:47.276524 UTC",
    "endTime": "2026-06-01 06:56:02.002648 UTC",
    "result": "passed",


Summary by CodeRabbit

Release Notes

  • Tests

    • New control plane test suite added to verify kube-apiserver readiness endpoint is accessible via port-forward.
    • Suite skips unsupported cluster types and includes robust port-forwarding and readiness polling with cleanup.
  • Chores

    • Registered the control plane extended tests and established ownership for ongoing control plane testing.

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

Pipeline controller notification
This repo is configured to use the pipeline controller. Second-stage tests will be triggered either automatically or after lgtm label is added, depending on the repository configuration. The pipeline controller will automatically detect which contexts are required and will utilize /test Prow commands to trigger the second stage.

For optional jobs, comment /test ? to see a list of all defined jobs. To trigger manually all jobs from second stage use /pipeline required command.

This repository is configured in: automatic mode

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 31, 2026

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

This PR adds a control-plane e2e test that verifies kube-apiserver /readyz?verbose via oc port-forward, registers the suite in staticSuites and the extended test bundle, and adds an OWNERS file for the test package.

Changes

Control Plane Readyz E2E Test

Layer / File(s) Summary
Control plane e2e test implementation
test/extended/controlplane/controlplane_tests.go
Defines a Ginkgo test suite: constants for kube-apiserver namespace and timing, a BeforeEach that skips MicroShift/HyperShift, and the core test that lists running kube-apiserver-ip* pods, starts oc port-forward subprocesses to random local ports, polls http://localhost:<port>/readyz?verbose until reachable, asserts the response contains ok, and registers cleanup.
Test suite registration and bundle import
pkg/testsuites/standard_suites.go, test/extended/include.go
Adds an openshift/controlplane entry to staticSuites with its long description and qualifier generated by withStandardEarlyOrLateTests, and adds a blank import of test/extended/controlplane to include the package in the extended test bundle.
Code ownership
test/extended/controlplane/OWNERS
Adds OWNERS listing approvers and reviewers for the new controlplane test package.

Sequence Diagram

sequenceDiagram
  participant TestSuite
  participant KubeAPI
  participant KubeAPIPod as kube-apiserver Pod
  participant PortFwd as oc port-forward
  participant LocalHTTP as localhost:port/readyz?verbose
  TestSuite->>KubeAPI: List pods in openshift-kube-apiserver (filter kube-apiserver-ip*)
  KubeAPI-->>TestSuite: Pod list
  TestSuite->>PortFwd: Start subprocess forwarding random localhost:port -> pod:insecureReadyzPort
  PortFwd->>KubeAPIPod: Forward traffic to readyz port
  TestSuite->>LocalHTTP: Poll localhost:port/readyz?verbose
  LocalHTTP-->>TestSuite: 200 response containing "ok"
  TestSuite->>TestSuite: Assert response contains "ok"
  TestSuite->>PortFwd: Cleanup: cancel/kill port-forward subprocess
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes


Caution

Pre-merge checks failed

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

  • Ignore

❌ Failed checks (1 error, 2 warnings, 1 inconclusive)

Check name Status Explanation Resolution
No-Sensitive-Data-In-Logs ❌ Error The test logs internal hostnames: pod names like 'kube-apiserver-ip-10-0-18-151.us-east-2.compute.internal' at lines 95 (portForwardCmd.String()) and 126 (readyz response). Remove or sanitize logging of pod names/internal hostnames; log only pod count or generic identifiers instead of full pod names with IP addresses.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Test Structure And Quality ⚠️ Warning Two assertions in BeforeEach (lines 42, 48) lack meaningful failure messages per requirement 4. All other assertions in the It block properly include messages. Add failure messages to BeforeEach assertions: "failed to check IsMicroShiftCluster" and "failed to check IsHypershift" respectively.
Title check ❓ Inconclusive The PR title 'migrate read only tests from otp to origin' is vague and does not clearly describe the specific changes. The actual changeset adds a new control plane test suite (openshift/controlplane) with a readyz endpoint test, but the title uses generic terminology ('read only tests') that doesn't match the specific test being migrated (OCP-24698 readyz endpoint test) and doesn't mention 'control plane' or the actual functionality being tested. Consider a more specific title like 'Add control plane readyz endpoint test for kube-apiserver pods' or 'Migrate OCP-24698 control plane test to origin' to better reflect the actual changes in the PR.
✅ Passed checks (11 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Stable And Deterministic Test Names ✅ Passed The main It() test title is stable and deterministic with no dynamic values. By() substeps are narrative logging elements, not test titles.
Microshift Test Compatibility ✅ Passed Test is protected from MicroShift via exutil.IsMicroShiftCluster() check with g.Skip() in BeforeEach hook (lines 41-45), which is an approved protection mechanism per custom check instructions.
Single Node Openshift (Sno) Test Compatibility ✅ Passed Test makes no multi-node assumptions. Works with any pod count (1+ kube-apiserver pods), tests readyz endpoint via port-forward. No node affinity, anti-affinity, or node-count dependencies.
Topology-Aware Scheduling Compatibility ✅ Passed PR adds only test code validating existing control-plane infrastructure. Does not introduce deployment manifests, operators, controllers, or scheduling constraints.
Ote Binary Stdout Contract ✅ Passed No OTE Binary Stdout Contract violations found. All logging uses test framework functions (e2e.Logf, g.By) within test blocks; no process-level fmt/klog writes detected.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed Test hardcodes 'localhost' hostname (safe for IPv4/IPv6), uses only cluster-internal kube-apiserver via port-forward, no external connectivity, no hardcoded IPv4 CIDR blocks.
No-Weak-Crypto ✅ Passed No weak cryptography (MD5, SHA1, DES, RC4, 3DES, Blowfish, ECB), custom crypto implementations, or non-constant-time secret comparisons detected in any modified files.
Container-Privileges ✅ Passed PR adds Go test code and configuration files only; no K8s manifests or container configurations with privilege escalation settings are introduced.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@openshift-ci openshift-ci Bot requested review from deads2k and p0lyn0mial May 31, 2026 18:49
@sandeepknd
Copy link
Copy Markdown
Contributor Author

/assign @gangwgr
/assign @ropatil010

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

🧹 Nitpick comments (2)
test/extended/otp/otp_tests.go (2)

68-68: 💤 Low value

Consider checking port availability before use.

Random port selection without availability checking could lead to conflicts, though the risk is low since the suite runs serially (Parallelism: 1). Consider using a more robust approach like binding to :0 and letting the OS assign an available port, or checking availability before use.

🤖 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 `@test/extended/otp/otp_tests.go` at line 68, The test currently picks a random
port with localPort := rand.Intn(65534-1025) + 1025 which can collide; replace
that approach by letting the OS pick an available port (use a temporary TCP
listener on ":0" to obtain the assigned port) or explicitly check availability
before using localPort. Concretely, in otp_tests.go change the random port
allocation to create a net.Listen("tcp", ":0"), read the listener's Addr to set
localPort (or use the listener directly for server startup), then close or reuse
the listener as appropriate so the test always uses an available port.

99-99: ⚖️ Poor tradeoff

HTTP client lacks explicit timeout but is protected by polling timeout.

The http.Get call doesn't specify a timeout, which could potentially hang. However, since it's wrapped in wait.PollUntilContextTimeout with a 30-second timeout, the risk is mitigated. For better control and faster failure detection on hung requests, consider using an HTTP client with an explicit shorter timeout.

♻️ Optional improvement with explicit HTTP timeout
+			// Create HTTP client with timeout
+			httpClient := &http.Client{
+				Timeout: 5 * time.Second,
+			}
+
			var responseBody string
			var lastErr error
			err = wait.PollUntilContextTimeout(ctx, 500*time.Millisecond, portForwardTimeout, true, func(ctx context.Context) (bool, error) {
-				resp, err := http.Get(fmt.Sprintf("http://localhost:%d/readyz?verbose", localPort))
+				resp, err := httpClient.Get(fmt.Sprintf("http://localhost:%d/readyz?verbose", localPort))
🤖 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 `@test/extended/otp/otp_tests.go` at line 99, The http.Get call in otp_tests.go
can hang; replace it with an explicit http.Client that sets a reasonable Timeout
(e.g., a few seconds) and call
client.Get(fmt.Sprintf("http://localhost:%d/readyz?verbose", localPort)) inside
the existing wait.PollUntilContextTimeout block (keep using
wait.PollUntilContextTimeout with its 30s overall timeout), and ensure the
response body is closed after reading; this gives faster failed-request
detection while preserving the polling behavior.
🤖 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 `@test/extended/otp/otp_tests.go`:
- Line 106: The call to io.ReadAll(resp.Body) currently ignores its error;
change the assignment to capture the error (e.g., body, err :=
io.ReadAll(resp.Body)) and handle it immediately (for example with
require.NoError(t, err) or t.Fatalf) before using the response body so the test
fails clearly if the read fails; update the usage in the test function that
reads resp.Body to reference the new err variable and ensure the response body
is only used after the error check.

---

Nitpick comments:
In `@test/extended/otp/otp_tests.go`:
- Line 68: The test currently picks a random port with localPort :=
rand.Intn(65534-1025) + 1025 which can collide; replace that approach by letting
the OS pick an available port (use a temporary TCP listener on ":0" to obtain
the assigned port) or explicitly check availability before using localPort.
Concretely, in otp_tests.go change the random port allocation to create a
net.Listen("tcp", ":0"), read the listener's Addr to set localPort (or use the
listener directly for server startup), then close or reuse the listener as
appropriate so the test always uses an available port.
- Line 99: The http.Get call in otp_tests.go can hang; replace it with an
explicit http.Client that sets a reasonable Timeout (e.g., a few seconds) and
call client.Get(fmt.Sprintf("http://localhost:%d/readyz?verbose", localPort))
inside the existing wait.PollUntilContextTimeout block (keep using
wait.PollUntilContextTimeout with its 30s overall timeout), and ensure the
response body is closed after reading; this gives faster failed-request
detection while preserving the polling behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Enterprise

Run ID: 5d064165-f32d-4679-acf6-482dcefeb28a

📥 Commits

Reviewing files that changed from the base of the PR and between 76ed5a8 and aaadafc.

📒 Files selected for processing (4)
  • pkg/testsuites/standard_suites.go
  • test/extended/include.go
  • test/extended/otp/OWNERS
  • test/extended/otp/otp_tests.go

e2e.Logf("Found %d kube-apiserver pods to test", len(targets))

for _, target := range targets {
target := target // capture loop variable
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This line prevents a common Go bug with loop variables and closures.
The Problem:
In Go, when loop variable is used inside a function that executes later (like deferred cleanup or goroutines), all iterations share the same variable. Without capturing it, they all end
up using the last value from the loop.

Example of the bug:

  for _, target := range targets {
      g.DeferCleanup(func() {
          // BUG: This will use the LAST target from the loop for ALL cleanups!
          cleanup(target.podName)
      })
  }

The fix:

  for _, target := range targets {
      target := target  // Creates a NEW variable for THIS iteration
      g.DeferCleanup(func() {
          // Now this captures the correct target for this iteration
          cleanup(target.podName)
      })
  }   

In this test:
The g.DeferCleanup() function registers cleanup code that runs after the test completes. Without target := target, all three cleanup functions would try to clean up the same (last) pod
instead of their respective pods.

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

♻️ Duplicate comments (1)
test/extended/otp/otp_tests.go (1)

112-123: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Use a context/timeout-aware HTTP request for the readyz probe (and handle ignored errors).

http.Get in the PollUntilContextTimeout callback ignores the callback context and has no client timeout, so a stalled request can hang/flake beyond portForwardTimeout.

  • Replace with http.NewRequestWithContext(ctx, ...) and an http.Client{Timeout: ...}.
  • Don’t ignore io.ReadAll(resp.Body) errors (body, err := ...).
  • Don’t discard Process.Kill() errors in the DeferCleanup cleanup.
Proposed fix
-			err = wait.PollUntilContextTimeout(ctx, 500*time.Millisecond, portForwardTimeout, true, func(ctx context.Context) (bool, error) {
-				resp, err := http.Get(fmt.Sprintf("http://localhost:%d/readyz?verbose", localPort))
+			httpClient := &http.Client{Timeout: 5 * time.Second}
+			err = wait.PollUntilContextTimeout(ctx, 500*time.Millisecond, portForwardTimeout, true, func(ctx context.Context) (bool, error) {
+				req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("http://localhost:%d/readyz?verbose", localPort), nil)
+				if err != nil {
+					lastErr = err
+					return false, nil
+				}
+				resp, err := httpClient.Do(req)
 				if err != nil {
 					lastErr = err
 					return false, nil
 				}
🤖 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 `@test/extended/otp/otp_tests.go` around lines 112 - 123, The readyz probe uses
http.Get inside wait.PollUntilContextTimeout which ignores the callback context
and lacks a request timeout; replace the http.Get call with an HTTP request
created via http.NewRequestWithContext(ctx, "GET",
fmt.Sprintf("http://localhost:%d/readyz?verbose", localPort), nil) and execute
it with an http.Client that has a sensible Timeout (e.g., derived from
portForwardTimeout or a fraction thereof) so requests are canceled by the
provided ctx; capture and handle errors returned by io.ReadAll (assign body, err
:= io.ReadAll(resp.Body) and return the error if non-nil) and ensure the
DeferCleanup that calls Process.Kill() checks and logs/returns that error
instead of discarding it so failures to kill the process are not ignored.
🤖 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 `@test/extended/otp/otp_tests.go`:
- Around line 103-105: The cleanup currently ignores the error from
portForwardCmd.Process.Kill(); change it to capture the returned error, and if
err != nil and err != os.ErrProcessDone then log or fail the test (e.g., using
the test logger or t.Errorf/t.Logf) so failures are not swallowed. Locate the
Kill call on portForwardCmd.Process (in the OTP test cleanup block) and replace
the blank-assignment with error handling that compares to os.ErrProcessDone and
reports any other error.

---

Duplicate comments:
In `@test/extended/otp/otp_tests.go`:
- Around line 112-123: The readyz probe uses http.Get inside
wait.PollUntilContextTimeout which ignores the callback context and lacks a
request timeout; replace the http.Get call with an HTTP request created via
http.NewRequestWithContext(ctx, "GET",
fmt.Sprintf("http://localhost:%d/readyz?verbose", localPort), nil) and execute
it with an http.Client that has a sensible Timeout (e.g., derived from
portForwardTimeout or a fraction thereof) so requests are canceled by the
provided ctx; capture and handle errors returned by io.ReadAll (assign body, err
:= io.ReadAll(resp.Body) and return the error if non-nil) and ensure the
DeferCleanup that calls Process.Kill() checks and logs/returns that error
instead of discarding it so failures to kill the process are not ignored.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Enterprise

Run ID: 7e2062e6-d6c1-41bb-8692-339a733990b0

📥 Commits

Reviewing files that changed from the base of the PR and between aaadafc and 3ec3487.

📒 Files selected for processing (4)
  • pkg/testsuites/standard_suites.go
  • test/extended/include.go
  • test/extended/otp/OWNERS
  • test/extended/otp/otp_tests.go
✅ Files skipped from review due to trivial changes (1)
  • test/extended/otp/OWNERS
🚧 Files skipped from review as they are similar to previous changes (1)
  • test/extended/include.go

@sandeepknd
Copy link
Copy Markdown
Contributor Author

/test images

1 similar comment
@sandeepknd
Copy link
Copy Markdown
Contributor Author

/test images

@sandeepknd
Copy link
Copy Markdown
Contributor Author

/test okd-scos-images

Comment thread pkg/testsuites/standard_suites.go Outdated
This suite comprises the generic control plane tests from the openshift-tests-private repo.
`),
Qualifiers: []string{
withStandardEarlyOrLateTests(`name.contains("[Suite:openshift/controlplaneotp]")`),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

remove otp

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

addressed.

Comment thread test/extended/otp/otp_tests.go Outdated
@@ -0,0 +1,130 @@
package otp
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

rename file and directory to controlplane

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

addressed.

Comment thread test/extended/otp/OWNERS Outdated
@@ -0,0 +1,8 @@
approvers:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

add all team members

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

addressed.

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

Scheduling required tests:
/test e2e-aws-csi
/test e2e-aws-ovn-fips
/test e2e-aws-ovn-microshift
/test e2e-aws-ovn-microshift-serial
/test e2e-aws-ovn-serial-1of2
/test e2e-aws-ovn-serial-2of2
/test e2e-gcp-csi
/test e2e-gcp-ovn
/test e2e-gcp-ovn-upgrade
/test e2e-metal-ipi-ovn-ipv6
/test e2e-vsphere-ovn
/test e2e-vsphere-ovn-upi

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

🧹 Nitpick comments (2)
test/extended/controlplane/controlplane_tests.go (2)

86-86: 💤 Low value

Remove redundant defer.

The defer pfCancel() at line 86 is redundant because g.DeferCleanup at line 102 already calls pfCancel(). Since DeferCleanup is the proper Ginkgo cleanup mechanism and handles both success and failure cases, the explicit defer adds no value and could cause confusion.

♻️ Proposed fix
 			// Create context with timeout for port-forward
 			pfCtx, pfCancel := context.WithCancel(ctx)
-			defer pfCancel()
🤖 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 `@test/extended/controlplane/controlplane_tests.go` at line 86, Remove the
redundant defer by deleting the explicit "defer pfCancel()" call and rely on the
Ginkgo cleanup registration already present via "g.DeferCleanup(pfCancel)" (or
the existing "g.DeferCleanup" call) to invoke pfCancel; ensure only the cleanup
registration (g.DeferCleanup with pfCancel) remains so pfCancel is executed once
through the Ginkgo cleanup mechanism.

113-113: 💤 Low value

Consider adding HTTP client timeout.

The http.Get call uses the default client, which has no timeout. If the port-forward is established but the readyz endpoint hangs, the request could block until the outer poll timeout expires, making debugging harder.

⏱️ Proposed improvement
+			httpClient := &http.Client{Timeout: 5 * time.Second}
 			err = wait.PollUntilContextTimeout(ctx, 500*time.Millisecond, portForwardTimeout, true, func(ctx context.Context) (bool, error) {
-				resp, err := http.Get(fmt.Sprintf("http://localhost:%d/readyz?verbose", localPort))
+				resp, err := httpClient.Get(fmt.Sprintf("http://localhost:%d/readyz?verbose", localPort))
🤖 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 `@test/extended/controlplane/controlplane_tests.go` at line 113, The http.Get
call in the test (the readyz probe in controlplane_tests.go) uses the default
client with no timeout; replace it with a request using an http.Client with a
Deadline/Timeout or create the request with context.WithTimeout and use
http.DefaultClient.Do to enforce a short timeout (e.g., a few seconds) so the
test won't hang; ensure you still check and close resp.Body after Do to avoid
leaks.
🤖 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 `@test/extended/controlplane/controlplane_tests.go`:
- Line 120: The call to io.ReadAll(resp.Body) currently ignores its error;
update that line to capture the error (e.g., body, err := io.ReadAll(resp.Body))
and handle it by failing the test with a clear message (for example using
t.Fatalf("reading response body: %v", err) or require.NoError(t, err)) so any
read failure is reported instead of proceeding with an empty body; locate the
io.ReadAll(resp.Body) usage in controlplane_tests.go and apply this change.
- Around line 103-105: The cleanup currently ignores the error returned by
portForwardCmd.Process.Kill(); update the cleanup block that references
portForwardCmd and portForwardCmd.Process to call Kill() and check its error:
import the os package if missing, call err := portForwardCmd.Process.Kill(),
then if err != nil && !errors.Is(err, os.ErrProcessDone) log or report the error
(using the existing test logger or t.Logf/t.Errorf) so only os.ErrProcessDone is
ignored and all other Kill errors are surfaced.

---

Nitpick comments:
In `@test/extended/controlplane/controlplane_tests.go`:
- Line 86: Remove the redundant defer by deleting the explicit "defer
pfCancel()" call and rely on the Ginkgo cleanup registration already present via
"g.DeferCleanup(pfCancel)" (or the existing "g.DeferCleanup" call) to invoke
pfCancel; ensure only the cleanup registration (g.DeferCleanup with pfCancel)
remains so pfCancel is executed once through the Ginkgo cleanup mechanism.
- Line 113: The http.Get call in the test (the readyz probe in
controlplane_tests.go) uses the default client with no timeout; replace it with
a request using an http.Client with a Deadline/Timeout or create the request
with context.WithTimeout and use http.DefaultClient.Do to enforce a short
timeout (e.g., a few seconds) so the test won't hang; ensure you still check and
close resp.Body after Do to avoid leaks.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Enterprise

Run ID: 8e2d47b4-2c0a-46d4-aa02-aa9ccf41ae29

📥 Commits

Reviewing files that changed from the base of the PR and between 3ec3487 and 4629f95.

📒 Files selected for processing (4)
  • pkg/testsuites/standard_suites.go
  • test/extended/controlplane/OWNERS
  • test/extended/controlplane/controlplane_tests.go
  • test/extended/include.go
✅ Files skipped from review due to trivial changes (1)
  • test/extended/controlplane/OWNERS

Comment on lines +103 to +105
if portForwardCmd.Process != nil {
_ = portForwardCmd.Process.Kill()
}
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 | 🔴 Critical | ⚡ Quick win

Handle Process.Kill() errors in port-forward cleanup.

The cleanup code ignores the error from portForwardCmd.Process.Kill(). While os.ErrProcessDone can be safely ignored, other errors (e.g., permission issues) should be logged so cleanup failures aren't silently lost. As per coding guidelines, Go code must never ignore error returns.

🛡️ Proposed fix to handle the error

Import the os package at the top of the file if not already present:

 import (
 	"context"
 	"fmt"
 	"io"
 	"math/rand"
 	"net/http"
+	"os"
 	"os/exec"

Then update the cleanup logic:

 			g.DeferCleanup(func() {
 				e2e.Logf("Cleaning up port-forward for pod %s", target.podName)
 				pfCancel()
 				if portForwardCmd.Process != nil {
-					_ = portForwardCmd.Process.Kill()
+					if err := portForwardCmd.Process.Kill(); err != nil && err != os.ErrProcessDone {
+						e2e.Logf("Warning: failed to kill port-forward process for pod %s: %v", target.podName, err)
+					}
 				}
 			})
📝 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
if portForwardCmd.Process != nil {
_ = portForwardCmd.Process.Kill()
}
if portForwardCmd.Process != nil {
if err := portForwardCmd.Process.Kill(); err != nil && err != os.ErrProcessDone {
e2e.Logf("Warning: failed to kill port-forward process for pod %s: %v", target.podName, err)
}
}
🤖 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 `@test/extended/controlplane/controlplane_tests.go` around lines 103 - 105, The
cleanup currently ignores the error returned by portForwardCmd.Process.Kill();
update the cleanup block that references portForwardCmd and
portForwardCmd.Process to call Kill() and check its error: import the os package
if missing, call err := portForwardCmd.Process.Kill(), then if err != nil &&
!errors.Is(err, os.ErrProcessDone) log or report the error (using the existing
test logger or t.Logf/t.Errorf) so only os.ErrProcessDone is ignored and all
other Kill errors are surfaced.

}
defer resp.Body.Close()

body, _ := io.ReadAll(resp.Body)
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 | 🔴 Critical | ⚡ Quick win

Handle error from io.ReadAll.

The error returned by io.ReadAll is ignored. If reading the response body fails, the test will proceed with an empty responseBody and potentially produce a misleading assertion failure. As per coding guidelines, Go code must never ignore error returns.

🛡️ Proposed fix to handle the error
-				body, _ := io.ReadAll(resp.Body)
-				responseBody = string(body)
+				body, err := io.ReadAll(resp.Body)
+				if err != nil {
+					lastErr = fmt.Errorf("failed to read response body: %w", err)
+					return false, nil
+				}
+				responseBody = string(body)
🤖 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 `@test/extended/controlplane/controlplane_tests.go` at line 120, The call to
io.ReadAll(resp.Body) currently ignores its error; update that line to capture
the error (e.g., body, err := io.ReadAll(resp.Body)) and handle it by failing
the test with a clear message (for example using t.Fatalf("reading response
body: %v", err) or require.NoError(t, err)) so any read failure is reported
instead of proceeding with an empty body; locate the io.ReadAll(resp.Body) usage
in controlplane_tests.go and apply this change.

}
})

g.It("OCP-24698 should have accessible HTTP readyz endpoints for all kube-apiserver pods", func(ctx context.Context) {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

add [OTP] in cases title

Comment thread pkg/testsuites/standard_suites.go Outdated
Qualifiers: []string{
withStandardEarlyOrLateTests(`name.contains("[Suite:openshift/controlplane]")`),
},
Parallelism: 1,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

remove parallelism

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

done

Comment thread pkg/testsuites/standard_suites.go Outdated
withStandardEarlyOrLateTests(`name.contains("[Suite:openshift/controlplane]")`),
},
Parallelism: 1,
TestTimeout: 15 * time.Minute,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

remove this, I think not needed

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

removed.

@gangwgr
Copy link
Copy Markdown
Contributor

gangwgr commented Jun 1, 2026

/lgtm

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label Jun 1, 2026
@openshift-ci openshift-ci Bot removed the lgtm Indicates that a PR is ready to be merged. label Jun 1, 2026
@sandeepknd
Copy link
Copy Markdown
Contributor Author

/test okd-scos-images

@sandeepknd
Copy link
Copy Markdown
Contributor Author

/retest

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

Scheduling required tests:
/test e2e-aws-csi
/test e2e-aws-ovn-fips
/test e2e-aws-ovn-microshift
/test e2e-aws-ovn-microshift-serial
/test e2e-aws-ovn-serial-1of2
/test e2e-aws-ovn-serial-2of2
/test e2e-gcp-csi
/test e2e-gcp-ovn
/test e2e-gcp-ovn-upgrade
/test e2e-metal-ipi-ovn-ipv6
/test e2e-vsphere-ovn
/test e2e-vsphere-ovn-upi

@sandeepknd
Copy link
Copy Markdown
Contributor Author

/retest

1 similar comment
@sandeepknd
Copy link
Copy Markdown
Contributor Author

/retest

@gangwgr
Copy link
Copy Markdown
Contributor

gangwgr commented Jun 2, 2026

/lgtm

@sandeepknd
Copy link
Copy Markdown
Contributor Author

/verified by CI.

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label Jun 2, 2026
@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label Jun 2, 2026
@openshift-ci-robot
Copy link
Copy Markdown

@sandeepknd: This PR has been marked as verified by CI..

Details

In response to this:

/verified by CI.

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 openshift-eng/jira-lifecycle-plugin repository.

@gangwgr
Copy link
Copy Markdown
Contributor

gangwgr commented Jun 2, 2026

/approve

@sandeepknd
Copy link
Copy Markdown
Contributor Author

/assign @cpmeadors

@sandeepknd
Copy link
Copy Markdown
Contributor Author

/assign @xueqzhan

@sandeepknd
Copy link
Copy Markdown
Contributor Author

/assign @bertinatto

Copy link
Copy Markdown
Contributor

@xueqzhan xueqzhan left a comment

Choose a reason for hiding this comment

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

Can you help me understand the added value for this test? Isn't readyz port being sampled constantly by kubelet? Do we not have other tests acting on the missing readyz events? I just want to make sure we are adding tests that are really increasing coverage.

namespace string
}

var _ = g.Describe("[sig-api-machinery][Suite:openshift/controlplane] Control Plane", func() {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I suggest not to use [Suite:] in your test name. You can just use [openshift/controlplane] and then match it in the Suite selection. [Suite:] is a standard one used by the framework.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I followed the existing suites format. All those use "Suite" in the name.
More importantly, when I removed it, its unable to detect the test case.

$ OPENSHIFT_SKIP_EXTERNAL_TESTS=1 ./openshift-tests run-test "[sig-api-machinery][openshift/controlplane][OTP] OCP-24698 should have accessible HTTP readyz endpoints for all kube-apiserver pods"
I0603 01:05:58.665617  151043 factory.go:195] Registered Plugin "containerd"
  I0603 01:05:59.107432  151043 binary.go:80] Found 8895 test specs
  I0603 01:05:59.112124  151043 binary.go:97] 1226 test specs remain, after filtering out k8s
openshift-tests v4.1.0-11404-g58ddcec
Error: no such tests: [sig-api-machinery][openshift/controlplane][OTP] OCP-24698 should have accessible HTTP readyz endpoints for all kube-apiserver pods
error: no such tests: [sig-api-machinery][openshift/controlplane][OTP] OCP-24698 should have accessible HTTP readyz endpoints for all kube-apiserver pods

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you intend to include your test in [Suite:openshift/conformance/parallel] at all? If not, then your way is ok. But if you intend to include this test in the default conformance test, you might want to work with existing framework.

The reason your local run couldn't find the test was because appendSuiteNames appends to your test the following string "[Suite:openshift/conformance/parallel]"

Comment thread pkg/testsuites/standard_suites.go Outdated
{
Name: "openshift/controlplane",
Description: templates.LongDesc(`
This suite comprises the generic control plane tests from the openshift-tests-private repo.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you intend to use this for non OTP test as well? Maybe make this generic enough and do not restrict it to openshift-tests-private in case you will add new tests here later?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

addressed.

@openshift-ci openshift-ci Bot removed the lgtm Indicates that a PR is ready to be merged. label Jun 2, 2026
@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Jun 2, 2026

New changes are detected. LGTM label has been removed.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Jun 2, 2026

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: gangwgr, sandeepknd
Once this PR has been reviewed and has the lgtm label, please ask for approval from bertinatto. For more information see the Code Review Process.

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

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

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

@sandeepknd
Copy link
Copy Markdown
Contributor Author

Can you help me understand the added value for this test? Isn't readyz port being sampled constantly by kubelet? Do we not have other tests acting on the missing readyz events? I just want to make sure we are adding tests that are really increasing coverage.

Its primarily a read-only test that checks the kube-api-server readyz status. It can be considered a basic day0 test.
cc : @gangwgr

@openshift-merge-bot
Copy link
Copy Markdown
Contributor

Scheduling required tests:
/test e2e-aws-csi
/test e2e-aws-ovn-fips
/test e2e-aws-ovn-microshift
/test e2e-aws-ovn-microshift-serial
/test e2e-aws-ovn-serial-1of2
/test e2e-aws-ovn-serial-2of2
/test e2e-gcp-csi
/test e2e-gcp-ovn
/test e2e-gcp-ovn-upgrade
/test e2e-metal-ipi-ovn-ipv6
/test e2e-vsphere-ovn
/test e2e-vsphere-ovn-upi

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Jun 2, 2026

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

@xueqzhan
Copy link
Copy Markdown
Contributor

xueqzhan commented Jun 2, 2026

Can you help me understand the added value for this test? Isn't readyz port being sampled constantly by kubelet? Do we not have other tests acting on the missing readyz events? I just want to make sure we are adding tests that are really increasing coverage.

Its primarily a read-only test that checks the kube-api-server readyz status. It can be considered a basic day0 test. cc : @gangwgr

@benluddy I might need your help here. Across control plane's OTP migration effort, do we have guidelines as which tests should be migrated and which ones should not? For example, the test added in this PR simply tunnels through requests directly to the kube-apiserver's readyz endpoints and make sure it works. Are we adding extra coverage with this? We are struggling with too many tests running in our CI jobs already. But it does add extra coverage, we should definitely port.

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

Labels

verified Signifies that the PR passed pre-merge verification criteria

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants