A self-hosted orchestration system crafted for power users. composia.xyz
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189package cli
import ( "fmt"
controllerv1 "forgejo.alexma.top/alexma233/composia/gen/go/proto/composia/controller/v1")
func (application *app) runTaskList(args []string) error { fs := newCommandFlagSet("task list") var statuses stringListFlag var services stringListFlag var nodes stringListFlag var types stringListFlag var excludeStatuses stringListFlag var excludeServices stringListFlag var excludeNodes stringListFlag var excludeTypes stringListFlag fs.Var(&statuses, "status", "status filter; repeat or comma-separate") fs.Var(&services, "service", "service name filter; repeat or comma-separate") fs.Var(&nodes, "node", "node ID filter; repeat or comma-separate") fs.Var(&types, "type", "task type filter; repeat or comma-separate") fs.Var(&excludeStatuses, "exclude-status", "status exclusion; repeat or comma-separate") fs.Var(&excludeServices, "exclude-service", "service exclusion; repeat or comma-separate") fs.Var(&excludeNodes, "exclude-node", "node exclusion; repeat or comma-separate") fs.Var(&excludeTypes, "exclude-type", "type exclusion; repeat or comma-separate") pageValues, _ := parsePageFlags(fs) if err := fs.Parse(args); err != nil { return err } if err := requireArgs(fs.Args(), 0, "composia task list [filters]"); err != nil { return err } pageSize, page, err := pageValues() if err != nil { return err } response, err := application.client.tasks.ListTasks(application.ctx, newRequest(&controllerv1.ListTasksRequest{ Status: taskStatusesFromTexts([]string(statuses)), ServiceName: []string(services), NodeId: []string(nodes), Type: taskTypesFromTexts([]string(types)), ExcludeStatus: taskStatusesFromTexts([]string(excludeStatuses)), ExcludeServiceName: []string(excludeServices), ExcludeNodeId: []string(excludeNodes), ExcludeType: taskTypesFromTexts([]string(excludeTypes)), PageSize: pageSize, Page: page, })) if err != nil { return err } if application.isJSONOutput() { return application.printMessage(response.Msg) } rows := make([][]string, 0, len(response.Msg.GetTasks())) for _, task := range response.Msg.GetTasks() { rows = append(rows, []string{ task.GetTaskId(), taskTypeText(task.GetType()), taskStatusText(task.GetStatus()), task.GetServiceName(), task.GetNodeId(), formatProtoTimestamp(task.GetCreatedAt()), }) } if err := application.writeTable([]string{"TASK", "TYPE", "STATUS", "SERVICE", "NODE", "CREATED"}, rows); err != nil { return err } return application.writeCount("total_count", response.Msg.GetTotalCount())}
func (application *app) runTaskGet(args []string) error { if err := requireArgs(args, 1, "composia task get <task>"); err != nil { return err } response, err := application.client.tasks.GetTask(application.ctx, newRequest(&controllerv1.GetTaskRequest{TaskId: args[0]})) if err != nil { return err } if application.isJSONOutput() { return application.printMessage(response.Msg) } return application.printTaskDetail(response.Msg)}
func (application *app) runTaskLogs(args []string) error { if err := requireArgs(args, 1, "composia task logs <task>"); err != nil { return err } return application.streamTaskLogs(application.ctx, args[0])}
func (application *app) runTaskAgain(args []string) error { fs := newCommandFlagSet("task run-again") waitOptions := addWaitFlags(fs) if err := fs.Parse(args); err != nil { return err } if err := requireArgs(fs.Args(), 1, "composia task run-again [--wait] [--follow] [--timeout duration] <task>"); err != nil { return err } response, err := application.client.tasks.RunTaskAgain(application.ctx, newRequest(&controllerv1.RunTaskAgainRequest{TaskId: fs.Arg(0)})) if err != nil { return err } return application.printTaskActionWithWait(response.Msg, waitOptions)}
func (application *app) runTaskFailLost(args []string) error { fs := newCommandFlagSet("task fail-lost") errorSummary := fs.String("error-summary", "", "operator reconciliation summary") if err := fs.Parse(args); err != nil { return err } if err := requireArgs(fs.Args(), 1, "composia task fail-lost [--error-summary text] <task>"); err != nil { return err } response, err := application.client.tasks.FailLostTaskExecution(application.ctx, newRequest(&controllerv1.FailLostTaskExecutionRequest{TaskId: fs.Arg(0), ErrorSummary: *errorSummary})) if err != nil { return err } return application.printTaskAction(response.Msg)}
func (application *app) runTaskWait(args []string) error { fs := newCommandFlagSet("task wait") waitOptions := addWaitFlags(fs) *waitOptions.wait = true if err := fs.Parse(args); err != nil { return err } if err := requireArgs(fs.Args(), 1, "composia task wait [--follow] [--timeout duration] [--interval duration] <task>"); err != nil { return err } return application.waitTask(fs.Arg(0), waitOptions)}
func (application *app) runTaskResolve(decision string, args []string) error { fs := newCommandFlagSet("task " + decision) comment := fs.String("comment", "", "operator comment") if err := fs.Parse(args); err != nil { return err } if err := requireArgs(fs.Args(), 1, fmt.Sprintf("composia task %s [--comment text] <task>", decision)); err != nil { return err } response, err := application.client.tasks.ResolveTaskConfirmation(application.ctx, newRequest(&controllerv1.ResolveTaskConfirmationRequest{TaskId: fs.Arg(0), Decision: taskDecisionFromText(decision), Comment: *comment})) if err != nil { return err } return application.printTaskAction(response.Msg)}
func (application *app) printTaskDetail(task *controllerv1.GetTaskResponse) error { if err := application.writeKV([][2]string{ {"task_id", task.GetTaskId()}, {"type", taskTypeText(task.GetType())}, {"source", taskSourceText(task.GetSource())}, {"service_name", task.GetServiceName()}, {"node_id", task.GetNodeId()}, {"status", taskStatusText(task.GetStatus())}, {"execution_state", task.GetExecutionState()}, {"lease_expires_at", formatProtoTimestamp(task.GetLeaseExpiresAt())}, {"created_at", formatProtoTimestamp(task.GetCreatedAt())}, {"started_at", formatProtoTimestamp(task.GetStartedAt())}, {"finished_at", formatProtoTimestamp(task.GetFinishedAt())}, {"repo_revision", task.GetRepoRevision()}, {"result_revision", task.GetResultRevision()}, {"attempt_of_task_id", task.GetAttemptOfTaskId()}, {"triggered_by", task.GetTriggeredBy()}, {"error_summary", task.GetErrorSummary()}, }); err != nil { return err } steps := task.GetSteps() if len(steps) == 0 { return nil } if _, err := fmt.Fprintln(application.out); err != nil { return err } rows := make([][]string, 0, len(steps)) for _, step := range steps { rows = append(rows, []string{taskStepNameText(step.GetStepName()), taskStatusText(step.GetStatus()), formatProtoTimestamp(step.GetStartedAt()), formatProtoTimestamp(step.GetFinishedAt())}) } return application.writeTable([]string{"STEP", "STATUS", "STARTED", "FINISHED"}, rows)}