@@ -28,6 +28,15 @@ import (
28
28
"github.com/karmada-io/karmada/pkg/util/helper"
29
29
)
30
30
31
+ // pruneIrrelevantField is the function that prune irrelevant fields from Work Object.
32
+ type irrelevantFieldPruneFunc func (workload * unstructured.Unstructured ) error
33
+
34
+ var kindIrrelevantFieldPruners = map [string ]irrelevantFieldPruneFunc {
35
+ util .JobKind : removeJobIrrelevantField ,
36
+ util .ServiceAccountKind : removeServiceAccountIrrelevantField ,
37
+ util .ServiceKind : removeServiceIrrelevantField ,
38
+ }
39
+
31
40
// RemoveIrrelevantField used to remove fields that generated by kube-apiserver and no need(or can't) propagate to
32
41
// member clusters.
33
42
func RemoveIrrelevantField (workload * unstructured.Unstructured , extraHooks ... func (* unstructured.Unstructured )) error {
@@ -66,40 +75,10 @@ func RemoveIrrelevantField(workload *unstructured.Unstructured, extraHooks ...fu
66
75
67
76
unstructured .RemoveNestedField (workload .Object , "status" )
68
77
69
- if workload .GetKind () == util .ServiceKind {
70
- // In the case spec.clusterIP is set to `None`, means user want a headless service, then it shouldn't be removed.
71
- clusterIP , exist , _ := unstructured .NestedString (workload .Object , "spec" , "clusterIP" )
72
- if exist && clusterIP != corev1 .ClusterIPNone {
73
- unstructured .RemoveNestedField (workload .Object , "spec" , "clusterIP" )
74
- unstructured .RemoveNestedField (workload .Object , "spec" , "clusterIPs" )
75
- }
76
- }
77
-
78
- if workload .GetKind () == util .JobKind {
79
- job := & batchv1.Job {}
80
- err := helper .ConvertToTypedObject (workload , job )
81
- if err != nil {
78
+ if pruneFunc , ok := kindIrrelevantFieldPruners [workload .GetKind ()]; ok {
79
+ if err := pruneFunc (workload ); err != nil {
82
80
return err
83
81
}
84
- if job .Spec .ManualSelector == nil || ! * job .Spec .ManualSelector {
85
- if err = removeGenerateSelectorOfJob (workload ); err != nil {
86
- return err
87
- }
88
- }
89
- }
90
-
91
- if workload .GetKind () == util .ServiceAccountKind {
92
- secrets , exist , _ := unstructured .NestedSlice (workload .Object , "secrets" )
93
- // If 'secrets' exists in ServiceAccount, remove the automatic generation secrets(e.g. default-token-xxx)
94
- if exist && len (secrets ) > 0 {
95
- tokenPrefix := fmt .Sprintf ("%s-token-" , workload .GetName ())
96
- for idx := 0 ; idx < len (secrets ); idx ++ {
97
- if strings .HasPrefix (secrets [idx ].(map [string ]interface {})["name" ].(string ), tokenPrefix ) {
98
- secrets = append (secrets [:idx ], secrets [idx + 1 :]... )
99
- }
100
- }
101
- _ = unstructured .SetNestedSlice (workload .Object , secrets , "secrets" )
102
- }
103
82
}
104
83
105
84
for i := range extraHooks {
@@ -159,3 +138,45 @@ func RemoveJobTTLSeconds(workload *unstructured.Unstructured) {
159
138
unstructured .RemoveNestedField (workload .Object , "spec" , "ttlSecondsAfterFinished" )
160
139
}
161
140
}
141
+
142
+ // removeJobIrrelevantField removes the irrelevant fields from Job (e.g. ManualSelector)
143
+ func removeJobIrrelevantField (workload * unstructured.Unstructured ) error {
144
+ job := & batchv1.Job {}
145
+ err := helper .ConvertToTypedObject (workload , job )
146
+ if err != nil {
147
+ return err
148
+ }
149
+ if job .Spec .ManualSelector == nil || ! * job .Spec .ManualSelector {
150
+ if err = removeGenerateSelectorOfJob (workload ); err != nil {
151
+ return err
152
+ }
153
+ }
154
+ return nil
155
+ }
156
+
157
+ // removeServiceAccountIrrelevantField removes the auto-generated secrets from ServiceAccount.
158
+ func removeServiceAccountIrrelevantField (workload * unstructured.Unstructured ) error {
159
+ secrets , exist , _ := unstructured .NestedSlice (workload .Object , "secrets" )
160
+ // If 'secrets' exists in ServiceAccount, remove the automatic generation secrets (e.g. default-token-xxx)
161
+ if exist && len (secrets ) > 0 {
162
+ tokenPrefix := fmt .Sprintf ("%s-token-" , workload .GetName ())
163
+ for idx := 0 ; idx < len (secrets ); idx ++ {
164
+ if strings .HasPrefix (secrets [idx ].(map [string ]interface {})["name" ].(string ), tokenPrefix ) {
165
+ secrets = append (secrets [:idx ], secrets [idx + 1 :]... )
166
+ }
167
+ }
168
+ _ = unstructured .SetNestedSlice (workload .Object , secrets , "secrets" )
169
+ }
170
+ return nil
171
+ }
172
+
173
+ // removeServiceIrrelevantField removes member cluster specific fields from Service (e.g. clusterIP, clusterIPs)
174
+ func removeServiceIrrelevantField (workload * unstructured.Unstructured ) error {
175
+ // In the case spec.clusterIP is set to `None`, means user want a headless service, then it shouldn't be removed.
176
+ clusterIP , exist , _ := unstructured .NestedString (workload .Object , "spec" , "clusterIP" )
177
+ if exist && clusterIP != corev1 .ClusterIPNone {
178
+ unstructured .RemoveNestedField (workload .Object , "spec" , "clusterIP" )
179
+ unstructured .RemoveNestedField (workload .Object , "spec" , "clusterIPs" )
180
+ }
181
+ return nil
182
+ }
0 commit comments