From aee5a47677f15100c3b41cfba8c7bcf77d7ab0b6 Mon Sep 17 00:00:00 2001 From: spencergibb Date: Fri, 3 Dec 2021 15:55:32 -0500 Subject: [PATCH 1/7] formatting --- ...KubernetesClientEventBasedConfigMapChangeDetector.java | 8 +++++--- .../KubernetesClientEventBasedSecretsChangeDetector.java | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/reload/KubernetesClientEventBasedConfigMapChangeDetector.java b/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/reload/KubernetesClientEventBasedConfigMapChangeDetector.java index e34d3bef..5db77916 100644 --- a/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/reload/KubernetesClientEventBasedConfigMapChangeDetector.java +++ b/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/reload/KubernetesClientEventBasedConfigMapChangeDetector.java @@ -76,10 +76,12 @@ public class KubernetesClientEventBasedConfigMapChangeDetector extends Configura super(environment, properties, strategy); this.propertySourceLocator = propertySourceLocator; this.coreV1Api = coreV1Api; - // We need to pass an APIClient to the SharedInformerFactory because if we use the default - // constructor it will use the configured default APIClient but that may not contain + // We need to pass an APIClient to the SharedInformerFactory because if we use the + // default + // constructor it will use the configured default APIClient but that may not + // contain // an APIClient configured within the cluster and does not contain the necessary - // certificate authorities for the cluster. This results in SSL errors. + // certificate authorities for the cluster. This results in SSL errors. // See https://github.com/spring-cloud/spring-cloud-kubernetes/issues/885 this.factory = new SharedInformerFactory(createApiClientForInformerClient()); this.kubernetesNamespaceProvider = kubernetesNamespaceProvider; diff --git a/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/reload/KubernetesClientEventBasedSecretsChangeDetector.java b/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/reload/KubernetesClientEventBasedSecretsChangeDetector.java index 7d17f865..d62b208e 100644 --- a/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/reload/KubernetesClientEventBasedSecretsChangeDetector.java +++ b/spring-cloud-kubernetes-client-config/src/main/java/org/springframework/cloud/kubernetes/client/config/reload/KubernetesClientEventBasedSecretsChangeDetector.java @@ -74,10 +74,12 @@ public class KubernetesClientEventBasedSecretsChangeDetector extends Configurati KubernetesNamespaceProvider kubernetesNamespaceProvider) { super(environment, properties, strategy); this.propertySourceLocator = propertySourceLocator; - // We need to pass an APIClient to the SharedInformerFactory because if we use the default - // constructor it will use the configured default APIClient but that may not contain + // We need to pass an APIClient to the SharedInformerFactory because if we use the + // default + // constructor it will use the configured default APIClient but that may not + // contain // an APIClient configured within the cluster and does not contain the necessary - // certificate authorities for the cluster. This results in SSL errors. + // certificate authorities for the cluster. This results in SSL errors. // See https://github.com/spring-cloud/spring-cloud-kubernetes/issues/885 this.factory = new SharedInformerFactory(createApiClientForInformerClient()); this.coreV1Api = coreV1Api; From 48e6a9b95f6d96a243d827f5bd16e13d33ade402 Mon Sep 17 00:00:00 2001 From: spencergibb Date: Fri, 3 Dec 2021 15:55:55 -0500 Subject: [PATCH 2/7] Disables failing tests See gh-927 --- .../config/KubernetesClientBootstrapConfigurationTests.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java index e4b56af7..d33cf5e4 100644 --- a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java +++ b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java @@ -16,6 +16,7 @@ package org.springframework.cloud.kubernetes.client.config; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -130,6 +131,7 @@ public class KubernetesClientBootstrapConfigurationTests { ConfigurableApplicationContext context; @Test + @Disabled("fails on jenkins https://github.com/spring-cloud/spring-cloud-kubernetes/issues/927") void secretsOnlyPresent() { assertThat(context.getBeanNamesForType(KubernetesClientConfigMapPropertySourceLocator.class)).hasSize(0); assertThat(context.getBeanNamesForType(KubernetesClientSecretsPropertySourceLocator.class)).hasSize(0); @@ -165,6 +167,7 @@ public class KubernetesClientBootstrapConfigurationTests { ConfigurableApplicationContext context; @Test + @Disabled("fails on jenkins https://github.com/spring-cloud/spring-cloud-kubernetes/issues/927") public void bothMissing() { assertThat(context.getBeanNamesForType(KubernetesClientConfigMapPropertySourceLocator.class)).hasSize(0); assertThat(context.getBeanNamesForType(KubernetesClientSecretsPropertySourceLocator.class)).hasSize(0); From 9f65c9598333e12289005787392050ac119ecca8 Mon Sep 17 00:00:00 2001 From: spencergibb Date: Fri, 3 Dec 2021 16:02:03 -0500 Subject: [PATCH 3/7] Disables failing tests See gh-927 --- .../config/KubernetesClientBootstrapConfigurationTests.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java index d33cf5e4..d20206e3 100644 --- a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java +++ b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java @@ -125,13 +125,13 @@ public class KubernetesClientBootstrapConfigurationTests { properties = { "spring.cloud.kubernetes.secrets.enabled=false", "spring.cloud.kubernetes.config.enabled=false" }) @Nested + @Disabled("fails on jenkins https://github.com/spring-cloud/spring-cloud-kubernetes/issues/927") class KubernetesEnabledSecretsAndConfigDisabled { @Autowired ConfigurableApplicationContext context; @Test - @Disabled("fails on jenkins https://github.com/spring-cloud/spring-cloud-kubernetes/issues/927") void secretsOnlyPresent() { assertThat(context.getBeanNamesForType(KubernetesClientConfigMapPropertySourceLocator.class)).hasSize(0); assertThat(context.getBeanNamesForType(KubernetesClientSecretsPropertySourceLocator.class)).hasSize(0); @@ -161,13 +161,13 @@ public class KubernetesClientBootstrapConfigurationTests { // effect, meaning when it is disabled, no property source bean is present @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class) @Nested + @Disabled("fails on jenkins https://github.com/spring-cloud/spring-cloud-kubernetes/issues/927") class KubernetesClientBootstrapConfigurationNotInsideK8s { @Autowired ConfigurableApplicationContext context; @Test - @Disabled("fails on jenkins https://github.com/spring-cloud/spring-cloud-kubernetes/issues/927") public void bothMissing() { assertThat(context.getBeanNamesForType(KubernetesClientConfigMapPropertySourceLocator.class)).hasSize(0); assertThat(context.getBeanNamesForType(KubernetesClientSecretsPropertySourceLocator.class)).hasSize(0); From 38414c6228e91f017927dda3a7cefb0a48dbb28a Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Sun, 5 Dec 2021 19:38:15 -0500 Subject: [PATCH 4/7] Disable informer autoconfiguration. Fixes #927 --- .../KubernetesClientBootstrapConfigurationTests.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java index d20206e3..11de4b6d 100644 --- a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java +++ b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java @@ -123,9 +123,8 @@ public class KubernetesClientBootstrapConfigurationTests { @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class, properties = { "spring.cloud.kubernetes.secrets.enabled=false", - "spring.cloud.kubernetes.config.enabled=false" }) - @Nested - @Disabled("fails on jenkins https://github.com/spring-cloud/spring-cloud-kubernetes/issues/927") + "spring.cloud.kubernetes.config.enabled=false", "kubernetes.informer.enabled=false" }) + @Neste class KubernetesEnabledSecretsAndConfigDisabled { @Autowired @@ -159,9 +158,9 @@ public class KubernetesClientBootstrapConfigurationTests { // tests that @ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES) has the desired // effect, meaning when it is disabled, no property source bean is present - @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class) + @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class, + properties = {"kubernetes.informer.enabled=false"}) @Nested - @Disabled("fails on jenkins https://github.com/spring-cloud/spring-cloud-kubernetes/issues/927") class KubernetesClientBootstrapConfigurationNotInsideK8s { @Autowired From f328c5d41dfc4d6f3804d8192c66c1159a95771c Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Sun, 5 Dec 2021 19:42:07 -0500 Subject: [PATCH 5/7] Fixing broken @Nested command --- .../config/KubernetesClientBootstrapConfigurationTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java index 11de4b6d..18bda516 100644 --- a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java +++ b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java @@ -124,7 +124,7 @@ public class KubernetesClientBootstrapConfigurationTests { @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class, properties = { "spring.cloud.kubernetes.secrets.enabled=false", "spring.cloud.kubernetes.config.enabled=false", "kubernetes.informer.enabled=false" }) - @Neste + @Nested class KubernetesEnabledSecretsAndConfigDisabled { @Autowired From 097b5d7f050df1c64c22e91e45d3ff235a0b786d Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Sun, 5 Dec 2021 19:44:04 -0500 Subject: [PATCH 6/7] Removing unused import --- .../config/KubernetesClientBootstrapConfigurationTests.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java index 18bda516..300bca7b 100644 --- a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java +++ b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java @@ -16,7 +16,6 @@ package org.springframework.cloud.kubernetes.client.config; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; From 311afba86d7814816cfe32d236c6d629833ee409 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Fri, 10 Dec 2021 09:24:18 -0500 Subject: [PATCH 7/7] Split tests to run in parallel on circleci (#933) --- .circleci/config.yml | 73 +++++++++++++++---- pom.xml | 50 ++++++++++++- ...etesClientBootstrapConfigurationTests.java | 2 +- .../run.sh | 34 ++++++--- 4 files changed, 131 insertions(+), 28 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4aada86f..61266be5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -17,31 +17,34 @@ orbs: kube-orb: circleci/kubernetes@0.11.0 version: 2.1 +workflows: + version: 2 + build-then-test: + jobs: + - build + - test: + requires: + - build jobs: - build: + test: + parallelism: 5 # parallel containers to split the tests among machine: true environment: _JAVA_OPTIONS: "-Xms1024m -Xmx2048m" _SERVICE_OCCURENCE: 5 steps: - checkout - - restore_cache: - keys: - - spring-cloud-kubernetes-{{ .Branch }}-{{ checksum "pom.xml" }} - - spring-cloud-kubernetes-{{ .Branch }} - - spring-cloud-kubernetes - - run: - name: dependencies - command: | - ./mvnw -s .settings.xml -U --fail-never dependency:go-offline -Dservice.occurence=${_SERVICE_OCCURENCE} || true - - save_cache: - paths: - - ~/.m2 - key: spring-cloud-kubernetes-{{ .Branch }}-{{ checksum "pom.xml" }} - run: name: Run regular tests command: | - ./mvnw -s .settings.xml clean install -Dservice.occurence=${_SERVICE_OCCURENCE} #org.jacoco:jacoco-maven-plugin:prepare-agent install -U -P sonar -nsu --batch-mode -Dmaven.test.redirectTestOutputToFile=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn + CLASSNAMES=$(circleci tests glob "**/src/test/**/**.java" | grep -v 'spring-cloud-kubernetes-integration-tests' \ + | sed 's/.*src.test.java.//g' | sed 's@/@.@g' \ + | sed 's/.\{5\}$//' \ + | circleci tests split --split-by=timings --timings-type=classname) + echo $CLASSNAMES + TEST_ARG=$(echo $CLASSNAMES | sed 's/ /,/g') + echo $TEST_ARG + ./mvnw -s .settings.xml -DfailIfNoTests=false -Dtest=$TEST_ARG -e clean org.jacoco:jacoco-maven-plugin:prepare-agent test -U -P sonar -nsu --batch-mode -Dmaven.test.redirectTestOutputToFile=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn mkdir -p $HOME/artifacts/junit/ find . -type f -regex ".*/spring-cloud-*.*/target/*.*" -exec cp {} $HOME/artifacts/ \; find . -type f -regex ".*/target/.*-reports/.*" -exec cp {} $HOME/artifacts/junit/ \; @@ -52,6 +55,12 @@ jobs: sudo apt update sudo apt install snapd - kube-orb/install-kubectl + - attach_workspace: + at: ./ + - run: + name: Load Controller Images From Workspace + command: | + docker load -i ./docker-images/spring-cloud-kubernetes-configuration-watcher.tar - run: name: Run Kind Integration Tests command: | @@ -125,6 +134,40 @@ jobs: - store_test_results: path: ~/junit/ destination: testartifacts + build: + machine: true + environment: + _JAVA_OPTIONS: "-Xms1024m -Xmx2048m" + _SERVICE_OCCURENCE: 5 + steps: + - checkout + - restore_cache: + keys: + - spring-cloud-kubernetes-{{ .Branch }}-{{ checksum "pom.xml" }} + - spring-cloud-kubernetes-{{ .Branch }} + - spring-cloud-kubernetes + - run: + name: dependencies + command: | + ./mvnw -s .settings.xml -U --fail-never dependency:go-offline -Dservice.occurence=${_SERVICE_OCCURENCE} || true + - run: + name: build + command: | + ./mvnw -s .settings.xml clean install -Dservice.occurence=${_SERVICE_OCCURENCE} -DskipTests + - run: + name: save docker images + command: | + TAG=$(./mvnw -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec) + echo $TAG + mkdir docker-images + docker save -o docker-images/spring-cloud-kubernetes-configuration-watcher.tar docker.io/springcloud/spring-cloud-kubernetes-configuration-watcher:${TAG} + - persist_to_workspace: + root: ./ + paths: docker-images + - save_cache: + paths: + - ~/.m2 + key: spring-cloud-kubernetes-{{ .Branch }}-{{ checksum "pom.xml" }} notify: webhooks: - url: https://webhooks.gitter.im/e/22e6bb4eb945dd61ba54 diff --git a/pom.xml b/pom.xml index f793f3b0..04864a7d 100644 --- a/pom.xml +++ b/pom.xml @@ -200,10 +200,8 @@ ${maven-surefire-plugin.version} true - 1 + all false - - false @@ -317,5 +315,51 @@ + + sonar + + + + org.jacoco + jacoco-maven-plugin + + + pre-unit-test + + prepare-agent + + + surefireArgLine + ${project.build.directory}/jacoco.exec + + + + + post-unit-test + test + + report + + + + ${project.build.directory}/jacoco.exec + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + all + false + + ${surefireArgLine} + + + + + diff --git a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java index 300bca7b..101ab510 100644 --- a/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java +++ b/spring-cloud-kubernetes-client-config/src/test/java/org/springframework/cloud/kubernetes/client/config/KubernetesClientBootstrapConfigurationTests.java @@ -158,7 +158,7 @@ public class KubernetesClientBootstrapConfigurationTests { // tests that @ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES) has the desired // effect, meaning when it is disabled, no property source bean is present @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class, - properties = {"kubernetes.informer.enabled=false"}) + properties = { "kubernetes.informer.enabled=false" }) @Nested class KubernetesClientBootstrapConfigurationNotInsideK8s { diff --git a/spring-cloud-kubernetes-integration-tests/run.sh b/spring-cloud-kubernetes-integration-tests/run.sh index 4dce8166..5c67b718 100755 --- a/spring-cloud-kubernetes-integration-tests/run.sh +++ b/spring-cloud-kubernetes-integration-tests/run.sh @@ -116,17 +116,33 @@ main() { #"${ISTIOCTL}" install --set profile=demo # running tests.. - for p in "${INTEGRATION_PROJECTS[@]}"; do - echo "Running test: $p" - cd $p - ${MVN} spring-boot:build-image \ - -Dspring-boot.build-image.imageName=docker.io/springcloud/$p:${MVN_VERSION} -Dspring-boot.build-image.builder=paketobuildpacks/builder - "${KIND}" load docker-image docker.io/springcloud/$p:${MVN_VERSION} - ${MVN} clean install -P it - cd .. - done + if [[ $CIRCLECI ]]; then + #This splits projects across all circleci instances, it returns a list of projects separated by a space + SPLIT_PROJECTS=$(printf "%s\n" "${INTEGRATION_PROJECTS[@]}" | circleci tests split) + SPLIT_PROJECTS=$(echo $SPLIT_PROJECTS | sed 's/ /,/g') + echo "split tests $SPLIT_PROJECTS" + #This splits the projects back into an array so we can iterate over them + IFS=',' read -ra PROJECTS <<< "$SPLIT_PROJECTS" + echo "projects $PROJECTS" + run_tests "${PROJECTS[@]}" + else + run_tests "${INTEGRATION_PROJECTS[@]}" + fi # teardown will happen automatically on exit } +run_tests() { + arr=("$@") + for p in "${arr[@]}"; do + echo "Running test: $p" + cd $p + ${MVN} spring-boot:build-image \ + -Dspring-boot.build-image.imageName=docker.io/springcloud/$p:${MVN_VERSION} -Dspring-boot.build-image.builder=paketobuildpacks/builder + "${KIND}" load docker-image docker.io/springcloud/$p:${MVN_VERSION} + ${MVN} clean install -P it + cd .. + done +} + main