1
1
package io .javaoperatorsdk .operator .api .config ;
2
2
3
3
import java .time .Duration ;
4
+ import java .util .HashMap ;
4
5
import java .util .HashSet ;
5
- import java .util .LinkedHashMap ;
6
6
import java .util .List ;
7
- import java .util .Optional ;
7
+ import java .util .Map ;
8
8
import java .util .Set ;
9
9
import java .util .function .UnaryOperator ;
10
- import java .util .stream .Collectors ;
11
10
12
11
import io .fabric8 .kubernetes .api .model .HasMetadata ;
13
12
import io .javaoperatorsdk .operator .api .config .dependent .DependentResourceSpec ;
14
- import io .javaoperatorsdk .operator .api .reconciler .dependent .managed .DependentResourceConfigurator ;
15
13
import io .javaoperatorsdk .operator .processing .event .rate .RateLimiter ;
16
14
import io .javaoperatorsdk .operator .processing .event .source .controller .ResourceEventFilter ;
17
15
import io .javaoperatorsdk .operator .processing .event .source .filter .GenericFilter ;
@@ -34,12 +32,12 @@ public class ControllerConfigurationOverrider<R extends HasMetadata> {
34
32
private ResourceEventFilter <R > customResourcePredicate ;
35
33
private final ControllerConfiguration <R > original ;
36
34
private Duration reconciliationMaxInterval ;
37
- private final LinkedHashMap <String , DependentResourceSpec > namedDependentResourceSpecs ;
38
35
private OnAddFilter <R > onAddFilter ;
39
36
private OnUpdateFilter <R > onUpdateFilter ;
40
37
private GenericFilter <R > genericFilter ;
41
38
private RateLimiter rateLimiter ;
42
39
private UnaryOperator <R > cachePruneFunction ;
40
+ private Map <DependentResourceSpec , Object > configurations ;
43
41
44
42
private ControllerConfigurationOverrider (ControllerConfiguration <R > original ) {
45
43
finalizer = original .getFinalizerName ();
@@ -49,13 +47,9 @@ private ControllerConfigurationOverrider(ControllerConfiguration<R> original) {
49
47
labelSelector = original .getLabelSelector ();
50
48
customResourcePredicate = original .getEventFilter ();
51
49
reconciliationMaxInterval = original .maxReconciliationInterval ().orElse (null );
52
- // make the original specs modifiable
53
- final var dependentResources = original .getDependentResources ();
54
- namedDependentResourceSpecs = new LinkedHashMap <>(dependentResources .size ());
55
50
this .onAddFilter = original .onAddFilter ().orElse (null );
56
51
this .onUpdateFilter = original .onUpdateFilter ().orElse (null );
57
52
this .genericFilter = original .genericFilter ().orElse (null );
58
- dependentResources .forEach (drs -> namedDependentResourceSpecs .put (drs .getName (), drs ));
59
53
this .original = original ;
60
54
this .rateLimiter = original .getRateLimiter ();
61
55
this .cachePruneFunction = original .cachePruneFunction ().orElse (null );
@@ -167,40 +161,24 @@ public ControllerConfigurationOverrider<R> withCachePruneFunction(
167
161
return this ;
168
162
}
169
163
170
- @ SuppressWarnings ("unchecked" )
171
164
public ControllerConfigurationOverrider <R > replacingNamedDependentResourceConfig (String name ,
172
165
Object dependentResourceConfig ) {
173
166
174
- var current = namedDependentResourceSpecs .get (name );
175
- if (current == null ) {
176
- throw new IllegalArgumentException ("Cannot find a DependentResource named: " + name );
177
- }
167
+ final var specs = original .getDependentResources ();
168
+ final var spec = specs .stream ()
169
+ .filter (drs -> drs .getName ().equals (name )).findFirst ()
170
+ .orElseThrow (
171
+ () -> new IllegalArgumentException ("Cannot find a DependentResource named: " + name ));
178
172
179
- var dependentResource = current .getDependentResource ();
180
- if (dependentResource instanceof DependentResourceConfigurator ) {
181
- var configurator = (DependentResourceConfigurator ) dependentResource ;
182
- configurator .configureWith (dependentResourceConfig );
173
+ if (configurations == null ) {
174
+ configurations = new HashMap <>(specs .size ());
183
175
}
176
+ configurations .put (spec , dependentResourceConfig );
184
177
185
178
return this ;
186
179
}
187
180
188
181
public ControllerConfiguration <R > build () {
189
- final var hasModifiedNamespaces = !original .getNamespaces ().equals (namespaces );
190
- final var newDependentSpecs = namedDependentResourceSpecs .values ().stream ()
191
- .peek (spec -> {
192
- // if the dependent resource has a NamespaceChangeable config
193
- // update the namespaces if needed, otherwise, do nothing
194
- if (hasModifiedNamespaces ) {
195
- final Optional <?> maybeConfig = spec .getDependentResourceConfiguration ();
196
- maybeConfig
197
- .filter (NamespaceChangeable .class ::isInstance )
198
- .map (NamespaceChangeable .class ::cast )
199
- .filter (NamespaceChangeable ::allowsNamespaceChanges )
200
- .ifPresent (nc -> nc .changeNamespaces (namespaces ));
201
- }
202
- }).collect (Collectors .toList ());
203
-
204
182
return new DefaultControllerConfiguration <>(
205
183
original .getAssociatedReconcilerClassName (),
206
184
original .getName (),
@@ -217,7 +195,9 @@ public ControllerConfiguration<R> build() {
217
195
onUpdateFilter ,
218
196
genericFilter ,
219
197
rateLimiter ,
220
- newDependentSpecs , cachePruneFunction );
198
+ original .getDependentResources (),
199
+ cachePruneFunction ,
200
+ configurations );
221
201
}
222
202
223
203
public static <R extends HasMetadata > ControllerConfigurationOverrider <R > override (
0 commit comments