Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
dfd25de
Set `Progressing` to `Succeeded` on `ClusterExtensionRevision` only a…
pedjak Feb 25, 2026
437a603
Merge branch 'main' into synchronize
Feb 25, 2026
1a5b997
UPSTREAM: <carry>: Add OpenShift specific files
dtfranz Oct 26, 2023
cc9151a
UPSTREAM: <carry>: Add new tests for single/own namespaces install modes
camilamacedo86 Oct 6, 2025
f44a576
UPSTREAM: <carry>: Upgrade OCP image from 4.20 to 4.21
camilamacedo86 Oct 13, 2025
578cd46
UPSTREAM: <carry>: [Default Catalog Tests] - Change logic to get ocp …
camilamacedo86 Oct 13, 2025
8d883b1
UPSTREAM: <carry>: Update OCP catalogs to v4.21
tmshort Oct 13, 2025
7419422
UPSTREAM: <carry>: support singleown cases in disconnected
kuiwang02 Oct 16, 2025
9bea09b
UPSTREAM: <carry>: fix cases 81696 and 74618 for product code changes
kuiwang02 Oct 17, 2025
48ca728
UPSTREAM: <carry>: Define Default timeouts and apply their usage accr…
camilamacedo86 Oct 22, 2025
c236f81
UPSTREAM: <carry>: Update to new feature-gate options in helm
tmshort Oct 22, 2025
9d98460
UPSTREAM: <carry>: Fix flake for single/own ns tests by ensuring uniq…
camilamacedo86 Oct 22, 2025
66dca48
UPSTREAM: <carry>: [OTE]: Enhance single/own ns based on review comme…
camilamacedo86 Oct 24, 2025
ed0a6a7
UPSTREAM: <carry>: Update OwnSingle template to use spec.config.inlin…
kuiwang02 Nov 3, 2025
2697d4e
UPSTREAM: <carry>: [OTE]: Add webhook cleanup validation on extension…
camilamacedo86 Nov 4, 2025
a0f67b4
UPSTREAM: <carry>: Add [OTP] to migrated cases
kuiwang02 Nov 7, 2025
3570895
UPSTREAM: <carry>: [OTE]: Upgrade dependencies used
camilamacedo86 Nov 5, 2025
31d0ed2
UPSTREAM: <carry>: fix(OTE): fix OpenShift Kubernetes replace version…
camilamacedo86 Nov 10, 2025
226f406
UPSTREAM: <carry>: [Default Catalog Tests] Upgrade go 1.24.6 and depe…
camilamacedo86 Nov 11, 2025
b70aca5
UPSTREAM: <carry>: add disconnected environment support with custom p…
kuiwang02 Nov 12, 2025
22c8ab8
UPSTREAM: <carry>: migrate jiazha test cases to OTE
jianzhangbjz Nov 14, 2025
1419865
UPSTREAM: <carry>: migrate clustercatalog case to ote
Xia-Zhao-rh Oct 17, 2025
b81c5d7
UPSTREAM: <carry>: migrate olmv1 QE stress cases
kuiwang02 Nov 20, 2025
c2e5dbc
UPSTREAM: <carry>: Use busybox/httpd to simulate probes
tmshort Nov 25, 2025
4d72adb
UPSTREAM: <carry>: migrate olmv1 QE cases
Xia-Zhao-rh Nov 25, 2025
53c5cde
UPSTREAM: <carry>: add agent for olmv1 qe cases
kuiwang02 Oct 21, 2025
41d55a9
UPSTREAM: <carry>: Disable upstream PodDisruptionBudget
tmshort Dec 3, 2025
2d884ed
UPSTREAM: <carry>: Add AGENTS.md for AI code contributions
rashmigottipati Dec 11, 2025
308cc84
UPSTREAM: <carry>: address review comments through addl prompts
rashmigottipati Dec 11, 2025
727ea5e
UPSTREAM: <carry>: addressing some more review comments
rashmigottipati Dec 11, 2025
6c9d4c5
UPSTREAM: <carry>: remove DCO line
rashmigottipati Dec 11, 2025
54426e9
UPSTREAM: <carry>: migrate bandrade test cases to OTE
bandrade Nov 18, 2025
e897256
UPSTREAM: <carry>: update metadata
bandrade Dec 3, 2025
24e518a
UPSTREAM: <carry>: remove originalName
bandrade Dec 3, 2025
a346aec
UPSTREAM: <carry>: update 80458's timeout to 180s
jianzhangbjz Dec 8, 2025
54a985a
UPSTREAM: <carry>: update 83026 to specify the clustercatalog
jianzhangbjz Dec 15, 2025
6b5ef04
UPSTREAM: <carry>: Update to golang 1.25 and ocp 4.22
oceanc80 Dec 18, 2025
18310ac
UPSTREAM: <carry>: Use oc client for running e2e tests
pedjak Jan 13, 2026
28e32f4
UPSTREAM: <carry>: Run upstream e2e tests tagged with `@catalogd-update`
pedjak Jan 14, 2026
40e35cc
UPSTREAM: <carry>: enhance case to make it more stable
kuiwang02 Jan 6, 2026
f0b4417
UPSTREAM: <carry>: add service account to curl job
ehearne-redhat Jan 7, 2026
e40a4ed
UPSTREAM: <carry>: move sa creation out of buildCurlJob()
ehearne-redhat Jan 8, 2026
31a8cc9
UPSTREAM: <carry>: comment out delete service account
ehearne-redhat Jan 9, 2026
2eac395
UPSTREAM: <carry>: move defercleanup for sa for LIFO
ehearne-redhat Jan 9, 2026
4b79cb7
UPSTREAM: <carry>: add polling so job fully deleted before proceed
ehearne-redhat Jan 12, 2026
d09e569
UPSTREAM: <carry>: Revert "Merge pull request #594 from ehearne-redha…
sosiouxme Jan 20, 2026
6470376
UPSTREAM: <carry>: Remove openshift-redhat-marketplace catalog tests
camilamacedo86 Jan 8, 2026
4a6029c
UPSTREAM: <carry>: config watchnamespace cases
kuiwang02 Jan 6, 2026
6e89fe7
UPSTREAM: <carry>: enhance ocp-79770
Xia-Zhao-rh Jan 26, 2026
64d9c48
UPSTREAM: <carry>: upgrade version support case
kuiwang02 Jan 28, 2026
ea5884a
UPSTREAM: <carry>: Remove installed condition check from auth preflig…
Jan 30, 2026
0d8ae8e
UPSTREAM: <carry>: Add openshift/api dependency
Jan 30, 2026
1c9db99
UPSTREAM: <carry>: Add boxcutter specific preflight auth test
Jan 30, 2026
3003569
UPSTREAM: <carry>: adjust watchnamespace case based on change
kuiwang02 Feb 2, 2026
82edd63
UPSTREAM: <carry>: fix(ote): Use as operator-controller dep from root…
camilamacedo86 Feb 3, 2026
ed1fd26
UPSTREAM: <carry>: add 83979 automation
bandrade Feb 2, 2026
9fad7a4
UPSTREAM: <carry>: add 85889 automation
bandrade Feb 2, 2026
266576e
UPSTREAM: <carry>: Update test-operator startup script to fix pod pro…
Feb 4, 2026
8263ce0
UPSTREAM: <carry>: Fix up own-namespace invalid configuration test
Feb 7, 2026
bfa5bc6
UPSTREAM: <drop>: go mod vendor
Feb 25, 2026
550c523
UPSTREAM: <drop>: remove upstream GitHub configuration
Feb 25, 2026
60f9e7b
UPSTREAM: <drop>: configure the commit-checker
Feb 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion commitchecker.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
expectedMergeBase: 662ecf276b48680b471cd49e22ddd28e02475437
expectedMergeBase: dfd25de92909f8a72869cfd0b1377b4fd524df8c
upstreamBranch: main
upstreamOrg: operator-framework
upstreamRepo: operator-controller
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"errors"
"fmt"
"strings"
"sync"
"time"

appsv1 "k8s.io/api/apps/v1"
Expand All @@ -20,6 +19,7 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/utils/clock"
"pkg.package-operator.run/boxcutter"
"pkg.package-operator.run/boxcutter/machinery"
machinerytypes "pkg.package-operator.run/boxcutter/machinery/types"
Expand Down Expand Up @@ -48,9 +48,7 @@ type ClusterExtensionRevisionReconciler struct {
Client client.Client
RevisionEngineFactory RevisionEngineFactory
TrackingCache trackingCache
// track if we have queued up the reconciliation that detects eventual progress deadline issues
// keys is revision UUID, value is boolean
progressDeadlineCheckInFlight sync.Map
Clock clock.Clock
}

type trackingCache interface {
Expand Down Expand Up @@ -86,15 +84,19 @@ func (c *ClusterExtensionRevisionReconciler) Reconcile(ctx context.Context, req
// check if we reached the progress deadline only if the revision is still progressing and has not succeeded yet
if isStillProgressing && !succeeded {
timeout := time.Duration(pd) * time.Minute
if time.Since(existingRev.CreationTimestamp.Time) > timeout {
if c.Clock.Since(existingRev.CreationTimestamp.Time) > timeout {
// progress deadline reached, reset any errors and stop reconciling this revision
markAsNotProgressing(reconciledRev, ocv1.ReasonProgressDeadlineExceeded, fmt.Sprintf("Revision has not rolled out for %d minutes.", pd))
markAsNotProgressing(reconciledRev, ocv1.ReasonProgressDeadlineExceeded, fmt.Sprintf("Revision has not rolled out for %d minute(s).", pd))
reconcileErr = nil
res = ctrl.Result{}
} else if _, found := c.progressDeadlineCheckInFlight.Load(existingRev.GetUID()); !found && reconcileErr == nil {
// if we haven't already queued up a reconcile to check for progress deadline, queue one up, but only once
c.progressDeadlineCheckInFlight.Store(existingRev.GetUID(), true)
res = ctrl.Result{RequeueAfter: timeout}
} else if reconcileErr == nil {
// We want to requeue so far in the future that the next reconciliation
// can detect if the revision did not progress within the given timeout.
// Thus, we plan the next reconcile slightly after (+2secs) the timeout is passed.
drift := 2 * time.Second
requeueAfter := existingRev.CreationTimestamp.Time.Add(timeout).Add(drift).Sub(c.Clock.Now()).Round(time.Second)
l.Info(fmt.Sprintf("ProgressDeadline not exceeded, requeue after ~%v to check again.", requeueAfter))
res = ctrl.Result{RequeueAfter: requeueAfter}
}
}
}
Expand Down Expand Up @@ -208,9 +210,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, cer
}

revVersion := cer.GetAnnotations()[labels.BundleVersionKey]
if !rres.InTransition() {
markAsProgressing(cer, ocv1.ReasonSucceeded, fmt.Sprintf("Revision %s has rolled out.", revVersion))
} else {
if rres.InTransition() {
markAsProgressing(cer, ocv1.ReasonRollingOut, fmt.Sprintf("Revision %s is rolling out.", revVersion))
}

Expand All @@ -231,6 +231,7 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, cer
}
}

markAsProgressing(cer, ocv1.ReasonSucceeded, fmt.Sprintf("Revision %s has rolled out.", revVersion))
markAsAvailable(cer, ocv1.ClusterExtensionRevisionReasonProbesSucceeded, "Objects are available and pass all probes.")

// We'll probably only want to remove this once we are done updating the ClusterExtension conditions
Expand Down Expand Up @@ -275,6 +276,9 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, cer
} else {
markAsUnavailable(cer, ocv1.ReasonRollingOut, fmt.Sprintf("Revision %s is rolling out.", revVersion))
}
if meta.FindStatusCondition(cer.Status.Conditions, ocv1.ClusterExtensionRevisionTypeProgressing) == nil {
markAsProgressing(cer, ocv1.ReasonRollingOut, fmt.Sprintf("Revision %s is rolling out.", revVersion))
}
}

return ctrl.Result{}, nil
Expand Down Expand Up @@ -333,6 +337,7 @@ func (c *ClusterExtensionRevisionReconciler) SetupWithManager(mgr ctrl.Manager)
return true
},
}
c.Clock = clock.RealClock{}
return ctrl.NewControllerManagedBy(mgr).
For(
&ocv1.ClusterExtensionRevision{},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/utils/clock"
clocktesting "k8s.io/utils/clock/testing"
"pkg.package-operator.run/boxcutter"
"pkg.package-operator.run/boxcutter/machinery"
machinerytypes "pkg.package-operator.run/boxcutter/machinery/types"
Expand Down Expand Up @@ -372,6 +374,7 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionReconciliation(t
name: "set Progressing:True:Succeeded once transition rollout is finished",
revisionResult: mockRevisionResult{
inTransition: false,
isComplete: true,
},
reconcilingRevisionName: clusterExtensionRevisionName,
existingObjs: func() []client.Object {
Expand All @@ -380,7 +383,7 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionReconciliation(t
meta.SetStatusCondition(&rev1.Status.Conditions, metav1.Condition{
Type: ocv1.TypeProgressing,
Status: metav1.ConditionTrue,
Reason: ocv1.ReasonSucceeded,
Reason: ocv1.ReasonRollingOut,
Message: "Revision 1.0.0 is rolling out.",
ObservedGeneration: 1,
})
Expand Down Expand Up @@ -945,16 +948,19 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_ProgressDeadline(t *testi
validate func(*testing.T, client.Client)
reconcileErr error
reconcileResult ctrl.Result
clock clock.Clock
}{
{
name: "progressing set to false when progress deadline is exceeded",
existingObjs: func() []client.Object {
ext := newTestClusterExtension()
rev1 := newTestClusterExtensionRevision(t, clusterExtensionRevisionName, ext, testScheme)
rev1.Spec.ProgressDeadlineMinutes = 1
rev1.CreationTimestamp = metav1.NewTime(time.Now().Add(-61 * time.Second))
rev1.CreationTimestamp = metav1.NewTime(time.Date(2022, 1, 1, 0, 0, 0, 0, time.UTC))
return []client.Object{rev1, ext}
},
// 61sec elapsed since the creation of the revision
clock: clocktesting.NewFakeClock(time.Date(2022, 1, 1, 0, 1, 1, 0, time.UTC)),
revisionResult: &mockRevisionResult{
inTransition: true,
},
Expand All @@ -975,13 +981,14 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_ProgressDeadline(t *testi
ext := newTestClusterExtension()
rev1 := newTestClusterExtensionRevision(t, clusterExtensionRevisionName, ext, testScheme)
rev1.Spec.ProgressDeadlineMinutes = 1
rev1.CreationTimestamp = metav1.NewTime(time.Now())
rev1.CreationTimestamp = metav1.NewTime(time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC))
return []client.Object{rev1, ext}
},
clock: clocktesting.NewFakeClock(time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)),
revisionResult: &mockRevisionResult{
inTransition: true,
},
reconcileResult: ctrl.Result{RequeueAfter: 1 * time.Minute},
reconcileResult: ctrl.Result{RequeueAfter: 62 * time.Second},
validate: func(t *testing.T, c client.Client) {
rev := &ocv1.ClusterExtensionRevision{}
err := c.Get(t.Context(), client.ObjectKey{
Expand Down Expand Up @@ -1049,6 +1056,7 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_ProgressDeadline(t *testi
TrackingCache: &mockTrackingCache{
client: testClient,
},
Clock: tc.clock,
}).Reconcile(t.Context(), ctrl.Request{
NamespacedName: types.NamespacedName{
Name: clusterExtensionRevisionName,
Expand Down
35 changes: 34 additions & 1 deletion test/e2e/features/install.feature
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,39 @@ Feature: Install ClusterExtension
invalid ClusterExtension configuration: invalid configuration: unknown field "watchNamespace"
"""

@BoxcutterRuntime
@ProgressDeadline
Scenario: Report ClusterExtension as not progressing if the rollout does not become available within given timeout
Given min value for ClusterExtension .spec.progressDeadlineMinutes is set to 1
And min value for ClusterExtensionRevision .spec.progressDeadlineMinutes is set to 1
When ClusterExtension is applied
"""
apiVersion: olm.operatorframework.io/v1
kind: ClusterExtension
metadata:
name: ${NAME}
spec:
namespace: ${TEST_NAMESPACE}
progressDeadlineMinutes: 1
serviceAccount:
name: olm-sa
source:
sourceType: Catalog
catalog:
packageName: test
# bundle refers bad image references, so that the deployment never becomes available
version: 1.0.2
selector:
matchLabels:
"olm.operatorframework.io/metadata.name": test-catalog
"""
Then ClusterExtensionRevision "${NAME}-1" reports Progressing as False with Reason ProgressDeadlineExceeded
And ClusterExtension reports Progressing as False with Reason ProgressDeadlineExceeded and Message:
"""
Revision has not rolled out for 1 minute(s).
"""
And ClusterExtension reports Progressing transition between 1 and 2 minutes since its creation

@BoxcutterRuntime
@ProgressDeadline
Scenario: Report ClusterExtension as not progressing if the rollout does not complete within given timeout
Expand Down Expand Up @@ -411,7 +444,7 @@ Feature: Install ClusterExtension
Then ClusterExtensionRevision "${NAME}-1" reports Progressing as False with Reason ProgressDeadlineExceeded
And ClusterExtension reports Progressing as False with Reason ProgressDeadlineExceeded and Message:
"""
Revision has not rolled out for 1 minutes.
Revision has not rolled out for 1 minute(s).
"""
And ClusterExtension reports Progressing transition between 1 and 2 minutes since its creation

Expand Down
2 changes: 1 addition & 1 deletion test/e2e/features/update.feature
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,6 @@ Feature: Update ClusterExtension
And ClusterExtension is available
When ClusterExtension is updated to version "1.0.2"
Then ClusterExtension reports "${NAME}-1, ${NAME}-2" as active revisions
And ClusterExtensionRevision "${NAME}-2" reports Progressing as True with Reason Succeeded
And ClusterExtensionRevision "${NAME}-2" reports Progressing as True with Reason RollingOut
And ClusterExtensionRevision "${NAME}-2" reports Available as False with Reason ProbeFailure

Loading