diff --git a/spring-cloud-kubernetes-core/src/main/java/org/springframework/cloud/kubernetes/profile/KubernetesApplicationContextInitializer.java b/spring-cloud-kubernetes-core/src/main/java/org/springframework/cloud/kubernetes/profile/KubernetesApplicationContextInitializer.java index 04effa2e..6209cc26 100644 --- a/spring-cloud-kubernetes-core/src/main/java/org/springframework/cloud/kubernetes/profile/KubernetesApplicationContextInitializer.java +++ b/spring-cloud-kubernetes-core/src/main/java/org/springframework/cloud/kubernetes/profile/KubernetesApplicationContextInitializer.java @@ -17,7 +17,8 @@ package org.springframework.cloud.kubernetes.profile; import io.fabric8.kubernetes.client.DefaultKubernetesClient; -import org.springframework.cloud.kubernetes.PodUtils; +import java.util.function.Supplier; +import org.springframework.cloud.kubernetes.LazilyInstantiate; import org.springframework.cloud.kubernetes.StandardPodUtils; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; @@ -26,30 +27,38 @@ import org.springframework.core.Ordered; public class KubernetesApplicationContextInitializer implements ApplicationContextInitializer, Ordered { - private final KubernetesProfileApplicationListener listener; private static final int ORDER = 100; - public KubernetesApplicationContextInitializer() { - //If we are inside Kubernetes this should be perfectly valid. - //If not then we won't add the Kubernetes profile anyway. - this(new StandardPodUtils(new DefaultKubernetesClient())); - } + private final Supplier listenerSupplier; - public KubernetesApplicationContextInitializer(PodUtils utils) { - this(new KubernetesProfileApplicationListener(utils)); - } + public KubernetesApplicationContextInitializer() { + this(LazilyInstantiate.using(() -> + //If we are inside Kubernetes this should be perfectly valid. + //If not then we won't add the Kubernetes profile anyway. + new KubernetesProfileApplicationListener( + new StandardPodUtils(new DefaultKubernetesClient())) + )); + } - public KubernetesApplicationContextInitializer(KubernetesProfileApplicationListener listener) { - this.listener = listener; - } + public KubernetesApplicationContextInitializer( + Supplier listenerSupplier) { + this.listenerSupplier = listenerSupplier; + } - @Override + @Override public int getOrder() { return ORDER; } @Override public void initialize(ConfigurableApplicationContext applicationContext) { - listener.addKubernetesProfile(applicationContext.getEnvironment()); + if(isKubernetesEnabled(applicationContext)){ + listenerSupplier.get().addKubernetesProfile(applicationContext.getEnvironment()); + } } + + private Boolean isKubernetesEnabled(ConfigurableApplicationContext applicationContext) { + return applicationContext.getEnvironment() + .getProperty("spring.cloud.kubernetes.enabled", Boolean.class, true); + } } diff --git a/spring-cloud-kubernetes-core/src/test/java/org/springframework/cloud/kubernetes/profile/KubernetesApplicationContextInitializerTest.java b/spring-cloud-kubernetes-core/src/test/java/org/springframework/cloud/kubernetes/profile/KubernetesApplicationContextInitializerTest.java new file mode 100644 index 00000000..306a48b4 --- /dev/null +++ b/spring-cloud-kubernetes-core/src/test/java/org/springframework/cloud/kubernetes/profile/KubernetesApplicationContextInitializerTest.java @@ -0,0 +1,60 @@ +package org.springframework.cloud.kubernetes.profile; + +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.function.Supplier; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.ConfigurableEnvironment; + +@RunWith(MockitoJUnitRunner.class) +public class KubernetesApplicationContextInitializerTest { + + @Mock + private Supplier listenerSupplier; + + @Mock + private ConfigurableApplicationContext applicationContext; + + @Mock + private ConfigurableEnvironment environment; + + @Mock + private KubernetesProfileApplicationListener listener; + + private KubernetesApplicationContextInitializer initializer; + + @Before + public void setUp() { + initializer = new KubernetesApplicationContextInitializer(listenerSupplier); + when(applicationContext.getEnvironment()).thenReturn(environment); + when(listenerSupplier.get()).thenReturn(listener); + } + + @Test + public void kubernetesDisabled() { + when(environment.getProperty("spring.cloud.kubernetes.enabled", Boolean.class, true)) + .thenReturn(false); + + initializer.initialize(applicationContext); + + verify(listenerSupplier, never()).get(); + } + + @Test + public void kubernetesEnabled() { + when(environment.getProperty("spring.cloud.kubernetes.enabled", Boolean.class, true)) + .thenReturn(true); + + initializer.initialize(applicationContext); + + verify(listenerSupplier).get(); + verify(listener).addKubernetesProfile(environment); + } +}