init from gitlab
This commit is contained in:
72
internal/server/commands/execution.go
Normal file
72
internal/server/commands/execution.go
Normal file
@@ -0,0 +1,72 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"github.com/texm/dokku-go"
|
||||
"gitlab.com/texm/shokku/internal/server/dto"
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
||||
type CallbackFunc func() error
|
||||
|
||||
type execution struct {
|
||||
Id string
|
||||
output *dokku.CommandOutputStream
|
||||
callback CallbackFunc
|
||||
error error
|
||||
}
|
||||
|
||||
type ExecutionStatus struct {
|
||||
CombinedOutput []dto.OutputLine
|
||||
|
||||
Finished bool
|
||||
FinishedAt time.Time
|
||||
|
||||
// TODO: this smells
|
||||
CallbackError error
|
||||
StreamError error
|
||||
StdoutReadError error
|
||||
StderrReadError error
|
||||
}
|
||||
|
||||
func generateCommandExecutionId() string {
|
||||
b := make([]rune, 16)
|
||||
for i := range b {
|
||||
b[i] = letterRunes[rand.Intn(len(letterRunes))]
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
|
||||
func RequestExecution(cmd AsyncDokkuCommand, callback CallbackFunc) string {
|
||||
id := generateCommandExecutionId()
|
||||
|
||||
exec := execution{
|
||||
Id: id,
|
||||
callback: callback,
|
||||
}
|
||||
executions[id] = exec
|
||||
|
||||
go func(exec execution, id string) {
|
||||
stream, err := cmd()
|
||||
exec.output = stream
|
||||
if err != nil {
|
||||
exec.error = err
|
||||
}
|
||||
executions[id] = exec
|
||||
}(exec, id)
|
||||
|
||||
return id
|
||||
}
|
||||
|
||||
func GetExecutionStatus(id string) (*ExecutionStatus, error) {
|
||||
status, ok := statuses[id]
|
||||
if !ok {
|
||||
_, exists := executions[id]
|
||||
if exists {
|
||||
return nil, ErrNotPolled
|
||||
}
|
||||
return nil, ErrNoExecution
|
||||
}
|
||||
|
||||
return status, nil
|
||||
}
|
||||
Reference in New Issue
Block a user