mirror of
https://github.com/OliveTin/OliveTin
synced 2026-08-26 12:36:30 +00:00
104 lines
3.2 KiB
Go
104 lines
3.2 KiB
Go
package api
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"connectrpc.com/connect"
|
|
apiv1 "github.com/OliveTin/OliveTin/gen/olivetin/api/v1"
|
|
config "github.com/OliveTin/OliveTin/internal/config"
|
|
"github.com/OliveTin/OliveTin/internal/executor"
|
|
"github.com/google/uuid"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestGetExecutionQueueGroupsByActionGroup(t *testing.T) {
|
|
cfg := config.DefaultConfig()
|
|
cfg.ActionGroups = map[string]*config.ActionGroup{
|
|
"deploy": {MaxConcurrent: 2, Icon: "backup"},
|
|
}
|
|
cfg.Actions = []*config.Action{
|
|
{Title: "backup", Shell: "sleep 1", MaxConcurrent: 1, Groups: []string{"deploy"}},
|
|
{Title: "ping", Shell: "echo ping"},
|
|
}
|
|
cfg.Sanitize()
|
|
|
|
ex := executor.DefaultExecutor(cfg)
|
|
ex.RebuildActionMap()
|
|
|
|
backupBinding := ex.FindBindingWithNoEntity(cfg.Actions[0])
|
|
pingBinding := ex.FindBindingWithNoEntity(cfg.Actions[1])
|
|
require.NotNil(t, backupBinding)
|
|
require.NotNil(t, pingBinding)
|
|
|
|
backupRunning := newAPIQueueLogEntry(backupBinding, true, false)
|
|
backupWaiting := newAPIQueueLogEntry(backupBinding, false, false)
|
|
backupWaiting.Queued = true
|
|
pingRunning := newAPIQueueLogEntry(pingBinding, true, false)
|
|
|
|
ex.SetLog(backupRunning.ExecutionTrackingID, backupRunning)
|
|
ex.SetLog(backupWaiting.ExecutionTrackingID, backupWaiting)
|
|
ex.SetLog(pingRunning.ExecutionTrackingID, pingRunning)
|
|
|
|
ts, client := getNewTestServerAndClientWithExecutor(cfg, ex)
|
|
defer ts.Close()
|
|
|
|
resp, err := client.GetExecutionQueue(context.Background(), connect.NewRequest(&apiv1.GetExecutionQueueRequest{}))
|
|
require.NoError(t, err)
|
|
require.NotNil(t, resp)
|
|
assert.Equal(t, int32(3), resp.Msg.TotalActive)
|
|
require.Len(t, resp.Msg.Groups, 2)
|
|
|
|
deployGroup := findExecutionQueueGroup(resp.Msg.Groups, "deploy")
|
|
defaultGroup := findExecutionQueueGroup(resp.Msg.Groups, defaultActionGroupName)
|
|
require.NotNil(t, deployGroup)
|
|
require.NotNil(t, defaultGroup)
|
|
|
|
assert.Equal(t, int32(2), deployGroup.MaxConcurrent)
|
|
assert.Equal(t, int32(5), deployGroup.QueueSize)
|
|
assert.Equal(t, "💾", deployGroup.Icon)
|
|
assert.Equal(t, int32(2), deployGroup.ActiveCount)
|
|
assert.Equal(t, int32(1), deployGroup.QueuedCount)
|
|
require.Len(t, deployGroup.Actions, 1)
|
|
assert.Equal(t, "backup", deployGroup.Actions[0].ActionTitle)
|
|
require.Len(t, deployGroup.Actions[0].Entries, 2)
|
|
|
|
require.Len(t, defaultGroup.Actions, 1)
|
|
assert.Equal(t, "ping", defaultGroup.Actions[0].ActionTitle)
|
|
assert.Equal(t, int32(1), defaultGroup.Actions[0].ActiveCount)
|
|
}
|
|
|
|
func findExecutionQueueGroup(groups []*apiv1.ExecutionQueueGroup, name string) *apiv1.ExecutionQueueGroup {
|
|
for _, group := range groups {
|
|
if group.Name == name {
|
|
return group
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func newAPIQueueLogEntry(binding *executor.ActionBinding, started bool, finished bool) *executor.InternalLogEntry {
|
|
startedAt := time.Now().Add(-time.Minute)
|
|
if started {
|
|
startedAt = time.Now().Add(-2 * time.Minute)
|
|
}
|
|
|
|
entry := &executor.InternalLogEntry{
|
|
Binding: binding,
|
|
DatetimeStarted: startedAt,
|
|
ExecutionTrackingID: uuid.NewString(),
|
|
ActionTitle: binding.Action.Title,
|
|
ExecutionStarted: started,
|
|
ExecutionFinished: finished,
|
|
}
|
|
|
|
if finished {
|
|
entry.DatetimeFinished = time.Now()
|
|
}
|
|
|
|
return entry
|
|
}
|