@@ -33,6 +33,9 @@ type UpdaterBuilder struct {
33
33
Converter Converter
34
34
IgnoreFilter map [fieldpath.APIVersion ]fieldpath.Filter
35
35
36
+ // IgnoredFields provides a set of fields to ignore for each
37
+ IgnoredFields map [fieldpath.APIVersion ]* fieldpath.Set
38
+
36
39
// Stop comparing the new object with old object after applying.
37
40
// This was initially used to avoid spurious etcd update, but
38
41
// since that's vastly inefficient, we've come-up with a better
@@ -46,6 +49,7 @@ func (u *UpdaterBuilder) BuildUpdater() *Updater {
46
49
return & Updater {
47
50
Converter : u .Converter ,
48
51
IgnoreFilter : u .IgnoreFilter ,
52
+ IgnoredFields : u .IgnoredFields ,
49
53
returnInputOnNoop : u .ReturnInputOnNoop ,
50
54
}
51
55
}
@@ -56,6 +60,9 @@ type Updater struct {
56
60
// Deprecated: This will eventually become private.
57
61
Converter Converter
58
62
63
+ // Deprecated: This will eventually become private.
64
+ IgnoredFields map [fieldpath.APIVersion ]* fieldpath.Set
65
+
59
66
// Deprecated: This will eventually become private.
60
67
IgnoreFilter map [fieldpath.APIVersion ]fieldpath.Filter
61
68
@@ -70,8 +77,19 @@ func (s *Updater) update(oldObject, newObject *typed.TypedValue, version fieldpa
70
77
return nil , nil , fmt .Errorf ("failed to compare objects: %v" , err )
71
78
}
72
79
73
- versions := map [fieldpath.APIVersion ]* typed.Comparison {
74
- version : compare .FilterFields (s .IgnoreFilter [version ]),
80
+ var versions map [fieldpath.APIVersion ]* typed.Comparison
81
+
82
+ if s .IgnoredFields != nil && s .IgnoreFilter != nil {
83
+ return nil , nil , fmt .Errorf ("IgnoreFilter and IgnoreFilter may not both be set" )
84
+ }
85
+ if s .IgnoredFields != nil {
86
+ versions = map [fieldpath.APIVersion ]* typed.Comparison {
87
+ version : compare .ExcludeFields (s .IgnoredFields [version ]),
88
+ }
89
+ } else {
90
+ versions = map [fieldpath.APIVersion ]* typed.Comparison {
91
+ version : compare .FilterFields (s .IgnoreFilter [version ]),
92
+ }
75
93
}
76
94
77
95
for manager , managerSet := range managers {
@@ -101,7 +119,12 @@ func (s *Updater) update(oldObject, newObject *typed.TypedValue, version fieldpa
101
119
if err != nil {
102
120
return nil , nil , fmt .Errorf ("failed to compare objects: %v" , err )
103
121
}
104
- versions [managerSet .APIVersion ()] = compare .FilterFields (s .IgnoreFilter [managerSet .APIVersion ()])
122
+
123
+ if s .IgnoredFields != nil {
124
+ versions [managerSet .APIVersion ()] = compare .ExcludeFields (s .IgnoredFields [managerSet .APIVersion ()])
125
+ } else {
126
+ versions [managerSet .APIVersion ()] = compare .FilterFields (s .IgnoreFilter [managerSet .APIVersion ()])
127
+ }
105
128
}
106
129
107
130
conflictSet := managerSet .Set ().Intersection (compare .Modified .Union (compare .Added ))
@@ -154,7 +177,16 @@ func (s *Updater) Update(liveObject, newObject *typed.TypedValue, version fieldp
154
177
managers [manager ] = fieldpath .NewVersionedSet (fieldpath .NewSet (), version , false )
155
178
}
156
179
set := managers [manager ].Set ().Difference (compare .Removed ).Union (compare .Modified ).Union (compare .Added )
157
- ignoreFilter := s .IgnoreFilter [version ]
180
+
181
+ if s .IgnoredFields != nil && s .IgnoreFilter != nil {
182
+ return nil , nil , fmt .Errorf ("IgnoreFilter and IgnoreFilter may not both be set" )
183
+ }
184
+ var ignoreFilter fieldpath.Filter
185
+ if s .IgnoredFields != nil {
186
+ ignoreFilter = fieldpath .NewExcludeSetFilter (s .IgnoredFields [version ])
187
+ } else {
188
+ ignoreFilter = s .IgnoreFilter [version ]
189
+ }
158
190
if ignoreFilter != nil {
159
191
set = ignoreFilter .Filter (set )
160
192
}
@@ -189,7 +221,15 @@ func (s *Updater) Apply(liveObject, configObject *typed.TypedValue, version fiel
189
221
return nil , fieldpath.ManagedFields {}, fmt .Errorf ("failed to get field set: %v" , err )
190
222
}
191
223
192
- ignoreFilter := s .IgnoreFilter [version ]
224
+ if s .IgnoredFields != nil && s .IgnoreFilter != nil {
225
+ return nil , nil , fmt .Errorf ("IgnoreFilter and IgnoreFilter may not both be set" )
226
+ }
227
+ var ignoreFilter fieldpath.Filter
228
+ if s .IgnoredFields != nil {
229
+ ignoreFilter = fieldpath .NewExcludeSetFilter (s .IgnoredFields [version ])
230
+ } else {
231
+ ignoreFilter = s .IgnoreFilter [version ]
232
+ }
193
233
if ignoreFilter != nil {
194
234
set = ignoreFilter .Filter (set )
195
235
}
0 commit comments