Skip to content

Split TLS observed config tests into OCP and HyperShift suites#31046

Open
gangwgr wants to merge 1 commit intoopenshift:mainfrom
gangwgr:fixing-tls-observed-test
Open

Split TLS observed config tests into OCP and HyperShift suites#31046
gangwgr wants to merge 1 commit intoopenshift:mainfrom
gangwgr:fixing-tls-observed-test

Conversation

@gangwgr
Copy link
Copy Markdown
Contributor

@gangwgr gangwgr commented Apr 21, 2026

Split TLS observed config tests into OCP and HyperShift suites

Refactor TLS observed config tests to separate standalone OCP and
HyperShift test suites for independent ownership. Move shared types,
data, and test implementations to the parent tls package, with
platform-specific test registrations in dedicated subdirectories
(tls/ocp and tls/hypershift) each with their own OWNERS files.
Move generic helpers to test/extended/util for reuse.

Suite names updated:

  • openshift/tls-observed-config-ocp (standalone OCP)
  • openshift/tls-observed-config-hypershift (HyperShift)

@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

@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Apr 21, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 21, 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

Split TLS observed-config tests into separate OCP and HyperShift suites; add HyperShift-specific HostedCluster TLS profile tests; make HyperShift management-cluster init optional and narrow pre-skips; add TLS port-forward and wire-level verification helpers; mark CVO as controlPlane.

Changes

Cohort / File(s) Summary
Test suite registrations
test/extended/include.go
Blank-import new TLS test packages for OCP and HyperShift to register suites via side effects.
Test suite list
pkg/testsuites/standard_suites.go
Replace single TLS suite with openshift/tls-observed-config-ocp and openshift/tls-observed-config-hypershift, set Parallelism=1 and TestTimeout=90m; preserve disruptive stability flag.
HyperShift TLS tests
test/extended/tls/hypershift/tls_observed_config_hypershift.go, test/extended/tls/hypershift/OWNERS
Add HyperShift-focused suite that discovers HostedClusters, patches HostedCluster apiServer TLS profiles (Modern/Custom), waits for HCP/guest stabilization, verifies ObservedConfig/ConfigMaps/env vars, performs wire-level TLS checks, and restores the profile; add OWNERS.
OCP TLS tests
test/extended/tls/ocp/tls_observed_config_ocp.go
Add OCP-focused non-disruptive and disruptive suites: per-target ObservedConfig/ConfigMap/env var/wire checks, disruptive APIServer profile-change tests (Modern/Custom) that patch the cluster profile, wait for stabilization, verify propagation, perform TLS wire tests, and restore original profile.
Existing TLS test adjustments
test/extended/tls/tls_observed_config.go
Mark openshift-cluster-version/CVO as controlPlane: true; make HyperShift management-cluster init conditional (mgmtOC nil when discovery fails); update ObservedConfig to accept isHyperShift and skip only when operator config/spec.observedConfig is missing for HyperShift control-plane targets; skip profile-change Its when mgmtOC is nil; derive Custom minTLSVersion from config.Spec.TLSSecurityProfile.Custom.MinTLSVersion with TLS1.2 default.
TLS utilities
test/extended/util/tls_helpers.go
Add helpers: port-forward orchestration with readiness/retries, partial-reader, TLS version naming, CheckTLSConnection (should-succeed/should-reject configs and rejection matching), Deployment rollout and ClusterOperator stability waits, env var utilities and logging used by tests.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant TestRunner as Test Runner
  participant MgmtAPI as Management API (HostedCluster)
  participant HCP as HostedControlPlane
  participant Guest as Guest Cluster (Operators/Deployments)
  participant Pod as Target Pod/Service
  participant Local as Local TLS Checker

  TestRunner->>MgmtAPI: discover HostedCluster (optional)
  Note right of MgmtAPI: discovery may fail → mgmt steps skipped
  TestRunner->>MgmtAPI: patch HostedCluster APIServer TLS profile
  MgmtAPI-->>HCP: propagate HostedCluster change
  HCP->>HCP: reconcile & rollout control-plane components
  HCP->>Guest: surface control-plane updates to guest
  Guest->>Pod: rollout deployments, update ConfigMaps & ObservedConfig
  TestRunner->>Pod: port-forward service to local port
  Local->>Pod: perform TLS handshakes (TLS1.3 / TLS1.2 etc.)
  Local-->>TestRunner: report allowed/rejected TLS versions
  TestRunner->>MgmtAPI: restore original TLS profile (DeferCleanup)
  MgmtAPI-->>HCP: restore propagation
  HCP->>Guest: reconverge guest components
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes


Important

Pre-merge checks failed

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

❌ Failed checks (3 warnings, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 63.16% 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 Test code has critical timeout issue: Custom profile tests use 60-minute context timeout matching Ginkgo timeout, risking DeferCleanup failure; assertions lack descriptive messages. Change Custom profile test timeouts from 60 to 50 minutes; add descriptive messages to all Expect() assertions, especially in BeforeEach blocks.
Ipv6 And Disconnected Network Test Compatibility ⚠️ Warning The ForwardPortAndExecute function uses IPv4-only localhost (127.0.0.1) in fallback connectivity tests, causing failures in IPv6-only environments where only [::1] is available. Modify the function to support both IPv4 and IPv6 by testing both 127.0.0.1 and [::1] as fallback connectivity checks, or gracefully skip IPv4 if unreachable and retry with IPv6.
Stable And Deterministic Test Names ❓ Inconclusive Unable to access test files in repository to verify actual Ginkgo test declarations for dynamic content. Make test files available in repository or provide code excerpts showing all It(), Describe(), Context(), When() calls to verify no dynamic values in test titles.
✅ Passed checks (8 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.
Microshift Test Compatibility ✅ Passed All newly added Ginkgo test suites include runtime exutil.IsMicroShiftCluster() checks in BeforeEach blocks and call g.Skip() on MicroShift, preventing execution on MicroShift clusters.
Single Node Openshift (Sno) Test Compatibility ✅ Passed New tests do not assume multi-node or HA cluster topology. Tests verify TLS configuration propagation appropriately and handle topology differences correctly.
Topology-Aware Scheduling Compatibility ✅ Passed This pull request modifies and adds only test-related code and test utilities, not deployment manifests or operator code.
Ote Binary Stdout Contract ✅ Passed Code changes contain only test functions and utilities with no process-level stdout writes that violate OTE binary stdout contract.
Title check ✅ Passed The title accurately reflects the main change: splitting TLS observed config tests into separate OCP and HyperShift test suites, which is confirmed by the creation of new test files (tls_observed_config_ocp.go, tls_observed_config_hypershift.go) and corresponding suite entries in standard_suites.go.
✨ 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-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

@gangwgr
Copy link
Copy Markdown
Contributor Author

gangwgr commented Apr 21, 2026

/testwith openshift/tls-scanner/main/periodic-tls-observed-config-hypershift openshift/release#77236

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Apr 21, 2026

@gangwgr, testwith: could not generate prow job. ERROR:

BUG: test 'periodic-tls-observed-config-hypershift' not found in injected config

@gangwgr
Copy link
Copy Markdown
Contributor Author

gangwgr commented Apr 21, 2026


    "name": "[sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should propagate TLS config to deployment env vars - openshift-image-registry",
    "lifecycle": "blocking",
    "duration": 12395,
    "startTime": "2026-04-21 10:42:23.861598 UTC",
    "endTime": "2026-04-21 10:42:36.256880 UTC",
    "result": "passed"


"name": "[sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-image-registry",
    "lifecycle": "blocking",
    "duration": 163237,
    "startTime": "2026-04-21 10:44:24.709072 UTC",
    "endTime": "2026-04-21 10:47:07.946579 UTC",
    "result": "passed"


  Ran 1 of 1 Specs in 2316.034 seconds
  SUCCESS! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped
[
  {
    "name": "[sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should enforce Custom TLS profile after cluster-wide config change [Timeout:60m]",
    "lifecycle": "blocking",
    "duration": 2601466,
    "startTime": "2026-04-21 11:00:22.680550 UTC",
    "endTime": "2026-04-21 11:43:44.146746 UTC",
    "result": "passed",

{
    "name": "[sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-cluster-samples-operator",
    "lifecycle": "blocking",
    "duration": 68986,
    "startTime": "2026-04-21 12:53:41.682796 UTC",
    "endTime": "2026-04-21 12:54:50.668861 UTC",
    "result": "passed",

 

  Ran 1 of 1 Specs in 2255.663 seconds
  SUCCESS! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped
[
  {
    "name": "[sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should enforce Modern TLS profile after cluster-wide config change [Timeout:60m]",
    "lifecycle": "blocking",
    "duration": 2255663,
    "startTime": "2026-04-21 12:55:34.182264 UTC",
    "endTime": "2026-04-21 13:33:09.845284 UTC",
    "result": "passed",

@gangwgr gangwgr force-pushed the fixing-tls-observed-test branch from cd230df to 9204fcc Compare April 22, 2026 16:22
@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

@gangwgr
Copy link
Copy Markdown
Contributor Author

gangwgr commented Apr 22, 2026

/hold

@openshift-ci openshift-ci Bot added the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label Apr 22, 2026
@gangwgr gangwgr force-pushed the fixing-tls-observed-test branch from 9204fcc to 6a544d6 Compare April 23, 2026 11:47
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

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@test/extended/tls/tls_observed_config.go`:
- Around line 476-483: Reset HyperShift management state variables at the start
of each BeforeEach by explicitly setting mgmtOC = nil, hcpNamespace = "",
hostedClusterName = "", and hostedClusterNS = "" so stale values from prior Its
cannot be reused; when credential lookup fails where you currently log the error
(the branch around exutil.NewHypershiftManagementCLI("tls-mgmt") and the call to
discoverHostedCluster), ensure you leave those variables in their zero values
instead of leaving prior values, and in the success branch assign mgmtOC and
call discoverHostedCluster to populate hostedClusterName/hostedClusterNS; apply
the same reset/failure-zeroing pattern to the other similar blocks (the other
occurrences around NewHypershiftManagementCLI/discoverHostedCluster).
- Around line 948-951: The current code unconditionally skips when
apierrors.IsNotFound(err), which can hide real failures; change the branching so
the skip via g.Skip(fmt.Sprintf(..., t.operatorConfigGVR.Resource,
t.operatorConfigName)) only happens when this is the known HyperShift
control-plane case (e.g., check a HyperShift/hosted indicator), otherwise treat
the missing operator config as a test failure (fail the test or report an
error). Concretely, replace the single apierrors.IsNotFound(err) branch with a
conditional that checks apierrors.IsNotFound(err) &&
<HyperShift-control-plane-condition> to call g.Skip(...), and add an else branch
to call g.Fatalf or return an error when apierrors.IsNotFound(err) on
non-HyperShift clusters; locate this change around the apierrors.IsNotFound(err)
check referencing t.operatorConfigGVR.Resource and t.operatorConfigName.
🪄 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: Pro Plus

Run ID: 5bc60b4a-e6b7-4fb3-b128-4403c410ace1

📥 Commits

Reviewing files that changed from the base of the PR and between 9204fcc and 6a544d6.

📒 Files selected for processing (1)
  • test/extended/tls/tls_observed_config.go

Comment on lines +476 to +483
if err != nil {
e2e.Logf("HyperShift cluster detected but management cluster credentials are not available: %v", err)
e2e.Logf("ConfigMap restoration tests will still run; TLS profile change tests will be skipped")
} else {
mgmtOC = exutil.NewHypershiftManagementCLI("tls-mgmt")
hostedClusterName, hostedClusterNS = discoverHostedCluster(mgmtOC, hcpNamespace)
e2e.Logf("HyperShift: HC=%s/%s, HCP NS=%s", hostedClusterNS, hostedClusterName, hcpNamespace)
}
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

Reset HyperShift management state at the start of each BeforeEach.

mgmtOC, hcpNamespace, hostedClusterName, and hostedClusterNS are describe-scoped and are only conditionally reassigned. If credential lookup fails in a later test, stale values from a prior It can still be used, which makes skip behavior and patch targets unreliable.

💡 Proposed fix
 g.BeforeEach(func() {
+	mgmtOC = nil
+	hcpNamespace = ""
+	hostedClusterName = ""
+	hostedClusterNS = ""
+
 	isMicroShift, err := exutil.IsMicroShiftCluster(oc.AdminKubeClient())
 	o.Expect(err).NotTo(o.HaveOccurred())
 	if isMicroShift {
 		g.Skip("TLS observed-config tests are not applicable to MicroShift clusters")
 	}
@@
 	if isHyperShiftCluster {
 		_, hcpNamespace, err = exutil.GetHypershiftManagementClusterConfigAndNamespace()
 		if err != nil {
 			e2e.Logf("HyperShift cluster detected but management cluster credentials are not available: %v", err)
 			e2e.Logf("ConfigMap restoration tests will still run; TLS profile change tests will be skipped")
 		} else {
 			mgmtOC = exutil.NewHypershiftManagementCLI("tls-mgmt")
 			hostedClusterName, hostedClusterNS = discoverHostedCluster(mgmtOC, hcpNamespace)
 			e2e.Logf("HyperShift: HC=%s/%s, HCP NS=%s", hostedClusterNS, hostedClusterName, hcpNamespace)
 		}
 	}
 })

Also applies to: 521-523, 749-751

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

In `@test/extended/tls/tls_observed_config.go` around lines 476 - 483, Reset
HyperShift management state variables at the start of each BeforeEach by
explicitly setting mgmtOC = nil, hcpNamespace = "", hostedClusterName = "", and
hostedClusterNS = "" so stale values from prior Its cannot be reused; when
credential lookup fails where you currently log the error (the branch around
exutil.NewHypershiftManagementCLI("tls-mgmt") and the call to
discoverHostedCluster), ensure you leave those variables in their zero values
instead of leaving prior values, and in the success branch assign mgmtOC and
call discoverHostedCluster to populate hostedClusterName/hostedClusterNS; apply
the same reset/failure-zeroing pattern to the other similar blocks (the other
occurrences around NewHypershiftManagementCLI/discoverHostedCluster).

Comment on lines +948 to +951
if apierrors.IsNotFound(err) {
g.Skip(fmt.Sprintf("Operator config %s/%s does not exist on this cluster (control-plane resource may not be available on HyperShift guest)",
t.operatorConfigGVR.Resource, t.operatorConfigName))
}
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

Avoid unconditional skip on missing operator config.

At Line 948, IsNotFound now always skips. That can hide real regressions for non-HyperShift clusters (or guest-side targets that should exist). Restrict this skip to the known HyperShift control-plane case and fail otherwise.

💡 Proposed fix
-	if apierrors.IsNotFound(err) {
-		g.Skip(fmt.Sprintf("Operator config %s/%s does not exist on this cluster (control-plane resource may not be available on HyperShift guest)",
-			t.operatorConfigGVR.Resource, t.operatorConfigName))
-	}
+	if apierrors.IsNotFound(err) && isHyperShift && t.controlPlane {
+		g.Skip(fmt.Sprintf("Operator config %s/%s does not exist on HyperShift guest (control-plane resource is on management cluster)",
+			t.operatorConfigGVR.Resource, t.operatorConfigName))
+	}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/extended/tls/tls_observed_config.go` around lines 948 - 951, The current
code unconditionally skips when apierrors.IsNotFound(err), which can hide real
failures; change the branching so the skip via g.Skip(fmt.Sprintf(...,
t.operatorConfigGVR.Resource, t.operatorConfigName)) only happens when this is
the known HyperShift control-plane case (e.g., check a HyperShift/hosted
indicator), otherwise treat the missing operator config as a test failure (fail
the test or report an error). Concretely, replace the single
apierrors.IsNotFound(err) branch with a conditional that checks
apierrors.IsNotFound(err) && <HyperShift-control-plane-condition> to call
g.Skip(...), and add an else branch to call g.Fatalf or return an error when
apierrors.IsNotFound(err) on non-HyperShift clusters; locate this change around
the apierrors.IsNotFound(err) check referencing t.operatorConfigGVR.Resource and
t.operatorConfigName.

@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

@gangwgr
Copy link
Copy Markdown
Contributor Author

gangwgr commented Apr 23, 2026

/retest-required

@openshift-trt
Copy link
Copy Markdown

openshift-trt Bot commented Apr 23, 2026

Job Failure Risk Analysis for sha: 6a544d6

Job Name Failure Risk
pull-ci-openshift-origin-main-e2e-aws-ovn-fips IncompleteTests
Tests for this run (22) are below the historical average (3311): IncompleteTests (not enough tests ran to make a reasonable risk analysis; this could be due to infra, installation, or upgrade problems)
pull-ci-openshift-origin-main-e2e-aws-ovn-serial-1of2 IncompleteTests
Tests for this run (20) are below the historical average (2002): IncompleteTests (not enough tests ran to make a reasonable risk analysis; this could be due to infra, installation, or upgrade problems)

@gangwgr
Copy link
Copy Markdown
Contributor Author

gangwgr commented Apr 24, 2026

hypershift run 
rgangwar@rgangwar-mac origin % ./hack/run-tls-tests.sh
==========================================
 TLSObservedConfig Test Runner
 Found 61 tests
==========================================

----------------------------------------
[1/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[2/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-controller-manager
----------------------------------------
>>> SKIPPED

----------------------------------------
[3/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-kube-apiserver
----------------------------------------
>>> SKIPPED

----------------------------------------
[4/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-apiserver
----------------------------------------
>>> SKIPPED

----------------------------------------
[5/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-etcd
----------------------------------------
>>> SKIPPED

----------------------------------------
[6/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-kube-controller-manager
----------------------------------------
>>> SKIPPED

----------------------------------------
[7/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-kube-scheduler
----------------------------------------
>>> SKIPPED

----------------------------------------
[8/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[9/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[10/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-kube-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[11/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[12/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-etcd
----------------------------------------
>>> SKIPPED

----------------------------------------
[13/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-kube-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[14/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-kube-scheduler
----------------------------------------
>>> PASSED

----------------------------------------
[15/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-cluster-samples-operator
----------------------------------------
>>> PASSED

----------------------------------------
[16/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should propagate TLS config to deployment env vars - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[17/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-image-registry:5000
----------------------------------------
>>> PASSED

----------------------------------------
[18/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-image-registry:60000
----------------------------------------
>>> SKIPPED

----------------------------------------
[19/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-controller-manager:443
----------------------------------------
>>> SKIPPED

----------------------------------------
[20/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-kube-apiserver:443
----------------------------------------
>>> SKIPPED

----------------------------------------
[21/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-kube-apiserver:17697
----------------------------------------
>>> SKIPPED

----------------------------------------
[22/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-apiserver:443
----------------------------------------
>>> SKIPPED

----------------------------------------
[23/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-apiserver:17698
----------------------------------------
>>> SKIPPED

----------------------------------------
[24/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-etcd:2379
----------------------------------------
>>> SKIPPED

----------------------------------------
[25/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-kube-controller-manager:443
----------------------------------------
>>> SKIPPED

----------------------------------------
[26/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-kube-scheduler:443
----------------------------------------
>>> SKIPPED

----------------------------------------
[27/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-cluster-samples-operator:60000
----------------------------------------
>>> PASSED

----------------------------------------
[28/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[29/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[30/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[31/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[32/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[33/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[34/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[35/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[36/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-kube-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[37/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-kube-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[38/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-kube-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[39/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-kube-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[40/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[41/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[42/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[43/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[44/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-etcd
----------------------------------------
>>> SKIPPED

----------------------------------------
[45/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-etcd
----------------------------------------
>>> SKIPPED

----------------------------------------
[46/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-etcd
----------------------------------------
>>> SKIPPED

----------------------------------------
[47/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-etcd
----------------------------------------
>>> SKIPPED

----------------------------------------
[48/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-kube-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[49/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-kube-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[50/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-kube-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[51/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-kube-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[52/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-kube-scheduler
----------------------------------------
>>> PASSED

----------------------------------------
[53/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-kube-scheduler
----------------------------------------
>>> PASSED

----------------------------------------
[54/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-kube-scheduler
----------------------------------------
>>> PASSED

----------------------------------------
[55/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-kube-scheduler
----------------------------------------
>>> PASSED

----------------------------------------
[56/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-cluster-samples-operator
----------------------------------------
>>> PASSED

----------------------------------------
[57/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-cluster-samples-operator
----------------------------------------
>>> PASSED

----------------------------------------
[58/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-cluster-samples-operator
----------------------------------------
>>> PASSED

----------------------------------------
[59/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-cluster-samples-operator
----------------------------------------
>>> PASSED

----------------------------------------
[60/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should enforce Modern TLS profile after cluster-wide config change [Timeout:60m]
----------------------------------------
>>> SKIPPED

----------------------------------------
[61/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should enforce Custom TLS profile after cluster-wide config change [Timeout:60m]
----------------------------------------
>>> SKIPPED

==========================================
 RESULTS
==========================================
 Total:   61
 Passed:  39
 Failed:  0
 Skipped: 22
=========================================

@gangwgr
Copy link
Copy Markdown
Contributor Author

gangwgr commented Apr 24, 2026

ocp run- 
./hack/run-tls-tests.sh                                                                              
==========================================
 TLSObservedConfig Test Runner
 Found 61 tests
==========================================

----------------------------------------
[1/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[2/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[3/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-kube-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[4/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[5/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-etcd
----------------------------------------
>>> PASSED

----------------------------------------
[6/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-kube-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[7/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should populate ObservedConfig with TLS settings - openshift-kube-scheduler
----------------------------------------
>>> PASSED

----------------------------------------
[8/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[9/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[10/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-kube-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[11/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[12/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-etcd
----------------------------------------
>>> PASSED

----------------------------------------
[13/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-kube-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[14/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-kube-scheduler
----------------------------------------
>>> PASSED

----------------------------------------
[15/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should have TLS config injected into ConfigMap - openshift-cluster-samples-operator
----------------------------------------
>>> PASSED

----------------------------------------
[16/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should propagate TLS config to deployment env vars - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[17/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-image-registry:5000
----------------------------------------
>>> PASSED

----------------------------------------
[18/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-image-registry:60000
----------------------------------------
>>> PASSED

----------------------------------------
[19/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-controller-manager:443
----------------------------------------
>>> PASSED

----------------------------------------
[20/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-kube-apiserver:443
----------------------------------------
>>> PASSED

----------------------------------------
[21/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-kube-apiserver:17697
----------------------------------------
>>> PASSED

----------------------------------------
[22/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-apiserver:443
----------------------------------------
>>> PASSED

----------------------------------------
[23/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-apiserver:17698
----------------------------------------
>>> PASSED

----------------------------------------
[24/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-etcd:2379
----------------------------------------
>>> PASSED

----------------------------------------
[25/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-kube-controller-manager:443
----------------------------------------
>>> PASSED

----------------------------------------
[26/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-kube-scheduler:443
----------------------------------------
>>> PASSED

----------------------------------------
[27/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config] should enforce TLS version at the wire level - openshift-cluster-samples-operator:60000
----------------------------------------
>>> PASSED

----------------------------------------
[28/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[29/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[30/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[31/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-image-registry
----------------------------------------
>>> PASSED

----------------------------------------
[32/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[33/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[34/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[35/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[36/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-kube-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[37/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-kube-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[38/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-kube-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[39/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-kube-apiserver
----------------------------------------
^[[B>>> PASSED

----------------------------------------
[40/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[41/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[42/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[43/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-apiserver
----------------------------------------
>>> PASSED

----------------------------------------
[44/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-etcd
----------------------------------------
>>> PASSED

----------------------------------------
[45/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-etcd
----------------------------------------
>>> PASSED

----------------------------------------
[46/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-etcd
----------------------------------------
>>> PASSED

----------------------------------------
[47/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-etcd
----------------------------------------
>>> PASSED

----------------------------------------
[48/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-kube-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[49/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-kube-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[50/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-kube-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[51/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-kube-controller-manager
----------------------------------------
>>> PASSED

----------------------------------------
[52/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-kube-scheduler
----------------------------------------
>>> PASSED

----------------------------------------
[53/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-kube-scheduler
----------------------------------------
>>> PASSED

----------------------------------------
[54/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-kube-scheduler
----------------------------------------
>>> PASSED

----------------------------------------
[55/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-kube-scheduler
----------------------------------------
>>> PASSED

----------------------------------------
[56/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation after deletion - openshift-cluster-samples-operator
----------------------------------------
>>> PASSED

----------------------------------------
[57/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore inject-tls annotation when set to false - openshift-cluster-samples-operator
----------------------------------------
>>> PASSED

----------------------------------------
[58/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after removal - openshift-cluster-samples-operator
----------------------------------------
>>> PASSED

----------------------------------------
[59/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should restore servingInfo after modification - openshift-cluster-samples-operator
----------------------------------------
>>> PASSED

----------------------------------------
[60/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should enforce Modern TLS profile after cluster-wide config change [Timeout:60m]
----------------------------------------
>>> PASSED

----------------------------------------
[61/61] Running: [sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config] should enforce Custom TLS profile after cluster-wide config change [Timeout:60m]
----------------------------------------
>>> PASSED

==========================================
 RESULTS
==========================================
 Total:   61
 Passed:  61
 Failed:  0
 Skipped: 0
==========================================

@gangwgr
Copy link
Copy Markdown
Contributor Author

gangwgr commented Apr 24, 2026

/retest-required

@openshift-ci openshift-ci Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Apr 24, 2026
@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Apr 24, 2026

[APPROVALNOTIFIER] This PR is NOT APPROVED

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

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

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

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

@openshift-ci openshift-ci Bot removed the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Apr 24, 2026
@gangwgr gangwgr force-pushed the fixing-tls-observed-test branch from 497f6ed to 3545553 Compare April 24, 2026 12:08
@openshift-ci openshift-ci Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Apr 24, 2026
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/tls/hypershift/tls_observed_config_hypershift.go (1)

280-304: Avoid time.Sleep inside poll function; it doubles the effective poll interval.

The time.Sleep(10 * time.Second) at line 287 runs on every poll iteration, effectively making the poll interval 20 seconds (10s poll interval + 10s sleep) and adding unnecessary delays. This also performs duplicate API calls. Consider using a longer poll interval instead, or tracking state across poll iterations.

♻️ Suggested approach
-		for _, indicator := range []string{"0/", "Pending", "Terminating", "Init"} {
-			if strings.Contains(out, indicator) {
-				e2e.Logf("  poll: %s pods still restarting (found %q)", appLabel, indicator)
-				return false, nil
-			}
-		}
-
-		time.Sleep(10 * time.Second)
-		out2, err := mgmtCLI.AsAdmin().Run("get").Args(
-			"pods", "-l", "app="+appLabel,
-			"--no-headers", "-n", hcpNS,
-		).Output()
-		if err != nil {
-			return false, nil
-		}
-		for _, indicator := range []string{"0/", "Pending", "Terminating", "Init"} {
-			if strings.Contains(out2, indicator) {
-				e2e.Logf("  poll: %s pods still not stable on recheck", appLabel)
-				return false, nil
-			}
-		}
+		for _, indicator := range []string{"0/", "Pending", "Terminating", "Init"} {
+			if strings.Contains(out, indicator) {
+				e2e.Logf("  poll: %s pods still restarting (found %q)", appLabel, indicator)
+				return false, nil
+			}
+		}

If stability confirmation is needed, consider using a separate sequential poll or tracking consecutive successful checks via closure state.

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

In `@test/extended/tls/hypershift/tls_observed_config_hypershift.go` around lines
280 - 304, The poll callback currently calls time.Sleep(10 * time.Second), which
doubles the effective poll interval and duplicates API calls; remove that sleep
and either increase the poll interval passed to the polling function or
implement a consecutive-success counter in the closure to require N successive
successful checks (e.g., track a counter in the closure and increment on success
/ reset on failure) to confirm stability; use the existing
mgmtCLI.AsAdmin().Run("get").Args(...).Output() call and e2e.Logf for logging
and avoid an extra out2 API call per iteration by reusing the first result or
doing a separate sequential poll outside this closure if a definitive recheck is
required.
test/extended/util/tls_helpers.go (1)

37-37: Port collision risk with rand.Intn for ephemeral ports.

Using rand.Intn without seeding or checking port availability can cause sporadic failures if the same port is selected twice in quick succession or if the port is already in use. Consider using port 0 to let the OS assign an available ephemeral port, or add retry logic specifically for port conflicts.

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

In `@test/extended/util/tls_helpers.go` at line 37, The current selection of
localPort via rand.Intn (localPort := rand.Intn(65534-1025) + 1025) risks port
collisions; replace this with OS-assigned ephemeral port allocation or a
retry-with-availability-check. Implement a helper (e.g., getFreePort) that
net.Listen("tcp", "127.0.0.1:0") to obtain the assigned port (from
Addr().(*net.TCPAddr).Port) and close the listener, and use that port instead of
rand.Intn, or add retry logic that attempts to bind the chosen localPort and
retries on "address already in use" errors before proceeding; update uses of
localPort in tls_helpers.go accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@test/extended/tls/hypershift/tls_observed_config_hypershift.go`:
- Around line 132-134: The indentation for the continuation line of the
exutil.ForwardPortAndExecute call is off; align the wrapped line that calls
exutil.CheckTLSConnection so it is indented to the same level as the for-loop
body (i.e., indent the line starting with func(localPort int) error { ... } and
the subsequent o.Expect(err).NotTo(...) so they appear as the for loop's block),
ensuring the call to exutil.ForwardPortAndExecute and the returned err check
remain visually grouped with the loop that uses t.ServiceName, t.Namespace and
t.ServicePort.

---

Nitpick comments:
In `@test/extended/tls/hypershift/tls_observed_config_hypershift.go`:
- Around line 280-304: The poll callback currently calls time.Sleep(10 *
time.Second), which doubles the effective poll interval and duplicates API
calls; remove that sleep and either increase the poll interval passed to the
polling function or implement a consecutive-success counter in the closure to
require N successive successful checks (e.g., track a counter in the closure and
increment on success / reset on failure) to confirm stability; use the existing
mgmtCLI.AsAdmin().Run("get").Args(...).Output() call and e2e.Logf for logging
and avoid an extra out2 API call per iteration by reusing the first result or
doing a separate sequential poll outside this closure if a definitive recheck is
required.

In `@test/extended/util/tls_helpers.go`:
- Line 37: The current selection of localPort via rand.Intn (localPort :=
rand.Intn(65534-1025) + 1025) risks port collisions; replace this with
OS-assigned ephemeral port allocation or a retry-with-availability-check.
Implement a helper (e.g., getFreePort) that net.Listen("tcp", "127.0.0.1:0") to
obtain the assigned port (from Addr().(*net.TCPAddr).Port) and close the
listener, and use that port instead of rand.Intn, or add retry logic that
attempts to bind the chosen localPort and retries on "address already in use"
errors before proceeding; update uses of localPort in tls_helpers.go
accordingly.
🪄 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: 6b6e979a-b331-47d6-9b79-77a4138b2bc9

📥 Commits

Reviewing files that changed from the base of the PR and between 6a544d6 and 497f6ed.

📒 Files selected for processing (8)
  • pkg/testsuites/standard_suites.go
  • test/extended/include.go
  • test/extended/tls/hypershift/OWNERS
  • test/extended/tls/hypershift/tls_observed_config_hypershift.go
  • test/extended/tls/ocp/OWNERS
  • test/extended/tls/ocp/tls_observed_config_ocp.go
  • test/extended/tls/tls_observed_config.go
  • test/extended/util/tls_helpers.go
✅ Files skipped from review due to trivial changes (2)
  • test/extended/include.go
  • test/extended/tls/hypershift/OWNERS

Comment thread test/extended/tls/hypershift/tls_observed_config_hypershift.go Outdated
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 (4)
test/extended/tls/ocp/tls_observed_config_ocp.go (3)

22-27: Consider removing defer g.GinkgoRecover() from Describe body.

GinkgoRecover() is typically used to recover panics in goroutines spawned by tests. Placing it at the Describe level with defer has no practical effect since the Describe body executes synchronously during suite setup. The actual test execution happens later in the It blocks.

♻️ Suggested removal
 var _ = g.Describe("[sig-api-machinery][Feature:TLSObservedConfig][Serial][Suite:openshift/tls-observed-config-ocp]", func() {
-	defer g.GinkgoRecover()
-
 	oc := exutil.NewCLI("tls-observed-config")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/extended/tls/ocp/tls_observed_config_ocp.go` around lines 22 - 27,
Remove the unnecessary defer g.GinkgoRecover() call from the g.Describe block:
open the Describe wrapper (the g.Describe(...) anonymous function) and delete
the line with defer g.GinkgoRecover(); keep test setup variables (oc :=
exutil.NewCLI and ctx := context.Background()) intact, and if you need panic
recovery for goroutines spawned inside It blocks, add g.GinkgoRecover() calls
inside those goroutines or inside specific It/BeforeEach/AfterEach bodies
instead.

93-95: Same note about defer g.GinkgoRecover().

As mentioned for the non-disruptive suite, this has no practical effect at the Describe level.

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

In `@test/extended/tls/ocp/tls_observed_config_ocp.go` around lines 93 - 95, The
deferred call defer g.GinkgoRecover() at the top-level Describe block (the
Describe invocation with label
"[sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config-ocp]")
is ineffective and should be removed; locate the Describe block and delete the
defer g.GinkgoRecover() statement so recovery is handled appropriately at
test/It level or by Ginkgo's global setup instead.

339-343: ConfigMap not-found handling differs from injection tests.

When a ConfigMap is not found, this test logs "SKIP" and continues, while TestConfigMapTLSInjection in the context snippets uses o.Expect(err).NotTo(o.HaveOccurred()). If the ConfigMap should exist after a Custom profile switch, silently skipping may mask issues.

Consider whether this should be an assertion failure or if the soft skip is intentional for targets where ConfigMaps might not exist.

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

In `@test/extended/tls/ocp/tls_observed_config_ocp.go` around lines 339 - 343, The
current handling of a missing ConfigMap in the Get call
(oc.AdminKubeClient().CoreV1().ConfigMaps(...).Get) silently logs "SKIP" and
continues, which differs from TestConfigMapTLSInjection's strict expectation;
decide which behavior is correct and change the code accordingly: if the
ConfigMap must exist after a Custom profile switch, replace the soft-skip block
with a hard assertion using o.Expect(err).NotTo(o.HaveOccurred()) (or equivalent
test failure), otherwise add a clear comment explaining why skipping is
intentional and make the skip conditional (e.g., detect platforms where
ConfigMaps may be absent) so the test intent is explicit. Ensure you update the
code around the cm, err := ...Get(...) block and any related test helper
functions to reflect the chosen behavior.
test/extended/util/tls_helpers.go (1)

54-72: Potential blocking read in readiness loop.

ReadPartialFrom(stdout, 1024) uses a blocking Read() call. If oc port-forward hasn't written anything to stdout yet, this could block indefinitely (or until the context times out), making the 500ms sleep ineffective. The TCP dial fallback at lines 63-69 helps mitigate this, but only after the first blocking read returns.

Consider using a non-blocking approach or reading in a separate goroutine with a select timeout.

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

In `@test/extended/util/tls_helpers.go` around lines 54 - 72, The readiness loop
currently calls ReadPartialFrom(stdout, 1024) which blocks and can delay the
loop; modify the logic in the loop that references ReadPartialFrom and stdout to
perform a non-blocking read (for example by launching a goroutine to read from
stdout and sending results on a channel, or by using a Reader with deadlines)
and use select with a timeout (matching the existing 500ms sleep or shorter) to
fall back to the TCP dial test on timeouts; ensure the new code still checks for
the "Forwarding from" substring and sets ready=true in the same places (the
existing loop, the ReadPartialFrom result handling, and the TCP dial fallback
using net.DialTimeout).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@test/extended/tls/ocp/tls_observed_config_ocp.go`:
- Around line 258-259: The context timeout for the TLS profile change uses
context.WithTimeout(ctx, 60*time.Minute) (creating configChangeCtx and
configChangeCancel) which matches the Ginkgo [Timeout:60m] and risks the
DeferCleanup not finishing; change the timeout to a smaller value (e.g.,
55*time.Minute or 50*time.Minute) so cleanup has headroom, keep the same
configChangeCancel defer and DeferCleanup usage around the TLS profile restore
(same symbols: configChangeCtx, configChangeCancel, context.WithTimeout,
DeferCleanup).

---

Nitpick comments:
In `@test/extended/tls/ocp/tls_observed_config_ocp.go`:
- Around line 22-27: Remove the unnecessary defer g.GinkgoRecover() call from
the g.Describe block: open the Describe wrapper (the g.Describe(...) anonymous
function) and delete the line with defer g.GinkgoRecover(); keep test setup
variables (oc := exutil.NewCLI and ctx := context.Background()) intact, and if
you need panic recovery for goroutines spawned inside It blocks, add
g.GinkgoRecover() calls inside those goroutines or inside specific
It/BeforeEach/AfterEach bodies instead.
- Around line 93-95: The deferred call defer g.GinkgoRecover() at the top-level
Describe block (the Describe invocation with label
"[sig-api-machinery][Feature:TLSObservedConfig][Serial][Disruptive][Suite:openshift/tls-observed-config-ocp]")
is ineffective and should be removed; locate the Describe block and delete the
defer g.GinkgoRecover() statement so recovery is handled appropriately at
test/It level or by Ginkgo's global setup instead.
- Around line 339-343: The current handling of a missing ConfigMap in the Get
call (oc.AdminKubeClient().CoreV1().ConfigMaps(...).Get) silently logs "SKIP"
and continues, which differs from TestConfigMapTLSInjection's strict
expectation; decide which behavior is correct and change the code accordingly:
if the ConfigMap must exist after a Custom profile switch, replace the soft-skip
block with a hard assertion using o.Expect(err).NotTo(o.HaveOccurred()) (or
equivalent test failure), otherwise add a clear comment explaining why skipping
is intentional and make the skip conditional (e.g., detect platforms where
ConfigMaps may be absent) so the test intent is explicit. Ensure you update the
code around the cm, err := ...Get(...) block and any related test helper
functions to reflect the chosen behavior.

In `@test/extended/util/tls_helpers.go`:
- Around line 54-72: The readiness loop currently calls ReadPartialFrom(stdout,
1024) which blocks and can delay the loop; modify the logic in the loop that
references ReadPartialFrom and stdout to perform a non-blocking read (for
example by launching a goroutine to read from stdout and sending results on a
channel, or by using a Reader with deadlines) and use select with a timeout
(matching the existing 500ms sleep or shorter) to fall back to the TCP dial test
on timeouts; ensure the new code still checks for the "Forwarding from"
substring and sets ready=true in the same places (the existing loop, the
ReadPartialFrom result handling, and the TCP dial fallback using
net.DialTimeout).
🪄 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: f14b1aed-eaa8-4372-93ec-88edd9465407

📥 Commits

Reviewing files that changed from the base of the PR and between 497f6ed and 3545553.

📒 Files selected for processing (8)
  • pkg/testsuites/standard_suites.go
  • test/extended/include.go
  • test/extended/tls/hypershift/OWNERS
  • test/extended/tls/hypershift/tls_observed_config_hypershift.go
  • test/extended/tls/ocp/OWNERS
  • test/extended/tls/ocp/tls_observed_config_ocp.go
  • test/extended/tls/tls_observed_config.go
  • test/extended/util/tls_helpers.go
✅ Files skipped from review due to trivial changes (3)
  • test/extended/include.go
  • test/extended/tls/hypershift/OWNERS
  • pkg/testsuites/standard_suites.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • test/extended/tls/hypershift/tls_observed_config_hypershift.go

Comment thread test/extended/tls/ocp/tls_observed_config_ocp.go
@gangwgr gangwgr force-pushed the fixing-tls-observed-test branch from 3545553 to a2fc928 Compare April 24, 2026 12:30
@gangwgr gangwgr changed the title fix tls observe test Split TLS observed config tests into OCP and HyperShift suites Apr 24, 2026
@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

Refactor TLS observed config tests to separate standalone OCP and
HyperShift test suites for independent ownership. Move shared types,
data, and test implementations to the parent tls package, with
platform-specific test registrations in dedicated subdirectories
(tls/ocp and tls/hypershift) each with their own OWNERS files.
Move generic helpers to test/extended/util for reuse.

Suite names updated:
- openshift/tls-observed-config-ocp (standalone OCP)
- openshift/tls-observed-config-hypershift (HyperShift)

Made-with: Cursor
@gangwgr gangwgr force-pushed the fixing-tls-observed-test branch from a2fc928 to 4aed097 Compare April 24, 2026 14:10
@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 Apr 24, 2026

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

do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant