From c2b78bb2d70a248a5bd62693bff7c26dd4fa5169 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 18 Jan 2024 16:55:09 -0500 Subject: [PATCH] feat: implement run:list --- plugins/scheduler-k3s/Makefile | 2 +- .../scheduler-k3s/src/triggers/triggers.go | 5 ++ plugins/scheduler-k3s/triggers.go | 70 +++++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/plugins/scheduler-k3s/Makefile b/plugins/scheduler-k3s/Makefile index 776266dec..1a89ea0ee 100644 --- a/plugins/scheduler-k3s/Makefile +++ b/plugins/scheduler-k3s/Makefile @@ -1,5 +1,5 @@ SUBCOMMANDS = subcommands/initialize subcommands/report subcommands/set subcommands/show-kubeconfig -TRIGGERS = triggers/install triggers/post-app-clone-setup triggers/post-app-rename-setup triggers/post-delete triggers/post-registry-login triggers/report triggers/scheduler-deploy triggers/scheduler-enter triggers/scheduler-logs triggers/scheduler-post-delete triggers/scheduler-run triggers/scheduler-stop +TRIGGERS = triggers/install triggers/post-app-clone-setup triggers/post-app-rename-setup triggers/post-delete triggers/post-registry-login triggers/report triggers/scheduler-deploy triggers/scheduler-enter triggers/scheduler-logs triggers/scheduler-post-delete triggers/scheduler-run triggers/scheduler-run-list triggers/scheduler-stop BUILD = commands subcommands triggers PLUGIN_NAME = scheduler-k3s diff --git a/plugins/scheduler-k3s/src/triggers/triggers.go b/plugins/scheduler-k3s/src/triggers/triggers.go index f0c64098a..ed701b317 100644 --- a/plugins/scheduler-k3s/src/triggers/triggers.go +++ b/plugins/scheduler-k3s/src/triggers/triggers.go @@ -109,6 +109,11 @@ func main() { } err = scheduler_k3s.TriggerSchedulerRun(scheduler, appName, envCount, args) + case "scheduler-run-list": + scheduler := flag.Arg(0) + appName := flag.Arg(1) + format := flag.Arg(2) + err = scheduler_k3s.TriggerSchedulerRunList(scheduler, appName, format) default: err = fmt.Errorf("Invalid plugin trigger call: %s", trigger) } diff --git a/plugins/scheduler-k3s/triggers.go b/plugins/scheduler-k3s/triggers.go index a6a67f56b..885505a2b 100644 --- a/plugins/scheduler-k3s/triggers.go +++ b/plugins/scheduler-k3s/triggers.go @@ -4,6 +4,7 @@ import ( "bufio" "context" "encoding/base64" + "encoding/json" "errors" "fmt" "io" @@ -21,6 +22,7 @@ import ( "github.com/fatih/color" "github.com/kballard/go-shellquote" "github.com/rancher/wharfie/pkg/registries" + "github.com/ryanuber/columnize" orderedmap "github.com/wk8/go-ordered-map/v2" "gopkg.in/yaml.v3" appsv1 "k8s.io/api/apps/v1" @@ -951,6 +953,74 @@ func TriggerSchedulerRun(scheduler string, appName string, envCount int, args [] return nil } +// TriggerSchedulerRunList lists one-off run pods for a given application +func TriggerSchedulerRunList(scheduler string, appName string, format string) error { + if scheduler != "k3s" { + return nil + } + + clientset, err := NewKubernetesClient() + if err != nil { + return fmt.Errorf("Error creating kubernetes client: %w", err) + } + + namespace := common.PropertyGetDefault("scheduler-k3s", appName, "namespace", "default") + + ctx := context.Background() + cronJobs, err := clientset.ListCronJobs(ctx, ListCronJobsInput{ + LabelSelector: fmt.Sprintf("dokku.com/app-name=%s", appName), + Namespace: namespace, + }) + if err != nil { + return fmt.Errorf("Error getting cron jobs: %w", err) + } + + type CronJobEntry struct { + ID string `json:"id"` + AppName string `json:"app"` + Command string `json:"command"` + Schedule string `json:"schedule"` + } + + data := []CronJobEntry{} + lines := []string{"ID | Schedule | Command"} + for _, cronJob := range cronJobs { + command := "" + for _, container := range cronJob.Spec.JobTemplate.Spec.Template.Spec.Containers { + if container.Name == fmt.Sprintf("%s-cron", appName) { + command = strings.Join(container.Args, " ") + } + } + + cronID, ok := cronJob.Labels["dokku.com/cron-id"] + if !ok { + common.LogWarn(fmt.Sprintf("Cron job %s does not have a cron ID label", cronJob.Name)) + continue + } + + lines = append(lines, fmt.Sprintf("%s | %s | %s", cronID, cronJob.Spec.Schedule, command)) + data = append(data, CronJobEntry{ + ID: cronID, + AppName: appName, + Command: command, + Schedule: cronJob.Spec.Schedule, + }) + } + + if format == "stdout" { + result := columnize.SimpleFormat(lines) + fmt.Println(result) + } else { + b, err := json.Marshal(data) + if err != nil { + return fmt.Errorf("Error marshalling cron jobs: %w", err) + } + fmt.Println(string(b)) + } + + return nil +} + // TriggerSchedulerPostDelete destroys the scheduler-k3s data for a given app container func TriggerSchedulerPostDelete(scheduler string, appName string) error { if scheduler != "k3s" {