api_queue_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package api
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. "connectrpc.com/connect"
  7. apiv1 "github.com/OliveTin/OliveTin/gen/olivetin/api/v1"
  8. config "github.com/OliveTin/OliveTin/internal/config"
  9. "github.com/OliveTin/OliveTin/internal/executor"
  10. "github.com/google/uuid"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/stretchr/testify/require"
  13. )
  14. func TestGetExecutionQueueGroupsByActionGroup(t *testing.T) {
  15. cfg := config.DefaultConfig()
  16. cfg.ActionGroups = map[string]*config.ActionGroup{
  17. "deploy": {MaxConcurrent: 2, Icon: "backup"},
  18. }
  19. cfg.Actions = []*config.Action{
  20. {Title: "backup", Shell: "sleep 1", MaxConcurrent: 1, Groups: []string{"deploy"}},
  21. {Title: "ping", Shell: "echo ping"},
  22. }
  23. cfg.Sanitize()
  24. ex := executor.DefaultExecutor(cfg)
  25. ex.RebuildActionMap()
  26. backupBinding := ex.FindBindingWithNoEntity(cfg.Actions[0])
  27. pingBinding := ex.FindBindingWithNoEntity(cfg.Actions[1])
  28. require.NotNil(t, backupBinding)
  29. require.NotNil(t, pingBinding)
  30. backupRunning := newAPIQueueLogEntry(backupBinding, true, false)
  31. backupWaiting := newAPIQueueLogEntry(backupBinding, false, false)
  32. backupWaiting.Queued = true
  33. pingRunning := newAPIQueueLogEntry(pingBinding, true, false)
  34. ex.SetLog(backupRunning.ExecutionTrackingID, backupRunning)
  35. ex.SetLog(backupWaiting.ExecutionTrackingID, backupWaiting)
  36. ex.SetLog(pingRunning.ExecutionTrackingID, pingRunning)
  37. ts, client := getNewTestServerAndClientWithExecutor(cfg, ex)
  38. defer ts.Close()
  39. resp, err := client.GetExecutionQueue(context.Background(), connect.NewRequest(&apiv1.GetExecutionQueueRequest{}))
  40. require.NoError(t, err)
  41. require.NotNil(t, resp)
  42. assert.Equal(t, int32(3), resp.Msg.TotalActive)
  43. require.Len(t, resp.Msg.Groups, 2)
  44. deployGroup := findExecutionQueueGroup(resp.Msg.Groups, "deploy")
  45. defaultGroup := findExecutionQueueGroup(resp.Msg.Groups, defaultActionGroupName)
  46. require.NotNil(t, deployGroup)
  47. require.NotNil(t, defaultGroup)
  48. assert.Equal(t, int32(2), deployGroup.MaxConcurrent)
  49. assert.Equal(t, int32(5), deployGroup.QueueSize)
  50. assert.Equal(t, "💾", deployGroup.Icon)
  51. assert.Equal(t, int32(2), deployGroup.ActiveCount)
  52. assert.Equal(t, int32(1), deployGroup.QueuedCount)
  53. require.Len(t, deployGroup.Actions, 1)
  54. assert.Equal(t, "backup", deployGroup.Actions[0].ActionTitle)
  55. require.Len(t, deployGroup.Actions[0].Entries, 2)
  56. require.Len(t, defaultGroup.Actions, 1)
  57. assert.Equal(t, "ping", defaultGroup.Actions[0].ActionTitle)
  58. assert.Equal(t, int32(1), defaultGroup.Actions[0].ActiveCount)
  59. }
  60. func findExecutionQueueGroup(groups []*apiv1.ExecutionQueueGroup, name string) *apiv1.ExecutionQueueGroup {
  61. for _, group := range groups {
  62. if group.Name == name {
  63. return group
  64. }
  65. }
  66. return nil
  67. }
  68. func newAPIQueueLogEntry(binding *executor.ActionBinding, started bool, finished bool) *executor.InternalLogEntry {
  69. startedAt := time.Now().Add(-time.Minute)
  70. if started {
  71. startedAt = time.Now().Add(-2 * time.Minute)
  72. }
  73. entry := &executor.InternalLogEntry{
  74. Binding: binding,
  75. DatetimeStarted: startedAt,
  76. ExecutionTrackingID: uuid.NewString(),
  77. ActionTitle: binding.Action.Title,
  78. ExecutionStarted: started,
  79. ExecutionFinished: finished,
  80. }
  81. if finished {
  82. entry.DatetimeFinished = time.Now()
  83. }
  84. return entry
  85. }