diff --git a/plugins/scheduler-k3s/Makefile b/plugins/scheduler-k3s/Makefile index 0efc49c332c..8935c769df0 100644 --- a/plugins/scheduler-k3s/Makefile +++ b/plugins/scheduler-k3s/Makefile @@ -1,5 +1,5 @@ SUBCOMMANDS = subcommands/annotations:set subcommands/autoscaling-auth:set subcommands/autoscaling-auth:report subcommands/cluster-add subcommands/cluster-list subcommands/cluster-remove subcommands/initialize subcommands/labels:set subcommands/report subcommands/set subcommands/show-kubeconfig subcommands/uninstall -TRIGGERS = triggers/install triggers/post-app-clone-setup triggers/post-app-rename-setup triggers/post-delete 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 +TRIGGERS = triggers/install triggers/post-app-clone-setup triggers/post-app-rename-setup triggers/post-delete triggers/report triggers/scheduler-app-status 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 ee171e767df..314a212fc5b 100644 --- a/plugins/scheduler-k3s/src/triggers/triggers.go +++ b/plugins/scheduler-k3s/src/triggers/triggers.go @@ -38,6 +38,10 @@ func main() { case "report": appName := flag.Arg(0) err = scheduler_k3s.ReportSingleApp(appName, "", "") + case "scheduler-app-status": + scheduler := flag.Arg(0) + appName := flag.Arg(1) + err = scheduler_k3s.TriggerSchedulerAppStatus(scheduler, appName) case "scheduler-deploy": scheduler := flag.Arg(0) appName := flag.Arg(1) diff --git a/plugins/scheduler-k3s/triggers.go b/plugins/scheduler-k3s/triggers.go index 86a5cb6c652..82c03ca2b17 100644 --- a/plugins/scheduler-k3s/triggers.go +++ b/plugins/scheduler-k3s/triggers.go @@ -75,6 +75,50 @@ func TriggerPostDelete(appName string) error { return propertyErr } +// TriggerSchedulerAppStatus returns the status of an app on the scheduler +func TriggerSchedulerAppStatus(scheduler string, appName string) error { + if scheduler != "k3s" { + return nil + } + + clientset, err := NewKubernetesClient() + if err != nil { + return fmt.Errorf("Error creating kubernetes client: %w", err) + } + + if err := clientset.Ping(); err != nil { + return fmt.Errorf("kubernetes api not available: %w", err) + } + + namespace := getComputedNamespace(appName) + deployments, err := clientset.ListDeployments(context.Background(), ListDeploymentsInput{ + Namespace: namespace, + LabelSelector: fmt.Sprintf("app.kubernetes.io/part-of=%s", appName), + }) + if err != nil { + return fmt.Errorf("Error listing pods: %w", err) + } + + processCount := 0 + expectedProcesses := 0 + runningProcesses := 0 + for _, deployment := range deployments { + processCount += int(*deployment.Spec.Replicas) + expectedProcesses += int(*deployment.Spec.Replicas) + runningProcesses += int(deployment.Status.AvailableReplicas) + } + + running := "true" + if expectedProcesses == 0 || runningProcesses == 0 { + running = "false" + } else if runningProcesses < expectedProcesses { + running = "mixed" + } + + fmt.Printf("%d %s", processCount, running) + return nil +} + // TriggerSchedulerDeploy deploys an image tag for a given application func TriggerSchedulerDeploy(scheduler string, appName string, imageTag string) error { if scheduler != "k3s" {