From f03caacda456fda7ee627eca9cf72688c34526fd Mon Sep 17 00:00:00 2001 From: Gareth Evans Date: Thu, 6 May 2021 22:26:54 +0100 Subject: [PATCH] fix: wait for pod to exist --- .../client/logwatch/PipelineRunLogWatch.java | 16 ++++--- .../client/logwatch/TaskRunLogWatch.java | 45 +++++++++++++++---- .../build/create/JenkinsFreestyleTest.java | 12 ++--- .../build/create/JenkinsPipelineTest.java | 30 +++++-------- 4 files changed, 63 insertions(+), 40 deletions(-) diff --git a/src/main/java/org/waveywaves/jenkins/plugins/tekton/client/logwatch/PipelineRunLogWatch.java b/src/main/java/org/waveywaves/jenkins/plugins/tekton/client/logwatch/PipelineRunLogWatch.java index 86b00c4..82c46ee 100644 --- a/src/main/java/org/waveywaves/jenkins/plugins/tekton/client/logwatch/PipelineRunLogWatch.java +++ b/src/main/java/org/waveywaves/jenkins/plugins/tekton/client/logwatch/PipelineRunLogWatch.java @@ -14,19 +14,23 @@ import java.util.logging.Logger; public class PipelineRunLogWatch implements Runnable { + private static final Logger LOGGER = Logger.getLogger(PipelineRunLogWatch.class.getName()); + private static final String PIPELINE_TASK_LABEL_NAME = "tekton.dev/pipelineTask"; + private static final String PIPELINE_RUN_LABEL_NAME = "tekton.dev/pipelineRun"; + + private final PipelineRun pipelineRun; + private KubernetesClient kubernetesClient; private TektonClient tektonClient; - private PipelineRun pipelineRun; private Exception exception; OutputStream consoleLogger; - ConcurrentHashMap taskRunsOnWatch = new ConcurrentHashMap(); - ConcurrentHashMap taskRunsWatchDone = new ConcurrentHashMap(); + //ConcurrentHashMap taskRunsOnWatch = new ConcurrentHashMap(); + //ConcurrentHashMap taskRunsWatchDone = new ConcurrentHashMap(); + - private final String pipelineTaskLabelName = "tekton.dev/pipelineTask"; - private final String pipelineRunLabelName = "tekton.dev/pipelineRun"; public PipelineRunLogWatch(KubernetesClient kubernetesClient, TektonClient tektonClient, PipelineRun pipelineRun, OutputStream consoleLogger) { this.kubernetesClient = kubernetesClient; @@ -54,7 +58,7 @@ public void run() { String pipelineTaskName = pt.getName(); LOGGER.info("Streaming logs for PipelineTask namespace=" + ns + ", runName=" + pipelineRunName + ", taskName=" + pipelineTaskName); ListOptions lo = new ListOptions(); - String selector = String.format("%s=%s,%s=%s", pipelineTaskLabelName, pipelineTaskName, pipelineRunLabelName, pipelineRunName); + String selector = String.format("%s=%s,%s=%s", PIPELINE_TASK_LABEL_NAME, pipelineTaskName, PIPELINE_RUN_LABEL_NAME, pipelineRunName); lo.setLabelSelector(selector); // the tekton operator may not have created the TasksRuns yet so lets wait a little bit for them to show up diff --git a/src/main/java/org/waveywaves/jenkins/plugins/tekton/client/logwatch/TaskRunLogWatch.java b/src/main/java/org/waveywaves/jenkins/plugins/tekton/client/logwatch/TaskRunLogWatch.java index 04dc721..0f76ef6 100644 --- a/src/main/java/org/waveywaves/jenkins/plugins/tekton/client/logwatch/TaskRunLogWatch.java +++ b/src/main/java/org/waveywaves/jenkins/plugins/tekton/client/logwatch/TaskRunLogWatch.java @@ -6,6 +6,7 @@ import io.fabric8.kubernetes.api.model.ContainerState; import io.fabric8.kubernetes.api.model.ContainerStateTerminated; import io.fabric8.kubernetes.api.model.ContainerStatus; +import io.fabric8.kubernetes.api.model.ListOptions; import io.fabric8.kubernetes.api.model.OwnerReference; import io.fabric8.kubernetes.api.model.Pod; import io.fabric8.kubernetes.api.model.PodStatus; @@ -28,9 +29,14 @@ public class TaskRunLogWatch implements Runnable{ private static final Logger LOGGER = Logger.getLogger(TaskRunLogWatch.class.getName()); + private static final String TASK_RUN_LABEL_NAME = "tekton.dev/taskRun"; + + // TODO should be final + private TaskRun taskRun; + private KubernetesClient kubernetesClient; private TektonClient tektonClient; - private TaskRun taskRun; + private Exception exception; OutputStream consoleLogger; @@ -52,7 +58,24 @@ public Exception getException() { public void run() { HashSet runningPhases = Sets.newHashSet("Running", "Succeeded", "Failed"); String ns = taskRun.getMetadata().getNamespace(); - List pods = kubernetesClient.pods().inNamespace(ns).list().getItems(); + ListOptions lo = new ListOptions(); + String selector = String.format("%s=%s", TASK_RUN_LABEL_NAME, taskRun.getMetadata().getName()); + lo.setLabelSelector(selector); + List pods = null; + for (int i = 0; i < 60; i++) { + pods = kubernetesClient.pods().inNamespace(ns).list(lo).getItems(); + LOGGER.info("Found " + pods.size() + " pod(s) for taskRun " + taskRun.getMetadata().getName()); + if (pods.size() > 0) { + break; + } + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + Pod taskRunPod = null; String podName = ""; for (Pod pod : pods) { @@ -144,14 +167,18 @@ public void run() { */ protected void logTaskRunFailure(TaskRun taskRun) { String name = taskRun.getMetadata().getName(); - List conditions = taskRun.getStatus().getConditions(); - if (conditions == null || conditions.size() == 0) { - logMessage("[Tekton] TaskRun " + name + " has no status conditions"); - return; - } + if (taskRun.getStatus() != null) { + List conditions = taskRun.getStatus().getConditions(); + if (conditions == null || conditions.size() == 0) { + logMessage("[Tekton] TaskRun " + name + " has no status conditions"); + return; + } - for (Condition condition : conditions) { - logMessage("[Tekton] TaskRun " + name + " " + condition.getType() + "/" + condition.getReason() + ": " + condition.getMessage()); + for (Condition condition : conditions) { + logMessage("[Tekton] TaskRun " + name + " " + condition.getType() + "/" + condition.getReason() + ": " + condition.getMessage()); + } + } else { + logMessage("[Tekton] TaskRun " + name + " has no status"); } } diff --git a/src/test/java/org/waveywaves/jenkins/plugins/tekton/client/build/create/JenkinsFreestyleTest.java b/src/test/java/org/waveywaves/jenkins/plugins/tekton/client/build/create/JenkinsFreestyleTest.java index f995a97..42df048 100644 --- a/src/test/java/org/waveywaves/jenkins/plugins/tekton/client/build/create/JenkinsFreestyleTest.java +++ b/src/test/java/org/waveywaves/jenkins/plugins/tekton/client/build/create/JenkinsFreestyleTest.java @@ -81,7 +81,7 @@ public void testFreestyleJobWithFileInput() throws Exception { assertThat(kubernetesRule.getMockServer().getRequestCount(), is(1)); - String log = jenkinsRule.getLog(b); + String log = JenkinsRule.getLog(b); System.out.println(log); assertThat(log, containsString("Legacy code started this job")); @@ -113,7 +113,7 @@ public void testFreestyleJobWithYamlInput() throws Exception { assertThat(kubernetesRule.getMockServer().getRequestCount(), is(1)); - String log = jenkinsRule.getLog(b); + String log = JenkinsRule.getLog(b); System.out.println(log); assertThat(log, containsString("Legacy code started this job")); @@ -199,7 +199,7 @@ public void testFreestyleJobWithComplexYamlInput() throws Exception { .addToItems(pod) .build(); - kubernetesRule.expect().get().withPath("/api/v1/namespaces/test/pods") + kubernetesRule.expect().get().withPath("/api/v1/namespaces/test/pods?labelSelector=tekton.dev%2FtaskRun%3DtestTaskRun") .andReturn(HttpURLConnection.HTTP_OK, podList).once(); kubernetesRule.expect().get().withPath("/api/v1/namespaces/test/pods/hello-world-pod") @@ -219,7 +219,7 @@ public void testFreestyleJobWithComplexYamlInput() throws Exception { FreeStyleBuild b = jenkinsRule.assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); - String log = jenkinsRule.getLog(b); + String log = JenkinsRule.getLog(b); System.out.println(log); assertThat(log, containsString("Legacy code started this job")); @@ -308,7 +308,7 @@ public void testFreestyleJobWithExpandedYamlInput() throws Exception { .addToItems(pod) .build(); - kubernetesRule.expect().get().withPath("/api/v1/namespaces/test/pods") + kubernetesRule.expect().get().withPath("/api/v1/namespaces/test/pods?labelSelector=tekton.dev%2FtaskRun%3DtestTaskRun") .andReturn(HttpURLConnection.HTTP_OK, podList).once(); kubernetesRule.expect().get().withPath("/api/v1/namespaces/test/pods/hello-world-pod") @@ -328,7 +328,7 @@ public void testFreestyleJobWithExpandedYamlInput() throws Exception { FreeStyleBuild b = jenkinsRule.assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); - String log = jenkinsRule.getLog(b); + String log = JenkinsRule.getLog(b); System.out.println(log); assertThat(log, containsString("Legacy code started this job")); diff --git a/src/test/java/org/waveywaves/jenkins/plugins/tekton/client/build/create/JenkinsPipelineTest.java b/src/test/java/org/waveywaves/jenkins/plugins/tekton/client/build/create/JenkinsPipelineTest.java index 130158e..37eb9e3 100644 --- a/src/test/java/org/waveywaves/jenkins/plugins/tekton/client/build/create/JenkinsPipelineTest.java +++ b/src/test/java/org/waveywaves/jenkins/plugins/tekton/client/build/create/JenkinsPipelineTest.java @@ -19,11 +19,8 @@ import io.fabric8.tekton.pipeline.v1beta1.TaskRunBuilder; import io.fabric8.tekton.pipeline.v1beta1.TaskRunList; import io.fabric8.tekton.pipeline.v1beta1.TaskRunListBuilder; -import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; -import java.nio.charset.StandardCharsets; -import org.apache.commons.io.IOUtils; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; import org.jenkinsci.plugins.workflow.job.WorkflowRun; @@ -32,7 +29,6 @@ import org.junit.Test; import org.junit.rules.RuleChain; import org.junit.rules.TestRule; -import org.jvnet.hudson.test.ExtractResourceSCM; import org.jvnet.hudson.test.JenkinsRule; import org.waveywaves.jenkins.plugins.tekton.client.TektonUtils; import org.waveywaves.jenkins.plugins.tekton.client.ToolUtils; @@ -85,7 +81,7 @@ public void testScriptedPipelineWithFileInput_Task() throws Exception { assertThat(kubernetesRule.getMockServer().getRequestCount(), is(1)); - String log = jenkinsRule.getLog(b); + String log = JenkinsRule.getLog(b); System.out.println(log); assertThat(log, containsString("Extracting: .tekton/task.yaml")); @@ -125,7 +121,7 @@ public void testDeclarativePipelineWithFileInput_Task() throws Exception { assertThat(kubernetesRule.getMockServer().getRequestCount(), is(1)); - String log = jenkinsRule.getLog(b); + String log = JenkinsRule.getLog(b); System.out.println(log); assertThat(log, containsString("Extracting: .tekton/task.yaml")); @@ -169,7 +165,7 @@ public void testDeclarativePipelineWithYamlInput_Task() throws Exception { assertThat(kubernetesRule.getMockServer().getRequestCount(), is(1)); - String log = jenkinsRule.getLog(b); + String log = JenkinsRule.getLog(b); System.out.println(log); assertThat(log, containsString("Extracting: .tekton/task.yaml")); @@ -258,7 +254,7 @@ public void testDeclarativePipelineWithYamlInput_PipelineRun() throws Exception .addToItems(pod) .build(); - kubernetesRule.expect().get().withPath("/api/v1/namespaces/test/pods") + kubernetesRule.expect().get().withPath("/api/v1/namespaces/test/pods?labelSelector=tekton.dev%2FtaskRun%3DtestTaskRun") .andReturn(HttpURLConnection.HTTP_OK, podList).once(); kubernetesRule.expect().get().withPath("/api/v1/namespaces/test/pods/hello-world-pod") @@ -291,7 +287,7 @@ public void testDeclarativePipelineWithYamlInput_PipelineRun() throws Exception WorkflowRun b = jenkinsRule.assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); - String log = jenkinsRule.getLog(b); + String log = JenkinsRule.getLog(b); System.out.println(log); assertThat(log, containsString("[Pipeline] tektonCreateRaw")); @@ -384,7 +380,7 @@ public void testDeclarativePipelineWithYamlInput_PipelineRun_DifferentNamespace( .addToItems(pod) .build(); - kubernetesRule.expect().get().withPath("/api/v1/namespaces/tekton-pipelines/pods") + kubernetesRule.expect().get().withPath("/api/v1/namespaces/tekton-pipelines/pods?labelSelector=tekton.dev%2FtaskRun%3DtestTaskRun") .andReturn(HttpURLConnection.HTTP_OK, podList).once(); kubernetesRule.expect().get().withPath("/api/v1/namespaces/tekton-pipelines/pods/hello-world-pod") @@ -417,7 +413,7 @@ public void testDeclarativePipelineWithYamlInput_PipelineRun_DifferentNamespace( WorkflowRun b = jenkinsRule.assertBuildStatus(Result.SUCCESS, p.scheduleBuild2(0).get()); - String log = jenkinsRule.getLog(b); + String log = JenkinsRule.getLog(b); System.out.println(log); assertThat(log, containsString("[Pipeline] tektonCreateRaw")); @@ -516,7 +512,7 @@ public void testDeclarativePipelineWithYamlInput_PipelineRun_FailingContainer() .addToItems(pod) .build(); - kubernetesRule.expect().get().withPath("/api/v1/namespaces/tekton-pipelines/pods") + kubernetesRule.expect().get().withPath("/api/v1/namespaces/tekton-pipelines/pods?labelSelector=tekton.dev%2FtaskRun%3DtestTaskRun") .andReturn(HttpURLConnection.HTTP_OK, podList).once(); kubernetesRule.expect().get().withPath("/api/v1/namespaces/tekton-pipelines/pods/hello-world-pod") @@ -549,7 +545,7 @@ public void testDeclarativePipelineWithYamlInput_PipelineRun_FailingContainer() WorkflowRun b = jenkinsRule.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); - String log = jenkinsRule.getLog(b); + String log = JenkinsRule.getLog(b); System.out.println(log); assertThat(log, containsString("[Pipeline] tektonCreateRaw")); @@ -643,7 +639,7 @@ public void testDeclarativePipelineWithYamlInput_PipelineRun_FailingPipelineRun( .addToItems(pod) .build(); - kubernetesRule.expect().get().withPath("/api/v1/namespaces/tekton-pipelines/pods") + kubernetesRule.expect().get().withPath("/api/v1/namespaces/tekton-pipelines/pods?labelSelector=tekton.dev%2FtaskRun%3DtestTaskRun") .andReturn(HttpURLConnection.HTTP_OK, podList).once(); kubernetesRule.expect().get().withPath("/api/v1/namespaces/tekton-pipelines/pods/hello-world-pod") @@ -676,7 +672,7 @@ public void testDeclarativePipelineWithYamlInput_PipelineRun_FailingPipelineRun( WorkflowRun b = jenkinsRule.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); - String log = jenkinsRule.getLog(b); + String log = JenkinsRule.getLog(b); System.out.println(log); assertThat(log, containsString("[Pipeline] tektonCreateRaw")); @@ -689,10 +685,6 @@ public void testDeclarativePipelineWithYamlInput_PipelineRun_FailingPipelineRun( assertThat(kubernetesRule.getMockServer().getRequestCount(), is(9)); } - private String contents(String filename) throws IOException { - return IOUtils.toString(this.getClass().getResourceAsStream(filename), StandardCharsets.UTF_8.name()); - } - private OwnerReference ownerReference(String uid) { return new OwnerReference("", false, false, "", "", uid); }