Skip to content

Commit 97f70eb

Browse files
committed
MachineOSConfig name should match MachineConfigPool
Add a restriction where the name of the MachineOSConfig object must be the same as the MachineConfigPool it is created for. This will ensure that we only have one MOSC per MCP. Signed-off-by: Urvashi <[email protected]>
1 parent 03c422f commit 97f70eb

File tree

5 files changed

+199
-8
lines changed

5 files changed

+199
-8
lines changed

machineconfiguration/v1/tests/machineosconfigs.machineconfiguration.openshift.io/OnClusterBuild.yaml

Lines changed: 180 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ tests:
99
apiVersion: machineconfiguration.openshift.io/v1
1010
kind: MachineOSConfig
1111
metadata:
12-
name: foobar
12+
name: worker
1313
spec:
1414
machineConfigPool:
1515
name: worker
@@ -24,7 +24,7 @@ tests:
2424
apiVersion: machineconfiguration.openshift.io/v1
2525
kind: MachineOSConfig
2626
metadata:
27-
name: foobar
27+
name: worker
2828
spec:
2929
machineConfigPool:
3030
name: worker
@@ -40,7 +40,7 @@ tests:
4040
apiVersion: machineconfiguration.openshift.io/v1
4141
kind: MachineOSConfig
4242
metadata:
43-
name: foobar
43+
name: worker
4444
spec:
4545
machineConfigPool:
4646
name: worker
@@ -55,7 +55,7 @@ tests:
5555
apiVersion: machineconfiguration.openshift.io/v1
5656
kind: MachineOSConfig
5757
metadata:
58-
name: foobar
58+
name: worker
5959
spec:
6060
machineConfigPool:
6161
name: worker
@@ -71,7 +71,7 @@ tests:
7171
apiVersion: machineconfiguration.openshift.io/v1
7272
kind: MachineOSConfig
7373
metadata:
74-
name: foobar
74+
name: worker
7575
spec:
7676
machineConfigPool:
7777
name: worker
@@ -88,7 +88,7 @@ tests:
8888
apiVersion: machineconfiguration.openshift.io/v1
8989
kind: MachineOSConfig
9090
metadata:
91-
name: foobar
91+
name: worker
9292
spec:
9393
machineConfigPool:
9494
name: worker
@@ -101,12 +101,184 @@ tests:
101101
apiVersion: machineconfiguration.openshift.io/v1
102102
kind: MachineOSConfig
103103
metadata:
104-
name: foobar
104+
name: worker
105105
spec:
106106
machineConfigPool:
107107
name: worker
108-
imageBuilder:
108+
imageBuilder:
109+
imageBuilderType: Job
110+
renderedImagePushSecret:
111+
name: foo
112+
renderedImagePushSpec: quay.io/mco/renderedImg:latest
113+
- name: Should succeed when MachineOSConfig name matches MachineConfigPool name
114+
initial: |
115+
apiVersion: machineconfiguration.openshift.io/v1
116+
kind: MachineOSConfig
117+
metadata:
118+
name: worker
119+
spec:
120+
machineConfigPool:
121+
name: worker
122+
imageBuilder:
123+
imageBuilderType: Job
124+
renderedImagePushSecret:
125+
name: foo
126+
renderedImagePushSpec: quay.io/mco/renderedImg:latest
127+
expected: |
128+
apiVersion: machineconfiguration.openshift.io/v1
129+
kind: MachineOSConfig
130+
metadata:
131+
name: worker
132+
spec:
133+
machineConfigPool:
134+
name: worker
135+
imageBuilder:
136+
imageBuilderType: Job
137+
renderedImagePushSecret:
138+
name: foo
139+
renderedImagePushSpec: quay.io/mco/renderedImg:latest
140+
- name: Should fail when MachineOSConfig name does not match MachineConfigPool name
141+
initial: |
142+
apiVersion: machineconfiguration.openshift.io/v1
143+
kind: MachineOSConfig
144+
metadata:
145+
name: different-name
146+
spec:
147+
machineConfigPool:
148+
name: worker
149+
imageBuilder:
150+
imageBuilderType: Job
151+
renderedImagePushSecret:
152+
name: foo
153+
renderedImagePushSpec: quay.io/mco/renderedImg:latest
154+
expectedError: "MachineOSConfig name must match the referenced MachineConfigPool name; can only have one MachineOSConfig per MachineConfigPool"
155+
onUpdate:
156+
- name: Should allow changing other fields when a persisted value is no longer valid (mismatched names)
157+
initialCRDPatches:
158+
- op: remove
159+
path: /spec/versions/0/schema/openAPIV3Schema/x-kubernetes-validations # Remove the name matching validation
160+
initial: |
161+
apiVersion: machineconfiguration.openshift.io/v1
162+
kind: MachineOSConfig
163+
metadata:
164+
name: different-name
165+
spec:
166+
machineConfigPool:
167+
name: worker
168+
imageBuilder:
169+
imageBuilderType: Job
170+
renderedImagePushSecret:
171+
name: foo
172+
renderedImagePushSpec: quay.io/mco/renderedImg:latest
173+
updated: |
174+
apiVersion: machineconfiguration.openshift.io/v1
175+
kind: MachineOSConfig
176+
metadata:
177+
name: different-name
178+
spec:
179+
machineConfigPool:
180+
name: worker
181+
imageBuilder:
182+
imageBuilderType: Job
183+
renderedImagePushSecret:
184+
name: foo
185+
renderedImagePushSpec: quay.io/mco/renderedImg:v2.0
186+
containerFile:
187+
- containerfileArch: AMD64
188+
content: |
189+
FROM configs AS final
190+
RUN rpm-ostree install tree && \
191+
ostree container commit
192+
expected: |
193+
apiVersion: machineconfiguration.openshift.io/v1
194+
kind: MachineOSConfig
195+
metadata:
196+
name: different-name
197+
spec:
198+
machineConfigPool:
199+
name: worker
200+
imageBuilder:
201+
imageBuilderType: Job
202+
renderedImagePushSecret:
203+
name: foo
204+
renderedImagePushSpec: quay.io/mco/renderedImg:v2.0
205+
containerFile:
206+
- containerfileArch: AMD64
207+
content: |
208+
FROM configs AS final
209+
RUN rpm-ostree install tree && \
210+
ostree container commit
211+
- name: Should allow updating a persisted value that is no longer valid to a valid value (fix mismatched names)
212+
initialCRDPatches:
213+
- op: remove
214+
path: /spec/versions/0/schema/openAPIV3Schema/x-kubernetes-validations # Remove the name matching validation
215+
initial: |
216+
apiVersion: machineconfiguration.openshift.io/v1
217+
kind: MachineOSConfig
218+
metadata:
219+
name: worker
220+
spec:
221+
machineConfigPool:
222+
name: different-pool
223+
imageBuilder:
224+
imageBuilderType: Job
225+
renderedImagePushSecret:
226+
name: foo
227+
renderedImagePushSpec: quay.io/mco/renderedImg:latest
228+
updated: |
229+
apiVersion: machineconfiguration.openshift.io/v1
230+
kind: MachineOSConfig
231+
metadata:
232+
name: worker
233+
spec:
234+
machineConfigPool:
235+
name: worker
236+
imageBuilder:
237+
imageBuilderType: Job
238+
renderedImagePushSecret:
239+
name: foo
240+
renderedImagePushSpec: quay.io/mco/renderedImg:latest
241+
expected: |
242+
apiVersion: machineconfiguration.openshift.io/v1
243+
kind: MachineOSConfig
244+
metadata:
245+
name: worker
246+
spec:
247+
machineConfigPool:
248+
name: worker
249+
imageBuilder:
250+
imageBuilderType: Job
251+
renderedImagePushSecret:
252+
name: foo
253+
renderedImagePushSpec: quay.io/mco/renderedImg:latest
254+
- name: Should not allow updating a persisted value that is no longer valid to a still invalid value (different mismatched MCP names)
255+
initialCRDPatches:
256+
- op: remove
257+
path: /spec/versions/0/schema/openAPIV3Schema/x-kubernetes-validations # Remove the name matching validation
258+
initial: |
259+
apiVersion: machineconfiguration.openshift.io/v1
260+
kind: MachineOSConfig
261+
metadata:
262+
name: different-name
263+
spec:
264+
machineConfigPool:
265+
name: worker
266+
imageBuilder:
267+
imageBuilderType: Job
268+
renderedImagePushSecret:
269+
name: foo
270+
renderedImagePushSpec: quay.io/mco/renderedImg:latest
271+
updated: |
272+
apiVersion: machineconfiguration.openshift.io/v1
273+
kind: MachineOSConfig
274+
metadata:
275+
name: different-name
276+
spec:
277+
machineConfigPool:
278+
name: worker-different
279+
imageBuilder:
109280
imageBuilderType: Job
110281
renderedImagePushSecret:
111282
name: foo
112283
renderedImagePushSpec: quay.io/mco/renderedImg:latest
284+
expectedError: "MachineOSConfig name must match the referenced MachineConfigPool name; can only have one MachineOSConfig per MachineConfigPool"

machineconfiguration/v1/types_machineosconfig.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
// MachineOSConfig describes the configuration for a build process managed by the MCO
1919
// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).
2020
// +openshift:compatibility-gen:level=1
21+
// +kubebuilder:validation:XValidation:rule="self.metadata.name == self.spec.machineConfigPool.name || oldSelf.hasValue() && oldSelf.spec.machineConfigPool.name.value() == self.spec.machineConfigPool.name",optionalOldSelf=true,message="MachineOSConfig name must match the referenced MachineConfigPool name; can only have one MachineOSConfig per MachineConfigPool"
2122
type MachineOSConfig struct {
2223
metav1.TypeMeta `json:",inline"`
2324

machineconfiguration/v1/zz_generated.crd-manifests/0000_80_machine-config_01_machineosconfigs.crd.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,12 @@ spec:
345345
required:
346346
- spec
347347
type: object
348+
x-kubernetes-validations:
349+
- message: MachineOSConfig name must match the referenced MachineConfigPool
350+
name; can only have one MachineOSConfig per MachineConfigPool
351+
optionalOldSelf: true
352+
rule: self.metadata.name == self.spec.machineConfigPool.name || oldSelf.hasValue()
353+
&& oldSelf.spec.machineConfigPool.name.value() == self.spec.machineConfigPool.name
348354
served: true
349355
storage: true
350356
subresources:

machineconfiguration/v1/zz_generated.featuregated-crd-manifests/machineosconfigs.machineconfiguration.openshift.io/OnClusterBuild.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,12 @@ spec:
346346
required:
347347
- spec
348348
type: object
349+
x-kubernetes-validations:
350+
- message: MachineOSConfig name must match the referenced MachineConfigPool
351+
name; can only have one MachineOSConfig per MachineConfigPool
352+
optionalOldSelf: true
353+
rule: self.metadata.name == self.spec.machineConfigPool.name || oldSelf.hasValue()
354+
&& oldSelf.spec.machineConfigPool.name.value() == self.spec.machineConfigPool.name
349355
served: true
350356
storage: true
351357
subresources:

payload-manifests/crds/0000_80_machine-config_01_machineosconfigs.crd.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,12 @@ spec:
345345
required:
346346
- spec
347347
type: object
348+
x-kubernetes-validations:
349+
- message: MachineOSConfig name must match the referenced MachineConfigPool
350+
name; can only have one MachineOSConfig per MachineConfigPool
351+
optionalOldSelf: true
352+
rule: self.metadata.name == self.spec.machineConfigPool.name || oldSelf.hasValue()
353+
&& oldSelf.spec.machineConfigPool.name.value() == self.spec.machineConfigPool.name
348354
served: true
349355
storage: true
350356
subresources:

0 commit comments

Comments
 (0)