3
3
import java .io .Closeable ;
4
4
import java .io .IOException ;
5
5
import java .net .ConnectException ;
6
- import java .util .Collections ;
7
- import java .util .LinkedList ;
6
+ import java .util .ArrayList ;
7
+ import java .util .HashMap ;
8
8
import java .util .List ;
9
+ import java .util .Map ;
9
10
10
11
import org .slf4j .Logger ;
11
12
import org .slf4j .LoggerFactory ;
@@ -50,7 +51,7 @@ public ConfigurationService getConfigurationService() {
50
51
}
51
52
52
53
public List <ConfiguredController > getControllers () {
53
- return Collections . unmodifiableList (controllers .controllers );
54
+ return new ArrayList <> (controllers .controllers . values () );
54
55
}
55
56
56
57
/**
@@ -159,7 +160,7 @@ public <R extends CustomResource> void register(
159
160
}
160
161
161
162
private static class ControllerManager implements Closeable {
162
- private final List < ConfiguredController > controllers = new LinkedList <>();
163
+ private final Map < String , ConfiguredController > controllers = new HashMap <>();
163
164
private boolean started = false ;
164
165
165
166
@@ -173,7 +174,7 @@ public synchronized void shouldStart() {
173
174
}
174
175
175
176
public synchronized void start () {
176
- controllers .parallelStream ().forEach (ConfiguredController ::start );
177
+ controllers .values (). parallelStream ().forEach (ConfiguredController ::start );
177
178
started = true ;
178
179
}
179
180
@@ -183,7 +184,7 @@ public synchronized void close() {
183
184
return ;
184
185
}
185
186
186
- this .controllers .parallelStream ().forEach (closeable -> {
187
+ this .controllers .values (). parallelStream ().forEach (closeable -> {
187
188
try {
188
189
log .debug ("closing {}" , closeable );
189
190
closeable .close ();
@@ -196,7 +197,15 @@ public synchronized void close() {
196
197
}
197
198
198
199
public synchronized void add (ConfiguredController configuredController ) {
199
- this .controllers .add (configuredController );
200
+ final var configuration = configuredController .getConfiguration ();
201
+ final var crdName = configuration .getCRDName ();
202
+ final var existing = controllers .get (crdName );
203
+ if (existing != null ) {
204
+ throw new OperatorException ("Cannot register controller " + configuration .getName ()
205
+ + ": another controller (" + existing .getConfiguration ().getName ()
206
+ + ") is already registered for CRD " + crdName );
207
+ }
208
+ this .controllers .put (crdName , configuredController );
200
209
if (started ) {
201
210
configuredController .start ();
202
211
}
0 commit comments