diff --git a/agent/engine/docker_image_manager.go b/agent/engine/docker_image_manager.go index 949e3a166c0..5f465054c85 100644 --- a/agent/engine/docker_image_manager.go +++ b/agent/engine/docker_image_manager.go @@ -17,6 +17,7 @@ import ( "context" "fmt" "sort" + "strings" "sync" "time" @@ -537,7 +538,7 @@ func (imageManager *dockerImageManager) deleteImage(ctx context.Context, imageID seelog.Infof("Removing Image: %s", imageID) err := imageManager.client.RemoveImage(ctx, imageID, dockerclient.RemoveImageTimeout) if err != nil { - if err.Error() == imageNotFoundForDeletionError { + if strings.Contains(err.Error(), imageNotFoundForDeletionError) { seelog.Errorf("Image already removed from the instance: %v", err) } else { seelog.Errorf("Error removing Image %v - %v", imageID, err) diff --git a/agent/engine/docker_image_manager_test.go b/agent/engine/docker_image_manager_test.go index 05992c47f3f..c21d9a23f94 100644 --- a/agent/engine/docker_image_manager_test.go +++ b/agent/engine/docker_image_manager_test.go @@ -1064,7 +1064,9 @@ func TestDeleteImage(t *testing.T) { } } -func TestDeleteImageNotFoundError(t *testing.T) { +// This test tests that we detect correctly in agent when the agent is trying to delete image that +// does not exist for older version of docker. +func TestDeleteImageNotFoundOldDockerMessageError(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() client := mock_dockerapi.NewMockDockerClient(ctrl) @@ -1096,6 +1098,38 @@ func TestDeleteImageNotFoundError(t *testing.T) { } } +func TestDeleteImageNotFoundError(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + client := mock_dockerapi.NewMockDockerClient(ctrl) + imageManager := &dockerImageManager{client: client, state: dockerstate.NewTaskEngineState()} + imageManager.SetSaver(statemanager.NewNoopStateManager()) + container := &apicontainer.Container{ + Name: "testContainer", + Image: "testContainerImage", + } + imageInspected := &types.ImageInspect{ + ID: "sha256:qwerty", + } + client.EXPECT().InspectImage(container.Image).Return(imageInspected, nil).AnyTimes() + err := imageManager.RecordContainerReference(container) + if err != nil { + t.Error("Error in adding container to an existing image state") + } + imageState, _ := imageManager.getImageState(imageInspected.ID) + client.EXPECT().RemoveImage(gomock.Any(), container.Image, dockerclient.RemoveImageTimeout).Return( + errors.New("no such image: " + container.Image)) + ctx, cancel := context.WithCancel(context.TODO()) + defer cancel() + imageManager.deleteImage(ctx, container.Image, imageState) + if len(imageState.Image.Names) != 0 { + t.Error("Error removing Image name from image state") + } + if len(imageManager.getAllImageStates()) != 0 { + t.Error("Error removing image state from image manager") + } +} + func TestDeleteImageOtherRemoveImageErrors(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish()