From a2aa162665e7a109ed5212bd09f65d868955169e Mon Sep 17 00:00:00 2001 From: Scott Dodson Date: Fri, 21 Nov 2025 14:51:57 -0500 Subject: [PATCH 1/2] bump library-go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add support for APIServicesAvailable inertia to tolerate brief transient errors. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../controllerset/apiservercontrollerset.go | 16 ++++++++++++++++ .../pkg/operator/status/status_controller.go | 11 ++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/vendor/github.com/openshift/library-go/pkg/operator/apiserver/controllerset/apiservercontrollerset.go b/vendor/github.com/openshift/library-go/pkg/operator/apiserver/controllerset/apiservercontrollerset.go index 29e741feb..249dfc216 100644 --- a/vendor/github.com/openshift/library-go/pkg/operator/apiserver/controllerset/apiservercontrollerset.go +++ b/vendor/github.com/openshift/library-go/pkg/operator/apiserver/controllerset/apiservercontrollerset.go @@ -170,6 +170,22 @@ func WithStatusControllerPdbCompatibleHighInertia(workloadConditionsPrefix strin } } +// WithStatusControllerAPIServicesAvailableInertia sets inertia for APIServicesAvailable +// conditions to prevent brief transient errors from causing Available=False. +// This is useful for handling temporary network issues or brief missing HTTP headers +// that self-resolve within seconds. +func WithStatusControllerAPIServicesAvailableInertia() func(s *status.StatusSyncer) *status.StatusSyncer { + return func(s *status.StatusSyncer) *status.StatusSyncer { + return s.WithAvailableInertia(status.MustNewInertia( + 0, // default: no inertia for other conditions + status.InertiaCondition{ + ConditionTypeMatcher: regexp.MustCompile("^APIServicesAvailable$"), + Duration: 5 * time.Second, // tolerate brief transient errors + }).Inertia, + ) + } +} + func (cs *APIServerControllerSet) WithoutClusterOperatorStatusController() *APIServerControllerSet { cs.clusterOperatorStatusController.controller = nil cs.clusterOperatorStatusController.emptyAllowed = true diff --git a/vendor/github.com/openshift/library-go/pkg/operator/status/status_controller.go b/vendor/github.com/openshift/library-go/pkg/operator/status/status_controller.go index de348e797..d53da28da 100644 --- a/vendor/github.com/openshift/library-go/pkg/operator/status/status_controller.go +++ b/vendor/github.com/openshift/library-go/pkg/operator/status/status_controller.go @@ -52,6 +52,7 @@ type StatusSyncer struct { controllerFactory *factory.Factory recorder events.Recorder degradedInertia Inertia + availableInertia Inertia removeUnusedVersions bool } @@ -123,6 +124,14 @@ func (c *StatusSyncer) WithDegradedInertia(inertia Inertia) *StatusSyncer { return &output } +// WithAvailableInertia returns a copy of the StatusSyncer with the +// requested inertia function for available conditions. +func (c *StatusSyncer) WithAvailableInertia(inertia Inertia) *StatusSyncer { + output := *c + output.availableInertia = inertia + return &output +} + // WithVersionRemoval returns a copy of the StatusSyncer that will // remove versions that are missing in VersionGetter from the status. func (c *StatusSyncer) WithVersionRemoval() *StatusSyncer { @@ -217,7 +226,7 @@ func (c StatusSyncer) Sync(ctx context.Context, syncCtx factory.SyncContext) err configv1helpers.SetStatusCondition(&clusterOperatorObj.Status.Conditions, UnionClusterCondition(configv1.OperatorDegraded, operatorv1.ConditionFalse, c.degradedInertia, currentDetailedStatus.Conditions...), c.clock) configv1helpers.SetStatusCondition(&clusterOperatorObj.Status.Conditions, UnionClusterCondition(configv1.OperatorProgressing, operatorv1.ConditionFalse, nil, currentDetailedStatus.Conditions...), c.clock) - configv1helpers.SetStatusCondition(&clusterOperatorObj.Status.Conditions, UnionClusterCondition(configv1.OperatorAvailable, operatorv1.ConditionTrue, nil, currentDetailedStatus.Conditions...), c.clock) + configv1helpers.SetStatusCondition(&clusterOperatorObj.Status.Conditions, UnionClusterCondition(configv1.OperatorAvailable, operatorv1.ConditionTrue, c.availableInertia, currentDetailedStatus.Conditions...), c.clock) configv1helpers.SetStatusCondition(&clusterOperatorObj.Status.Conditions, UnionClusterCondition(configv1.OperatorUpgradeable, operatorv1.ConditionTrue, nil, currentDetailedStatus.Conditions...), c.clock) configv1helpers.SetStatusCondition(&clusterOperatorObj.Status.Conditions, UnionClusterCondition(configv1.EvaluationConditionsDetected, operatorv1.ConditionFalse, nil, currentDetailedStatus.Conditions...), c.clock) From 0f877930894780ec97668540029bcedbd0b067db Mon Sep 17 00:00:00 2001 From: Scott Dodson Date: Fri, 21 Nov 2025 14:52:11 -0500 Subject: [PATCH 2/2] OCPBUGS-23746: Add inertia for APIServicesAvailable condition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add inertia to the APIServicesAvailable condition to prevent brief transient errors (such as temporary network issues or brief missing HTTP headers) from causing Available=False. This uses a 5-second tolerance window for these self-resolving errors. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- pkg/operator/starter.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/operator/starter.go b/pkg/operator/starter.go index 450810d4f..89aa3dedc 100644 --- a/pkg/operator/starter.go +++ b/pkg/operator/starter.go @@ -201,6 +201,10 @@ func RunOperator(ctx context.Context, controllerConfig *controllercmd.Controller if infra == nil || infra.Status.ControlPlaneTopology != configv1.SingleReplicaTopologyMode { statusControllerOptions = append(statusControllerOptions, apiservercontrollerset.WithStatusControllerPdbCompatibleHighInertia("APIServer")) } + // Add inertia for APIServicesAvailable to prevent brief transient errors + statusControllerOptions = append(statusControllerOptions, + apiservercontrollerset.WithStatusControllerAPIServicesAvailableInertia()) + apiServerControllers := apiservercontrollerset.NewAPIServerControllerSet( "openshift-apiserver",