Skip to content

Commit 2059d6e

Browse files
authored
Ignore delayed buffered phoned home events during machine reclaim (#631)
1 parent ba9a75c commit 2059d6e

File tree

15 files changed

+177
-79
lines changed

15 files changed

+177
-79
lines changed

cmd/metal-api/internal/fsm/events.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ func Events() fsm.Events {
8888
Src: []string{
8989
states.PlannedReboot.String(),
9090
states.PhonedHome.String(),
91+
states.PXEBooting.String(),
92+
states.Preparing.String(),
93+
states.Registering.String(),
94+
states.Waiting.String(),
9195
},
9296
Dst: SelfTransitionState,
9397
},

cmd/metal-api/internal/fsm/fsm_test.go

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package fsm
33
import (
44
"context"
55
"log/slog"
6+
"os"
67
"testing"
78
"time"
89

@@ -13,7 +14,8 @@ import (
1314
func TestHandleProvisioningEvent(t *testing.T) {
1415
now := time.Now()
1516
lastEventTime := now.Add(-time.Minute * 4)
16-
exceedThresholdTime := now.Add(-time.Minute * 10)
17+
exceedReclaimThresholdTime := now.Add(-time.Minute * 10)
18+
exceedBufferedPhonedHomeThreshold := now.Add(-time.Minute * 10)
1719
tests := []struct {
1820
event *metal.ProvisioningEvent
1921
container *metal.ProvisioningEventContainer
@@ -427,12 +429,12 @@ func TestHandleProvisioningEvent(t *testing.T) {
427429
container: &metal.ProvisioningEventContainer{
428430
Events: metal.ProvisioningEvents{
429431
{
430-
Time: exceedThresholdTime,
432+
Time: exceedReclaimThresholdTime,
431433
Event: metal.ProvisioningEventMachineReclaim,
432434
},
433435
},
434436
Liveliness: metal.MachineLivelinessAlive,
435-
LastEventTime: &exceedThresholdTime,
437+
LastEventTime: &exceedReclaimThresholdTime,
436438
},
437439
event: &metal.ProvisioningEvent{
438440
Time: now,
@@ -446,7 +448,7 @@ func TestHandleProvisioningEvent(t *testing.T) {
446448
LastEventTime: &now,
447449
Events: metal.ProvisioningEvents{
448450
{
449-
Time: exceedThresholdTime,
451+
Time: exceedReclaimThresholdTime,
450452
Event: metal.ProvisioningEventMachineReclaim,
451453
},
452454
},
@@ -626,12 +628,69 @@ func TestHandleProvisioningEvent(t *testing.T) {
626628
},
627629
},
628630
},
631+
{
632+
name: "swallow delayed buffered phoned home event",
633+
container: &metal.ProvisioningEventContainer{
634+
Events: metal.ProvisioningEvents{
635+
{
636+
Time: lastEventTime,
637+
Event: metal.ProvisioningEventWaiting,
638+
},
639+
},
640+
Liveliness: metal.MachineLivelinessAlive,
641+
LastEventTime: &lastEventTime,
642+
},
643+
event: &metal.ProvisioningEvent{
644+
Time: now,
645+
Event: metal.ProvisioningEventPhonedHome,
646+
},
647+
want: &metal.ProvisioningEventContainer{
648+
Liveliness: metal.MachineLivelinessAlive,
649+
LastEventTime: &lastEventTime,
650+
Events: metal.ProvisioningEvents{
651+
{
652+
Time: lastEventTime,
653+
Event: metal.ProvisioningEventWaiting,
654+
},
655+
},
656+
},
657+
},
658+
{
659+
name: "buffered phoned home event threshold exceeded",
660+
container: &metal.ProvisioningEventContainer{
661+
Events: metal.ProvisioningEvents{
662+
{
663+
Time: exceedBufferedPhonedHomeThreshold,
664+
Event: metal.ProvisioningEventWaiting,
665+
},
666+
},
667+
Liveliness: metal.MachineLivelinessAlive,
668+
},
669+
event: &metal.ProvisioningEvent{
670+
Time: now,
671+
Event: metal.ProvisioningEventPhonedHome,
672+
},
673+
want: &metal.ProvisioningEventContainer{
674+
Liveliness: metal.MachineLivelinessAlive,
675+
LastEventTime: &now,
676+
Events: metal.ProvisioningEvents{
677+
{
678+
Time: now,
679+
Event: metal.ProvisioningEventPhonedHome,
680+
},
681+
{
682+
Time: exceedBufferedPhonedHomeThreshold,
683+
Event: metal.ProvisioningEventWaiting,
684+
},
685+
},
686+
},
687+
},
629688
}
630689
for i := range tests {
631690
ctx := context.Background()
632691
tt := tests[i]
633692
t.Run(tt.name, func(t *testing.T) {
634-
got, err := HandleProvisioningEvent(ctx, slog.Default(), tt.container, tt.event)
693+
got, err := HandleProvisioningEvent(ctx, slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug})), tt.container, tt.event)
635694
if diff := cmp.Diff(tt.wantErr, err); diff != "" {
636695
t.Errorf("HandleProvisioningEvent() diff = %s", diff)
637696
}

cmd/metal-api/internal/fsm/states/alive.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,21 @@ package states
22

33
import (
44
"context"
5-
"log/slog"
65

76
"github.com/looplab/fsm"
8-
"github.com/metal-stack/metal-api/cmd/metal-api/internal/metal"
97
)
108

119
type AliveState struct {
12-
log *slog.Logger
13-
container *metal.ProvisioningEventContainer
14-
event *metal.ProvisioningEvent
10+
*FSMState
1511
}
1612

1713
func newAlive(c *StateConfig) *AliveState {
1814
return &AliveState{
19-
log: c.Log,
20-
container: c.Container,
21-
event: c.Event,
15+
FSMState: &FSMState{
16+
container: c.Container,
17+
event: c.Event,
18+
log: c.Log,
19+
},
2220
}
2321
}
2422

cmd/metal-api/internal/fsm/states/booting-new-kernel.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@ import (
44
"context"
55

66
"github.com/looplab/fsm"
7-
"github.com/metal-stack/metal-api/cmd/metal-api/internal/metal"
87
)
98

109
type BootingNewKernelState struct {
11-
container *metal.ProvisioningEventContainer
12-
event *metal.ProvisioningEvent
10+
*FSMState
1311
}
1412

1513
func newBootingNewKernel(c *StateConfig) *BootingNewKernelState {
1614
return &BootingNewKernelState{
17-
container: c.Container,
18-
event: c.Event,
15+
FSMState: &FSMState{
16+
container: c.Container,
17+
event: c.Event,
18+
log: c.Log,
19+
},
1920
}
2021
}
2122

cmd/metal-api/internal/fsm/states/crashed.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@ import (
44
"context"
55

66
"github.com/looplab/fsm"
7-
"github.com/metal-stack/metal-api/cmd/metal-api/internal/metal"
87
)
98

109
type CrashState struct {
11-
container *metal.ProvisioningEventContainer
12-
event *metal.ProvisioningEvent
10+
*FSMState
1311
}
1412

1513
func newCrash(c *StateConfig) *CrashState {
1614
return &CrashState{
17-
container: c.Container,
18-
event: c.Event,
15+
FSMState: &FSMState{
16+
container: c.Container,
17+
event: c.Event,
18+
log: c.Log,
19+
},
1920
}
2021
}
2122

cmd/metal-api/internal/fsm/states/initial.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,19 @@ import (
55
"fmt"
66

77
"github.com/looplab/fsm"
8-
"github.com/metal-stack/metal-api/cmd/metal-api/internal/metal"
98
)
109

1110
type InitialState struct {
12-
container *metal.ProvisioningEventContainer
13-
event *metal.ProvisioningEvent
11+
*FSMState
1412
}
1513

1614
func newInitial(c *StateConfig) *InitialState {
1715
return &InitialState{
18-
container: c.Container,
19-
event: c.Event,
16+
FSMState: &FSMState{
17+
container: c.Container,
18+
event: c.Event,
19+
log: c.Log,
20+
},
2021
}
2122
}
2223

cmd/metal-api/internal/fsm/states/installing.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@ import (
44
"context"
55

66
"github.com/looplab/fsm"
7-
"github.com/metal-stack/metal-api/cmd/metal-api/internal/metal"
87
)
98

109
type InstallingState struct {
11-
container *metal.ProvisioningEventContainer
12-
event *metal.ProvisioningEvent
10+
*FSMState
1311
}
1412

1513
func newInstalling(c *StateConfig) *InstallingState {
1614
return &InstallingState{
17-
container: c.Container,
18-
event: c.Event,
15+
FSMState: &FSMState{
16+
container: c.Container,
17+
event: c.Event,
18+
log: c.Log,
19+
},
1920
}
2021
}
2122

cmd/metal-api/internal/fsm/states/machine-reclaim.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@ import (
44
"context"
55

66
"github.com/looplab/fsm"
7-
"github.com/metal-stack/metal-api/cmd/metal-api/internal/metal"
87
)
98

109
type MachineReclaimState struct {
11-
container *metal.ProvisioningEventContainer
12-
event *metal.ProvisioningEvent
10+
*FSMState
1311
}
1412

1513
func newMachineReclaim(c *StateConfig) *MachineReclaimState {
1614
return &MachineReclaimState{
17-
container: c.Container,
18-
event: c.Event,
15+
FSMState: &FSMState{
16+
container: c.Container,
17+
event: c.Event,
18+
log: c.Log,
19+
},
1920
}
2021
}
2122

cmd/metal-api/internal/fsm/states/phoned-home.go

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,21 @@ package states
22

33
import (
44
"context"
5-
"log/slog"
6-
"time"
75

86
"github.com/looplab/fsm"
9-
"github.com/metal-stack/metal-api/cmd/metal-api/internal/metal"
107
)
118

12-
// failedMachineReclaimThreshold is the duration after which the machine reclaim is assumed to have failed.
13-
const failedMachineReclaimThreshold = 5 * time.Minute
14-
159
type PhonedHomeState struct {
16-
log *slog.Logger
17-
container *metal.ProvisioningEventContainer
18-
event *metal.ProvisioningEvent
10+
*FSMState
1911
}
2012

2113
func newPhonedHome(c *StateConfig) *PhonedHomeState {
2214
return &PhonedHomeState{
23-
log: c.Log,
24-
container: c.Container,
25-
event: c.Event,
15+
FSMState: &FSMState{
16+
container: c.Container,
17+
event: c.Event,
18+
log: c.Log,
19+
},
2620
}
2721
}
2822

cmd/metal-api/internal/fsm/states/planned-reboot.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@ import (
44
"context"
55

66
"github.com/looplab/fsm"
7-
"github.com/metal-stack/metal-api/cmd/metal-api/internal/metal"
87
)
98

109
type PlannedRebootState struct {
11-
container *metal.ProvisioningEventContainer
12-
event *metal.ProvisioningEvent
10+
*FSMState
1311
}
1412

1513
func newPlannedReboot(c *StateConfig) *PlannedRebootState {
1614
return &PlannedRebootState{
17-
container: c.Container,
18-
event: c.Event,
15+
FSMState: &FSMState{
16+
container: c.Container,
17+
event: c.Event,
18+
log: c.Log,
19+
},
1920
}
2021
}
2122

0 commit comments

Comments
 (0)