Skip to content

Commit 74e5fd1

Browse files
Merge pull request #641 from openshift-bot/synchronize-upstream
MON-4516: Synchronize From Upstream Repositories
2 parents dcbc8c4 + 1ef0a97 commit 74e5fd1

24 files changed

+709
-32
lines changed

.goreleaser.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ dockers:
4545
use: buildx
4646
build_flag_templates:
4747
- "--platform=linux/amd64"
48+
- "--provenance=false"
4849
- image_templates:
4950
- "{{ .Env.OPCON_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64"
5051
dockerfile: Dockerfile.operator-controller
@@ -53,6 +54,7 @@ dockers:
5354
use: buildx
5455
build_flag_templates:
5556
- "--platform=linux/arm64"
57+
- "--provenance=false"
5658
- image_templates:
5759
- "{{ .Env.OPCON_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le"
5860
dockerfile: Dockerfile.operator-controller
@@ -61,6 +63,7 @@ dockers:
6163
use: buildx
6264
build_flag_templates:
6365
- "--platform=linux/ppc64le"
66+
- "--provenance=false"
6467
- image_templates:
6568
- "{{ .Env.OPCON_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x"
6669
dockerfile: Dockerfile.operator-controller
@@ -69,6 +72,7 @@ dockers:
6972
use: buildx
7073
build_flag_templates:
7174
- "--platform=linux/s390x"
75+
- "--provenance=false"
7276
- image_templates:
7377
- "{{ .Env.CATD_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64"
7478
dockerfile: Dockerfile.catalogd
@@ -77,6 +81,7 @@ dockers:
7781
use: buildx
7882
build_flag_templates:
7983
- "--platform=linux/amd64"
84+
- "--provenance=false"
8085
- image_templates:
8186
- "{{ .Env.CATD_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64"
8287
dockerfile: Dockerfile.catalogd
@@ -85,6 +90,7 @@ dockers:
8590
use: buildx
8691
build_flag_templates:
8792
- "--platform=linux/arm64"
93+
- "--provenance=false"
8894
- image_templates:
8995
- "{{ .Env.CATD_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le"
9096
dockerfile: Dockerfile.catalogd
@@ -93,6 +99,7 @@ dockers:
9399
use: buildx
94100
build_flag_templates:
95101
- "--platform=linux/ppc64le"
102+
- "--provenance=false"
96103
- image_templates:
97104
- "{{ .Env.CATD_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x"
98105
dockerfile: Dockerfile.catalogd
@@ -101,6 +108,7 @@ dockers:
101108
use: buildx
102109
build_flag_templates:
103110
- "--platform=linux/s390x"
111+
- "--provenance=false"
104112
docker_manifests:
105113
- name_template: "{{ .Env.OPCON_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}"
106114
image_templates:

api/v1/clusterextensionrevision_types.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,19 @@ type ClusterExtensionRevisionSpec struct {
105105
// +optional
106106
// <opcon:experimental>
107107
ProgressDeadlineMinutes int32 `json:"progressDeadlineMinutes,omitempty"`
108+
109+
// collisionProtection specifies the default collision protection strategy for all objects
110+
// in this revision. Individual phases or objects can override this value.
111+
//
112+
// When set, this value is used as the default for any phase or object that does not
113+
// explicitly specify its own collisionProtection.
114+
//
115+
// The resolution order is: object > phase > spec
116+
//
117+
// +required
118+
// +kubebuilder:validation:Enum=Prevent;IfNoController;None
119+
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="collisionProtection is immutable"
120+
CollisionProtection CollisionProtection `json:"collisionProtection,omitempty"`
108121
}
109122

110123
// ClusterExtensionRevisionLifecycleState specifies the lifecycle state of the ClusterExtensionRevision.
@@ -144,6 +157,19 @@ type ClusterExtensionRevisionPhase struct {
144157
// +required
145158
// +kubebuilder:validation:MaxItems=50
146159
Objects []ClusterExtensionRevisionObject `json:"objects"`
160+
161+
// collisionProtection specifies the default collision protection strategy for all objects
162+
// in this phase. Individual objects can override this value.
163+
//
164+
// When set, this value is used as the default for any object in this phase that does not
165+
// explicitly specify its own collisionProtection.
166+
//
167+
// When omitted, we use .spec.collistionProtection as the default for any object in this phase that does not
168+
// explicitly specify its own collisionProtection.
169+
//
170+
// +optional
171+
// +kubebuilder:validation:Enum=Prevent;IfNoController;None
172+
CollisionProtection CollisionProtection `json:"collisionProtection,omitempty"`
147173
}
148174

149175
// ClusterExtensionRevisionObject represents a Kubernetes object to be applied as part
@@ -174,7 +200,9 @@ type ClusterExtensionRevisionObject struct {
174200
// Use this setting with extreme caution as it may cause multiple controllers to fight over
175201
// the same resource, resulting in increased load on the API server and etcd.
176202
//
177-
// +required
203+
// When omitted, the value is inherited from the phase, then spec.
204+
//
205+
// +optional
178206
// +kubebuilder:validation:Enum=Prevent;IfNoController;None
179207
CollisionProtection CollisionProtection `json:"collisionProtection,omitempty"`
180208
}

api/v1/clusterextensionrevision_types_test.go

Lines changed: 103 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/stretchr/testify/require"
99
"k8s.io/apimachinery/pkg/api/errors"
1010
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1112
)
1213

1314
func TestClusterExtensionRevisionImmutability(t *testing.T) {
@@ -21,18 +22,20 @@ func TestClusterExtensionRevisionImmutability(t *testing.T) {
2122
}{
2223
"revision is immutable": {
2324
spec: ClusterExtensionRevisionSpec{
24-
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
25-
Revision: 1,
25+
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
26+
Revision: 1,
27+
CollisionProtection: CollisionProtectionPrevent,
2628
},
2729
updateFunc: func(cer *ClusterExtensionRevision) {
2830
cer.Spec.Revision = 2
2931
},
3032
},
3133
"phases may be initially empty": {
3234
spec: ClusterExtensionRevisionSpec{
33-
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
34-
Revision: 1,
35-
Phases: []ClusterExtensionRevisionPhase{},
35+
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
36+
Revision: 1,
37+
CollisionProtection: CollisionProtectionPrevent,
38+
Phases: []ClusterExtensionRevisionPhase{},
3639
},
3740
updateFunc: func(cer *ClusterExtensionRevision) {
3841
cer.Spec.Phases = []ClusterExtensionRevisionPhase{
@@ -46,8 +49,9 @@ func TestClusterExtensionRevisionImmutability(t *testing.T) {
4649
},
4750
"phases may be initially unset": {
4851
spec: ClusterExtensionRevisionSpec{
49-
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
50-
Revision: 1,
52+
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
53+
Revision: 1,
54+
CollisionProtection: CollisionProtectionPrevent,
5155
},
5256
updateFunc: func(cer *ClusterExtensionRevision) {
5357
cer.Spec.Phases = []ClusterExtensionRevisionPhase{
@@ -61,8 +65,9 @@ func TestClusterExtensionRevisionImmutability(t *testing.T) {
6165
},
6266
"phases are immutable if not empty": {
6367
spec: ClusterExtensionRevisionSpec{
64-
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
65-
Revision: 1,
68+
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
69+
Revision: 1,
70+
CollisionProtection: CollisionProtectionPrevent,
6671
Phases: []ClusterExtensionRevisionPhase{
6772
{
6873
Name: "foo",
@@ -79,6 +84,16 @@ func TestClusterExtensionRevisionImmutability(t *testing.T) {
7984
}
8085
},
8186
},
87+
"spec collisionProtection is immutable": {
88+
spec: ClusterExtensionRevisionSpec{
89+
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
90+
Revision: 1,
91+
CollisionProtection: CollisionProtectionPrevent,
92+
},
93+
updateFunc: func(cer *ClusterExtensionRevision) {
94+
cer.Spec.CollisionProtection = CollisionProtectionNone
95+
},
96+
},
8297
} {
8398
t.Run(name, func(t *testing.T) {
8499
cer := &ClusterExtensionRevision{
@@ -124,8 +139,9 @@ func TestClusterExtensionRevisionValidity(t *testing.T) {
124139
},
125140
"revision must be positive": {
126141
spec: ClusterExtensionRevisionSpec{
127-
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
128-
Revision: 1,
142+
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
143+
Revision: 1,
144+
CollisionProtection: CollisionProtectionPrevent,
129145
},
130146
valid: true,
131147
},
@@ -192,6 +208,70 @@ func TestClusterExtensionRevisionValidity(t *testing.T) {
192208
},
193209
valid: false,
194210
},
211+
"spec collisionProtection accepts Prevent": {
212+
spec: ClusterExtensionRevisionSpec{
213+
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
214+
Revision: 1,
215+
CollisionProtection: CollisionProtectionPrevent,
216+
},
217+
valid: true,
218+
},
219+
"spec collisionProtection accepts IfNoController": {
220+
spec: ClusterExtensionRevisionSpec{
221+
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
222+
Revision: 1,
223+
CollisionProtection: CollisionProtectionIfNoController,
224+
},
225+
valid: true,
226+
},
227+
"spec collisionProtection accepts None": {
228+
spec: ClusterExtensionRevisionSpec{
229+
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
230+
Revision: 1,
231+
CollisionProtection: CollisionProtectionNone,
232+
},
233+
valid: true,
234+
},
235+
"spec collisionProtection is required": {
236+
spec: ClusterExtensionRevisionSpec{
237+
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
238+
Revision: 1,
239+
},
240+
valid: false,
241+
},
242+
"spec collisionProtection rejects invalid values": {
243+
spec: ClusterExtensionRevisionSpec{
244+
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
245+
Revision: 1,
246+
CollisionProtection: CollisionProtection("Invalid"),
247+
},
248+
valid: false,
249+
},
250+
"spec collisionProtection must be set": {
251+
spec: ClusterExtensionRevisionSpec{
252+
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
253+
Revision: 1,
254+
},
255+
valid: false,
256+
},
257+
"object collisionProtection is optional": {
258+
spec: ClusterExtensionRevisionSpec{
259+
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
260+
Revision: 1,
261+
CollisionProtection: CollisionProtectionPrevent,
262+
Phases: []ClusterExtensionRevisionPhase{
263+
{
264+
Name: "deploy",
265+
Objects: []ClusterExtensionRevisionObject{
266+
{
267+
Object: configMap(),
268+
},
269+
},
270+
},
271+
},
272+
},
273+
valid: true,
274+
},
195275
} {
196276
t.Run(name, func(t *testing.T) {
197277
cer := &ClusterExtensionRevision{
@@ -211,3 +291,15 @@ func TestClusterExtensionRevisionValidity(t *testing.T) {
211291
})
212292
}
213293
}
294+
295+
func configMap() unstructured.Unstructured {
296+
return unstructured.Unstructured{
297+
Object: map[string]interface{}{
298+
"apiVersion": "v1",
299+
"kind": "ConfigMap",
300+
"metadata": map[string]interface{}{
301+
"name": "test-cm",
302+
},
303+
},
304+
}
305+
}

api/v1/validation_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ func TestValidate(t *testing.T) {
3636
}
3737
defaultRevisionSpec := func(s *ClusterExtensionRevisionSpec) *ClusterExtensionRevisionSpec {
3838
s.Revision = 1
39+
s.CollisionProtection = CollisionProtectionPrevent
3940
return s
4041
}
4142
c := newClient(t)

commitchecker.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
expectedMergeBase: fb28936f0227ad129151ce04f53598cc08e1b96e
1+
expectedMergeBase: 1ef820f0ca56126586fca2dc7a422c71edd7deef
22
upstreamBranch: main
33
upstreamOrg: operator-framework
44
upstreamRepo: operator-controller

helm/olmv1/base/operator-controller/crd/experimental/olm.operatorframework.io_clusterextensionrevisions.yaml

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,23 @@ spec:
5656
spec:
5757
description: spec defines the desired state of the ClusterExtensionRevision.
5858
properties:
59+
collisionProtection:
60+
description: |-
61+
collisionProtection specifies the default collision protection strategy for all objects
62+
in this revision. Individual phases or objects can override this value.
63+
64+
When set, this value is used as the default for any phase or object that does not
65+
explicitly specify its own collisionProtection.
66+
67+
The resolution order is: object > phase > spec
68+
enum:
69+
- Prevent
70+
- IfNoController
71+
- None
72+
type: string
73+
x-kubernetes-validations:
74+
- message: collisionProtection is immutable
75+
rule: self == oldSelf
5976
lifecycleState:
6077
description: |-
6178
lifecycleState specifies the lifecycle state of the ClusterExtensionRevision.
@@ -102,6 +119,21 @@ spec:
102119
ClusterExtensionRevisionPhase represents a group of objects that are applied together. The phase is considered
103120
complete only after all objects pass their status probes.
104121
properties:
122+
collisionProtection:
123+
description: |-
124+
collisionProtection specifies the default collision protection strategy for all objects
125+
in this phase. Individual objects can override this value.
126+
127+
When set, this value is used as the default for any object in this phase that does not
128+
explicitly specify its own collisionProtection.
129+
130+
When omitted, we use .spec.collistionProtection as the default for any object in this phase that does not
131+
explicitly specify its own collisionProtection.
132+
enum:
133+
- Prevent
134+
- IfNoController
135+
- None
136+
type: string
105137
name:
106138
description: |-
107139
name is a required identifier for this phase.
@@ -149,6 +181,8 @@ spec:
149181
owned by another controller.
150182
Use this setting with extreme caution as it may cause multiple controllers to fight over
151183
the same resource, resulting in increased load on the API server and etcd.
184+
185+
When omitted, the value is inherited from the phase, then spec.
152186
enum:
153187
- Prevent
154188
- IfNoController
@@ -163,7 +197,6 @@ spec:
163197
x-kubernetes-embedded-resource: true
164198
x-kubernetes-preserve-unknown-fields: true
165199
required:
166-
- collisionProtection
167200
- object
168201
type: object
169202
maxItems: 50
@@ -205,6 +238,7 @@ spec:
205238
- message: revision is immutable
206239
rule: self == oldSelf
207240
required:
241+
- collisionProtection
208242
- lifecycleState
209243
- revision
210244
type: object

helm/olmv1/templates/rbac/role-olmv1-system-metrics-monitor-role.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,13 @@ rules:
2121
- get
2222
- list
2323
- watch
24+
- apiGroups:
25+
- discovery.k8s.io
26+
resources:
27+
- endpointslices
28+
verbs:
29+
- get
30+
- list
31+
- watch
2432
{{- end -}}
2533
{{- end -}}

helm/olmv1/templates/servicemonitor-olmv1-system-metrics-monitor.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,6 @@ spec:
2929
selector:
3030
matchLabels:
3131
app.kubernetes.io/name: {{ include "olmv1.label.name" . }}
32+
serviceDiscoveryRole: EndpointSlice
3233
{{- end -}}
3334
{{- end -}}

0 commit comments

Comments
 (0)