diff --git a/src/test/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesTestUtil.java b/src/test/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesTestUtil.java index 7c458895fb..494da834cb 100644 --- a/src/test/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesTestUtil.java +++ b/src/test/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesTestUtil.java @@ -44,6 +44,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; +import hudson.model.Node; import io.fabric8.kubernetes.api.model.Cluster; import io.fabric8.kubernetes.api.model.Config; import io.fabric8.kubernetes.api.model.NamedCluster; @@ -58,6 +59,7 @@ import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable; import io.fabric8.kubernetes.client.internal.KubeConfigUtils; import io.fabric8.kubernetes.client.utils.Utils; +import jenkins.model.Jenkins; public class KubernetesTestUtil { @@ -101,6 +103,32 @@ public static KubernetesCloud setupCloud() throws UnrecoverableKeyException, Cer return cloud; } + /** + * Wait for Jenkins nodes (agents) to be deleted + */ + public static void waitForNodeDeletion(Jenkins jenkins) throws Exception { + try { + new ForkJoinPool(1).submit(() -> IntStream.range(1, 1_000_000).anyMatch(i -> { + try { + List nodes = jenkins.getNodes(); + LOGGER.log(INFO, "Still waiting for nodes to be deleted: {0}", nodes); + if (nodes.isEmpty()) { + LOGGER.log(INFO, "All nodes are deleted"); + } else { + LOGGER.log(INFO, "Still waiting for nodes to be deleted: {0}", nodes); + Thread.sleep(5000); + } + return nodes.isEmpty(); + } catch (InterruptedException e) { + LOGGER.log(INFO, "Waiting for nodes to be deleted - interrupted"); + return true; + } + })).get(30, TimeUnit.SECONDS); + } catch (TimeoutException e) { + LOGGER.log(INFO, "Waiting for nodes to be deleted - timed out"); + } + } + /** * Delete pods with matching labels * @@ -119,9 +147,8 @@ public static boolean deletePods(KubernetesClient client, Map la // wait for 30 seconds for all pods to be terminated if (wait) { LOGGER.log(INFO, "Waiting for pods to terminate"); - ForkJoinPool forkJoinPool = new ForkJoinPool(1); try { - forkJoinPool.submit(() -> IntStream.range(1, 1_000_000).anyMatch(i -> { + new ForkJoinPool(1).submit(() -> IntStream.range(1, 1_000_000).anyMatch(i -> { try { FilterWatchListDeletable> pods = client.pods() .withLabels(labels); diff --git a/src/test/java/org/csanchez/jenkins/plugins/kubernetes/pipeline/AbstractKubernetesPipelineTest.java b/src/test/java/org/csanchez/jenkins/plugins/kubernetes/pipeline/AbstractKubernetesPipelineTest.java index a7900d24e4..a136a71960 100644 --- a/src/test/java/org/csanchez/jenkins/plugins/kubernetes/pipeline/AbstractKubernetesPipelineTest.java +++ b/src/test/java/org/csanchez/jenkins/plugins/kubernetes/pipeline/AbstractKubernetesPipelineTest.java @@ -81,6 +81,9 @@ public void configureTemplates() throws Exception { @After public void cleanup() throws Exception { + waitForNodeDeletion(r.getInstance()); + assertEquals("There are agents left in Jenkins after test execution", Collections.emptyList(), + r.getInstance().getNodes()); assertFalse("There are pods leftover after test execution, see previous logs", deletePods(cloud.connect(), KubernetesCloud.DEFAULT_POD_LABELS, true)); } diff --git a/src/test/java/org/csanchez/jenkins/plugins/kubernetes/pipeline/KubernetesPipelineTest.java b/src/test/java/org/csanchez/jenkins/plugins/kubernetes/pipeline/KubernetesPipelineTest.java index 3625debc13..24df48210b 100644 --- a/src/test/java/org/csanchez/jenkins/plugins/kubernetes/pipeline/KubernetesPipelineTest.java +++ b/src/test/java/org/csanchez/jenkins/plugins/kubernetes/pipeline/KubernetesPipelineTest.java @@ -37,8 +37,8 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runners.model.Statement; -import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRuleNonLocalhost; +import org.jvnet.hudson.test.RestartableJenkinsRule; import hudson.model.Node; import hudson.slaves.DumbSlave; @@ -46,7 +46,6 @@ import hudson.slaves.RetentionStrategy; import io.fabric8.kubernetes.api.model.NamespaceBuilder; import io.fabric8.kubernetes.client.KubernetesClient; -import org.jvnet.hudson.test.RestartableJenkinsRule; /** * @author Carlos Sanchez