From 03a4b1ad564de7574a0e6dedec5b84e1d02be9cc Mon Sep 17 00:00:00 2001 From: erabii Date: Thu, 27 Oct 2022 15:35:57 +0300 Subject: [PATCH] Move configmap and secrets properties to record (#1108) --- ...netesClientConfigDataLocationResolver.java | 8 +- ...ntConfigMapPropertySourceLocatorTests.java | 33 +++-- ...ientSecretsPropertySourceLocatorTests.java | 43 +++--- .../config/AbstractConfigProperties.java | 120 ----------------- ...tryableConfigMapPropertySourceLocator.java | 6 +- ...RetryableSecretsPropertySourceLocator.java | 6 +- .../config/ConfigMapConfigProperties.java | 47 +------ .../ConfigMapPropertySourceLocator.java | 7 +- .../KubernetesBootstrapConfiguration.java | 7 +- .../KubernetesConfigDataLocationResolver.java | 8 +- .../commons/config/RetryProperties.java | 39 ++++++ .../config/SecretsConfigProperties.java | 49 +------ .../config/SecretsPropertySourceLocator.java | 4 +- ...ConfigMapConfigPropertiesBindingTests.java | 123 +++++++++++++++++ .../ConfigMapConfigPropertiesTests.java | 65 ++++----- .../SecretsConfigPropertiesBindingTests.java | 126 ++++++++++++++++++ .../config/SecretsConfigPropertiesTests.java | 114 ++++++++-------- ...tEnabledWithDefaultRetryConfiguration.java | 9 +- .../bootstrap/ConfigFailFastEnabled.java | 6 +- ...stEnabledWithCustomRetryConfiguration.java | 4 +- .../bootstrap/SecretsFailFastEnabled.java | 7 +- ...stEnabledWithCustomRetryConfiguration.java | 4 +- .../Fabric8ConfigDataLocationResolver.java | 8 +- ...c8ConfigMapPropertySourceLocatorTests.java | 26 ++-- ...ric8SecretsPropertySourceLocatorTests.java | 30 ++--- .../BootstrapKubernetesEnabled.java | 2 +- .../ConfigDataKubernetesEnabled.java | 2 +- .../KubernetesEnabled.java | 2 +- ...ConfigFailFastEnabledButRetryDisabled.java | 30 ++++- 29 files changed, 501 insertions(+), 434 deletions(-) delete mode 100644 spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/AbstractConfigProperties.java create mode 100644 spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/RetryProperties.java create mode 100644 spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigPropertiesBindingTests.java create mode 100644 spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/SecretsConfigPropertiesBindingTests.java rename spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/{ => kubernetes_enabled}/BootstrapKubernetesEnabled.java (97%) rename spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/{ => kubernetes_enabled}/ConfigDataKubernetesEnabled.java (97%) rename spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/{ => kubernetes_enabled}/KubernetesEnabled.java (98%) 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 6bfc4085..10360a45 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 != null && configMapProperties.isEnabled()) { + if (configMapProperties != null && configMapProperties.enabled()) { 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 != null && secretsProperties.isEnabled()) { + if (secretsProperties != null && secretsProperties.enabled()) { 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 != null && configMapProperties.isEnabled()) { + if (configMapProperties != null && configMapProperties.enabled()) { 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 != null && secretsProperties.isEnabled()) { + if (secretsProperties != null && secretsProperties.enabled()) { SecretsPropertySourceLocator secretsPropertySourceLocator = new KubernetesClientSecretsPropertySourceLocator( coreV1Api, namespaceProvider, secretsProperties); if (isRetryEnabledForSecrets(secretsProperties)) { diff --git a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientConfigMapPropertySourceLocatorTests.java b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientConfigMapPropertySourceLocatorTests.java index e9f458dd..a385fe3f 100644 --- a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientConfigMapPropertySourceLocatorTests.java +++ b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientConfigMapPropertySourceLocatorTests.java @@ -18,6 +18,7 @@ package org.springframework.cloud.kubernetes.client.config; import java.util.Collections; import java.util.List; +import java.util.Map; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.WireMock; @@ -38,6 +39,7 @@ import org.springframework.cloud.kubernetes.commons.KubernetesClientProperties; import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider; import org.springframework.cloud.kubernetes.commons.config.ConfigMapConfigProperties; import org.springframework.cloud.kubernetes.commons.config.NamespaceResolutionFailedException; +import org.springframework.cloud.kubernetes.commons.config.RetryProperties; import org.springframework.core.env.PropertySource; import org.springframework.mock.env.MockEnvironment; @@ -96,8 +98,8 @@ class KubernetesClientConfigMapPropertySourceLocatorTests { CoreV1Api api = new CoreV1Api(); stubFor(get("/api/v1/namespaces/default/configmaps") .willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(PROPERTIES_CONFIGMAP_LIST)))); - ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(); - configMapConfigProperties.setName("bootstrap-640"); + ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(true, List.of(), List.of(), + Map.of(), true, "bootstrap-640", null, false, false, false, RetryProperties.DEFAULT); MockEnvironment mockEnvironment = new MockEnvironment(); mockEnvironment.setProperty("spring.cloud.kubernetes.client.namespace", "default"); PropertySource propertySource = new KubernetesClientConfigMapPropertySourceLocator(api, @@ -111,13 +113,12 @@ class KubernetesClientConfigMapPropertySourceLocatorTests { CoreV1Api api = new CoreV1Api(); stubFor(get("/api/v1/namespaces/default/configmaps") .willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(PROPERTIES_CONFIGMAP_LIST)))); - ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(); - configMapConfigProperties.setName("fake-name"); + ConfigMapConfigProperties.Source source = new ConfigMapConfigProperties.Source("bootstrap-640", "default", Collections.emptyMap(), null, null, null); + ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(true, List.of(), + List.of(source), Map.of(), true, "fake-name", null, false, false, false, RetryProperties.DEFAULT); - List sources = Collections.singletonList(source); - configMapConfigProperties.setSources(sources); KubernetesClientProperties kubernetesClientProperties = new KubernetesClientProperties(); kubernetesClientProperties.setNamespace("dev"); PropertySource propertySource = new KubernetesClientConfigMapPropertySourceLocator(api, @@ -138,8 +139,8 @@ class KubernetesClientConfigMapPropertySourceLocatorTests { CoreV1Api api = new CoreV1Api(); stubFor(get("/api/v1/namespaces/default/configmaps") .willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(PROPERTIES_CONFIGMAP_LIST)))); - ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(); - configMapConfigProperties.setName("bootstrap-640"); + ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(true, List.of(), List.of(), + Map.of(), true, "bootstrap-640", null, false, false, false, RetryProperties.DEFAULT); KubernetesClientProperties kubernetesClientProperties = new KubernetesClientProperties(); kubernetesClientProperties.setNamespace(""); // empty on purpose assertThatThrownBy(() -> new KubernetesClientConfigMapPropertySourceLocator(api, configMapConfigProperties, @@ -159,8 +160,8 @@ class KubernetesClientConfigMapPropertySourceLocatorTests { CoreV1Api api = new CoreV1Api(); stubFor(get("/api/v1/namespaces/default/configmaps") .willReturn(aResponse().withStatus(200).withBody(new JSON().serialize(PROPERTIES_CONFIGMAP_LIST)))); - ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(); - configMapConfigProperties.setName("bootstrap-640"); + ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(true, List.of(), List.of(), + Map.of(), true, "bootstrap-640", null, false, false, false, RetryProperties.DEFAULT); KubernetesClientProperties kubernetesClientProperties = new KubernetesClientProperties(); kubernetesClientProperties.setNamespace(""); // empty on purpose assertThatThrownBy(() -> new KubernetesClientConfigMapPropertySourceLocator(api, configMapConfigProperties, @@ -174,10 +175,8 @@ class KubernetesClientConfigMapPropertySourceLocatorTests { stubFor(get("/api/v1/namespaces/default/configmaps") .willReturn(aResponse().withStatus(500).withBody("Internal Server Error"))); - ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(); - configMapConfigProperties.setName("bootstrap-640"); - configMapConfigProperties.setNamespace("default"); - configMapConfigProperties.setFailFast(true); + ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(true, List.of(), List.of(), + Map.of(), true, "bootstrap-640", "default", false, false, true, RetryProperties.DEFAULT); KubernetesClientConfigMapPropertySourceLocator locator = new KubernetesClientConfigMapPropertySourceLocator(api, configMapConfigProperties, new KubernetesNamespaceProvider(new MockEnvironment())); @@ -192,10 +191,8 @@ class KubernetesClientConfigMapPropertySourceLocatorTests { stubFor(get("/api/v1/namespaces/default/configmaps") .willReturn(aResponse().withStatus(500).withBody("Internal Server Error"))); - ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(); - configMapConfigProperties.setName("bootstrap-640"); - configMapConfigProperties.setNamespace("default"); - configMapConfigProperties.setFailFast(false); + ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(true, List.of(), List.of(), + Map.of(), true, "bootstrap-640", "default", false, false, false, RetryProperties.DEFAULT); KubernetesClientConfigMapPropertySourceLocator locator = new KubernetesClientConfigMapPropertySourceLocator(api, configMapConfigProperties, new KubernetesNamespaceProvider(new MockEnvironment())); diff --git a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientSecretsPropertySourceLocatorTests.java b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientSecretsPropertySourceLocatorTests.java index 02dea495..841dfa79 100644 --- a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientSecretsPropertySourceLocatorTests.java +++ b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientSecretsPropertySourceLocatorTests.java @@ -16,9 +16,9 @@ package org.springframework.cloud.kubernetes.client.config; -import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.WireMock; @@ -33,6 +33,7 @@ import org.junit.jupiter.api.Test; import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider; import org.springframework.cloud.kubernetes.commons.config.NamespaceResolutionFailedException; +import org.springframework.cloud.kubernetes.commons.config.RetryProperties; import org.springframework.cloud.kubernetes.commons.config.SecretsConfigProperties; import org.springframework.core.env.PropertySource; import org.springframework.mock.env.MockEnvironment; @@ -106,7 +107,6 @@ class KubernetesClientSecretsPropertySourceLocatorTests { void getLocateWithSources() { CoreV1Api api = new CoreV1Api(); stubFor(get(LIST_API).willReturn(aResponse().withStatus(200).withBody(LIST_BODY))); - SecretsConfigProperties secretsConfigProperties = new SecretsConfigProperties(); SecretsConfigProperties.Source source1 = new SecretsConfigProperties.Source("db-secret", "", Collections.emptyMap(), null, null, null); @@ -114,13 +114,9 @@ class KubernetesClientSecretsPropertySourceLocatorTests { SecretsConfigProperties.Source source2 = new SecretsConfigProperties.Source("rabbit-password", "", Collections.emptyMap(), null, null, null); - List sources = new ArrayList<>(); - sources.add(source1); - sources.add(source2); - secretsConfigProperties.setName("app"); - secretsConfigProperties.setNamespace("default"); - secretsConfigProperties.setSources(sources); - secretsConfigProperties.setEnableApi(true); + SecretsConfigProperties secretsConfigProperties = new SecretsConfigProperties(true, Map.of(), List.of(), + List.of(source1, source2), true, "app", "default", false, true, false, RetryProperties.DEFAULT); + PropertySource propertySource = new KubernetesClientSecretsPropertySourceLocator(api, new KubernetesNamespaceProvider(new MockEnvironment()), secretsConfigProperties).locate(ENV); assertThat(propertySource.containsProperty("password")).isTrue(); @@ -131,10 +127,9 @@ class KubernetesClientSecretsPropertySourceLocatorTests { void getLocateWithOutSources() { CoreV1Api api = new CoreV1Api(); stubFor(get(LIST_API).willReturn(aResponse().withStatus(200).withBody(LIST_BODY))); - SecretsConfigProperties secretsConfigProperties = new SecretsConfigProperties(); - secretsConfigProperties.setName("db-secret"); - secretsConfigProperties.setNamespace("default"); - secretsConfigProperties.setEnableApi(true); + SecretsConfigProperties secretsConfigProperties = new SecretsConfigProperties(true, Map.of(), List.of(), + List.of(), true, "db-secret", "default", false, true, false, RetryProperties.DEFAULT); + PropertySource propertySource = new KubernetesClientSecretsPropertySourceLocator(api, new KubernetesNamespaceProvider(new MockEnvironment()), secretsConfigProperties).locate(ENV); assertThat(propertySource.containsProperty("password")).isTrue(); @@ -152,10 +147,10 @@ class KubernetesClientSecretsPropertySourceLocatorTests { void testLocateWithoutNamespaceConstructor() { CoreV1Api api = new CoreV1Api(); stubFor(get(LIST_API).willReturn(aResponse().withStatus(200).withBody(LIST_BODY))); - SecretsConfigProperties secretsConfigProperties = new SecretsConfigProperties(); - secretsConfigProperties.setName("db-secret"); - secretsConfigProperties.setNamespace(""); // empty on purpose - secretsConfigProperties.setEnableApi(true); + + SecretsConfigProperties secretsConfigProperties = new SecretsConfigProperties(true, Map.of(), List.of(), + List.of(), true, "db-secret", "", false, true, false, RetryProperties.DEFAULT); + assertThatThrownBy(() -> new KubernetesClientSecretsPropertySourceLocator(api, new KubernetesNamespaceProvider(new MockEnvironment()), secretsConfigProperties).locate(ENV)) .isInstanceOf(NamespaceResolutionFailedException.class); @@ -166,11 +161,8 @@ class KubernetesClientSecretsPropertySourceLocatorTests { CoreV1Api api = new CoreV1Api(); stubFor(get(LIST_API).willReturn(aResponse().withStatus(500).withBody("Internal Server Error"))); - SecretsConfigProperties secretsConfigProperties = new SecretsConfigProperties(); - secretsConfigProperties.setName("db-secret"); - secretsConfigProperties.setNamespace("default"); - secretsConfigProperties.setEnableApi(true); - secretsConfigProperties.setFailFast(true); + SecretsConfigProperties secretsConfigProperties = new SecretsConfigProperties(true, Map.of(), List.of(), + List.of(), true, "db-secret", "default", false, true, true, RetryProperties.DEFAULT); KubernetesClientSecretsPropertySourceLocator locator = new KubernetesClientSecretsPropertySourceLocator(api, new KubernetesNamespaceProvider(new MockEnvironment()), secretsConfigProperties); @@ -184,11 +176,8 @@ class KubernetesClientSecretsPropertySourceLocatorTests { CoreV1Api api = new CoreV1Api(); stubFor(get(LIST_API).willReturn(aResponse().withStatus(500).withBody("Internal Server Error"))); - SecretsConfigProperties secretsConfigProperties = new SecretsConfigProperties(); - secretsConfigProperties.setName("db-secret"); - secretsConfigProperties.setNamespace("default"); - secretsConfigProperties.setEnableApi(true); - secretsConfigProperties.setFailFast(false); + SecretsConfigProperties secretsConfigProperties = new SecretsConfigProperties(true, Map.of(), List.of(), + List.of(), true, "db-secret", "default", false, true, false, RetryProperties.DEFAULT); KubernetesClientSecretsPropertySourceLocator locator = new KubernetesClientSecretsPropertySourceLocator(api, new KubernetesNamespaceProvider(new MockEnvironment()), secretsConfigProperties); diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/AbstractConfigProperties.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/AbstractConfigProperties.java deleted file mode 100644 index acd9a529..00000000 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/AbstractConfigProperties.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2013-2021 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.commons.config; - -import org.springframework.boot.context.properties.bind.DefaultValue; - -/** - * Abstraction over configuration properties. - * - * @author Ioannis Canellos - * @author Isik Erhan - */ -public abstract class AbstractConfigProperties { - - protected boolean enabled = true; - - protected String name; - - protected String namespace; - - // use config map or secret name to prefix properties - protected boolean useNameAsPrefix; - - // use profile name to append config map name - protected boolean includeProfileSpecificSources = true; - - protected boolean failFast = false; - - protected RetryProperties retry = RetryProperties.DEFAULT; - - public boolean isEnabled() { - return this.enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } - - public String getNamespace() { - return this.namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - public boolean isUseNameAsPrefix() { - return useNameAsPrefix; - } - - public void setUseNameAsPrefix(boolean useNameAsPrefix) { - this.useNameAsPrefix = useNameAsPrefix; - } - - public boolean isIncludeProfileSpecificSources() { - return includeProfileSpecificSources; - } - - public void setIncludeProfileSpecificSources(boolean includeProfileSpecificSources) { - this.includeProfileSpecificSources = includeProfileSpecificSources; - } - - public boolean isFailFast() { - return failFast; - } - - public void setFailFast(boolean failFast) { - this.failFast = failFast; - } - - public RetryProperties getRetry() { - return retry; - } - - public void setRetry(RetryProperties retry) { - this.retry = retry; - } - - /** - * Kubernetes config retry properties. - * @param initialInterval Initial retry interval in milliseconds. - * @param multiplier Maximum interval for backoff. - * @param maxInterval Maximum interval - * @param maxAttempts Maximum number of attempts. - * @param enabled Retry enabled or not - */ - public record RetryProperties(@DefaultValue("1000") long initialInterval, @DefaultValue("1.1") double multiplier, - @DefaultValue("2000") long maxInterval, @DefaultValue("6") int maxAttempts, - @DefaultValue("true") boolean enabled) { - - /** - * Default instance. - */ - public static final RetryProperties DEFAULT = new RetryProperties(1000, 1.1, 2000, 6, true); - - } - -} diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigDataRetryableConfigMapPropertySourceLocator.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigDataRetryableConfigMapPropertySourceLocator.java index 5a8e9351..c5416a3b 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigDataRetryableConfigMapPropertySourceLocator.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigDataRetryableConfigMapPropertySourceLocator.java @@ -39,9 +39,9 @@ public class ConfigDataRetryableConfigMapPropertySourceLocator extends ConfigMap ConfigMapPropertySourceLocator configMapPropertySourceLocator, ConfigMapConfigProperties properties) { super(properties); this.configMapPropertySourceLocator = configMapPropertySourceLocator; - this.retryTemplate = RetryTemplate.builder().maxAttempts(properties.getRetry().maxAttempts()) - .exponentialBackoff(properties.getRetry().initialInterval(), properties.getRetry().multiplier(), - properties.getRetry().maxInterval()) + this.retryTemplate = RetryTemplate.builder().maxAttempts(properties.retry().maxAttempts()) + .exponentialBackoff(properties.retry().initialInterval(), properties.retry().multiplier(), + properties.retry().maxInterval()) .build(); } diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigDataRetryableSecretsPropertySourceLocator.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigDataRetryableSecretsPropertySourceLocator.java index 4044f013..58f402b0 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigDataRetryableSecretsPropertySourceLocator.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigDataRetryableSecretsPropertySourceLocator.java @@ -39,9 +39,9 @@ public class ConfigDataRetryableSecretsPropertySourceLocator extends SecretsProp SecretsConfigProperties secretsConfigProperties) { super(secretsConfigProperties); this.secretsPropertySourceLocator = propertySourceLocator; - this.retryTemplate = RetryTemplate.builder().maxAttempts(properties.getRetry().maxAttempts()) - .exponentialBackoff(properties.getRetry().initialInterval(), properties.getRetry().multiplier(), - properties.getRetry().maxInterval()) + this.retryTemplate = RetryTemplate.builder().maxAttempts(properties.retry().maxAttempts()) + .exponentialBackoff(properties.retry().initialInterval(), properties.retry().multiplier(), + properties.retry().maxInterval()) .build(); } diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigProperties.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigProperties.java index d9f921b9..2b3fc5ba 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigProperties.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigProperties.java @@ -17,7 +17,6 @@ package org.springframework.cloud.kubernetes.commons.config; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -37,53 +36,17 @@ import static org.springframework.cloud.kubernetes.commons.config.ConfigUtils.ge * @author Isik Erhan */ @ConfigurationProperties(ConfigMapConfigProperties.PREFIX) -public class ConfigMapConfigProperties extends AbstractConfigProperties { +public record ConfigMapConfigProperties(@DefaultValue("true") boolean enableApi, @DefaultValue List paths, + @DefaultValue List sources, @DefaultValue Map labels, + @DefaultValue("true") boolean enabled, String name, String namespace, boolean useNameAsPrefix, + @DefaultValue("true") boolean includeProfileSpecificSources, boolean failFast, + @DefaultValue RetryProperties retry) { /** * Prefix for Kubernetes config maps configuration properties. */ public static final String PREFIX = "spring.cloud.kubernetes.config"; - private boolean enableApi = true; - - private List paths = Collections.emptyList(); - - private List sources = Collections.emptyList(); - - private Map labels = Collections.emptyMap(); - - public boolean isEnableApi() { - return this.enableApi; - } - - public void setEnableApi(boolean enableApi) { - this.enableApi = enableApi; - } - - public List getPaths() { - return this.paths; - } - - public void setPaths(List paths) { - this.paths = paths; - } - - public List getSources() { - return this.sources; - } - - public void setSources(List sources) { - this.sources = sources; - } - - public Map getLabels() { - return labels; - } - - public void setLabels(Map labels) { - this.labels = labels; - } - /** * @return A list of config map source(s) to use. */ diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapPropertySourceLocator.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapPropertySourceLocator.java index b9b8cb40..8fb17681 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapPropertySourceLocator.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapPropertySourceLocator.java @@ -25,7 +25,6 @@ import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.function.Function; -import java.util.stream.Collectors; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -66,7 +65,7 @@ public abstract class ConfigMapPropertySourceLocator implements PropertySourceLo if (environment instanceof ConfigurableEnvironment env) { CompositePropertySource composite = new CompositePropertySource("composite-configmap"); - if (this.properties.isEnableApi()) { + if (this.properties.enableApi()) { Set sources = new LinkedHashSet<>(this.properties.determineSources(environment)); LOG.debug("Config Map normalized sources : " + sources); sources.forEach(s -> composite.addFirstPropertySource(getMapPropertySource(s, env))); @@ -85,7 +84,7 @@ public abstract class ConfigMapPropertySourceLocator implements PropertySourceLo } private void addPropertySourcesFromPaths(Environment environment, CompositePropertySource composite) { - Set uniquePaths = new LinkedHashSet<>(properties.getPaths()); + Set uniquePaths = new LinkedHashSet<>(properties.paths()); uniquePaths.stream().map(Paths::get).filter(p -> { boolean exists = Files.exists(p); if (!exists) { @@ -99,7 +98,7 @@ public abstract class ConfigMapPropertySourceLocator implements PropertySourceLo LOG.warn("Configured input path: " + p + " will be ignored because it is not a regular file"); } return regular; - }).collect(Collectors.toList()).forEach(p -> { + }).toList().forEach(p -> { try { String content = new String(Files.readAllBytes(p)).trim(); String filename = p.toAbsolutePath().toString().toLowerCase(); diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesBootstrapConfiguration.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesBootstrapConfiguration.java index d8996aec..48ae9f8a 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesBootstrapConfiguration.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesBootstrapConfiguration.java @@ -48,8 +48,7 @@ public class KubernetesBootstrapConfiguration { @Import(AopAutoConfiguration.class) public static class RetryConfiguration { - public static RetryOperationsInterceptor retryOperationsInterceptor( - AbstractConfigProperties.RetryProperties retryProperties) { + public static RetryOperationsInterceptor retryOperationsInterceptor(RetryProperties retryProperties) { return RetryInterceptorBuilder.stateless().backOffOptions(retryProperties.initialInterval(), retryProperties.multiplier(), retryProperties.maxInterval()) .maxAttempts(retryProperties.maxAttempts()).build(); @@ -58,7 +57,7 @@ public class KubernetesBootstrapConfiguration { @Bean @ConditionalOnKubernetesConfigRetryEnabled public RetryOperationsInterceptor kubernetesConfigRetryInterceptor(ConfigMapConfigProperties configProperties) { - return retryOperationsInterceptor(configProperties.getRetry()); + return retryOperationsInterceptor(configProperties.retry()); } @Bean("kubernetesConfigRetryInterceptor") @@ -70,7 +69,7 @@ public class KubernetesBootstrapConfiguration { @Bean @ConditionalOnKubernetesSecretsRetryEnabled public RetryOperationsInterceptor kubernetesSecretsRetryInterceptor(SecretsConfigProperties configProperties) { - return retryOperationsInterceptor(configProperties.getRetry()); + return retryOperationsInterceptor(configProperties.retry()); } @Bean("kubernetesSecretsRetryInterceptor") 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 2e23088f..1fc53040 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 @@ -127,13 +127,13 @@ public abstract class KubernetesConfigDataLocationResolver } protected final boolean isRetryEnabledForConfigMap(ConfigMapConfigProperties configMapProperties) { - return RETRY_IS_PRESENT && configMapProperties != null && configMapProperties.getRetry().enabled() - && configMapProperties.isFailFast(); + return RETRY_IS_PRESENT && configMapProperties != null && configMapProperties.retry().enabled() + && configMapProperties.failFast(); } protected final boolean isRetryEnabledForSecrets(SecretsConfigProperties secretsProperties) { - return RETRY_IS_PRESENT && secretsProperties != null && secretsProperties.getRetry().enabled() - && secretsProperties.isFailFast(); + return RETRY_IS_PRESENT && secretsProperties != null && secretsProperties.retry().enabled() + && secretsProperties.failFast(); } protected KubernetesNamespaceProvider kubernetesNamespaceProvider(Environment environment) { diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/RetryProperties.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/RetryProperties.java new file mode 100644 index 00000000..e160efcc --- /dev/null +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/RetryProperties.java @@ -0,0 +1,39 @@ +/* + * Copyright 2013-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.commons.config; + +import org.springframework.boot.context.properties.bind.DefaultValue; + +/** + * + * @author wind57 Kubernetes config retry properties. + * @param initialInterval Initial retry interval in milliseconds. + * @param multiplier Maximum interval for backoff. + * @param maxInterval Maximum interval + * @param maxAttempts Maximum number of attempts. + * @param enabled Retry enabled or not + */ +public record RetryProperties(@DefaultValue("1000") long initialInterval, @DefaultValue("1.1") double multiplier, + @DefaultValue("2000") long maxInterval, @DefaultValue("6") int maxAttempts, + @DefaultValue("true") boolean enabled) { + + /** + * Default instance. + */ + public static final RetryProperties DEFAULT = new RetryProperties(1000, 1.1, 2000, 6, true); + +} diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SecretsConfigProperties.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SecretsConfigProperties.java index 0ac6eaab..ea481848 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SecretsConfigProperties.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SecretsConfigProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2021 the original author or authors. + * Copyright 2013-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ package org.springframework.cloud.kubernetes.commons.config; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -38,53 +37,17 @@ import static org.springframework.cloud.kubernetes.commons.config.ConfigUtils.ge * @author Isik Erhan */ @ConfigurationProperties(SecretsConfigProperties.PREFIX) -public class SecretsConfigProperties extends AbstractConfigProperties { +public record SecretsConfigProperties(boolean enableApi, @DefaultValue Map labels, + @DefaultValue List paths, @DefaultValue List sources, @DefaultValue("true") boolean enabled, + String name, String namespace, boolean useNameAsPrefix, + @DefaultValue("true") boolean includeProfileSpecificSources, boolean failFast, + @DefaultValue RetryProperties retry) { /** * Prefix for Kubernetes secrets configuration properties. */ public static final String PREFIX = "spring.cloud.kubernetes.secrets"; - private boolean enableApi = false; - - private Map labels = Collections.emptyMap(); - - private List paths = Collections.emptyList(); - - private List sources = Collections.emptyList(); - - public boolean isEnableApi() { - return this.enableApi; - } - - public void setEnableApi(boolean enableApi) { - this.enableApi = enableApi; - } - - public Map getLabels() { - return this.labels; - } - - public void setLabels(Map labels) { - this.labels = labels; - } - - public List getPaths() { - return this.paths; - } - - public void setPaths(List paths) { - this.paths = paths; - } - - public List getSources() { - return sources; - } - - public void setSources(List sources) { - this.sources = sources; - } - /** * @return A list of Secret source(s) to use. */ diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SecretsPropertySourceLocator.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SecretsPropertySourceLocator.java index 46147829..7db534f3 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SecretsPropertySourceLocator.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/SecretsPropertySourceLocator.java @@ -73,7 +73,7 @@ public abstract class SecretsPropertySourceLocator implements PropertySourceLoca // read for secrets mount putPathConfig(composite); - if (this.properties.isEnableApi()) { + if (this.properties.enableApi()) { uniqueSources.forEach(s -> composite.addPropertySource(getMapPropertySourceForSingleSecret(env, s))); } @@ -98,7 +98,7 @@ public abstract class SecretsPropertySourceLocator implements PropertySourceLoca protected void putPathConfig(CompositePropertySource composite) { - this.properties.getPaths().stream().map(Paths::get).filter(Files::exists).flatMap(x -> { + this.properties.paths().stream().map(Paths::get).filter(Files::exists).flatMap(x -> { try { return Files.walk(x); } diff --git a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigPropertiesBindingTests.java b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigPropertiesBindingTests.java new file mode 100644 index 00000000..526b70a9 --- /dev/null +++ b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigPropertiesBindingTests.java @@ -0,0 +1,123 @@ +/* + * Copyright 2013-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.commons.config; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Configuration; + +/** + * @author wind57 + * + * tests that prove that binding works. We need these because we moved to a record for + * configuration properties. + */ +class ConfigMapConfigPropertiesBindingTests { + + @Test + void testWithDefaults() { + new ApplicationContextRunner().withUserConfiguration(Config.class).run(context -> { + ConfigMapConfigProperties props = context.getBean(ConfigMapConfigProperties.class); + Assertions.assertNotNull(props); + Assertions.assertTrue(props.enableApi()); + Assertions.assertTrue(props.paths().isEmpty()); + Assertions.assertTrue(props.sources().isEmpty()); + Assertions.assertTrue(props.labels().isEmpty()); + Assertions.assertTrue(props.enabled()); + Assertions.assertNull(props.name()); + Assertions.assertNull(props.namespace()); + Assertions.assertFalse(props.useNameAsPrefix()); + Assertions.assertTrue(props.includeProfileSpecificSources()); + Assertions.assertFalse(props.failFast()); + + Assertions.assertNotNull(props.retry()); + Assertions.assertEquals(props.retry().initialInterval(), 1000L); + Assertions.assertEquals(props.retry().multiplier(), 1.1D); + Assertions.assertEquals(props.retry().maxInterval(), 2000L); + Assertions.assertEquals(props.retry().maxAttempts(), 6); + Assertions.assertTrue(props.retry().enabled()); + }); + } + + @Test + void testWithNonDefaults() { + new ApplicationContextRunner().withUserConfiguration(Config.class).withPropertyValues( + "spring.cloud.kubernetes.config.enableApi=false", "spring.cloud.kubernetes.config.paths[0]=a", + "spring.cloud.kubernetes.config.paths[1]=b", "spring.cloud.kubernetes.config.sources[0].name=source-a", + "spring.cloud.kubernetes.config.sources[0].namespace=source-namespace-a", + "spring.cloud.kubernetes.config.sources[0].labels.key=source-value", + "spring.cloud.kubernetes.config.sources[0].explicit-prefix=source-prefix", + "spring.cloud.kubernetes.config.sources[0].use-name-as-prefix=true", + "spring.cloud.kubernetes.config.sources[0].include-profile-specific-sources=true", + "spring.cloud.kubernetes.config.labels.label-a=label-a", "spring.cloud.kubernetes.config.enabled=false", + "spring.cloud.kubernetes.config.name=name", "spring.cloud.kubernetes.config.namespace=namespace", + "spring.cloud.kubernetes.config.use-name-as-prefix=true", + "spring.cloud.kubernetes.config.include-profile-specific-sources=true", + "spring.cloud.kubernetes.config.fail-fast=true", + "spring.cloud.kubernetes.config.retry.initial-interval=1", + "spring.cloud.kubernetes.config.retry.multiplier=1.2", + "spring.cloud.kubernetes.config.retry.max-interval=3", + "spring.cloud.kubernetes.config.retry.max-attempts=4", + "spring.cloud.kubernetes.config.retry.enabled=false").run(context -> { + ConfigMapConfigProperties props = context.getBean(ConfigMapConfigProperties.class); + Assertions.assertNotNull(props); + Assertions.assertFalse(props.enableApi()); + + Assertions.assertEquals(props.paths().size(), 2); + Assertions.assertEquals(props.paths().get(0), "a"); + Assertions.assertEquals(props.paths().get(1), "b"); + + Assertions.assertEquals(props.sources().size(), 1); + ConfigMapConfigProperties.Source source = props.sources().get(0); + Assertions.assertEquals(source.name(), "source-a"); + Assertions.assertEquals(source.namespace(), "source-namespace-a"); + Assertions.assertEquals(source.labels().size(), 1); + Assertions.assertEquals(source.labels().get("key"), "source-value"); + Assertions.assertEquals(source.explicitPrefix(), "source-prefix"); + Assertions.assertTrue(source.useNameAsPrefix()); + Assertions.assertTrue(source.includeProfileSpecificSources()); + + Assertions.assertEquals(props.labels().size(), 1); + Assertions.assertEquals(props.labels().get("label-a"), "label-a"); + + Assertions.assertFalse(props.enabled()); + Assertions.assertEquals(props.name(), "name"); + Assertions.assertEquals(props.namespace(), "namespace"); + Assertions.assertTrue(props.useNameAsPrefix()); + Assertions.assertTrue(props.includeProfileSpecificSources()); + Assertions.assertTrue(props.failFast()); + + RetryProperties retryProperties = props.retry(); + Assertions.assertNotNull(retryProperties); + Assertions.assertEquals(retryProperties.initialInterval(), 1); + Assertions.assertEquals(retryProperties.multiplier(), 1.2); + Assertions.assertEquals(retryProperties.maxInterval(), 3); + Assertions.assertFalse(retryProperties.enabled()); + + }); + } + + @Configuration + @EnableConfigurationProperties(ConfigMapConfigProperties.class) + static class Config { + + } + +} diff --git a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigPropertiesTests.java b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigPropertiesTests.java index 64baff08..f4b0a98c 100644 --- a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigPropertiesTests.java +++ b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/ConfigMapConfigPropertiesTests.java @@ -16,7 +16,6 @@ package org.springframework.cloud.kubernetes.commons.config; -import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; @@ -47,10 +46,8 @@ class ConfigMapConfigPropertiesTests { */ @Test void testUseNameAsPrefixUnsetEmptySources() { - ConfigMapConfigProperties properties = new ConfigMapConfigProperties(); - properties.setSources(Collections.emptyList()); - properties.setName("config-map-a"); - properties.setNamespace("spring-k8s"); + ConfigMapConfigProperties properties = new ConfigMapConfigProperties(true, List.of(), List.of(), Map.of(), true, + "config-map-a", "spring-k8s", false, false, false, RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(sources.size(), 1, "empty sources must generate a List with a single NormalizedSource"); @@ -75,11 +72,8 @@ class ConfigMapConfigPropertiesTests { */ @Test void testUseNameAsPrefixSetEmptySources() { - ConfigMapConfigProperties properties = new ConfigMapConfigProperties(); - properties.setSources(Collections.emptyList()); - properties.setUseNameAsPrefix(true); - properties.setName("config-map-a"); - properties.setNamespace("spring-k8s"); + ConfigMapConfigProperties properties = new ConfigMapConfigProperties(true, List.of(), List.of(), Map.of(), true, + "config-map-a", "spring-k8s", true, false, false, RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(sources.size(), 1, "empty sources must generate a List with a single NormalizedSource"); @@ -106,13 +100,12 @@ class ConfigMapConfigPropertiesTests { */ @Test void testUseNameAsPrefixUnsetNonEmptySources() { - ConfigMapConfigProperties properties = new ConfigMapConfigProperties(); - properties.setUseNameAsPrefix(true); - properties.setNamespace("spring-k8s"); ConfigMapConfigProperties.Source one = new ConfigMapConfigProperties.Source("config-map-one", null, Collections.emptyMap(), null, null, null); - properties.setSources(Collections.singletonList(one)); + + ConfigMapConfigProperties properties = new ConfigMapConfigProperties(true, List.of(), List.of(one), Map.of(), + true, "config-map-a", "spring-k8s", true, false, false, RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(sources.size(), 1, "a single NormalizedSource is expected"); @@ -144,9 +137,6 @@ class ConfigMapConfigPropertiesTests { */ @Test void testUseNameAsPrefixSetNonEmptySources() { - ConfigMapConfigProperties properties = new ConfigMapConfigProperties(); - properties.setUseNameAsPrefix(true); - properties.setNamespace("spring-k8s"); ConfigMapConfigProperties.Source one = new ConfigMapConfigProperties.Source("config-map-one", null, Collections.emptyMap(), null, false, null); @@ -157,7 +147,8 @@ class ConfigMapConfigPropertiesTests { ConfigMapConfigProperties.Source three = new ConfigMapConfigProperties.Source("config-map-three", null, Collections.emptyMap(), null, true, null); - properties.setSources(Arrays.asList(one, two, three)); + ConfigMapConfigProperties properties = new ConfigMapConfigProperties(true, List.of(), List.of(one, two, three), + Map.of(), true, "config-map-a", "spring-k8s", true, false, false, RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(sources.size(), 3, "3 NormalizedSources are expected"); @@ -192,9 +183,6 @@ class ConfigMapConfigPropertiesTests { */ @Test void testMultipleCases() { - ConfigMapConfigProperties properties = new ConfigMapConfigProperties(); - properties.setUseNameAsPrefix(false); - properties.setNamespace("spring-k8s"); ConfigMapConfigProperties.Source one = new ConfigMapConfigProperties.Source("config-map-one", null, Collections.emptyMap(), "one", false, null); @@ -208,7 +196,9 @@ class ConfigMapConfigPropertiesTests { ConfigMapConfigProperties.Source four = new ConfigMapConfigProperties.Source(null, "config-map-four", Collections.emptyMap(), null, false, null); - properties.setSources(Arrays.asList(one, two, three, four)); + ConfigMapConfigProperties properties = new ConfigMapConfigProperties(true, List.of(), + List.of(one, two, three, four), Map.of(), true, "config-map-a", "spring-k8s", true, false, false, + RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(sources.size(), 4, "4 NormalizedSources are expected"); @@ -238,10 +228,9 @@ class ConfigMapConfigPropertiesTests { */ @Test void testUseIncludeProfileSpecificSourcesNoChanges() { - ConfigMapConfigProperties properties = new ConfigMapConfigProperties(); - properties.setSources(Collections.emptyList()); - properties.setName("config-map-a"); - properties.setNamespace("spring-k8s"); + + ConfigMapConfigProperties properties = new ConfigMapConfigProperties(true, List.of(), List.of(), Map.of(), true, + "config-map-a", "spring-k8s", false, true, false, RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(sources.size(), 1, "empty sources must generate a List with a single NormalizedSource"); @@ -268,11 +257,9 @@ class ConfigMapConfigPropertiesTests { */ @Test void testUseIncludeProfileSpecificSourcesDefaultChanged() { - ConfigMapConfigProperties properties = new ConfigMapConfigProperties(); - properties.setSources(Collections.emptyList()); - properties.setName("config-map-a"); - properties.setNamespace("spring-k8s"); - properties.setIncludeProfileSpecificSources(false); + + ConfigMapConfigProperties properties = new ConfigMapConfigProperties(true, List.of(), List.of(), Map.of(), true, + "config-map-a", "spring-k8s", false, false, false, RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(sources.size(), 1, "empty sources must generate a List with a single NormalizedSource"); @@ -305,11 +292,6 @@ class ConfigMapConfigPropertiesTests { */ @Test void testUseIncludeProfileSpecificSourcesDefaultChangedSourceOverride() { - ConfigMapConfigProperties properties = new ConfigMapConfigProperties(); - properties.setSources(Collections.emptyList()); - properties.setName("config-map-a"); - properties.setNamespace("spring-k8s"); - properties.setIncludeProfileSpecificSources(false); ConfigMapConfigProperties.Source one = new ConfigMapConfigProperties.Source("config-map-one", null, Collections.emptyMap(), "one", null, true); @@ -320,7 +302,8 @@ class ConfigMapConfigPropertiesTests { ConfigMapConfigProperties.Source three = new ConfigMapConfigProperties.Source("config-map-three", null, Collections.emptyMap(), null, null, false); - properties.setSources(Arrays.asList(one, two, three)); + ConfigMapConfigProperties properties = new ConfigMapConfigProperties(true, List.of(), List.of(one, two, three), + Map.of(), true, "config-map-a", "spring-k8s", false, false, false, RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(sources.size(), 3); @@ -363,10 +346,6 @@ class ConfigMapConfigPropertiesTests { */ @Test void testLabelsMultipleCases() { - ConfigMapConfigProperties properties = new ConfigMapConfigProperties(); - properties.setUseNameAsPrefix(false); - properties.setNamespace("spring-k8s"); - properties.setIncludeProfileSpecificSources(false); ConfigMapConfigProperties.Source one = new ConfigMapConfigProperties.Source(null, null, Map.of("first-label", "configmap-one"), "one", false, null); @@ -380,7 +359,9 @@ class ConfigMapConfigPropertiesTests { ConfigMapConfigProperties.Source four = new ConfigMapConfigProperties.Source(null, null, Map.of("fourth-label", "configmap-four"), null, null, null); - properties.setSources(Arrays.asList(one, two, three, four)); + ConfigMapConfigProperties properties = new ConfigMapConfigProperties(true, List.of(), + List.of(one, two, three, four), Map.of(), true, "config-map-a", "spring-k8s", false, false, false, + RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); // we get 8 property sources, since "named" ones with "application" are diff --git a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/SecretsConfigPropertiesBindingTests.java b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/SecretsConfigPropertiesBindingTests.java new file mode 100644 index 00000000..45918b70 --- /dev/null +++ b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/SecretsConfigPropertiesBindingTests.java @@ -0,0 +1,126 @@ +/* + * Copyright 2013-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.commons.config; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Configuration; + +/** + * @author wind57 + * + * tests that prove that binding works. We need these because we moved to a record for + * configuration properties. + */ +class SecretsConfigPropertiesBindingTests { + + @Test + void testWithDefaults() { + new ApplicationContextRunner().withUserConfiguration(Config.class).run(context -> { + SecretsConfigProperties props = context.getBean(SecretsConfigProperties.class); + Assertions.assertNotNull(props); + Assertions.assertFalse(props.enableApi()); + Assertions.assertTrue(props.paths().isEmpty()); + Assertions.assertTrue(props.sources().isEmpty()); + Assertions.assertTrue(props.labels().isEmpty()); + Assertions.assertTrue(props.enabled()); + Assertions.assertNull(props.name()); + Assertions.assertNull(props.namespace()); + Assertions.assertFalse(props.useNameAsPrefix()); + Assertions.assertTrue(props.includeProfileSpecificSources()); + Assertions.assertFalse(props.failFast()); + + Assertions.assertNotNull(props.retry()); + Assertions.assertEquals(props.retry().initialInterval(), 1000L); + Assertions.assertEquals(props.retry().multiplier(), 1.1D); + Assertions.assertEquals(props.retry().maxInterval(), 2000L); + Assertions.assertEquals(props.retry().maxAttempts(), 6); + Assertions.assertTrue(props.retry().enabled()); + }); + } + + @Test + void testWithNonDefaults() { + new ApplicationContextRunner().withUserConfiguration(Config.class) + .withPropertyValues("spring.cloud.kubernetes.secrets.enableApi=false", + "spring.cloud.kubernetes.secrets.paths[0]=a", "spring.cloud.kubernetes.secrets.paths[1]=b", + "spring.cloud.kubernetes.secrets.sources[0].name=source-a", + "spring.cloud.kubernetes.secrets.sources[0].namespace=source-namespace-a", + "spring.cloud.kubernetes.secrets.sources[0].labels.key=source-value", + "spring.cloud.kubernetes.secrets.sources[0].explicit-prefix=source-prefix", + "spring.cloud.kubernetes.secrets.sources[0].use-name-as-prefix=true", + "spring.cloud.kubernetes.secrets.sources[0].include-profile-specific-sources=true", + "spring.cloud.kubernetes.secrets.labels.label-a=label-a", + "spring.cloud.kubernetes.secrets.enabled=false", "spring.cloud.kubernetes.secrets.name=name", + "spring.cloud.kubernetes.secrets.namespace=namespace", + "spring.cloud.kubernetes.secrets.use-name-as-prefix=true", + "spring.cloud.kubernetes.secrets.include-profile-specific-sources=true", + "spring.cloud.kubernetes.secrets.fail-fast=true", + "spring.cloud.kubernetes.secrets.retry.initial-interval=1", + "spring.cloud.kubernetes.secrets.retry.multiplier=1.2", + "spring.cloud.kubernetes.secrets.retry.max-interval=3", + "spring.cloud.kubernetes.secrets.retry.max-attempts=4", + "spring.cloud.kubernetes.secrets.retry.enabled=false") + .run(context -> { + SecretsConfigProperties props = context.getBean(SecretsConfigProperties.class); + Assertions.assertNotNull(props); + Assertions.assertFalse(props.enableApi()); + + Assertions.assertEquals(props.paths().size(), 2); + Assertions.assertEquals(props.paths().get(0), "a"); + Assertions.assertEquals(props.paths().get(1), "b"); + + Assertions.assertEquals(props.sources().size(), 1); + SecretsConfigProperties.Source source = props.sources().get(0); + Assertions.assertEquals(source.name(), "source-a"); + Assertions.assertEquals(source.namespace(), "source-namespace-a"); + Assertions.assertEquals(source.labels().size(), 1); + Assertions.assertEquals(source.labels().get("key"), "source-value"); + Assertions.assertEquals(source.explicitPrefix(), "source-prefix"); + Assertions.assertTrue(source.useNameAsPrefix()); + Assertions.assertTrue(source.includeProfileSpecificSources()); + + Assertions.assertEquals(props.labels().size(), 1); + Assertions.assertEquals(props.labels().get("label-a"), "label-a"); + + Assertions.assertFalse(props.enabled()); + Assertions.assertEquals(props.name(), "name"); + Assertions.assertEquals(props.namespace(), "namespace"); + Assertions.assertTrue(props.useNameAsPrefix()); + Assertions.assertTrue(props.includeProfileSpecificSources()); + Assertions.assertTrue(props.failFast()); + + RetryProperties retryProperties = props.retry(); + Assertions.assertNotNull(retryProperties); + Assertions.assertEquals(retryProperties.initialInterval(), 1); + Assertions.assertEquals(retryProperties.multiplier(), 1.2); + Assertions.assertEquals(retryProperties.maxInterval(), 3); + Assertions.assertFalse(retryProperties.enabled()); + + }); + } + + @Configuration + @EnableConfigurationProperties(SecretsConfigProperties.class) + static class Config { + + } + +} diff --git a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/SecretsConfigPropertiesTests.java b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/SecretsConfigPropertiesTests.java index 9c97dd34..cb3cd643 100644 --- a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/SecretsConfigPropertiesTests.java +++ b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/SecretsConfigPropertiesTests.java @@ -16,7 +16,6 @@ package org.springframework.cloud.kubernetes.commons.config; -import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashSet; @@ -34,18 +33,19 @@ import org.springframework.mock.env.MockEnvironment; */ class SecretsConfigPropertiesTests { - private final SecretsConfigProperties properties = new SecretsConfigProperties(); - /** * the case when labels are empty */ @Test void emptySourcesSecretName() { - properties.setNamespace("namespace"); + + SecretsConfigProperties properties = new SecretsConfigProperties(false, Map.of(), List.of(), List.of(), true, + null, "namespace", false, true, false, RetryProperties.DEFAULT); + List source = properties.determineSources(new MockEnvironment()); - properties.setSources(Collections.emptyList()); Assertions.assertEquals(source.size(), 1); Assertions.assertTrue(source.get(0) instanceof NamedSecretNormalizedSource); + Assertions.assertTrue(source.get(0).name().isPresent()); Assertions.assertEquals(source.get(0).name().get(), "application"); } @@ -70,16 +70,18 @@ class SecretsConfigPropertiesTests { */ @Test void multipleSources() { - SecretsConfigProperties.Source one = new SecretsConfigProperties.Source("one", "spring-k8s", - Collections.singletonMap("one", "1"), null, null, null); - SecretsConfigProperties.Source two = new SecretsConfigProperties.Source(null, "spring-k8s", - Collections.singletonMap("two", "2"), null, null, null); + SecretsConfigProperties.Source one = new SecretsConfigProperties.Source("one", "spring-k8s", Map.of("one", "1"), + null, false, false); + + SecretsConfigProperties.Source two = new SecretsConfigProperties.Source(null, "spring-k8s", Map.of("two", "2"), + null, false, false); SecretsConfigProperties.Source three = new SecretsConfigProperties.Source(null, "spring-k8s", - Collections.singletonMap("three", "3"), null, null, null); + Map.of("three", "3"), null, false, false); - properties.setSources(Arrays.asList(one, two, three)); + SecretsConfigProperties properties = new SecretsConfigProperties(false, Map.of(), List.of(), + List.of(one, two, three), true, null, "namespace", false, true, false, RetryProperties.DEFAULT); List result = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(result.size(), 6); @@ -122,10 +124,9 @@ class SecretsConfigPropertiesTests { */ @Test void testUseNameAsPrefixUnsetEmptySources() { - SecretsConfigProperties properties = new SecretsConfigProperties(); - properties.setSources(Collections.emptyList()); - properties.setName("secret-a"); - properties.setNamespace("spring-k8s"); + + SecretsConfigProperties properties = new SecretsConfigProperties(false, Map.of(), List.of(), List.of(), true, + "secret-a", "namespace", false, true, false, RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(sources.size(), 1, "empty sources must generate a List with a single NormalizedSource"); @@ -149,11 +150,9 @@ class SecretsConfigPropertiesTests { */ @Test void testUseNameAsPrefixSetEmptySources() { - SecretsConfigProperties properties = new SecretsConfigProperties(); - properties.setSources(Collections.emptyList()); - properties.setUseNameAsPrefix(true); - properties.setName("secret-a"); - properties.setNamespace("spring-k8s"); + + SecretsConfigProperties properties = new SecretsConfigProperties(false, Map.of(), List.of(), List.of(), true, + "secret-a", "namespace", true, true, false, RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(sources.size(), 1, "empty sources must generate a List with a single NormalizedSource"); @@ -180,13 +179,12 @@ class SecretsConfigPropertiesTests { */ @Test void testUseNameAsPrefixUnsetNonEmptySources() { - SecretsConfigProperties properties = new SecretsConfigProperties(); - properties.setUseNameAsPrefix(true); - properties.setNamespace("spring-k8s"); - SecretsConfigProperties.Source one = new SecretsConfigProperties.Source("secret-one", null, - Collections.emptyMap(), null, null, null); - properties.setSources(Collections.singletonList(one)); + SecretsConfigProperties.Source one = new SecretsConfigProperties.Source("secret-one", "spring-k8s", Map.of(), + null, true, false); + + SecretsConfigProperties properties = new SecretsConfigProperties(false, Map.of(), List.of(), List.of(one), true, + "secret-one", null, false, true, false, RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(sources.size(), 1, "a single NormalizedSource is expected"); @@ -218,20 +216,18 @@ class SecretsConfigPropertiesTests { */ @Test void testUseNameAsPrefixSetNonEmptySources() { - SecretsConfigProperties properties = new SecretsConfigProperties(); - properties.setUseNameAsPrefix(true); - properties.setNamespace("spring-k8s"); - SecretsConfigProperties.Source one = new SecretsConfigProperties.Source("secret-one", null, - Collections.emptyMap(), null, false, null); + SecretsConfigProperties.Source one = new SecretsConfigProperties.Source("secret-one", "spring-k8s", Map.of(), + null, false, false); - SecretsConfigProperties.Source two = new SecretsConfigProperties.Source("secret-two", null, - Collections.emptyMap(), null, true, null); + SecretsConfigProperties.Source two = new SecretsConfigProperties.Source("secret-two", "spring-k8s", Map.of(), + null, true, false); - SecretsConfigProperties.Source three = new SecretsConfigProperties.Source("secret-three", null, - Collections.emptyMap(), null, null, null); + SecretsConfigProperties.Source three = new SecretsConfigProperties.Source("secret-three", "spring-k8s", + Map.of(), null, true, false); - properties.setSources(Arrays.asList(one, two, three)); + SecretsConfigProperties properties = new SecretsConfigProperties(false, Map.of(), List.of(), + List.of(one, two, three), true, "secret-one", null, false, true, false, RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(sources.size(), 3, "3 NormalizedSources are expected"); @@ -266,23 +262,22 @@ class SecretsConfigPropertiesTests { */ @Test void testMultipleCases() { - SecretsConfigProperties properties = new SecretsConfigProperties(); - properties.setUseNameAsPrefix(false); - properties.setNamespace("spring-k8s"); - SecretsConfigProperties.Source one = new SecretsConfigProperties.Source("secret-one", null, - Collections.emptyMap(), "one", false, null); + SecretsConfigProperties.Source one = new SecretsConfigProperties.Source("secret-one", "spring-k8s", Map.of(), + "one", false, false); - SecretsConfigProperties.Source two = new SecretsConfigProperties.Source("secret-two", null, - Collections.emptyMap(), "two", true, null); + SecretsConfigProperties.Source two = new SecretsConfigProperties.Source("secret-two", "spring-k8s", Map.of(), + "two", true, false); - SecretsConfigProperties.Source three = new SecretsConfigProperties.Source("secret-three", null, - Collections.emptyMap(), "three", null, null); + SecretsConfigProperties.Source three = new SecretsConfigProperties.Source("secret-three", "spring-k8s", + Map.of(), "three", false, false); - SecretsConfigProperties.Source four = new SecretsConfigProperties.Source("secret-four", null, - Collections.emptyMap(), null, null, null); + SecretsConfigProperties.Source four = new SecretsConfigProperties.Source("secret-four", "spring-k8s", Map.of(), + null, false, false); - properties.setSources(Arrays.asList(one, two, three, four)); + SecretsConfigProperties properties = new SecretsConfigProperties(false, Map.of(), List.of(), + List.of(one, two, three, four), true, "secret-one", "spring-k8s", false, false, false, + RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); Assertions.assertEquals(sources.size(), 4, "4 NormalizedSources are expected"); @@ -328,24 +323,21 @@ class SecretsConfigPropertiesTests { @Test void testLabelsMultipleCases() { - SecretsConfigProperties properties = new SecretsConfigProperties(); - properties.setUseNameAsPrefix(false); - properties.setNamespace("spring-k8s"); - properties.setIncludeProfileSpecificSources(false); + SecretsConfigProperties.Source one = new SecretsConfigProperties.Source(null, "spring-k8s", + Map.of("first-label", "secret-one"), "one", false, false); - SecretsConfigProperties.Source one = new SecretsConfigProperties.Source(null, null, - Map.of("first-label", "secret-one"), "one", false, null); - - SecretsConfigProperties.Source two = new SecretsConfigProperties.Source(null, null, + SecretsConfigProperties.Source two = new SecretsConfigProperties.Source(null, "spring-k8s", Map.of("second-label", "secret-two"), "two", true, true); - SecretsConfigProperties.Source three = new SecretsConfigProperties.Source(null, null, - Map.of("third-label", "secret-three"), "three", null, null); + SecretsConfigProperties.Source three = new SecretsConfigProperties.Source(null, "spring-k8s", + Map.of("third-label", "secret-three"), "three", false, false); - SecretsConfigProperties.Source four = new SecretsConfigProperties.Source(null, null, - Map.of("fourth-label", "secret-four"), null, null, null); + SecretsConfigProperties.Source four = new SecretsConfigProperties.Source(null, "spring-k8s", + Map.of("fourth-label", "secret-four"), null, false, false); - properties.setSources(Arrays.asList(one, two, three, four)); + SecretsConfigProperties properties = new SecretsConfigProperties(false, Map.of(), List.of(), + List.of(one, two, three, four), false, null, "spring-k8s", false, false, false, + RetryProperties.DEFAULT); List sources = properties.determineSources(new MockEnvironment()); // we get 8 property sources, since "named" ones with "application" are diff --git a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/ConfigAndSecretsFailFastEnabledWithDefaultRetryConfiguration.java b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/ConfigAndSecretsFailFastEnabledWithDefaultRetryConfiguration.java index 416b9807..40023585 100644 --- a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/ConfigAndSecretsFailFastEnabledWithDefaultRetryConfiguration.java +++ b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/ConfigAndSecretsFailFastEnabledWithDefaultRetryConfiguration.java @@ -22,9 +22,9 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.kubernetes.commons.config.AbstractConfigProperties; import org.springframework.cloud.kubernetes.commons.config.App; import org.springframework.cloud.kubernetes.commons.config.ConfigMapConfigProperties; +import org.springframework.cloud.kubernetes.commons.config.RetryProperties; import org.springframework.cloud.kubernetes.commons.config.SecretsConfigProperties; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.retry.interceptor.RetryOperationsInterceptor; @@ -58,16 +58,15 @@ public class ConfigAndSecretsFailFastEnabledWithDefaultRetryConfiguration { @Test void retryConfigurationShouldBeDefault() { - AbstractConfigProperties.RetryProperties defaultRetryProperties = AbstractConfigProperties.RetryProperties.DEFAULT; - - AbstractConfigProperties.RetryProperties configMapRetryProperties = configMapConfigProperties.getRetry(); + RetryProperties defaultRetryProperties = RetryProperties.DEFAULT; + RetryProperties configMapRetryProperties = configMapConfigProperties.retry(); assertThat(configMapRetryProperties.maxAttempts()).isEqualTo(defaultRetryProperties.maxAttempts()); assertThat(configMapRetryProperties.initialInterval()).isEqualTo(defaultRetryProperties.initialInterval()); assertThat(configMapRetryProperties.maxInterval()).isEqualTo(defaultRetryProperties.maxInterval()); assertThat(configMapRetryProperties.multiplier()).isEqualTo(defaultRetryProperties.multiplier()); - AbstractConfigProperties.RetryProperties secretsRetryProperties = secretsConfigProperties.getRetry(); + RetryProperties secretsRetryProperties = secretsConfigProperties.retry(); assertThat(secretsRetryProperties.maxAttempts()).isEqualTo(defaultRetryProperties.maxAttempts()); assertThat(secretsRetryProperties.initialInterval()).isEqualTo(defaultRetryProperties.initialInterval()); diff --git a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/ConfigFailFastEnabled.java b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/ConfigFailFastEnabled.java index 0cf480dc..8b564c56 100644 --- a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/ConfigFailFastEnabled.java +++ b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/ConfigFailFastEnabled.java @@ -22,9 +22,9 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.kubernetes.commons.config.AbstractConfigProperties; import org.springframework.cloud.kubernetes.commons.config.App; import org.springframework.cloud.kubernetes.commons.config.ConfigMapConfigProperties; +import org.springframework.cloud.kubernetes.commons.config.RetryProperties; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.retry.interceptor.RetryOperationsInterceptor; @@ -53,8 +53,8 @@ class ConfigFailFastEnabled { @Test void retryConfigurationShouldBeDefault() { - AbstractConfigProperties.RetryProperties retryProperties = configMapConfigProperties.getRetry(); - AbstractConfigProperties.RetryProperties defaultRetryProperties = AbstractConfigProperties.RetryProperties.DEFAULT; + RetryProperties retryProperties = configMapConfigProperties.retry(); + RetryProperties defaultRetryProperties = RetryProperties.DEFAULT; assertThat(retryProperties.maxAttempts()).isEqualTo(defaultRetryProperties.maxAttempts()); assertThat(retryProperties.initialInterval()).isEqualTo(defaultRetryProperties.initialInterval()); diff --git a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/ConfigFailFastEnabledWithCustomRetryConfiguration.java b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/ConfigFailFastEnabledWithCustomRetryConfiguration.java index ed5b7289..52e3c355 100644 --- a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/ConfigFailFastEnabledWithCustomRetryConfiguration.java +++ b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/ConfigFailFastEnabledWithCustomRetryConfiguration.java @@ -20,9 +20,9 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.kubernetes.commons.config.AbstractConfigProperties; import org.springframework.cloud.kubernetes.commons.config.App; import org.springframework.cloud.kubernetes.commons.config.ConfigMapConfigProperties; +import org.springframework.cloud.kubernetes.commons.config.RetryProperties; import static org.assertj.core.api.Assertions.assertThat; @@ -42,7 +42,7 @@ class ConfigFailFastEnabledWithCustomRetryConfiguration { @Test void retryConfigurationShouldBeCustomized() { - AbstractConfigProperties.RetryProperties retryProperties = configMapConfigProperties.getRetry(); + RetryProperties retryProperties = configMapConfigProperties.retry(); assertThat(retryProperties.maxAttempts()).isEqualTo(3); assertThat(retryProperties.initialInterval()).isEqualTo(1500L); diff --git a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/SecretsFailFastEnabled.java b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/SecretsFailFastEnabled.java index 9267604d..a640da72 100644 --- a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/SecretsFailFastEnabled.java +++ b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/SecretsFailFastEnabled.java @@ -22,8 +22,8 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.kubernetes.commons.config.AbstractConfigProperties; import org.springframework.cloud.kubernetes.commons.config.App; +import org.springframework.cloud.kubernetes.commons.config.RetryProperties; import org.springframework.cloud.kubernetes.commons.config.SecretsConfigProperties; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.retry.interceptor.RetryOperationsInterceptor; @@ -53,9 +53,8 @@ class SecretsFailFastEnabled { @Test void retryConfigurationShouldBeDefault() { - AbstractConfigProperties.RetryProperties retryProperties = secretsConfigProperties.getRetry(); - AbstractConfigProperties.RetryProperties defaultRetryProperties = new AbstractConfigProperties.RetryProperties( - 1000, 1.1, 2000, 6, true); + RetryProperties retryProperties = secretsConfigProperties.retry(); + RetryProperties defaultRetryProperties = RetryProperties.DEFAULT; assertThat(retryProperties.maxAttempts()).isEqualTo(defaultRetryProperties.maxAttempts()); assertThat(retryProperties.initialInterval()).isEqualTo(defaultRetryProperties.initialInterval()); diff --git a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/SecretsFailFastEnabledWithCustomRetryConfiguration.java b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/SecretsFailFastEnabledWithCustomRetryConfiguration.java index 9b82826c..b4d54048 100644 --- a/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/SecretsFailFastEnabledWithCustomRetryConfiguration.java +++ b/spring-cloud-kubernetes-commons/src/test/java/org/springframework/cloud/kubernetes/commons/config/bootstrap/SecretsFailFastEnabledWithCustomRetryConfiguration.java @@ -20,8 +20,8 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.kubernetes.commons.config.AbstractConfigProperties; import org.springframework.cloud.kubernetes.commons.config.App; +import org.springframework.cloud.kubernetes.commons.config.RetryProperties; import org.springframework.cloud.kubernetes.commons.config.SecretsConfigProperties; import static org.assertj.core.api.Assertions.assertThat; @@ -42,7 +42,7 @@ class SecretsFailFastEnabledWithCustomRetryConfiguration { @Test void retryConfigurationShouldBeCustomized() { - AbstractConfigProperties.RetryProperties retryProperties = secretsConfigProperties.getRetry(); + RetryProperties retryProperties = secretsConfigProperties.retry(); assertThat(retryProperties.maxAttempts()).isEqualTo(3); assertThat(retryProperties.initialInterval()).isEqualTo(1500L); 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 85768a9d..2c045e1f 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 != null && configMapProperties.isEnabled()) { + if (configMapProperties != null && configMapProperties.enabled()) { 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 != null && secretsProperties.isEnabled()) { + if (secretsProperties != null && secretsProperties.enabled()) { 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 != null && configMapProperties.isEnabled()) { + if (configMapProperties != null && configMapProperties.enabled()) { 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 != null && secretsProperties.isEnabled()) { + if (secretsProperties != null && secretsProperties.enabled()) { 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/Fabric8ConfigMapPropertySourceLocatorTests.java b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigMapPropertySourceLocatorTests.java index 5e958a3c..012bd83a 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigMapPropertySourceLocatorTests.java +++ b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigMapPropertySourceLocatorTests.java @@ -16,6 +16,9 @@ package org.springframework.cloud.kubernetes.fabric8.config; +import java.util.List; +import java.util.Map; + import io.fabric8.kubernetes.client.DefaultKubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; @@ -29,6 +32,7 @@ import org.springframework.cloud.kubernetes.commons.config.ConfigUtils; import org.springframework.cloud.kubernetes.commons.config.NamedConfigMapNormalizedSource; import org.springframework.cloud.kubernetes.commons.config.NamespaceResolutionFailedException; import org.springframework.cloud.kubernetes.commons.config.NormalizedSource; +import org.springframework.cloud.kubernetes.commons.config.RetryProperties; import org.springframework.mock.env.MockEnvironment; import static org.assertj.core.api.Assertions.assertThatNoException; @@ -52,14 +56,12 @@ class Fabric8ConfigMapPropertySourceLocatorTests { void locateShouldThrowExceptionOnFailureWhenFailFastIsEnabled() { String name = "my-config"; String namespace = "default"; - String path = String.format("/api/v1/namespaces/%s/configmaps", namespace); + String path = "/api/v1/namespaces/default/configmaps"; mockServer.expect().withPath(path).andReturn(500, "Internal Server Error").once(); - ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(); - configMapConfigProperties.setName(name); - configMapConfigProperties.setNamespace(namespace); - configMapConfigProperties.setFailFast(true); + ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(true, List.of(), List.of(), + Map.of(), true, name, namespace, false, true, true, RetryProperties.DEFAULT); Fabric8ConfigMapPropertySourceLocator locator = new Fabric8ConfigMapPropertySourceLocator(mockClient, configMapConfigProperties, new KubernetesNamespaceProvider(new MockEnvironment())); @@ -72,14 +74,12 @@ class Fabric8ConfigMapPropertySourceLocatorTests { void locateShouldNotThrowExceptionOnFailureWhenFailFastIsDisabled() { String name = "my-config"; String namespace = "default"; - String path = String.format("/api/v1/namespaces/%s/configmaps/%s", namespace, name); + String path = "/api/v1/namespaces/default/configmaps/my-config"; mockServer.expect().withPath(path).andReturn(500, "Internal Server Error").once(); - ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(); - configMapConfigProperties.setName(name); - configMapConfigProperties.setNamespace(namespace); - configMapConfigProperties.setFailFast(false); + ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(true, List.of(), List.of(), + Map.of(), true, name, namespace, false, true, false, RetryProperties.DEFAULT); Fabric8ConfigMapPropertySourceLocator locator = new Fabric8ConfigMapPropertySourceLocator(mockClient, configMapConfigProperties, new KubernetesNamespaceProvider(new MockEnvironment())); @@ -90,10 +90,8 @@ class Fabric8ConfigMapPropertySourceLocatorTests { @Test void constructorWithoutClientNamespaceMustFail() { - ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(); - configMapConfigProperties.setName("name"); - configMapConfigProperties.setNamespace(null); - configMapConfigProperties.setFailFast(false); + ConfigMapConfigProperties configMapConfigProperties = new ConfigMapConfigProperties(true, List.of(), List.of(), + Map.of(), true, "name", null, false, true, false, RetryProperties.DEFAULT); Mockito.when(client.getNamespace()).thenReturn(null); Fabric8ConfigMapPropertySourceLocator source = new Fabric8ConfigMapPropertySourceLocator(client, diff --git a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8SecretsPropertySourceLocatorTests.java b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8SecretsPropertySourceLocatorTests.java index fc975aa6..24c771e3 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8SecretsPropertySourceLocatorTests.java +++ b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8SecretsPropertySourceLocatorTests.java @@ -16,12 +16,16 @@ package org.springframework.cloud.kubernetes.fabric8.config; +import java.util.List; +import java.util.Map; + import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; import org.junit.jupiter.api.Test; import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider; +import org.springframework.cloud.kubernetes.commons.config.RetryProperties; import org.springframework.cloud.kubernetes.commons.config.SecretsConfigProperties; import org.springframework.mock.env.MockEnvironment; @@ -40,17 +44,14 @@ class Fabric8SecretsPropertySourceLocatorTests { @Test void locateShouldThrowExceptionOnFailureWhenFailFastIsEnabled() { - final String name = "my-config"; - final String namespace = "default"; - final String path = String.format("/api/v1/namespaces/%s/secrets", namespace); + String name = "my-secret"; + String namespace = "default"; + String path = "/api/v1/namespaces/default/secrets"; mockServer.expect().withPath(path).andReturn(500, "Internal Server Error").once(); - SecretsConfigProperties configMapConfigProperties = new SecretsConfigProperties(); - configMapConfigProperties.setName(name); - configMapConfigProperties.setNamespace(namespace); - configMapConfigProperties.setEnableApi(true); - configMapConfigProperties.setFailFast(true); + SecretsConfigProperties configMapConfigProperties = new SecretsConfigProperties(true, Map.of(), List.of(), + List.of(), true, name, namespace, false, true, true, RetryProperties.DEFAULT); Fabric8SecretsPropertySourceLocator locator = new Fabric8SecretsPropertySourceLocator(mockClient, configMapConfigProperties, new KubernetesNamespaceProvider(new MockEnvironment())); @@ -61,17 +62,14 @@ class Fabric8SecretsPropertySourceLocatorTests { @Test void locateShouldNotThrowExceptionOnFailureWhenFailFastIsDisabled() { - final String name = "my-config"; - final String namespace = "default"; - final String path = String.format("/api/v1/namespaces/%s/secrets/%s", namespace, name); + String name = "my-secret"; + String namespace = "default"; + String path = "/api/v1/namespaces/default/secrets/my-secret"; mockServer.expect().withPath(path).andReturn(500, "Internal Server Error").once(); - SecretsConfigProperties configMapConfigProperties = new SecretsConfigProperties(); - configMapConfigProperties.setName(name); - configMapConfigProperties.setNamespace(namespace); - configMapConfigProperties.setEnableApi(true); - configMapConfigProperties.setFailFast(false); + SecretsConfigProperties configMapConfigProperties = new SecretsConfigProperties(true, Map.of(), List.of(), + List.of(), true, name, namespace, false, true, false, RetryProperties.DEFAULT); Fabric8SecretsPropertySourceLocator locator = new Fabric8SecretsPropertySourceLocator(mockClient, configMapConfigProperties, new KubernetesNamespaceProvider(new MockEnvironment())); diff --git a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/BootstrapKubernetesEnabled.java b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/kubernetes_enabled/BootstrapKubernetesEnabled.java similarity index 97% rename from spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/BootstrapKubernetesEnabled.java rename to spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/kubernetes_enabled/BootstrapKubernetesEnabled.java index 42fe2aa9..f84d111e 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/BootstrapKubernetesEnabled.java +++ b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/kubernetes_enabled/BootstrapKubernetesEnabled.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.config.bootstrap; +package org.springframework.cloud.kubernetes.fabric8.config.bootstrap.kubernetes_enabled; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.kubernetes.fabric8.config.Application; diff --git a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/ConfigDataKubernetesEnabled.java b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/kubernetes_enabled/ConfigDataKubernetesEnabled.java similarity index 97% rename from spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/ConfigDataKubernetesEnabled.java rename to spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/kubernetes_enabled/ConfigDataKubernetesEnabled.java index b385dc0b..fbd74b1c 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/ConfigDataKubernetesEnabled.java +++ b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/kubernetes_enabled/ConfigDataKubernetesEnabled.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.config.bootstrap; +package org.springframework.cloud.kubernetes.fabric8.config.bootstrap.kubernetes_enabled; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.kubernetes.fabric8.config.Application; diff --git a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/KubernetesEnabled.java b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/kubernetes_enabled/KubernetesEnabled.java similarity index 98% rename from spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/KubernetesEnabled.java rename to spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/kubernetes_enabled/KubernetesEnabled.java index 8fd7f739..10853c4d 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/KubernetesEnabled.java +++ b/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/bootstrap/kubernetes_enabled/KubernetesEnabled.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.config.bootstrap; +package org.springframework.cloud.kubernetes.fabric8.config.bootstrap.kubernetes_enabled; import org.junit.jupiter.api.Test; diff --git a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/fail_fast_enabled_retry_disabled/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 index 5b3f27c5..a3bc41c0 100644 --- a/spring-cloud-kubernetes-fabric8-config/src/test/java/org/springframework/cloud/kubernetes/fabric8/config/locator_retry/fail_fast_enabled_retry_disabled/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 @@ -16,6 +16,9 @@ package org.springframework.cloud.kubernetes.fabric8.config.locator_retry.fail_fast_enabled_retry_disabled; +import java.util.List; +import java.util.Map; + import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; @@ -23,10 +26,14 @@ 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.commons.config.RetryProperties; import org.springframework.cloud.kubernetes.fabric8.config.Application; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.core.env.Environment; /** * we call Fabric8ConfigMapPropertySourceLocator::locate directly, thus no need for @@ -44,6 +51,7 @@ import org.springframework.cloud.kubernetes.fabric8.config.Application; "spring.cloud.kubernetes.secrets.enabled=false", "spring.config.import=kubernetes:" }, classes = Application.class) @EnableKubernetesMockClient +@Import(ConfigDataConfigFailFastEnabledButRetryDisabled.LocalConfig.class) class ConfigDataConfigFailFastEnabledButRetryDisabled extends ConfigFailFastEnabledButRetryDisabled { private static KubernetesMockServer mockServer; @@ -53,12 +61,26 @@ class ConfigDataConfigFailFastEnabledButRetryDisabled extends ConfigFailFastEnab @MockBean private KubernetesNamespaceProvider kubernetesNamespaceProvider; - @SpyBean - private ConfigMapConfigProperties properties; - @BeforeAll static void setup() { setup(mockClient, mockServer); } + @Configuration + static class LocalConfig { + + /** + * we need this config because ConfigMapConfigProperties is now a record, so we + * can't use @SpyBean on it. We also read the property of fail-fast from the + * Environment, that in turn is set in the @SpringBootTest properties. + */ + @Bean + ConfigMapConfigProperties properties(Environment environment) { + return new ConfigMapConfigProperties(true, List.of(), List.of(), Map.of(), true, null, null, false, true, + Boolean.parseBoolean(environment.getProperty("spring.cloud.kubernetes.config.fail-fast")), + RetryProperties.DEFAULT); + } + + } + }