Skip to content

Commit

Permalink
refactor: introduce dedicated runstatus package
Browse files Browse the repository at this point in the history
  • Loading branch information
leg100 committed Mar 2, 2025
1 parent 45f2329 commit 04d8aef
Show file tree
Hide file tree
Showing 46 changed files with 463 additions and 440 deletions.
19 changes: 0 additions & 19 deletions internal/http/html/components/run.templ

This file was deleted.

3 changes: 2 additions & 1 deletion internal/integration/daemon_helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"github.com/leg100/otf/internal/resource"
"github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runner"
"github.com/leg100/otf/internal/runstatus"
"github.com/leg100/otf/internal/sql"
"github.com/leg100/otf/internal/state"
"github.com/leg100/otf/internal/team"
Expand Down Expand Up @@ -207,7 +208,7 @@ func (s *testDaemon) getRun(t *testing.T, ctx context.Context, runID resource.ID
return run
}

func (s *testDaemon) waitRunStatus(t *testing.T, runID resource.ID, status run.Status) *run.Run {
func (s *testDaemon) waitRunStatus(t *testing.T, runID resource.ID, status runstatus.Status) *run.Run {
t.Helper()

for event := range s.runEvents {
Expand Down
10 changes: 5 additions & 5 deletions internal/integration/notification_gcppubsub_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
"github.com/google/uuid"
"github.com/leg100/otf/internal"
"github.com/leg100/otf/internal/notifications"
otfrun "github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runstatus"
"github.com/leg100/otf/internal/testutils"
"github.com/leg100/otf/internal/workspace"
"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -82,10 +82,10 @@ func TestIntegration_NotificationGCPPubSub(t *testing.T) {
got = append(got, <-received)

// keep a record of whether a match was found for each expected status
matches := map[otfrun.Status]bool{
otfrun.RunPending: false,
otfrun.RunPlanning: false,
otfrun.RunPlanned: false,
matches := map[runstatus.Status]bool{
runstatus.Pending: false,
runstatus.Planning: false,
runstatus.Planned: false,
}
for _, g := range got {
var payload notifications.GenericPayload
Expand Down
10 changes: 5 additions & 5 deletions internal/integration/remote_state_sharing_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"testing"

"github.com/leg100/otf/internal"
"github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runstatus"
"github.com/leg100/otf/internal/workspace"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
Expand Down Expand Up @@ -43,12 +43,12 @@ func TestRemoteStateSharing(t *testing.T) {
producerRun := daemon.createRun(t, ctx, producer, producerCV, nil)

// Wait for run to reach planned state before applying
planned := daemon.waitRunStatus(t, producerRun.ID, run.RunPlanned)
planned := daemon.waitRunStatus(t, producerRun.ID, runstatus.Planned)
err = daemon.Runs.Apply(ctx, planned.ID)
require.NoError(t, err)

// Wait for run to be applied
daemon.waitRunStatus(t, producerRun.ID, run.RunApplied)
daemon.waitRunStatus(t, producerRun.ID, runstatus.Applied)

// consume state in a run in the consumer workspace from the producer
// workspace.
Expand Down Expand Up @@ -80,10 +80,10 @@ output "remote_foo" {

// create run and apply
consumerRun := daemon.createRun(t, ctx, consumer, consumerCV, nil)
planned = daemon.waitRunStatus(t, consumerRun.ID, run.RunPlanned)
planned = daemon.waitRunStatus(t, consumerRun.ID, runstatus.Planned)
err = daemon.Runs.Apply(ctx, planned.ID)
require.NoError(t, err)
daemon.waitRunStatus(t, consumerRun.ID, run.RunApplied)
daemon.waitRunStatus(t, consumerRun.ID, runstatus.Applied)

got := daemon.getCurrentState(t, ctx, consumer.ID)
if assert.Contains(t, got.Outputs, "remote_foo", got.Outputs) {
Expand Down
4 changes: 2 additions & 2 deletions internal/integration/retry_run_ui_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (

"github.com/leg100/otf/internal"
"github.com/leg100/otf/internal/configversion"
"github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runstatus"
"github.com/playwright-community/playwright-go"
"github.com/stretchr/testify/require"
)
Expand All @@ -21,7 +21,7 @@ func TestIntegration_RetryRunUI(t *testing.T) {
})
// create a run and wait for it reach planned-and-finished state
r := daemon.createRun(t, ctx, ws, cv, nil)
daemon.waitRunStatus(t, r.ID, run.RunPlannedAndFinished)
daemon.waitRunStatus(t, r.ID, runstatus.PlannedAndFinished)

// open browser, go to run, and click retry
browser.New(t, ctx, func(page playwright.Page) {
Expand Down
4 changes: 2 additions & 2 deletions internal/integration/run_api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
tfe "github.com/hashicorp/go-tfe"
"github.com/leg100/otf/internal"
"github.com/leg100/otf/internal/github"
"github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runstatus"
"github.com/leg100/otf/internal/testutils"
"github.com/leg100/otf/internal/vcs"
"github.com/leg100/otf/internal/workspace"
Expand Down Expand Up @@ -58,7 +58,7 @@ func TestIntegration_RunAPI(t *testing.T) {
require.NoError(t, err)

// wait for run to reach planned status
planned := daemon.waitRunStatus(t, testutils.ParseID(t, created.ID), run.RunPlanned)
planned := daemon.waitRunStatus(t, testutils.ParseID(t, created.ID), runstatus.Planned)

// run should have planned two resources (defined in the config from the
// github repo)
Expand Down
4 changes: 2 additions & 2 deletions internal/integration/run_cancel_interrupt_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import (

"github.com/leg100/otf/internal"
"github.com/leg100/otf/internal/releases"
"github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runner"
"github.com/leg100/otf/internal/runstatus"
"github.com/leg100/otf/internal/variable"
"github.com/leg100/otf/internal/workspace"
"github.com/stretchr/testify/require"
Expand Down Expand Up @@ -86,5 +86,5 @@ func TestIntegration_RunCancelInterrupt(t *testing.T) {

// canceling the job should result in the run then entering the canceled
// state.
daemon.waitRunStatus(t, r.ID, run.RunCanceled)
daemon.waitRunStatus(t, r.ID, runstatus.Canceled)
}
4 changes: 2 additions & 2 deletions internal/integration/run_error_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import (

"github.com/leg100/otf/internal"
"github.com/leg100/otf/internal/resource"
"github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runner"
"github.com/leg100/otf/internal/runstatus"
"github.com/leg100/otf/internal/workspace"
"github.com/stretchr/testify/require"
)
Expand Down Expand Up @@ -99,7 +99,7 @@ func TestRunError(t *testing.T) {
gotErrorLogs = true
}
case event := <-daemon.runEvents:
if event.Payload.Status == run.RunErrored {
if event.Payload.Status == runstatus.Errored {
gotErrorStatus = true
}
}
Expand Down
6 changes: 3 additions & 3 deletions internal/integration/run_job_cancel_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import (

"github.com/leg100/otf/internal/daemon"
"github.com/leg100/otf/internal/pubsub"
"github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runner"
"github.com/leg100/otf/internal/runstatus"
"github.com/stretchr/testify/require"
)

Expand All @@ -27,7 +27,7 @@ func TestIntegration_RunJobCancel(t *testing.T) {

// Create run, and wait til it reaches plan queued state
r := daemon.createRun(t, ctx, nil, nil, nil)
daemon.waitRunStatus(t, r.ID, run.RunPlanQueued)
daemon.waitRunStatus(t, r.ID, runstatus.PlanQueued)
// Job should be automatically created
wait(t, jobs, func(event pubsub.Event[*runner.Job]) bool {
return event.Payload.RunID == r.ID
Expand All @@ -38,7 +38,7 @@ func TestIntegration_RunJobCancel(t *testing.T) {
require.NoError(t, err)

// Run and job should now enter canceled state.
daemon.waitRunStatus(t, r.ID, run.RunCanceled)
daemon.waitRunStatus(t, r.ID, runstatus.Canceled)
wait(t, jobs, func(event pubsub.Event[*runner.Job]) bool {
return event.Payload.Status == runner.JobCanceled &&
event.Payload.RunID == r.ID
Expand Down
12 changes: 6 additions & 6 deletions internal/integration/run_scheduler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (

"github.com/leg100/otf/internal/pubsub"
"github.com/leg100/otf/internal/resource"
otfrun "github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runstatus"
"github.com/leg100/otf/internal/workspace"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
Expand All @@ -31,22 +31,22 @@ func TestRunScheduler(t *testing.T) {
waitWorkspaceLock(t, workspaceEvents, &run1.ID)

// Wait for Run#1 to be planned
daemon.waitRunStatus(t, run1.ID, otfrun.RunPlanned)
daemon.waitRunStatus(t, run1.ID, runstatus.Planned)
// Run#2 should still be pending
assert.Equal(t, otfrun.RunPending, daemon.getRun(t, ctx, run2.ID).Status)
assert.Equal(t, runstatus.Pending, daemon.getRun(t, ctx, run2.ID).Status)

// Apply Run#1
err := daemon.Runs.Apply(ctx, run1.ID)
require.NoError(t, err)

// Wait for Run#1 to be applied
daemon.waitRunStatus(t, run1.ID, otfrun.RunApplied)
daemon.waitRunStatus(t, run1.ID, runstatus.Applied)

// Wait for Run#2 to lock workspace
waitWorkspaceLock(t, workspaceEvents, &run2.ID)

// Wait for Run#2 to be planned&finished (because there are no changes)
daemon.waitRunStatus(t, run2.ID, otfrun.RunPlannedAndFinished)
daemon.waitRunStatus(t, run2.ID, runstatus.PlannedAndFinished)

// Wait for workspace to be unlocked
waitWorkspaceLock(t, workspaceEvents, nil)
Expand All @@ -66,7 +66,7 @@ func TestRunScheduler(t *testing.T) {
require.NoError(t, err)

// Run #3 should now proceed to planned&finished
daemon.waitRunStatus(t, run3.ID, otfrun.RunPlannedAndFinished)
daemon.waitRunStatus(t, run3.ID, runstatus.PlannedAndFinished)
}

func waitWorkspaceLock(t *testing.T, events <-chan pubsub.Event[*workspace.Workspace], lock *resource.ID) {
Expand Down
13 changes: 7 additions & 6 deletions internal/integration/run_service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/leg100/otf/internal/github"
"github.com/leg100/otf/internal/resource"
otfrun "github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runstatus"
"github.com/leg100/otf/internal/testutils"
"github.com/leg100/otf/internal/user"
"github.com/leg100/otf/internal/vcs"
Expand Down Expand Up @@ -100,8 +101,8 @@ func TestRunService(t *testing.T) {
assert.Nil(t, ws.Lock)
}

assert.Equal(t, otfrun.RunPlanQueued, got.Status)
timestamp, err := got.StatusTimestamp(otfrun.RunPlanQueued)
assert.Equal(t, runstatus.PlanQueued, got.Status)
timestamp, err := got.StatusTimestamp(runstatus.PlanQueued)
assert.NoError(t, err)
assert.True(t, timestamp.After(got.CreatedAt))
})
Expand All @@ -118,8 +119,8 @@ func TestRunService(t *testing.T) {
got, err := svc.Runs.Get(ctx, run.ID)
require.NoError(t, err)

assert.Equal(t, otfrun.RunCanceled, got.Status)
canceled, err := got.StatusTimestamp(otfrun.RunCanceled)
assert.Equal(t, runstatus.Canceled, got.Status)
canceled, err := got.StatusTimestamp(runstatus.Canceled)
assert.NoError(t, err)
assert.True(t, canceled.After(got.CreatedAt))
})
Expand Down Expand Up @@ -202,7 +203,7 @@ func TestRunService(t *testing.T) {
},
{
name: "by pending status",
opts: otfrun.ListOptions{Organization: internal.String(ws1.Organization), Statuses: []otfrun.Status{otfrun.RunPending}},
opts: otfrun.ListOptions{Organization: internal.String(ws1.Organization), Statuses: []runstatus.Status{runstatus.Pending}},
want: func(t *testing.T, l *resource.Page[*otfrun.Run]) {
assert.Equal(t, 2, len(l.Items))
assert.Contains(t, l.Items, run1)
Expand All @@ -211,7 +212,7 @@ func TestRunService(t *testing.T) {
},
{
name: "by statuses - no match",
opts: otfrun.ListOptions{Organization: internal.String(ws1.Organization), Statuses: []otfrun.Status{otfrun.RunPlanned}},
opts: otfrun.ListOptions{Organization: internal.String(ws1.Organization), Statuses: []runstatus.Status{runstatus.Planned}},
want: func(t *testing.T, l *resource.Page[*otfrun.Run]) {
assert.Equal(t, 0, len(l.Items))
},
Expand Down
11 changes: 6 additions & 5 deletions internal/integration/run_status_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

"github.com/leg100/otf/internal"
"github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runstatus"
"github.com/leg100/otf/internal/workspace"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
Expand Down Expand Up @@ -34,14 +35,14 @@ func TestIntegration_RunStatus(t *testing.T) {
steps := []struct {
name string
config string
wantStatus run.Status
wantStatus runstatus.Status
wantResourceReport run.Report
wantOutputReport run.Report
}{
{
name: "add resource",
config: `resource "random_pet" "cat" { prefix = "mr-" }`,
wantStatus: run.RunApplied,
wantStatus: runstatus.Applied,
wantResourceReport: run.Report{
Additions: 1,
},
Expand All @@ -50,7 +51,7 @@ func TestIntegration_RunStatus(t *testing.T) {
name: "replace resource",
config: `resource "random_pet" "cat" { prefix = "sir-" }
`,
wantStatus: run.RunApplied,
wantStatus: runstatus.Applied,
wantResourceReport: run.Report{
Additions: 1,
Destructions: 1,
Expand All @@ -61,14 +62,14 @@ func TestIntegration_RunStatus(t *testing.T) {
config: `resource "random_pet" "cat" { prefix = "sir-" }
output "cat_name" { value = random_pet.cat.id }
`,
wantStatus: run.RunApplied,
wantStatus: runstatus.Applied,
wantOutputReport: run.Report{
Additions: 1,
},
},
{
name: "destroy all",
wantStatus: run.RunApplied,
wantStatus: runstatus.Applied,
wantResourceReport: run.Report{
Destructions: 1,
},
Expand Down
6 changes: 3 additions & 3 deletions internal/integration/state_ui_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"regexp"
"testing"

"github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runstatus"
"github.com/playwright-community/playwright-go"
"github.com/stretchr/testify/require"
)
Expand All @@ -20,10 +20,10 @@ func TestIntegration_StateUI(t *testing.T) {

// create run and wait for it to complete
r := daemon.createRun(t, ctx, ws, cv, nil)
planned := daemon.waitRunStatus(t, r.ID, run.RunPlanned)
planned := daemon.waitRunStatus(t, r.ID, runstatus.Planned)
err := daemon.Runs.Apply(ctx, planned.ID)
require.NoError(t, err)
daemon.waitRunStatus(t, r.ID, run.RunApplied)
daemon.waitRunStatus(t, r.ID, runstatus.Applied)

browser.New(t, ctx, func(page playwright.Page) {
_, err := page.Goto(workspaceURL(daemon.System.Hostname(), org.Name, ws.Name))
Expand Down
4 changes: 2 additions & 2 deletions internal/integration/terraform_cli_cancel_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (

goexpect "github.com/google/goexpect"
"github.com/leg100/otf/internal"
"github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runstatus"
"github.com/leg100/otf/internal/testutils"
"github.com/stretchr/testify/require"
)
Expand Down Expand Up @@ -79,7 +79,7 @@ data "http" "wait" {

for event := range svc.runEvents {
r := event.Payload
if r.Status == run.RunCanceled {
if r.Status == runstatus.Canceled {
break
}
require.False(t, r.Done(), "run unexpectedly finished with status %s", r.Status)
Expand Down
3 changes: 2 additions & 1 deletion internal/integration/terraform_cli_discard_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
goexpect "github.com/google/goexpect"
"github.com/leg100/otf/internal"
"github.com/leg100/otf/internal/run"
"github.com/leg100/otf/internal/runstatus"
"github.com/stretchr/testify/require"
)

Expand Down Expand Up @@ -51,5 +52,5 @@ func TestIntegration_TerraformCLIDiscard(t *testing.T) {
runs, err := svc.Runs.List(ctx, run.ListOptions{Organization: &org.Name})
require.NoError(t, err)
require.Equal(t, 1, len(runs.Items))
require.Equal(t, run.RunDiscarded, runs.Items[0].Status)
require.Equal(t, runstatus.Discarded, runs.Items[0].Status)
}
Loading

0 comments on commit 04d8aef

Please sign in to comment.