From 8297c939194cd4928e85d81b44703e7d1b31b09f Mon Sep 17 00:00:00 2001 From: Steve Nay <265958+snay2@users.noreply.github.com> Date: Tue, 12 Jul 2022 10:18:25 -0500 Subject: [PATCH 1/2] Handle scheduled events immediately in IMDS mode, the same as queue processor mode --- pkg/monitor/scheduledevent/scheduled-event-monitor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/monitor/scheduledevent/scheduled-event-monitor.go b/pkg/monitor/scheduledevent/scheduled-event-monitor.go index 4d43e96d..a7c06070 100644 --- a/pkg/monitor/scheduledevent/scheduled-event-monitor.go +++ b/pkg/monitor/scheduledevent/scheduled-event-monitor.go @@ -105,7 +105,7 @@ func (m ScheduledEventMonitor) checkForScheduledEvents() ([]monitor.Interruption Description: fmt.Sprintf("%s will occur between %s and %s because %s\n", scheduledEvent.Code, scheduledEvent.NotBefore, scheduledEvent.NotAfter, scheduledEvent.Description), State: scheduledEvent.State, NodeName: m.NodeName, - StartTime: notBefore, + StartTime: time.Now(), EndTime: notAfter, PreDrainTask: preDrainFunc, }) From e42318635ac50b88fc25c0b4addba15d6889dab8 Mon Sep 17 00:00:00 2001 From: Steve Nay <265958+snay2@users.noreply.github.com> Date: Thu, 21 Jul 2022 10:10:10 -0500 Subject: [PATCH 2/2] Update unit tests to expect StartTime to be roughly the same as time.Now() --- .../scheduledevent/scheduled-event-monitor_test.go | 12 +++++++++--- pkg/test/helpers.go | 10 ++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/pkg/monitor/scheduledevent/scheduled-event-monitor_test.go b/pkg/monitor/scheduledevent/scheduled-event-monitor_test.go index 2bb99695..eb7fbb8f 100644 --- a/pkg/monitor/scheduledevent/scheduled-event-monitor_test.go +++ b/pkg/monitor/scheduledevent/scheduled-event-monitor_test.go @@ -18,6 +18,7 @@ import ( "net/http/httptest" "strings" "testing" + "time" "github.com/aws/aws-node-termination-handler/pkg/ec2metadata" "github.com/aws/aws-node-termination-handler/pkg/monitor" @@ -47,6 +48,11 @@ var scheduledEventResponse = []byte(`[{ "State": "` + scheduledEventState + `" }]`) +// oneSecondAgo returns a time.Time object representing one second prior to now +func oneSecondAgo() time.Time { + return time.Now().Add(time.Second * -1) +} + func TestMonitor_Success(t *testing.T) { var requestPath string = ec2metadata.ScheduledEventPath @@ -71,7 +77,7 @@ func TestMonitor_Success(t *testing.T) { h.Equals(t, scheduledEventId, result.EventID) h.Equals(t, scheduledevent.ScheduledEventKind, result.Kind) h.Equals(t, scheduledEventState, result.State) - h.Equals(t, expScheduledEventStartTimeFmt, result.StartTime.String()) + h.TimeWithinRange(t, result.StartTime, oneSecondAgo(), time.Now()) h.Equals(t, expScheduledEventEndTimeFmt, result.EndTime.String()) h.Assert(t, strings.Contains(result.Description, scheduledEventCode), @@ -126,7 +132,7 @@ func TestMonitor_CanceledEvent(t *testing.T) { h.Equals(t, scheduledEventId, result.EventID) h.Equals(t, scheduledevent.ScheduledEventKind, result.Kind) h.Equals(t, state, result.State) - h.Equals(t, expScheduledEventStartTimeFmt, result.StartTime.String()) + h.TimeWithinRange(t, result.StartTime, oneSecondAgo(), time.Now()) h.Equals(t, expScheduledEventEndTimeFmt, result.EndTime.String()) h.Assert(t, strings.Contains(result.Description, scheduledEventCode), @@ -253,7 +259,7 @@ func TestMonitor_EndTimeParseFail(t *testing.T) { h.Equals(t, scheduledEventId, result.EventID) h.Equals(t, scheduledevent.ScheduledEventKind, result.Kind) h.Equals(t, scheduledEventState, result.State) - h.Equals(t, expScheduledEventStartTimeFmt, result.StartTime.String()) + h.TimeWithinRange(t, result.StartTime, oneSecondAgo(), time.Now()) h.Equals(t, expScheduledEventStartTimeFmt, result.EndTime.String()) h.Assert(t, strings.Contains(result.Description, scheduledEventCode), diff --git a/pkg/test/helpers.go b/pkg/test/helpers.go index 332cec0e..74fcf26a 100644 --- a/pkg/test/helpers.go +++ b/pkg/test/helpers.go @@ -19,6 +19,7 @@ import ( "reflect" "runtime" "testing" + "time" ) // Assert fails the test if the condition is false. @@ -57,3 +58,12 @@ func Equals(tb testing.TB, exp, act interface{}) { } } + +// TimeWithinRange fails the test if act is not after lowerBound or not before upperBound +func TimeWithinRange(tb testing.TB, act time.Time, lowerBound time.Time, upperBound time.Time) { + if !(act.After(lowerBound) && act.Before(upperBound)) { + _, file, line, _ := runtime.Caller(1) + fmt.Printf("\033[31m%s:%d:\n\n\tlower bound: %#v\n\n\tgot: %#v\n\n\tupper bound: %#v\033[39m\n\n", filepath.Base(file), line, lowerBound, act, upperBound) + tb.FailNow() + } +}