Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
553e210
Fix release: disable buildx provenance so docker manifest create succ…
camilamacedo86 Feb 19, 2026
1fd37fa
Remove ephemeral aspects ofnetwork errors on Progressing condition (#…
perdasilva Feb 19, 2026
af6733e
Add collisionProtection inheritance hierarchy to ClusterExtensionRevi…
pedjak Feb 19, 2026
11f2db3
Remove experimental to experimental upgrade test (#2518)
perdasilva Feb 19, 2026
1ef820f
MON-4516: Use endpointslices for metrics (#2516)
tmshort Feb 19, 2026
d0d185e
Merge branch 'main' into synchronize
Feb 20, 2026
8081a17
UPSTREAM: <carry>: Add OpenShift specific files
dtfranz Oct 26, 2023
87d3450
UPSTREAM: <carry>: Add new tests for single/own namespaces install modes
camilamacedo86 Oct 6, 2025
1cd1286
UPSTREAM: <carry>: Upgrade OCP image from 4.20 to 4.21
camilamacedo86 Oct 13, 2025
8fc6f59
UPSTREAM: <carry>: [Default Catalog Tests] - Change logic to get ocp …
camilamacedo86 Oct 13, 2025
09342cb
UPSTREAM: <carry>: Update OCP catalogs to v4.21
tmshort Oct 13, 2025
5a770a0
UPSTREAM: <carry>: support singleown cases in disconnected
kuiwang02 Oct 16, 2025
cda64be
UPSTREAM: <carry>: fix cases 81696 and 74618 for product code changes
kuiwang02 Oct 17, 2025
afeedd1
UPSTREAM: <carry>: Define Default timeouts and apply their usage accr…
camilamacedo86 Oct 22, 2025
1a4a60d
UPSTREAM: <carry>: Update to new feature-gate options in helm
tmshort Oct 22, 2025
9aded4c
UPSTREAM: <carry>: Fix flake for single/own ns tests by ensuring uniq…
camilamacedo86 Oct 22, 2025
20f2410
UPSTREAM: <carry>: [OTE]: Enhance single/own ns based on review comme…
camilamacedo86 Oct 24, 2025
ba8e056
UPSTREAM: <carry>: Update OwnSingle template to use spec.config.inlin…
kuiwang02 Nov 3, 2025
16f5d8b
UPSTREAM: <carry>: [OTE]: Add webhook cleanup validation on extension…
camilamacedo86 Nov 4, 2025
039a7e3
UPSTREAM: <carry>: Add [OTP] to migrated cases
kuiwang02 Nov 7, 2025
8df228f
UPSTREAM: <carry>: [OTE]: Upgrade dependencies used
camilamacedo86 Nov 5, 2025
e1d42b9
UPSTREAM: <carry>: fix(OTE): fix OpenShift Kubernetes replace version…
camilamacedo86 Nov 10, 2025
c0dd921
UPSTREAM: <carry>: [Default Catalog Tests] Upgrade go 1.24.6 and depe…
camilamacedo86 Nov 11, 2025
6ff14aa
UPSTREAM: <carry>: add disconnected environment support with custom p…
kuiwang02 Nov 12, 2025
290dee3
UPSTREAM: <carry>: migrate jiazha test cases to OTE
jianzhangbjz Nov 14, 2025
95ec77c
UPSTREAM: <carry>: migrate clustercatalog case to ote
Xia-Zhao-rh Oct 17, 2025
7943b78
UPSTREAM: <carry>: migrate olmv1 QE stress cases
kuiwang02 Nov 20, 2025
9233fc2
UPSTREAM: <carry>: Use busybox/httpd to simulate probes
tmshort Nov 25, 2025
fc30d82
UPSTREAM: <carry>: migrate olmv1 QE cases
Xia-Zhao-rh Nov 25, 2025
664bb34
UPSTREAM: <carry>: add agent for olmv1 qe cases
kuiwang02 Oct 21, 2025
7d8bd07
UPSTREAM: <carry>: Disable upstream PodDisruptionBudget
tmshort Dec 3, 2025
a0b793f
UPSTREAM: <carry>: Add AGENTS.md for AI code contributions
rashmigottipati Dec 11, 2025
cd6877e
UPSTREAM: <carry>: address review comments through addl prompts
rashmigottipati Dec 11, 2025
c6364b7
UPSTREAM: <carry>: addressing some more review comments
rashmigottipati Dec 11, 2025
bfec8fe
UPSTREAM: <carry>: remove DCO line
rashmigottipati Dec 11, 2025
b445805
UPSTREAM: <carry>: migrate bandrade test cases to OTE
bandrade Nov 18, 2025
6bc9d5f
UPSTREAM: <carry>: update metadata
bandrade Dec 3, 2025
f01c2ec
UPSTREAM: <carry>: remove originalName
bandrade Dec 3, 2025
dc8e7f6
UPSTREAM: <carry>: update 80458's timeout to 180s
jianzhangbjz Dec 8, 2025
38ab9b2
UPSTREAM: <carry>: update 83026 to specify the clustercatalog
jianzhangbjz Dec 15, 2025
54c5ab8
UPSTREAM: <carry>: Update to golang 1.25 and ocp 4.22
oceanc80 Dec 18, 2025
b8439d8
UPSTREAM: <carry>: Use oc client for running e2e tests
pedjak Jan 13, 2026
d85141c
UPSTREAM: <carry>: Run upstream e2e tests tagged with `@catalogd-update`
pedjak Jan 14, 2026
391cfe9
UPSTREAM: <carry>: enhance case to make it more stable
kuiwang02 Jan 6, 2026
22f8bca
UPSTREAM: <carry>: add service account to curl job
ehearne-redhat Jan 7, 2026
c226f49
UPSTREAM: <carry>: move sa creation out of buildCurlJob()
ehearne-redhat Jan 8, 2026
d265c78
UPSTREAM: <carry>: comment out delete service account
ehearne-redhat Jan 9, 2026
3e390ac
UPSTREAM: <carry>: move defercleanup for sa for LIFO
ehearne-redhat Jan 9, 2026
fa96a41
UPSTREAM: <carry>: add polling so job fully deleted before proceed
ehearne-redhat Jan 12, 2026
bc5e729
UPSTREAM: <carry>: Revert "Merge pull request #594 from ehearne-redha…
sosiouxme Jan 20, 2026
1bf40ac
UPSTREAM: <carry>: Remove openshift-redhat-marketplace catalog tests
camilamacedo86 Jan 8, 2026
6eca1ee
UPSTREAM: <carry>: config watchnamespace cases
kuiwang02 Jan 6, 2026
2cb0ba7
UPSTREAM: <carry>: enhance ocp-79770
Xia-Zhao-rh Jan 26, 2026
aa44405
UPSTREAM: <carry>: upgrade version support case
kuiwang02 Jan 28, 2026
6c10c64
UPSTREAM: <carry>: Remove installed condition check from auth preflig…
Jan 30, 2026
6a7705b
UPSTREAM: <carry>: Add openshift/api dependency
Jan 30, 2026
4a6fc32
UPSTREAM: <carry>: Add boxcutter specific preflight auth test
Jan 30, 2026
755e24b
UPSTREAM: <carry>: adjust watchnamespace case based on change
kuiwang02 Feb 2, 2026
3e401e8
UPSTREAM: <carry>: fix(ote): Use as operator-controller dep from root…
camilamacedo86 Feb 3, 2026
8c645f0
UPSTREAM: <carry>: add 83979 automation
bandrade Feb 2, 2026
535d588
UPSTREAM: <carry>: add 85889 automation
bandrade Feb 2, 2026
f9413ee
UPSTREAM: <carry>: Update test-operator startup script to fix pod pro…
Feb 4, 2026
5f0b574
UPSTREAM: <carry>: Fix up own-namespace invalid configuration test
Feb 7, 2026
869bd0b
UPSTREAM: <drop>: go mod vendor
Feb 20, 2026
c771b17
UPSTREAM: <drop>: remove upstream GitHub configuration
Feb 20, 2026
1ef0a97
UPSTREAM: <drop>: configure the commit-checker
Feb 20, 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
8 changes: 8 additions & 0 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ dockers:
use: buildx
build_flag_templates:
- "--platform=linux/amd64"
- "--provenance=false"
- image_templates:
- "{{ .Env.OPCON_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64"
dockerfile: Dockerfile.operator-controller
Expand All @@ -53,6 +54,7 @@ dockers:
use: buildx
build_flag_templates:
- "--platform=linux/arm64"
- "--provenance=false"
- image_templates:
- "{{ .Env.OPCON_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le"
dockerfile: Dockerfile.operator-controller
Expand All @@ -61,6 +63,7 @@ dockers:
use: buildx
build_flag_templates:
- "--platform=linux/ppc64le"
- "--provenance=false"
- image_templates:
- "{{ .Env.OPCON_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x"
dockerfile: Dockerfile.operator-controller
Expand All @@ -69,6 +72,7 @@ dockers:
use: buildx
build_flag_templates:
- "--platform=linux/s390x"
- "--provenance=false"
- image_templates:
- "{{ .Env.CATD_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64"
dockerfile: Dockerfile.catalogd
Expand All @@ -77,6 +81,7 @@ dockers:
use: buildx
build_flag_templates:
- "--platform=linux/amd64"
- "--provenance=false"
- image_templates:
- "{{ .Env.CATD_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64"
dockerfile: Dockerfile.catalogd
Expand All @@ -85,6 +90,7 @@ dockers:
use: buildx
build_flag_templates:
- "--platform=linux/arm64"
- "--provenance=false"
- image_templates:
- "{{ .Env.CATD_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le"
dockerfile: Dockerfile.catalogd
Expand All @@ -93,6 +99,7 @@ dockers:
use: buildx
build_flag_templates:
- "--platform=linux/ppc64le"
- "--provenance=false"
- image_templates:
- "{{ .Env.CATD_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x"
dockerfile: Dockerfile.catalogd
Expand All @@ -101,6 +108,7 @@ dockers:
use: buildx
build_flag_templates:
- "--platform=linux/s390x"
- "--provenance=false"
docker_manifests:
- name_template: "{{ .Env.OPCON_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}"
image_templates:
Expand Down
30 changes: 29 additions & 1 deletion api/v1/clusterextensionrevision_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,19 @@ type ClusterExtensionRevisionSpec struct {
// +optional
// <opcon:experimental>
ProgressDeadlineMinutes int32 `json:"progressDeadlineMinutes,omitempty"`

// collisionProtection specifies the default collision protection strategy for all objects
// in this revision. Individual phases or objects can override this value.
//
// When set, this value is used as the default for any phase or object that does not
// explicitly specify its own collisionProtection.
//
// The resolution order is: object > phase > spec
//
// +required
// +kubebuilder:validation:Enum=Prevent;IfNoController;None
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="collisionProtection is immutable"
CollisionProtection CollisionProtection `json:"collisionProtection,omitempty"`
}

// ClusterExtensionRevisionLifecycleState specifies the lifecycle state of the ClusterExtensionRevision.
Expand Down Expand Up @@ -144,6 +157,19 @@ type ClusterExtensionRevisionPhase struct {
// +required
// +kubebuilder:validation:MaxItems=50
Objects []ClusterExtensionRevisionObject `json:"objects"`

// collisionProtection specifies the default collision protection strategy for all objects
// in this phase. Individual objects can override this value.
//
// When set, this value is used as the default for any object in this phase that does not
// explicitly specify its own collisionProtection.
//
// When omitted, we use .spec.collistionProtection as the default for any object in this phase that does not
// explicitly specify its own collisionProtection.
//
// +optional
// +kubebuilder:validation:Enum=Prevent;IfNoController;None
CollisionProtection CollisionProtection `json:"collisionProtection,omitempty"`
}

// ClusterExtensionRevisionObject represents a Kubernetes object to be applied as part
Expand Down Expand Up @@ -174,7 +200,9 @@ type ClusterExtensionRevisionObject struct {
// Use this setting with extreme caution as it may cause multiple controllers to fight over
// the same resource, resulting in increased load on the API server and etcd.
//
// +required
// When omitted, the value is inherited from the phase, then spec.
//
// +optional
// +kubebuilder:validation:Enum=Prevent;IfNoController;None
CollisionProtection CollisionProtection `json:"collisionProtection,omitempty"`
}
Expand Down
114 changes: 103 additions & 11 deletions api/v1/clusterextensionrevision_types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/stretchr/testify/require"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)

func TestClusterExtensionRevisionImmutability(t *testing.T) {
Expand All @@ -21,18 +22,20 @@ func TestClusterExtensionRevisionImmutability(t *testing.T) {
}{
"revision is immutable": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
CollisionProtection: CollisionProtectionPrevent,
},
updateFunc: func(cer *ClusterExtensionRevision) {
cer.Spec.Revision = 2
},
},
"phases may be initially empty": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
Phases: []ClusterExtensionRevisionPhase{},
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
CollisionProtection: CollisionProtectionPrevent,
Phases: []ClusterExtensionRevisionPhase{},
},
updateFunc: func(cer *ClusterExtensionRevision) {
cer.Spec.Phases = []ClusterExtensionRevisionPhase{
Expand All @@ -46,8 +49,9 @@ func TestClusterExtensionRevisionImmutability(t *testing.T) {
},
"phases may be initially unset": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
CollisionProtection: CollisionProtectionPrevent,
},
updateFunc: func(cer *ClusterExtensionRevision) {
cer.Spec.Phases = []ClusterExtensionRevisionPhase{
Expand All @@ -61,8 +65,9 @@ func TestClusterExtensionRevisionImmutability(t *testing.T) {
},
"phases are immutable if not empty": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
CollisionProtection: CollisionProtectionPrevent,
Phases: []ClusterExtensionRevisionPhase{
{
Name: "foo",
Expand All @@ -79,6 +84,16 @@ func TestClusterExtensionRevisionImmutability(t *testing.T) {
}
},
},
"spec collisionProtection is immutable": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
CollisionProtection: CollisionProtectionPrevent,
},
updateFunc: func(cer *ClusterExtensionRevision) {
cer.Spec.CollisionProtection = CollisionProtectionNone
},
},
} {
t.Run(name, func(t *testing.T) {
cer := &ClusterExtensionRevision{
Expand Down Expand Up @@ -124,8 +139,9 @@ func TestClusterExtensionRevisionValidity(t *testing.T) {
},
"revision must be positive": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
CollisionProtection: CollisionProtectionPrevent,
},
valid: true,
},
Expand Down Expand Up @@ -192,6 +208,70 @@ func TestClusterExtensionRevisionValidity(t *testing.T) {
},
valid: false,
},
"spec collisionProtection accepts Prevent": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
CollisionProtection: CollisionProtectionPrevent,
},
valid: true,
},
"spec collisionProtection accepts IfNoController": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
CollisionProtection: CollisionProtectionIfNoController,
},
valid: true,
},
"spec collisionProtection accepts None": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
CollisionProtection: CollisionProtectionNone,
},
valid: true,
},
"spec collisionProtection is required": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
},
valid: false,
},
"spec collisionProtection rejects invalid values": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
CollisionProtection: CollisionProtection("Invalid"),
},
valid: false,
},
"spec collisionProtection must be set": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
},
valid: false,
},
"object collisionProtection is optional": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
CollisionProtection: CollisionProtectionPrevent,
Phases: []ClusterExtensionRevisionPhase{
{
Name: "deploy",
Objects: []ClusterExtensionRevisionObject{
{
Object: configMap(),
},
},
},
},
},
valid: true,
},
} {
t.Run(name, func(t *testing.T) {
cer := &ClusterExtensionRevision{
Expand All @@ -211,3 +291,15 @@ func TestClusterExtensionRevisionValidity(t *testing.T) {
})
}
}

func configMap() unstructured.Unstructured {
return unstructured.Unstructured{
Object: map[string]interface{}{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": map[string]interface{}{
"name": "test-cm",
},
},
}
}
1 change: 1 addition & 0 deletions api/v1/validation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ func TestValidate(t *testing.T) {
}
defaultRevisionSpec := func(s *ClusterExtensionRevisionSpec) *ClusterExtensionRevisionSpec {
s.Revision = 1
s.CollisionProtection = CollisionProtectionPrevent
return s
}
c := newClient(t)
Expand Down
2 changes: 1 addition & 1 deletion commitchecker.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
expectedMergeBase: fb28936f0227ad129151ce04f53598cc08e1b96e
expectedMergeBase: 1ef820f0ca56126586fca2dc7a422c71edd7deef
upstreamBranch: main
upstreamOrg: operator-framework
upstreamRepo: operator-controller
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,23 @@ spec:
spec:
description: spec defines the desired state of the ClusterExtensionRevision.
properties:
collisionProtection:
description: |-
collisionProtection specifies the default collision protection strategy for all objects
in this revision. Individual phases or objects can override this value.
When set, this value is used as the default for any phase or object that does not
explicitly specify its own collisionProtection.
The resolution order is: object > phase > spec
enum:
- Prevent
- IfNoController
- None
type: string
x-kubernetes-validations:
- message: collisionProtection is immutable
rule: self == oldSelf
lifecycleState:
description: |-
lifecycleState specifies the lifecycle state of the ClusterExtensionRevision.
Expand Down Expand Up @@ -102,6 +119,21 @@ spec:
ClusterExtensionRevisionPhase represents a group of objects that are applied together. The phase is considered
complete only after all objects pass their status probes.
properties:
collisionProtection:
description: |-
collisionProtection specifies the default collision protection strategy for all objects
in this phase. Individual objects can override this value.
When set, this value is used as the default for any object in this phase that does not
explicitly specify its own collisionProtection.
When omitted, we use .spec.collistionProtection as the default for any object in this phase that does not
explicitly specify its own collisionProtection.
enum:
- Prevent
- IfNoController
- None
type: string
name:
description: |-
name is a required identifier for this phase.
Expand Down Expand Up @@ -149,6 +181,8 @@ spec:
owned by another controller.
Use this setting with extreme caution as it may cause multiple controllers to fight over
the same resource, resulting in increased load on the API server and etcd.
When omitted, the value is inherited from the phase, then spec.
enum:
- Prevent
- IfNoController
Expand All @@ -163,7 +197,6 @@ spec:
x-kubernetes-embedded-resource: true
x-kubernetes-preserve-unknown-fields: true
required:
- collisionProtection
- object
type: object
maxItems: 50
Expand Down Expand Up @@ -205,6 +238,7 @@ spec:
- message: revision is immutable
rule: self == oldSelf
required:
- collisionProtection
- lifecycleState
- revision
type: object
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,13 @@ rules:
- get
- list
- watch
- apiGroups:
- discovery.k8s.io
resources:
- endpointslices
verbs:
- get
- list
- watch
{{- end -}}
{{- end -}}
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,6 @@ spec:
selector:
matchLabels:
app.kubernetes.io/name: {{ include "olmv1.label.name" . }}
serviceDiscoveryRole: EndpointSlice
{{- end -}}
{{- end -}}
Loading