Merge pull request #6798 from dokku/scheduler-k3s-app-status

Implement missing scheduler-app-status trigger in k3s scheduler plugin
This commit is contained in:
Jose Diaz-Gonzalez
2024-04-04 22:48:15 -04:00
committed by GitHub
3 changed files with 49 additions and 1 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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" {