diff --git a/CHANGELOG.md b/CHANGELOG.md index bb630529341..aa185e4965d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 1.21.0-dev +* Bug - Fixed a bug where unrecognized task cannot be stopped [#1467](https://github.com/aws/amazon-ecs-agent/pull/1467) + ## 1.20.1 * Bug - Fixed a bug where the agent couldn't be upgraded if there are tasks that use volumes in the task definition on the instance diff --git a/agent/acs/handler/acs_handler.go b/agent/acs/handler/acs_handler.go index 30cd067b004..05efbc5b9c2 100644 --- a/agent/acs/handler/acs_handler.go +++ b/agent/acs/handler/acs_handler.go @@ -16,14 +16,13 @@ package handler import ( + "context" "io" "net/url" "strconv" "strings" "time" - "context" - acsclient "github.com/aws/amazon-ecs-agent/agent/acs/client" "github.com/aws/amazon-ecs-agent/agent/acs/model/ecsacs" "github.com/aws/amazon-ecs-agent/agent/acs/update_handler" diff --git a/agent/acs/handler/payload_handler.go b/agent/acs/handler/payload_handler.go index 1fb81f92dd1..81bd6c283c6 100644 --- a/agent/acs/handler/payload_handler.go +++ b/agent/acs/handler/payload_handler.go @@ -337,6 +337,10 @@ func (payloadHandler *payloadRequestHandler) handleUnrecognizedTask(task *ecsacs TaskARN: *task.Arn, Status: apitaskstatus.TaskStopped, Reason: UnrecognizedTaskError{err}.Error(), + // The real task cannot be extracted from payload message, so we send an empty task. + // This is necessary because the task handler will not send an event whose + // Task is nil. + Task: &apitask.Task{}, } payloadHandler.taskHandler.AddStateChangeEvent(taskEvent, payloadHandler.ecsClient) diff --git a/agent/acs/handler/payload_handler_test.go b/agent/acs/handler/payload_handler_test.go index 82df6a5236f..004ac5600d4 100644 --- a/agent/acs/handler/payload_handler_test.go +++ b/agent/acs/handler/payload_handler_test.go @@ -15,12 +15,13 @@ package handler import ( + "context" + "errors" "fmt" "reflect" + "sync" "testing" - "context" - "github.com/aws/amazon-ecs-agent/agent/acs/model/ecsacs" "github.com/aws/amazon-ecs-agent/agent/api" "github.com/aws/amazon-ecs-agent/agent/api/mocks" @@ -754,3 +755,30 @@ func TestPayloadHandlerAddedASMAuthData(t *testing.T) { assert.Equal(t, aws.StringValue(expected.AsmAuthData.Region), actual.ASMAuthData.Region) assert.Equal(t, aws.StringValue(expected.AsmAuthData.CredentialsParameter), actual.ASMAuthData.CredentialsParameter) } + +func TestHandleUnrecognizedTask(t *testing.T) { + tester := setup(t) + defer tester.ctrl.Finish() + + arn := "arn" + ecsacsTask := &ecsacs.Task{Arn: &arn} + payloadMessage := &ecsacs.PayloadMessage{ + Tasks: []*ecsacs.Task{ecsacsTask}, + MessageId: aws.String(payloadMessageId), + } + + mockECSACSClient := mock_api.NewMockECSClient(tester.ctrl) + taskHandler := eventhandler.NewTaskHandler(tester.ctx, tester.payloadHandler.saver, nil, mockECSACSClient) + tester.payloadHandler.taskHandler = taskHandler + + wait := &sync.WaitGroup{} + wait.Add(1) + + mockECSACSClient.EXPECT().SubmitTaskStateChange(gomock.Any()).Do(func(change api.TaskStateChange) { + assert.NotNil(t, change.Task) + wait.Done() + }) + + tester.payloadHandler.handleUnrecognizedTask(ecsacsTask, errors.New("test error"), payloadMessage) + wait.Wait() +}