From 70eb713514ce0f07c39fb2e02db14013d7a4bc21 Mon Sep 17 00:00:00 2001 From: Aleem Haji Date: Sat, 22 Feb 2025 14:31:00 -0500 Subject: [PATCH] Fixes basic job success checks (#78) * Adds support for new job status string * Fixes job status checking, and adds basic test --- pkg/hope/kubectl_jobs.go | 20 ++++++++------ pkg/hope/kubectl_jobs_test.go | 49 +++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 pkg/hope/kubectl_jobs_test.go diff --git a/pkg/hope/kubectl_jobs.go b/pkg/hope/kubectl_jobs.go index c9ffaa8..8b5320e 100644 --- a/pkg/hope/kubectl_jobs.go +++ b/pkg/hope/kubectl_jobs.go @@ -26,19 +26,23 @@ const ( // Check to see if the provided job has completed, or is still running. func GetJobStatus(log *logrus.Entry, kubectl *kubeutil.Kubectl, namespace, job string) (JobStatus, error) { - output, err := kubeutil.GetKubectl(kubectl, "get", "-n", namespace, "job", job, "-o", "template={{range .status.conditions}}{{.type}}{{end}}") + template := "template={{range .status.conditions}}{{.type}}\n{{end}}" + output, err := kubeutil.GetKubectl(kubectl, "get", "-n", namespace, "job", job, "-o", template) if err != nil { return JobStatusUnknown, err } - switch output { - case "Complete": - return JobStatusComplete, nil - case "Failed": - return JobStatusFailed, nil - default: - return JobStatusRunning, nil + // Search for terminal statuses, and with none, assume running. + for _, status := range strings.Split(output, "\n") { + switch status { + case "Complete": + return JobStatusComplete, nil + case "Failed": + return JobStatusFailed, nil + } } + + return JobStatusRunning, nil } func FollowLogsIfContainersRunning(kubectl *kubeutil.Kubectl, namespace, job string) error { diff --git a/pkg/hope/kubectl_jobs_test.go b/pkg/hope/kubectl_jobs_test.go new file mode 100644 index 0000000..e3602a2 --- /dev/null +++ b/pkg/hope/kubectl_jobs_test.go @@ -0,0 +1,49 @@ +package hope + +import ( + "testing" +) + +import ( + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" +) + +import ( + "github.com/Eagerod/hope/pkg/kubeutil" +) + +// Implemented as a suite to allow manipulating kubeutil.kubectl funcs +type KubectlJobsTestSuite struct { + suite.Suite + + originalGetKubectl func(kubectl *kubeutil.Kubectl, args ...string) (string, error) +} + +func (s *KubectlJobsTestSuite) SetupTest() { + s.originalGetKubectl = kubeutil.GetKubectl + +} + +func (s *KubectlJobsTestSuite) TeardownTest() { + kubeutil.GetKubectl = s.originalGetKubectl +} + +// Actual test method to run the suite +func TestKubectlJobs(t *testing.T) { + suite.Run(t, new(KubectlJobsTestSuite)) +} + +func (s *KubectlJobsTestSuite) TestGetJobStatus() { + t := s.T() + + kubeutil.GetKubectl = func(kubectl *kubeutil.Kubectl, args ...string) (string, error) { + return "SuccessCriteriaMet\nComplete", nil + } + + kubectl := kubeutil.Kubectl{} + status, err := GetJobStatus(log.WithFields(log.Fields{}), &kubectl, "default", "imaginary-job") + assert.Nil(t, err) + assert.Equal(t, status, JobStatusComplete) +}