Skip to content

Commit 4efceac

Browse files
author
Thean Lim
committed
test(agent): Migrate integration tests to moby v29; drop docker/docker
Migrate the agent module's integration and sudo-tagged test files off github.com/docker/docker onto the moby v29 SDK (moby/moby/client + api/types). These were the last non-vendor importers of docker/docker, so go mod tidy now drops it from agent/go.mod and the vendored docker/docker tree is removed entirely. Mirrors the unit-test migration: reshaped client Options/Result structs, renamed exec methods (ContainerExec* -> Exec*), ContainerInspect result under .Container, ContainerKill/ContainerTop/ContainerStop option structs, and network.EndpointSettings.IPAddress as netip.Addr. Verified in a finch Linux container: engine + stats compile clean under -tags integration and -tags sudo, windows integ cross-compiles, and linux+windows production builds pass. gomod is idempotent (diff-clean); gofmt + goimports clean on all touched files.
1 parent 176d4a5 commit 4efceac

219 files changed

Lines changed: 151 additions & 28594 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

agent/engine/common_unix_integ_testutil.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,8 @@ import (
4545
apitaskstatus "github.com/aws/amazon-ecs-agent/ecs-agent/api/task/status"
4646
"github.com/aws/amazon-ecs-agent/ecs-agent/ec2"
4747

48-
"github.com/docker/docker/api/types"
49-
sdkClient "github.com/docker/docker/client"
5048
dockercontainer "github.com/moby/moby/api/types/container"
49+
sdkClient "github.com/moby/moby/client"
5150
"github.com/pborman/uuid"
5251
"github.com/stretchr/testify/assert"
5352
"github.com/stretchr/testify/require"
@@ -419,7 +418,7 @@ func logContainerLogs(t *testing.T, taskEngine TaskEngine, taskArn string, conta
419418
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
420419
defer cancel()
421420

422-
logReader, err := client.ContainerLogs(ctx, container.DockerID, types.ContainerLogsOptions{
421+
logReader, err := client.ContainerLogs(ctx, container.DockerID, sdkClient.ContainerLogsOptions{
423422
ShowStdout: true,
424423
ShowStderr: true,
425424
})

agent/engine/docker_image_manager_integ_test.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ import (
3535
apicontainerstatus "github.com/aws/amazon-ecs-agent/ecs-agent/api/container/status"
3636
apitaskstatus "github.com/aws/amazon-ecs-agent/ecs-agent/api/task/status"
3737

38-
"github.com/docker/docker/api/types"
39-
"github.com/docker/docker/client"
38+
cerrdefs "github.com/containerd/errdefs"
39+
"github.com/moby/moby/client"
4040
"github.com/stretchr/testify/assert"
4141
"github.com/stretchr/testify/require"
4242
)
@@ -149,11 +149,11 @@ func TestIntegImageCleanupHappyCase(t *testing.T) {
149149

150150
// Verify top 2 LRU images are removed from docker
151151
_, err = dockerClient.InspectImage(imageState1ImageID)
152-
if !client.IsErrNotFound(err) {
152+
if !cerrdefs.IsNotFound(err) {
153153
t.Fatalf("Image was not removed successfully")
154154
}
155155
_, err = dockerClient.InspectImage(imageState2ImageID)
156-
if !client.IsErrNotFound(err) {
156+
if !cerrdefs.IsNotFound(err) {
157157
t.Fatalf("Image was not removed successfully")
158158
}
159159

@@ -263,11 +263,11 @@ func TestIntegImageCleanupThreshold(t *testing.T) {
263263

264264
// Verify Image1 & Image3 are removed from docker
265265
_, err = dockerClient.InspectImage(imageState1ImageID)
266-
if !client.IsErrNotFound(err) {
266+
if !cerrdefs.IsNotFound(err) {
267267
t.Fatalf("Image was not removed successfully")
268268
}
269269
_, err = dockerClient.InspectImage(imageState3ImageID)
270-
if !client.IsErrNotFound(err) {
270+
if !cerrdefs.IsNotFound(err) {
271271
t.Fatalf("Image was not removed successfully")
272272
}
273273

@@ -302,15 +302,15 @@ func TestImageWithSameNameAndDifferentID(t *testing.T) {
302302
stateChangeEvents := taskEngine.StateChangeEvents()
303303

304304
// Pull the images needed for the test
305-
if _, err = dockerClient.InspectImage(test3Image1Name); client.IsErrNotFound(err) {
305+
if _, err = dockerClient.InspectImage(test3Image1Name); cerrdefs.IsNotFound(err) {
306306
metadata := dockerClient.PullImage(ctx, test3Image1Name, nil, dockerclient.LoadImageTimeout)
307307
assert.NoError(t, metadata.Error, "Failed to pull image %s", test3Image1Name)
308308
}
309-
if _, err = dockerClient.InspectImage(test3Image2Name); client.IsErrNotFound(err) {
309+
if _, err = dockerClient.InspectImage(test3Image2Name); cerrdefs.IsNotFound(err) {
310310
metadata := dockerClient.PullImage(ctx, test3Image2Name, nil, dockerclient.LoadImageTimeout)
311311
assert.NoError(t, metadata.Error, "Failed to pull image %s", test3Image2Name)
312312
}
313-
if _, err = dockerClient.InspectImage(test3Image3Name); client.IsErrNotFound(err) {
313+
if _, err = dockerClient.InspectImage(test3Image3Name); cerrdefs.IsNotFound(err) {
314314
metadata := dockerClient.PullImage(ctx, test3Image3Name, nil, dockerclient.LoadImageTimeout)
315315
assert.NoError(t, metadata.Error, "Failed to pull image %s", test3Image3Name)
316316
}
@@ -409,11 +409,11 @@ func TestImageWithSameNameAndDifferentID(t *testing.T) {
409409

410410
// Verify images are removed by docker
411411
_, err = dockerClient.InspectImage(imageID1)
412-
assert.True(t, client.IsErrNotFound(err), "Image was not removed successfully, image: %s", imageID1)
412+
assert.True(t, cerrdefs.IsNotFound(err), "Image was not removed successfully, image: %s", imageID1)
413413
_, err = dockerClient.InspectImage(imageID2)
414-
assert.True(t, client.IsErrNotFound(err), "Image was not removed successfully, image: %s", imageID2)
414+
assert.True(t, cerrdefs.IsNotFound(err), "Image was not removed successfully, image: %s", imageID2)
415415
_, err = dockerClient.InspectImage(imageID3)
416-
assert.True(t, client.IsErrNotFound(err), "Image was not removed successfully, image: %s", imageID3)
416+
assert.True(t, cerrdefs.IsNotFound(err), "Image was not removed successfully, image: %s", imageID3)
417417
}
418418

419419
// TestImageWithSameIDAndDifferentNames tests images can be correctly removed if
@@ -448,7 +448,7 @@ func TestImageWithSameIDAndDifferentNames(t *testing.T) {
448448
task3.Containers[0].Image = "testimagewithsameidanddifferentnames-3:latest"
449449

450450
// Pull the images needed for the test
451-
if _, err = dockerClient.InspectImage(test4Image1Name); client.IsErrNotFound(err) {
451+
if _, err = dockerClient.InspectImage(test4Image1Name); cerrdefs.IsNotFound(err) {
452452
metadata := dockerClient.PullImage(ctx, test4Image1Name, nil, DefaultTestConfigIntegTest().ImagePullTimeout)
453453
assert.NoError(t, metadata.Error, "Failed to pull image %s", test4Image1Name)
454454
}
@@ -468,7 +468,7 @@ func TestImageWithSameIDAndDifferentNames(t *testing.T) {
468468
imageID1 := imageState1.Image.ImageID
469469

470470
// copy the image for task2 to run with same image but different name
471-
err = sdkDockerClient.ImageTag(ctx, task1.Containers[0].Image, task2.Containers[0].Image)
471+
_, err = sdkDockerClient.ImageTag(ctx, client.ImageTagOptions{Source: task1.Containers[0].Image, Target: task2.Containers[0].Image})
472472
require.NoError(t, err, "Trying to copy image failed")
473473

474474
// Start and wait for task2 to be running
@@ -483,7 +483,7 @@ func TestImageWithSameIDAndDifferentNames(t *testing.T) {
483483
require.Equal(t, imageID2, imageID1, "The image id in task2 should be same as in task1")
484484

485485
// make task3 use the same image name but different image id
486-
err = sdkDockerClient.ImageTag(ctx, task1.Containers[0].Image, task3.Containers[0].Image)
486+
_, err = sdkDockerClient.ImageTag(ctx, client.ImageTagOptions{Source: task1.Containers[0].Image, Target: task3.Containers[0].Image})
487487
require.NoError(t, err, "Trying to copy image failed")
488488

489489
// Start and wait for task3 to be running
@@ -530,21 +530,21 @@ func TestImageWithSameIDAndDifferentNames(t *testing.T) {
530530

531531
// Verify images are removed by docker
532532
_, err = dockerClient.InspectImage(imageID1)
533-
assert.True(t, client.IsErrNotFound(err), "Image was not removed successfully")
533+
assert.True(t, cerrdefs.IsNotFound(err), "Image was not removed successfully")
534534
}
535535

536536
// renameImage retag the image with the target tag and delete the source tag
537-
func renameImage(source string, target string, client *client.Client) error {
537+
func renameImage(source string, target string, dockerClient *client.Client) error {
538538
ctx, cancel := context.WithCancel(context.TODO())
539539
defer cancel()
540540

541-
err := client.ImageTag(ctx, source, target)
541+
_, err := dockerClient.ImageTag(ctx, client.ImageTagOptions{Source: source, Target: target})
542542
if err != nil {
543543
return fmt.Errorf("Trying to tag image failed, err: %v", err)
544544
}
545545

546546
// delete the source tag
547-
_, err = client.ImageRemove(ctx, source, types.ImageRemoveOptions{})
547+
_, err = dockerClient.ImageRemove(ctx, source, client.ImageRemoveOptions{})
548548
if err != nil {
549549
return fmt.Errorf("Failed to remove the source tag of the image: %s", source)
550550
}

agent/engine/engine_integ_test.go

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@ import (
3939
"github.com/aws/amazon-ecs-agent/ecs-agent/credentials"
4040

4141
"github.com/aws/aws-sdk-go-v2/aws"
42-
"github.com/docker/docker/api/types"
43-
sdkClient "github.com/docker/docker/client"
4442
"github.com/moby/moby/api/types/container"
43+
sdkClient "github.com/moby/moby/client"
4544
"github.com/stretchr/testify/assert"
4645
"github.com/stretchr/testify/require"
4746
)
@@ -115,7 +114,7 @@ func dialWithRetries(proto string, address string, tries int, timeout time.Durat
115114
func removeImage(t *testing.T, img string) {
116115
client, err := sdkClient.NewClientWithOpts(sdkClient.WithHost(endpoint), sdkClient.WithVersion(sdkclientfactory.GetDefaultVersion().String()))
117116
require.NoError(t, err, "create docker client failed")
118-
client.ImageRemove(context.TODO(), img, types.ImageRemoveOptions{})
117+
client.ImageRemove(context.TODO(), img, sdkClient.ImageRemoveOptions{})
119118
}
120119

121120
func cleanVolumes(testTask *apitask.Task, dockerClient dockerapi.DockerClient) {
@@ -148,18 +147,18 @@ func TestDockerStateToContainerState(t *testing.T) {
148147

149148
containerMetadata = taskEngine.(*DockerTaskEngine).createContainer(testTask, container)
150149
assert.NoError(t, containerMetadata.Error)
151-
state, _ := client.ContainerInspect(ctx, containerMetadata.DockerID)
152-
assert.Equal(t, apicontainerstatus.ContainerCreated, dockerapi.DockerStateToState(state.ContainerJSONBase.State))
150+
state, _ := client.ContainerInspect(ctx, containerMetadata.DockerID, sdkClient.ContainerInspectOptions{})
151+
assert.Equal(t, apicontainerstatus.ContainerCreated, dockerapi.DockerStateToState(state.Container.State))
153152

154153
containerMetadata = taskEngine.(*DockerTaskEngine).startContainer(testTask, container)
155154
assert.NoError(t, containerMetadata.Error)
156-
state, _ = client.ContainerInspect(ctx, containerMetadata.DockerID)
157-
assert.Equal(t, apicontainerstatus.ContainerRunning, dockerapi.DockerStateToState(state.ContainerJSONBase.State))
155+
state, _ = client.ContainerInspect(ctx, containerMetadata.DockerID, sdkClient.ContainerInspectOptions{})
156+
assert.Equal(t, apicontainerstatus.ContainerRunning, dockerapi.DockerStateToState(state.Container.State))
158157

159158
containerMetadata = taskEngine.(*DockerTaskEngine).stopContainer(testTask, container)
160159
assert.NoError(t, containerMetadata.Error)
161-
state, _ = client.ContainerInspect(ctx, containerMetadata.DockerID)
162-
assert.Equal(t, apicontainerstatus.ContainerStopped, dockerapi.DockerStateToState(state.ContainerJSONBase.State))
160+
state, _ = client.ContainerInspect(ctx, containerMetadata.DockerID, sdkClient.ContainerInspectOptions{})
161+
assert.Equal(t, apicontainerstatus.ContainerStopped, dockerapi.DockerStateToState(state.Container.State))
163162

164163
// clean up the container
165164
err = taskEngine.(*DockerTaskEngine).removeContainer(testTask, container)
@@ -173,8 +172,8 @@ func TestDockerStateToContainerState(t *testing.T) {
173172
assert.NoError(t, containerMetadata.Error)
174173
containerMetadata = taskEngine.(*DockerTaskEngine).startContainer(testTask, container)
175174
assert.Error(t, containerMetadata.Error)
176-
state, _ = client.ContainerInspect(ctx, containerMetadata.DockerID)
177-
assert.Equal(t, apicontainerstatus.ContainerStopped, dockerapi.DockerStateToState(state.ContainerJSONBase.State))
175+
state, _ = client.ContainerInspect(ctx, containerMetadata.DockerID, sdkClient.ContainerInspectOptions{})
176+
assert.Equal(t, apicontainerstatus.ContainerStopped, dockerapi.DockerStateToState(state.Container.State))
178177

179178
// clean up the container
180179
err = taskEngine.(*DockerTaskEngine).removeContainer(testTask, container)
@@ -443,9 +442,9 @@ func TestLabels(t *testing.T) {
443442

444443
containerMap, _ := taskEngine.(*DockerTaskEngine).state.ContainerMapByArn(testTask.Arn)
445444
cid := containerMap[testTask.Containers[0].Name].DockerID
446-
state, _ := client.ContainerInspect(ctx, cid)
447-
assert.EqualValues(t, "value", state.Config.Labels["com.foo.label2"])
448-
assert.EqualValues(t, "", state.Config.Labels["label1"])
445+
state, _ := client.ContainerInspect(ctx, cid, sdkClient.ContainerInspectOptions{})
446+
assert.EqualValues(t, "value", state.Container.Config.Labels["com.foo.label2"])
447+
assert.EqualValues(t, "", state.Container.Config.Labels["label1"])
449448

450449
// Kill the existing container now
451450
// Create instead of copying the testTask, to avoid race condition.
@@ -487,14 +486,14 @@ func TestLogDriverOptions(t *testing.T) {
487486

488487
containerMap, _ := taskEngine.(*DockerTaskEngine).state.ContainerMapByArn(testTask.Arn)
489488
cid := containerMap[testTask.Containers[0].Name].DockerID
490-
state, _ := client.ContainerInspect(ctx, cid)
489+
state, _ := client.ContainerInspect(ctx, cid, sdkClient.ContainerInspectOptions{})
491490

492491
containerExpected := container.LogConfig{
493492
Type: "json-file",
494493
Config: map[string]string{"max-file": "50", "max-size": "50k"},
495494
}
496495

497-
assert.EqualValues(t, containerExpected, state.HostConfig.LogConfig)
496+
assert.EqualValues(t, containerExpected, state.Container.HostConfig.LogConfig)
498497

499498
// Kill the existing container now
500499
// Create instead of copying the testTask, to avoid race condition.
@@ -538,11 +537,11 @@ func testNetworkMode(t *testing.T, networkMode string) {
538537
containerMap, _ := taskEngine.(*DockerTaskEngine).state.ContainerMapByArn(testTask.Arn)
539538
cid := containerMap[testTask.Containers[0].Name].DockerID
540539

541-
state, _ := client.ContainerInspect(ctx, cid)
542-
assert.NotNil(t, state.NetworkSettings, "Couldn't find the container network setting info")
540+
state, _ := client.ContainerInspect(ctx, cid, sdkClient.ContainerInspectOptions{})
541+
assert.NotNil(t, state.Container.NetworkSettings, "Couldn't find the container network setting info")
543542

544543
var networks []string
545-
for key := range state.NetworkSettings.Networks {
544+
for key := range state.Container.NetworkSettings.Networks {
546545
networks = append(networks, key)
547546
}
548547
assert.Equal(t, 1, len(networks), "found multiple networks in container config")
@@ -583,7 +582,7 @@ func TestTaskCleanup(t *testing.T) {
583582

584583
containerMap, _ := taskEngine.(*DockerTaskEngine).state.ContainerMapByArn(testTask.Arn)
585584
cid := containerMap[testTask.Containers[0].Name].DockerID
586-
_, err = client.ContainerInspect(ctx, cid)
585+
_, err = client.ContainerInspect(ctx, cid, sdkClient.ContainerInspectOptions{})
587586
assert.NoError(t, err, "Inspect should work")
588587

589588
// Create instead of copying the testTask, to avoid race condition.
@@ -598,6 +597,6 @@ func TestTaskCleanup(t *testing.T) {
598597
task.SetSentStatus(apitaskstatus.TaskStopped) // cleanupTask waits for TaskStopped to be sent before cleaning
599598
waitForTaskCleanup(t, taskEngine, testArn, 120) // 120 seconds
600599

601-
_, err = client.ContainerInspect(ctx, cid)
600+
_, err = client.ContainerInspect(ctx, cid, sdkClient.ContainerInspectOptions{})
602601
assert.Error(t, err, "Inspect should not work")
603602
}

agent/engine/engine_sudo_linux_integ_test.go

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ import (
4949

5050
ecstypes "github.com/aws/aws-sdk-go-v2/service/ecs/types"
5151
"github.com/cihub/seelog"
52-
"github.com/docker/docker/api/types"
53-
sdkClient "github.com/docker/docker/client"
52+
dockercontainer "github.com/moby/moby/api/types/container"
53+
sdkClient "github.com/moby/moby/client"
5454
"github.com/pkg/errors"
5555
"github.com/stretchr/testify/assert"
5656
"github.com/stretchr/testify/require"
@@ -491,7 +491,7 @@ func verifyExecCmdAgentExpectedMounts(t *testing.T,
491491
ctx context.Context,
492492
client *sdkClient.Client,
493493
testTaskId, containerId, containerName, testExecCmdHostVersionedBinDir, testConfigFileName, testLogConfigFileName string) {
494-
inspectState, err := client.ContainerInspect(ctx, containerId)
494+
inspectState, err := client.ContainerInspect(ctx, containerId, sdkClient.ContainerInspectOptions{})
495495
require.NoError(t, err)
496496

497497
expectedMounts := []struct {
@@ -537,8 +537,8 @@ func verifyExecCmdAgentExpectedMounts(t *testing.T,
537537
}
538538

539539
for _, em := range expectedMounts {
540-
var found *types.MountPoint
541-
for _, m := range inspectState.Mounts {
540+
var found *dockercontainer.MountPoint
541+
for _, m := range inspectState.Container.Mounts {
542542
if m.Source == em.source {
543543
found = &m
544544
break
@@ -554,7 +554,7 @@ func verifyExecCmdAgentExpectedMounts(t *testing.T,
554554
require.Equal(t, "bind", string(found.Type), "Destination for mount point (%s) is not of type bind", em.source)
555555
}
556556

557-
require.Equal(t, len(expectedMounts), len(inspectState.Mounts), "Wrong number of bind mounts detected in container (%s)", containerName)
557+
require.Equal(t, len(expectedMounts), len(inspectState.Container.Mounts), "Wrong number of bind mounts detected in container (%s)", containerName)
558558
}
559559

560560
func verifyMockExecCommandAgentIsRunning(t *testing.T, client *sdkClient.Client, containerId string) string {
@@ -631,7 +631,7 @@ func waitForKillProcToFinish(t *testing.T, client *sdkClient.Client, containerId
631631
func findContainerProcess(client *sdkClient.Client, containerId, matching string) (string, string, error) {
632632
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
633633
defer cancel()
634-
top, err := client.ContainerTop(ctx, containerId, nil)
634+
top, err := client.ContainerTop(ctx, containerId, sdkClient.ContainerTopOptions{})
635635
if err != nil {
636636
return "", "", fmt.Errorf("failed to run container top: %w", err)
637637
}
@@ -665,13 +665,12 @@ func findContainerProcess(client *sdkClient.Client, containerId, matching string
665665
func killMockExecCommandAgent(t *testing.T, client *sdkClient.Client, containerId, pid string) {
666666
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
667667
defer cancel()
668-
create, err := client.ContainerExecCreate(ctx, containerId, types.ExecConfig{
669-
Detach: true,
670-
Cmd: []string{testExecCommandAgentKillBin, "-pid=" + pid},
668+
create, err := client.ExecCreate(ctx, containerId, sdkClient.ExecCreateOptions{
669+
Cmd: []string{testExecCommandAgentKillBin, "-pid=" + pid},
671670
})
672671
require.NoError(t, err)
673672

674-
err = client.ContainerExecStart(ctx, create.ID, types.ExecStartCheck{
673+
_, err = client.ExecStart(ctx, create.ID, sdkClient.ExecStartOptions{
675674
Detach: true,
676675
})
677676
require.NoError(t, err)
@@ -758,7 +757,7 @@ func TestGMSATaskFile(t *testing.T) {
758757
assert.NoError(t, err)
759758

760759
// Kill the existing container now
761-
err = client.ContainerKill(context.TODO(), cid, "SIGKILL")
760+
_, err = client.ContainerKill(context.TODO(), cid, sdkClient.ContainerKillOptions{Signal: "SIGKILL"})
762761
assert.NoError(t, err, "Could not kill container")
763762

764763
VerifyTaskIsStopped(stateChangeEvents, testTask)
@@ -851,7 +850,7 @@ func TestGMSADomainlessTaskFile(t *testing.T) {
851850
assert.NoError(t, err)
852851

853852
// Kill the existing container now
854-
err = client.ContainerKill(context.TODO(), cid, "SIGKILL")
853+
_, err = client.ContainerKill(context.TODO(), cid, sdkClient.ContainerKillOptions{Signal: "SIGKILL"})
855854
assert.NoError(t, err, "Could not kill container")
856855

857856
VerifyTaskIsStopped(stateChangeEvents, testTask)
@@ -1033,12 +1032,12 @@ func TestGMSANotRunningErr(t *testing.T) {
10331032
}
10341033

10351034
func verifyContainerBindMount(client *sdkClient.Client, id, expectedBind string) error {
1036-
dockerContainer, err := client.ContainerInspect(context.TODO(), id)
1035+
dockerContainer, err := client.ContainerInspect(context.TODO(), id, sdkClient.ContainerInspectOptions{})
10371036
if err != nil {
10381037
return err
10391038
}
10401039

1041-
for _, opt := range dockerContainer.HostConfig.Binds {
1040+
for _, opt := range dockerContainer.Container.HostConfig.Binds {
10421041
if opt == expectedBind {
10431042
return nil
10441043
}

0 commit comments

Comments
 (0)