Skip to content
This repository was archived by the owner on Aug 29, 2024. It is now read-only.

Commit 3bda9bb

Browse files
authored
Refresh session if token expires during delete message (actions#3529)
1 parent ab92e4e commit 3bda9bb

File tree

2 files changed

+104
-2
lines changed

2 files changed

+104
-2
lines changed

cmd/ghalistener/listener/listener.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,23 @@ func (l *Listener) getMessage(ctx context.Context) (*actions.RunnerScaleSetMessa
295295

296296
func (l *Listener) deleteLastMessage(ctx context.Context) error {
297297
l.logger.Info("Deleting last message", "lastMessageID", l.lastMessageID)
298-
if err := l.client.DeleteMessage(ctx, l.session.MessageQueueUrl, l.session.MessageQueueAccessToken, l.lastMessageID); err != nil {
299-
return fmt.Errorf("failed to delete message: %w", err)
298+
err := l.client.DeleteMessage(ctx, l.session.MessageQueueUrl, l.session.MessageQueueAccessToken, l.lastMessageID)
299+
if err == nil { // if NO error
300+
return nil
301+
}
302+
303+
expiredError := &actions.MessageQueueTokenExpiredError{}
304+
if !errors.As(err, &expiredError) {
305+
return fmt.Errorf("failed to delete last message: %w", err)
306+
}
307+
308+
if err := l.refreshSession(ctx); err != nil {
309+
return err
310+
}
311+
312+
err = l.client.DeleteMessage(ctx, l.session.MessageQueueUrl, l.session.MessageQueueAccessToken, l.lastMessageID)
313+
if err != nil {
314+
return fmt.Errorf("failed to delete last message after message session refresh: %w", err)
300315
}
301316

302317
return nil

cmd/ghalistener/listener/listener_test.go

+87
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,93 @@ func TestListener_deleteLastMessage(t *testing.T) {
377377
err = l.deleteLastMessage(ctx)
378378
assert.NotNil(t, err)
379379
})
380+
381+
t.Run("RefreshAndSucceeds", func(t *testing.T) {
382+
t.Parallel()
383+
384+
ctx := context.Background()
385+
config := Config{
386+
ScaleSetID: 1,
387+
Metrics: metrics.Discard,
388+
}
389+
390+
client := listenermocks.NewClient(t)
391+
392+
newUUID := uuid.New()
393+
session := &actions.RunnerScaleSetSession{
394+
SessionId: &newUUID,
395+
OwnerName: "example",
396+
RunnerScaleSet: &actions.RunnerScaleSet{},
397+
MessageQueueUrl: "https://example.com",
398+
MessageQueueAccessToken: "1234567890",
399+
Statistics: nil,
400+
}
401+
client.On("RefreshMessageSession", ctx, mock.Anything, mock.Anything).Return(session, nil).Once()
402+
403+
client.On("DeleteMessage", ctx, mock.Anything, mock.Anything, mock.Anything).Return(&actions.MessageQueueTokenExpiredError{}).Once()
404+
405+
client.On("DeleteMessage", ctx, mock.Anything, mock.Anything, mock.MatchedBy(func(lastMessageID any) bool {
406+
return lastMessageID.(int64) == int64(5)
407+
})).Return(nil).Once()
408+
config.Client = client
409+
410+
l, err := New(config)
411+
require.Nil(t, err)
412+
413+
oldUUID := uuid.New()
414+
l.session = &actions.RunnerScaleSetSession{
415+
SessionId: &oldUUID,
416+
RunnerScaleSet: &actions.RunnerScaleSet{},
417+
}
418+
l.lastMessageID = 5
419+
420+
config.Client = client
421+
422+
err = l.deleteLastMessage(ctx)
423+
assert.NoError(t, err)
424+
})
425+
426+
t.Run("RefreshAndFails", func(t *testing.T) {
427+
t.Parallel()
428+
429+
ctx := context.Background()
430+
config := Config{
431+
ScaleSetID: 1,
432+
Metrics: metrics.Discard,
433+
}
434+
435+
client := listenermocks.NewClient(t)
436+
437+
newUUID := uuid.New()
438+
session := &actions.RunnerScaleSetSession{
439+
SessionId: &newUUID,
440+
OwnerName: "example",
441+
RunnerScaleSet: &actions.RunnerScaleSet{},
442+
MessageQueueUrl: "https://example.com",
443+
MessageQueueAccessToken: "1234567890",
444+
Statistics: nil,
445+
}
446+
client.On("RefreshMessageSession", ctx, mock.Anything, mock.Anything).Return(session, nil).Once()
447+
448+
client.On("DeleteMessage", ctx, mock.Anything, mock.Anything, mock.Anything).Return(&actions.MessageQueueTokenExpiredError{}).Twice()
449+
450+
config.Client = client
451+
452+
l, err := New(config)
453+
require.Nil(t, err)
454+
455+
oldUUID := uuid.New()
456+
l.session = &actions.RunnerScaleSetSession{
457+
SessionId: &oldUUID,
458+
RunnerScaleSet: &actions.RunnerScaleSet{},
459+
}
460+
l.lastMessageID = 5
461+
462+
config.Client = client
463+
464+
err = l.deleteLastMessage(ctx)
465+
assert.Error(t, err)
466+
})
380467
}
381468

382469
func TestListener_Listen(t *testing.T) {

0 commit comments

Comments
 (0)