diff --git a/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientConfigDataLocationResolver.java b/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientConfigDataLocationResolver.java index a9fb96ea..6bfc4085 100644 --- a/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientConfigDataLocationResolver.java +++ b/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientConfigDataLocationResolver.java @@ -70,7 +70,7 @@ public class KubernetesClientConfigDataLocationResolver extends KubernetesConfig registerRetryBeans(configMapProperties, secretsProperties, bootstrapContext, coreV1Api, namespaceProvider); } else { - if (configMapProperties.isEnabled()) { + if (configMapProperties != null && configMapProperties.isEnabled()) { KubernetesClientConfigMapPropertySourceLocator configMapPropertySourceLocator = new KubernetesClientConfigMapPropertySourceLocator( coreV1Api, configMapProperties, namespaceProvider); bootstrapContext.registerIfAbsent(ConfigMapPropertySourceLocator.class, @@ -80,7 +80,7 @@ public class KubernetesClientConfigDataLocationResolver extends KubernetesConfig event.getBootstrapContext().get(ConfigMapPropertySourceLocator.class))); } - if (secretsProperties.isEnabled()) { + if (secretsProperties != null && secretsProperties.isEnabled()) { KubernetesClientSecretsPropertySourceLocator secretsPropertySourceLocator = new KubernetesClientSecretsPropertySourceLocator( coreV1Api, namespaceProvider, secretsProperties); bootstrapContext.registerIfAbsent(SecretsPropertySourceLocator.class, @@ -95,7 +95,7 @@ public class KubernetesClientConfigDataLocationResolver extends KubernetesConfig private void registerRetryBeans(ConfigMapConfigProperties configMapProperties, SecretsConfigProperties secretsProperties, ConfigurableBootstrapContext bootstrapContext, CoreV1Api coreV1Api, KubernetesNamespaceProvider namespaceProvider) { - if (configMapProperties.isEnabled()) { + if (configMapProperties != null && configMapProperties.isEnabled()) { ConfigMapPropertySourceLocator configMapPropertySourceLocator = new KubernetesClientConfigMapPropertySourceLocator( coreV1Api, configMapProperties, namespaceProvider); if (isRetryEnabledForConfigMap(configMapProperties)) { @@ -110,7 +110,7 @@ public class KubernetesClientConfigDataLocationResolver extends KubernetesConfig event.getBootstrapContext().get(ConfigMapPropertySourceLocator.class))); } - if (secretsProperties.isEnabled()) { + if (secretsProperties != null && secretsProperties.isEnabled()) { SecretsPropertySourceLocator secretsPropertySourceLocator = new KubernetesClientSecretsPropertySourceLocator( coreV1Api, namespaceProvider, secretsProperties); if (isRetryEnabledForSecrets(secretsProperties)) { diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesConfigDataLocationResolver.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesConfigDataLocationResolver.java index 5a703958..946af3b1 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesConfigDataLocationResolver.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesConfigDataLocationResolver.java @@ -93,9 +93,9 @@ public abstract class KubernetesConfigDataLocationResolver public List resolveProfileSpecific(ConfigDataLocationResolverContext resolverContext, ConfigDataLocation location, Profiles profiles) throws ConfigDataLocationNotFoundException { PropertyHolder propertyHolder = loadProperties(resolverContext); - KubernetesClientProperties properties = propertyHolder.kubernetesClientProperties; - ConfigMapConfigProperties configMapProperties = propertyHolder.configMapConfigProperties; - SecretsConfigProperties secretsProperties = propertyHolder.secretsProperties; + KubernetesClientProperties properties = propertyHolder.kubernetesClientProperties(); + ConfigMapConfigProperties configMapProperties = propertyHolder.configMapConfigProperties(); + SecretsConfigProperties secretsProperties = propertyHolder.secretsProperties(); ConfigurableBootstrapContext bootstrapContext = resolverContext.getBootstrapContext(); bootstrapContext.registerIfAbsent(KubernetesClientProperties.class, InstanceSupplier.of(properties)); @@ -103,21 +103,27 @@ public abstract class KubernetesConfigDataLocationResolver "configDataKubernetesClientProperties", event.getBootstrapContext().get(KubernetesClientProperties.class))); - bootstrapContext.registerIfAbsent(ConfigMapConfigProperties.class, InstanceSupplier.of(configMapProperties)); - bootstrapContext.addCloseListener(event -> event.getApplicationContext().getBeanFactory().registerSingleton( - "configDataConfigMapConfigProperties", - event.getBootstrapContext().get(ConfigMapConfigProperties.class))); + if (configMapProperties != null) { + bootstrapContext.registerIfAbsent(ConfigMapConfigProperties.class, + InstanceSupplier.of(configMapProperties)); + bootstrapContext.addCloseListener(event -> event.getApplicationContext().getBeanFactory().registerSingleton( + "configDataConfigMapConfigProperties", + event.getBootstrapContext().get(ConfigMapConfigProperties.class))); + } - bootstrapContext.registerIfAbsent(SecretsConfigProperties.class, InstanceSupplier.of(secretsProperties)); - bootstrapContext.addCloseListener(event -> event.getApplicationContext().getBeanFactory().registerSingleton( - "configDataSecretsConfigProperties", event.getBootstrapContext().get(SecretsConfigProperties.class))); + if (secretsProperties != null) { + bootstrapContext.registerIfAbsent(SecretsConfigProperties.class, InstanceSupplier.of(secretsProperties)); + bootstrapContext.addCloseListener(event -> event.getApplicationContext().getBeanFactory().registerSingleton( + "configDataSecretsConfigProperties", + event.getBootstrapContext().get(SecretsConfigProperties.class))); + } HashMap kubernetesConfigData = new HashMap<>(); kubernetesConfigData.put("spring.cloud.kubernetes.client.namespace", properties.getNamespace()); - if (propertyHolder.applicationName != null) { + if (propertyHolder.applicationName() != null) { // If its null it means sprig.application.name was not set so don't add it to // the property source - kubernetesConfigData.put("spring.application.name", propertyHolder.applicationName); + kubernetesConfigData.put("spring.application.name", propertyHolder.applicationName()); } PropertySource> propertySource = new MapPropertySource("kubernetesConfigData", kubernetesConfigData); @@ -148,11 +154,13 @@ public abstract class KubernetesConfigDataLocationResolver } protected boolean isRetryEnabledForConfigMap(ConfigMapConfigProperties configMapProperties) { - return RETRY_IS_PRESENT && configMapProperties.getRetry().isEnabled() && configMapProperties.isFailFast(); + return RETRY_IS_PRESENT && configMapProperties != null && configMapProperties.getRetry().isEnabled() + && configMapProperties.isFailFast(); } protected boolean isRetryEnabledForSecrets(SecretsConfigProperties secretsProperties) { - return RETRY_IS_PRESENT && secretsProperties.getRetry().isEnabled() && secretsProperties.isFailFast(); + return RETRY_IS_PRESENT && secretsProperties != null && secretsProperties.getRetry().isEnabled() + && secretsProperties.isFailFast(); } protected KubernetesNamespaceProvider kubernetesNamespaceProvider(Environment environment) { @@ -183,17 +191,23 @@ public abstract class KubernetesConfigDataLocationResolver } else { kubernetesClientProperties = binder - .bind(KubernetesClientProperties.PREFIX, Bindable.of(KubernetesClientProperties.class), bindHandler) - .orElseGet(KubernetesClientProperties::new); + .bindOrCreate(KubernetesClientProperties.PREFIX, Bindable.of(KubernetesClientProperties.class), bindHandler); } kubernetesClientProperties.setNamespace(namespace); - ConfigMapConfigProperties configMapConfigProperties = binder - .bind(ConfigMapConfigProperties.PREFIX, ConfigMapConfigProperties.class) - .orElseGet(ConfigMapConfigProperties::new); - SecretsConfigProperties secretsProperties = binder - .bind(SecretsConfigProperties.PREFIX, SecretsConfigProperties.class) - .orElseGet(SecretsConfigProperties::new); + boolean configEnabled = binder.bind("spring.cloud.kubernetes.config.enabled", boolean.class).orElse(true); + boolean secretsEnabled = binder.bind("spring.cloud.kubernetes.secrets.enabled", boolean.class).orElse(true); + + ConfigMapConfigProperties configMapConfigProperties = null; + if (configEnabled) { + configMapConfigProperties = binder.bindOrCreate(ConfigMapConfigProperties.PREFIX, ConfigMapConfigProperties.class); + } + + SecretsConfigProperties secretsProperties = null; + if (secretsEnabled) { + secretsProperties = binder.bindOrCreate(SecretsConfigProperties.PREFIX, SecretsConfigProperties.class); + } + return new PropertyHolder(kubernetesClientProperties, configMapConfigProperties, secretsProperties, applicationName); diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesConfigDataResource.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesConfigDataResource.java index bfc1e970..43da1f2a 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesConfigDataResource.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesConfigDataResource.java @@ -62,14 +62,6 @@ public class KubernetesConfigDataResource extends ConfigDataResource { return this.properties; } - public ConfigMapConfigProperties getConfigMapProperties() { - return configMapProperties; - } - - public SecretsConfigProperties getSecretsConfigProperties() { - return secretsConfigProperties; - } - public boolean isOptional() { return this.optional; } diff --git a/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigDataLocationResolver.java b/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigDataLocationResolver.java index 0861ddd4..85768a9d 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigDataLocationResolver.java +++ b/spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigDataLocationResolver.java @@ -72,7 +72,7 @@ public class Fabric8ConfigDataLocationResolver extends KubernetesConfigDataLocat namespaceProvider); } else { - if (configMapProperties.isEnabled()) { + if (configMapProperties != null && configMapProperties.isEnabled()) { Fabric8ConfigMapPropertySourceLocator configMapPropertySourceLocator = new Fabric8ConfigMapPropertySourceLocator( kubernetesClient, configMapProperties, namespaceProvider); bootstrapContext.registerIfAbsent(ConfigMapPropertySourceLocator.class, @@ -81,7 +81,7 @@ public class Fabric8ConfigDataLocationResolver extends KubernetesConfigDataLocat .registerSingleton("configDataConfigMapPropertySourceLocator", event.getBootstrapContext().get(ConfigMapPropertySourceLocator.class))); } - if (secretsProperties.isEnabled()) { + if (secretsProperties != null && secretsProperties.isEnabled()) { Fabric8SecretsPropertySourceLocator secretsPropertySourceLocator = new Fabric8SecretsPropertySourceLocator( kubernetesClient, secretsProperties, namespaceProvider); bootstrapContext.registerIfAbsent(SecretsPropertySourceLocator.class, @@ -96,7 +96,7 @@ public class Fabric8ConfigDataLocationResolver extends KubernetesConfigDataLocat private void registerRetryBeans(ConfigMapConfigProperties configMapProperties, SecretsConfigProperties secretsProperties, ConfigurableBootstrapContext bootstrapContext, KubernetesClient kubernetesClient, KubernetesNamespaceProvider namespaceProvider) { - if (configMapProperties.isEnabled()) { + if (configMapProperties != null && configMapProperties.isEnabled()) { ConfigMapPropertySourceLocator configMapPropertySourceLocator = new Fabric8ConfigMapPropertySourceLocator( kubernetesClient, configMapProperties, namespaceProvider); if (isRetryEnabledForConfigMap(configMapProperties)) { @@ -111,7 +111,7 @@ public class Fabric8ConfigDataLocationResolver extends KubernetesConfigDataLocat event.getBootstrapContext().get(ConfigMapPropertySourceLocator.class))); } - if (secretsProperties.isEnabled()) { + if (secretsProperties != null && secretsProperties.isEnabled()) { SecretsPropertySourceLocator secretsPropertySourceLocator = new Fabric8SecretsPropertySourceLocator( kubernetesClient, secretsProperties, namespaceProvider); if (isRetryEnabledForSecrets(secretsProperties)) { diff --git a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/BootstrapConfigFailFastEnabledButRetryDisabled.java b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/fail_fast_enabled_retry_disabled/BootstrapConfigFailFastEnabledButRetryDisabled.java similarity index 97% rename from spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/BootstrapConfigFailFastEnabledButRetryDisabled.java rename to spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/fail_fast_enabled_retry_disabled/BootstrapConfigFailFastEnabledButRetryDisabled.java index 4ac5c75c..c5fdcbe7 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/BootstrapConfigFailFastEnabledButRetryDisabled.java +++ b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/fail_fast_enabled_retry_disabled/BootstrapConfigFailFastEnabledButRetryDisabled.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.config.locator_retry; +package org.springframework.cloud.kubernetes.fabric8.config.locator_retry.fail_fast_enabled_retry_disabled; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; diff --git a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/ConfigDataConfigFailFastEnabledButRetryDisabled.java b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/fail_fast_enabled_retry_disabled/ConfigDataConfigFailFastEnabledButRetryDisabled.java similarity index 88% rename from spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/ConfigDataConfigFailFastEnabledButRetryDisabled.java rename to spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/fail_fast_enabled_retry_disabled/ConfigDataConfigFailFastEnabledButRetryDisabled.java index faffb9cb..5b3f27c5 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/ConfigDataConfigFailFastEnabledButRetryDisabled.java +++ b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/fail_fast_enabled_retry_disabled/ConfigDataConfigFailFastEnabledButRetryDisabled.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.config.locator_retry; +package org.springframework.cloud.kubernetes.fabric8.config.locator_retry.fail_fast_enabled_retry_disabled; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; @@ -23,7 +23,9 @@ import org.junit.jupiter.api.BeforeAll; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider; +import org.springframework.cloud.kubernetes.commons.config.ConfigMapConfigProperties; import org.springframework.cloud.kubernetes.fabric8.config.Application; /** @@ -49,7 +51,10 @@ class ConfigDataConfigFailFastEnabledButRetryDisabled extends ConfigFailFastEnab private static KubernetesClient mockClient; @MockBean - KubernetesNamespaceProvider kubernetesNamespaceProvider; + private KubernetesNamespaceProvider kubernetesNamespaceProvider; + + @SpyBean + private ConfigMapConfigProperties properties; @BeforeAll static void setup() { diff --git a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/ConfigFailFastEnabledButRetryDisabled.java b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/fail_fast_enabled_retry_disabled/ConfigFailFastEnabledButRetryDisabled.java similarity index 98% rename from spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/ConfigFailFastEnabledButRetryDisabled.java rename to spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/fail_fast_enabled_retry_disabled/ConfigFailFastEnabledButRetryDisabled.java index ec78e9b9..5ee02b58 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/ConfigFailFastEnabledButRetryDisabled.java +++ b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/fail_fast_enabled_retry_disabled/ConfigFailFastEnabledButRetryDisabled.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.config.locator_retry; +package org.springframework.cloud.kubernetes.fabric8.config.locator_retry.fail_fast_enabled_retry_disabled; import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.KubernetesClient;