diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AbstractConfigurationService.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AbstractConfigurationService.java index 6aa893e5c5..e3ad35188c 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AbstractConfigurationService.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AbstractConfigurationService.java @@ -8,23 +8,28 @@ public abstract class AbstractConfigurationService implements ConfigurationService { - protected final Map configurations = new ConcurrentHashMap<>(); + private final Map configurations = new ConcurrentHashMap<>(); protected void register(ControllerConfiguration config) { final var name = config.getName(); final var existing = configurations.get(name); if (existing != null) { - throw new IllegalArgumentException( - "Controller name '" - + name - + "' is used by both " - + existing.getAssociatedControllerClassName() - + " and " - + config.getAssociatedControllerClassName()); + throwExceptionOnNameCollision(config.getAssociatedControllerClassName(), existing); } configurations.put(name, config); } + protected void throwExceptionOnNameCollision( + String newControllerClassName, ControllerConfiguration existing) { + throw new IllegalArgumentException( + "Controller name '" + + existing.getName() + + "' is used by both " + + existing.getAssociatedControllerClassName() + + " and " + + newControllerClassName); + } + @Override public ControllerConfiguration getConfigurationFor( ResourceController controller) { diff --git a/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationService.java b/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationService.java index 852928e642..cadc69b701 100644 --- a/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationService.java +++ b/operator-framework/src/main/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationService.java @@ -22,6 +22,12 @@ public ControllerConfiguration getConfigurationFor // create the the configuration on demand and register it config = new AnnotationConfiguration(controller); register(config); + } else { + // check that we don't have a controller name collision + final var newControllerClassName = controller.getClass().getCanonicalName(); + if (!config.getAssociatedControllerClassName().equals(newControllerClassName)) { + throwExceptionOnNameCollision(newControllerClassName, config); + } } return config; } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationServiceTest.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationServiceTest.java index 1844cb6c3d..6a3986a5df 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationServiceTest.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/DefaultConfigurationServiceTest.java @@ -72,7 +72,8 @@ public UpdateControl createOr @Controller( generationAwareEventProcessing = false, - crdName = TestCustomResourceController.CRD_NAME) + crdName = TestCustomResourceController.CRD_NAME, + name = "test") static class TestCustomResourceController implements ResourceController { public static final String CRD_NAME = "customservices.sample.javaoperatorsdk";