Skip to content

Commit 21f6556

Browse files
author
Ryan Zhang
committed
temp
1 parent 571b8e4 commit 21f6556

7 files changed

+299
-51
lines changed

config/crd/bases/placement.kubernetes-fleet.io_clusterresourceoverrides.yaml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -303,8 +303,9 @@ spec:
303303
- clusterSelectorTerms
304304
type: object
305305
jsonPatchOverrides:
306-
description: JSONPatchOverrides defines a list of JSON patch
307-
override rules.
306+
description: |-
307+
JSONPatchOverrides defines a list of JSON patch override rules.
308+
This field is only allowed when OverrideType is JSONPatch.
308309
items:
309310
description: JSONPatchOverride applies a JSON patch on
310311
the selected resources following [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902).
@@ -334,8 +335,13 @@ spec:
334335
maxItems: 20
335336
minItems: 1
336337
type: array
337-
required:
338-
- jsonPatchOverrides
338+
overrideType:
339+
description: OverrideType defines the type of the override
340+
rules.
341+
enum:
342+
- JSONPatch
343+
- Delete
344+
type: string
339345
type: object
340346
maxItems: 20
341347
minItems: 1

config/crd/bases/placement.kubernetes-fleet.io_clusterresourceoverridesnapshots.yaml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -317,8 +317,9 @@ spec:
317317
- clusterSelectorTerms
318318
type: object
319319
jsonPatchOverrides:
320-
description: JSONPatchOverrides defines a list of JSON
321-
patch override rules.
320+
description: |-
321+
JSONPatchOverrides defines a list of JSON patch override rules.
322+
This field is only allowed when OverrideType is JSONPatch.
322323
items:
323324
description: JSONPatchOverride applies a JSON patch
324325
on the selected resources following [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902).
@@ -348,8 +349,13 @@ spec:
348349
maxItems: 20
349350
minItems: 1
350351
type: array
351-
required:
352-
- jsonPatchOverrides
352+
overrideType:
353+
description: OverrideType defines the type of the override
354+
rules.
355+
enum:
356+
- JSONPatch
357+
- Delete
358+
type: string
353359
type: object
354360
maxItems: 20
355361
minItems: 1

config/crd/bases/placement.kubernetes-fleet.io_resourceoverrides.yaml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,9 @@ spec:
218218
- clusterSelectorTerms
219219
type: object
220220
jsonPatchOverrides:
221-
description: JSONPatchOverrides defines a list of JSON patch
222-
override rules.
221+
description: |-
222+
JSONPatchOverrides defines a list of JSON patch override rules.
223+
This field is only allowed when OverrideType is JSONPatch.
223224
items:
224225
description: JSONPatchOverride applies a JSON patch on
225226
the selected resources following [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902).
@@ -249,8 +250,13 @@ spec:
249250
maxItems: 20
250251
minItems: 1
251252
type: array
252-
required:
253-
- jsonPatchOverrides
253+
overrideType:
254+
description: OverrideType defines the type of the override
255+
rules.
256+
enum:
257+
- JSONPatch
258+
- Delete
259+
type: string
254260
type: object
255261
maxItems: 20
256262
minItems: 1

config/crd/bases/placement.kubernetes-fleet.io_resourceoverridesnapshots.yaml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,9 @@ spec:
232232
- clusterSelectorTerms
233233
type: object
234234
jsonPatchOverrides:
235-
description: JSONPatchOverrides defines a list of JSON
236-
patch override rules.
235+
description: |-
236+
JSONPatchOverrides defines a list of JSON patch override rules.
237+
This field is only allowed when OverrideType is JSONPatch.
237238
items:
238239
description: JSONPatchOverride applies a JSON patch
239240
on the selected resources following [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902).
@@ -263,8 +264,13 @@ spec:
263264
maxItems: 20
264265
minItems: 1
265266
type: array
266-
required:
267-
- jsonPatchOverrides
267+
overrideType:
268+
description: OverrideType defines the type of the override
269+
rules.
270+
enum:
271+
- JSONPatch
272+
- Delete
273+
type: string
268274
type: object
269275
maxItems: 20
270276
minItems: 1

pkg/controllers/workgenerator/controller.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -425,17 +425,22 @@ func (r *Reconciler) syncAllWork(ctx context.Context, resourceBinding *fleetv1be
425425
}
426426
var simpleManifests []fleetv1beta1.Manifest
427427
for j := range snapshot.Spec.SelectedResources {
428-
selectedResource := snapshot.Spec.SelectedResources[j]
429-
if err := r.applyOverrides(&selectedResource, cluster, croMap, roMap); err != nil {
430-
return false, false, err
428+
selectedResource := snapshot.Spec.SelectedResources[j].DeepCopy()
429+
// TODO: override the content of the wrapped resource instead of the envelope itself
430+
resourceDeleted, overrideErr := r.applyOverrides(selectedResource, cluster, croMap, roMap)
431+
if overrideErr != nil {
432+
return false, false, overrideErr
433+
}
434+
if resourceDeleted {
435+
klog.V(2).InfoS("The resource is deleted by the override rules", "snapshot", klog.KObj(snapshot), "selectedResource", snapshot.Spec.SelectedResources[j])
436+
continue
431437
}
432-
433438
// we need to special treat configMap with envelopeConfigMapAnnotation annotation,
434439
// so we need to check the GVK and annotation of the selected resource
435440
var uResource unstructured.Unstructured
436-
if err := uResource.UnmarshalJSON(selectedResource.Raw); err != nil {
437-
klog.ErrorS(err, "work has invalid content", "snapshot", klog.KObj(snapshot), "selectedResource", selectedResource.Raw)
438-
return true, false, controller.NewUnexpectedBehaviorError(err)
441+
if unMarshallErr := uResource.UnmarshalJSON(selectedResource.Raw); unMarshallErr != nil {
442+
klog.ErrorS(unMarshallErr, "work has invalid content", "snapshot", klog.KObj(snapshot), "selectedResource", selectedResource.Raw)
443+
return true, false, controller.NewUnexpectedBehaviorError(unMarshallErr)
439444
}
440445
if uResource.GetObjectKind().GroupVersionKind() == utils.ConfigMapGVK &&
441446
len(uResource.GetAnnotations()[fleetv1beta1.EnvelopeConfigMapAnnotation]) != 0 {
@@ -447,7 +452,7 @@ func (r *Reconciler) syncAllWork(ctx context.Context, resourceBinding *fleetv1be
447452
activeWork[work.Name] = work
448453
newWork = append(newWork, work)
449454
} else {
450-
simpleManifests = append(simpleManifests, fleetv1beta1.Manifest(selectedResource))
455+
simpleManifests = append(simpleManifests, fleetv1beta1.Manifest(*selectedResource))
451456
}
452457
}
453458
if len(simpleManifests) == 0 {

pkg/controllers/workgenerator/override.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,21 @@ func (r *Reconciler) fetchResourceOverrideSnapshots(ctx context.Context, resourc
9292
return roMap, nil
9393
}
9494

95-
func (r *Reconciler) applyOverrides(resource *placementv1beta1.ResourceContent, cluster clusterv1beta1.MemberCluster, croMap map[placementv1beta1.ResourceIdentifier][]*placementv1alpha1.ClusterResourceOverrideSnapshot, roMap map[placementv1beta1.ResourceIdentifier][]*placementv1alpha1.ResourceOverrideSnapshot) error {
95+
// applyOverrides applies the overrides on the selected resources.
96+
// The resource could be selected by both ClusterResourceOverride and ResourceOverride.
97+
// It returns
98+
// - true if the resource is deleted by the overrides.
99+
// - an error if the override rules are invalid.
100+
func (r *Reconciler) applyOverrides(resource *placementv1beta1.ResourceContent, cluster clusterv1beta1.MemberCluster,
101+
croMap map[placementv1beta1.ResourceIdentifier][]*placementv1alpha1.ClusterResourceOverrideSnapshot, roMap map[placementv1beta1.ResourceIdentifier][]*placementv1alpha1.ResourceOverrideSnapshot) (bool, error) {
96102
if len(croMap) == 0 && len(roMap) == 0 {
97-
return nil
103+
return false, nil
98104
}
99105

100106
var uResource unstructured.Unstructured
101107
if err := uResource.UnmarshalJSON(resource.Raw); err != nil {
102108
klog.ErrorS(err, "Work has invalid content", "selectedResource", resource.Raw)
103-
return controller.NewUnexpectedBehaviorError(err)
109+
return false, controller.NewUnexpectedBehaviorError(err)
104110
}
105111
gvk := uResource.GetObjectKind().GroupVersionKind()
106112
key := placementv1beta1.ResourceIdentifier{
@@ -131,13 +137,12 @@ func (r *Reconciler) applyOverrides(resource *placementv1beta1.ResourceContent,
131137
}
132138
if err := applyOverrideRules(resource, cluster, snapshot.Spec.OverrideSpec.Policy.OverrideRules); err != nil {
133139
klog.ErrorS(err, "Failed to apply the override rules", "clusterResourceOverrideSnapshot", klog.KObj(snapshot))
134-
return err
140+
return false, err
135141
}
136142
}
137143
klog.V(2).InfoS("Applied clusterResourceOverrideSnapshots", "resource", klog.KObj(&uResource), "numberOfOverrides", len(croMap[key]))
138144

139-
// If the resource is selected by both ClusterResourceOverride and ResourceOverride, ResourceOverride will win when
140-
// resolving conflicts.
145+
// If the resource is selected by both ClusterResourceOverride and ResourceOverride, ResourceOverride will win when resolving conflicts.
141146
// Apply ResourceOverrideSnapshots.
142147
if !isClusterScopeResource {
143148
key = placementv1beta1.ResourceIdentifier{
@@ -155,12 +160,12 @@ func (r *Reconciler) applyOverrides(resource *placementv1beta1.ResourceContent,
155160
}
156161
if err := applyOverrideRules(resource, cluster, snapshot.Spec.OverrideSpec.Policy.OverrideRules); err != nil {
157162
klog.ErrorS(err, "Failed to apply the override rules", "resourceOverrideSnapshot", klog.KObj(snapshot))
158-
return err
163+
return false, err
159164
}
160165
}
161166
klog.V(2).InfoS("Applied resourceOverrideSnapshots", "resource", klog.KObj(&uResource), "numberOfOverrides", len(roMap[key]))
162167
}
163-
return nil
168+
return resource.Raw == nil, nil
164169
}
165170

166171
func applyOverrideRules(resource *placementv1beta1.ResourceContent, cluster clusterv1beta1.MemberCluster, rules []placementv1alpha1.OverrideRule) error {
@@ -173,7 +178,12 @@ func applyOverrideRules(resource *placementv1beta1.ResourceContent, cluster clus
173178
if !matched {
174179
continue
175180
}
176-
181+
if rule.OverrideType == placementv1alpha1.DeleteOverrideType {
182+
// Delete the resource
183+
resource.Raw = nil
184+
return nil
185+
}
186+
// Apply JSONPatchOverrides
177187
if err := applyJSONPatchOverride(resource, rule.JSONPatchOverrides); err != nil {
178188
klog.ErrorS(err, "Failed to apply JSON patch override")
179189
return controller.NewUserError(err)

0 commit comments

Comments
 (0)