From 552d7634471c3bfe2999cdbbdd9fc223720cf78d Mon Sep 17 00:00:00 2001 From: Maksym Pavlenko Date: Mon, 25 Jul 2022 10:47:00 -0700 Subject: [PATCH 1/4] Use image lists in client tests Signed-off-by: Maksym Pavlenko --- integration/addition_gids_test.go | 4 +- integration/client/client_unix_test.go | 5 ++- integration/container_log_test.go | 6 ++- integration/container_restart_test.go | 11 ++--- integration/container_stats_test.go | 23 +++++----- integration/container_stop_test.go | 5 ++- .../container_update_resources_test.go | 9 ++-- integration/container_volume_test.go | 3 +- .../container_without_image_ref_test.go | 3 +- integration/containerd_image_test.go | 5 ++- integration/duplicate_name_test.go | 5 ++- integration/image_load_test.go | 3 +- integration/imagefs_info_test.go | 3 +- .../{common.go => images/image_list.go} | 43 ++++++------------- .../{ => images}/image_list.sample.toml | 0 integration/main_test.go | 20 ++++++++- integration/pod_dualstack_test.go | 3 +- integration/pod_hostname_test.go | 3 +- integration/restart_test.go | 7 +-- integration/truncindex_test.go | 3 +- integration/volume_copy_up_test.go | 5 ++- 21 files changed, 95 insertions(+), 74 deletions(-) rename integration/{common.go => images/image_list.go} (70%) rename integration/{ => images}/image_list.sample.toml (100%) diff --git a/integration/addition_gids_test.go b/integration/addition_gids_test.go index 08ab327d6..2c3ae037b 100644 --- a/integration/addition_gids_test.go +++ b/integration/addition_gids_test.go @@ -25,6 +25,8 @@ import ( "testing" "time" + "github.com/containerd/containerd/integration/images" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -38,7 +40,7 @@ func TestAdditionalGids(t *testing.T) { WithPodLogDirectory(testPodLogDir)) var ( - testImage = GetImage(BusyBox) + testImage = images.Get(images.BusyBox) containerName = "test-container" ) diff --git a/integration/client/client_unix_test.go b/integration/client/client_unix_test.go index 8250ae0a2..621f4e17a 100644 --- a/integration/client/client_unix_test.go +++ b/integration/client/client_unix_test.go @@ -23,6 +23,7 @@ import ( "testing" . "github.com/containerd/containerd" + "github.com/containerd/containerd/integration/images" "github.com/containerd/containerd/platforms" ) @@ -33,8 +34,8 @@ const ( ) var ( - testImage = "ghcr.io/containerd/busybox:1.32" - testMultiLayeredImage = "ghcr.io/containerd/volume-copy-up:2.1" + testImage = images.Get(images.BusyBox) + testMultiLayeredImage = images.Get(images.VolumeCopyUp) shortCommand = withProcessArgs("true") longCommand = withProcessArgs("/bin/sh", "-c", "while true; do sleep 1; done") ) diff --git a/integration/container_log_test.go b/integration/container_log_test.go index 60de3e568..bfff289dd 100644 --- a/integration/container_log_test.go +++ b/integration/container_log_test.go @@ -24,6 +24,8 @@ import ( "testing" "time" + "github.com/containerd/containerd/integration/images" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -38,7 +40,7 @@ func TestContainerLogWithoutTailingNewLine(t *testing.T) { ) var ( - testImage = GetImage(BusyBox) + testImage = images.Get(images.BusyBox) containerName = "test-container" ) @@ -86,7 +88,7 @@ func TestLongContainerLog(t *testing.T) { ) var ( - testImage = GetImage(BusyBox) + testImage = images.Get(images.BusyBox) containerName = "test-container" ) diff --git a/integration/container_restart_test.go b/integration/container_restart_test.go index 044a4c193..0f97c5952 100644 --- a/integration/container_restart_test.go +++ b/integration/container_restart_test.go @@ -19,6 +19,7 @@ package integration import ( "testing" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -28,12 +29,12 @@ func TestContainerRestart(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox1", "restart") - EnsureImageExists(t, pauseImage) + EnsureImageExists(t, images.PauseImage) t.Logf("Create a container config and run container in a pod") containerConfig := ContainerConfig( "container1", - pauseImage, + images.PauseImage, WithTestLabels(), WithTestAnnotations(), ) @@ -62,12 +63,12 @@ func TestFailedContainerRestart(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox1", "restart") - EnsureImageExists(t, pauseImage) + EnsureImageExists(t, images.PauseImage) t.Logf("Create a container config in a pod with a command that fails") containerConfig := ContainerConfig( "container1", - pauseImage, + images.PauseImage, WithCommand("something-that-doesnt-exist"), WithTestLabels(), WithTestAnnotations(), @@ -88,7 +89,7 @@ func TestFailedContainerRestart(t *testing.T) { containerConfig = ContainerConfig( "container1", - pauseImage, + images.PauseImage, WithTestLabels(), WithTestAnnotations(), ) diff --git a/integration/container_stats_test.go b/integration/container_stats_test.go index 2380aa404..da09a05c7 100644 --- a/integration/container_stats_test.go +++ b/integration/container_stats_test.go @@ -23,6 +23,7 @@ import ( "testing" "time" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -33,12 +34,12 @@ func TestContainerStats(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox1", "stats") - EnsureImageExists(t, pauseImage) + EnsureImageExists(t, images.PauseImage) t.Logf("Create a container config and run container in a pod") containerConfig := ContainerConfig( "container1", - pauseImage, + images.PauseImage, WithTestLabels(), WithTestAnnotations(), ) @@ -74,7 +75,7 @@ func TestContainerConsumedStats(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox1", "stats") - testImage := GetImage(ResourceConsumer) + testImage := images.Get(images.ResourceConsumer) EnsureImageExists(t, testImage) t.Logf("Create a container config and run container in a pod") @@ -145,7 +146,7 @@ func TestContainerListStats(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "running-pod", "statsls") - EnsureImageExists(t, pauseImage) + EnsureImageExists(t, images.PauseImage) t.Logf("Create a container config and run containers in a pod") containerConfigMap := make(map[string]*runtime.ContainerConfig) @@ -153,7 +154,7 @@ func TestContainerListStats(t *testing.T) { cName := fmt.Sprintf("container%d", i) containerConfig := ContainerConfig( cName, - pauseImage, + images.PauseImage, WithTestLabels(), WithTestAnnotations(), ) @@ -199,7 +200,7 @@ func TestContainerListStatsWithIdFilter(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "running-pod", "statsls") - EnsureImageExists(t, pauseImage) + EnsureImageExists(t, images.PauseImage) t.Logf("Create a container config and run containers in a pod") containerConfigMap := make(map[string]*runtime.ContainerConfig) @@ -207,7 +208,7 @@ func TestContainerListStatsWithIdFilter(t *testing.T) { cName := fmt.Sprintf("container%d", i) containerConfig := ContainerConfig( cName, - pauseImage, + images.PauseImage, WithTestLabels(), WithTestAnnotations(), ) @@ -258,7 +259,7 @@ func TestContainerListStatsWithSandboxIdFilter(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "running-pod", "statsls") - EnsureImageExists(t, pauseImage) + EnsureImageExists(t, images.PauseImage) t.Logf("Create a container config and run containers in a pod") containerConfigMap := make(map[string]*runtime.ContainerConfig) @@ -266,7 +267,7 @@ func TestContainerListStatsWithSandboxIdFilter(t *testing.T) { cName := fmt.Sprintf("container%d", i) containerConfig := ContainerConfig( cName, - pauseImage, + images.PauseImage, WithTestLabels(), WithTestAnnotations(), ) @@ -318,7 +319,7 @@ func TestContainerListStatsWithIdSandboxIdFilter(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "running-pod", "statsls") - EnsureImageExists(t, pauseImage) + EnsureImageExists(t, images.PauseImage) t.Logf("Create container config and run containers in a pod") containerConfigMap := make(map[string]*runtime.ContainerConfig) @@ -326,7 +327,7 @@ func TestContainerListStatsWithIdSandboxIdFilter(t *testing.T) { cName := fmt.Sprintf("container%d", i) containerConfig := ContainerConfig( cName, - pauseImage, + images.PauseImage, WithTestLabels(), WithTestAnnotations(), ) diff --git a/integration/container_stop_test.go b/integration/container_stop_test.go index b2a206823..0069eb88b 100644 --- a/integration/container_stop_test.go +++ b/integration/container_stop_test.go @@ -22,6 +22,7 @@ import ( "testing" "time" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -42,7 +43,7 @@ func TestSharedPidMultiProcessContainerStop(t *testing.T) { }() var ( - testImage = GetImage(BusyBox) + testImage = images.Get(images.BusyBox) containerName = "test-container" ) @@ -79,7 +80,7 @@ func TestContainerStopCancellation(t *testing.T) { sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox", "cancel-container-stop") var ( - testImage = GetImage(BusyBox) + testImage = images.Get(images.BusyBox) containerName = "test-container" ) diff --git a/integration/container_update_resources_test.go b/integration/container_update_resources_test.go index 0a7b90c95..b59b2423e 100644 --- a/integration/container_update_resources_test.go +++ b/integration/container_update_resources_test.go @@ -29,6 +29,7 @@ import ( "github.com/containerd/cgroups" cgroupsv2 "github.com/containerd/cgroups/v2" "github.com/containerd/containerd" + "github.com/containerd/containerd/integration/images" runtimespec "github.com/opencontainers/runtime-spec/specs-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -151,7 +152,7 @@ func TestUpdateContainerResources_MemorySwap(t *testing.T) { t.Log("Create a sandbox") sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox", "update-container-swap-resources") - EnsureImageExists(t, pauseImage) + EnsureImageExists(t, images.PauseImage) memoryLimit := int64(128 * 1024 * 1024) baseSwapLimit := int64(200 * 1024 * 1024) @@ -168,7 +169,7 @@ func TestUpdateContainerResources_MemorySwap(t *testing.T) { t.Log("Create a container with memory limit but no swap") cnConfig := ContainerConfig( "container", - pauseImage, + images.PauseImage, WithResources(&runtime.LinuxContainerResources{ MemoryLimitInBytes: memoryLimit, MemorySwapLimitInBytes: baseSwapLimit, @@ -223,12 +224,12 @@ func TestUpdateContainerResources_MemoryLimit(t *testing.T) { t.Log("Create a sandbox") sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox", "update-container-resources") - EnsureImageExists(t, pauseImage) + EnsureImageExists(t, images.PauseImage) t.Log("Create a container with memory limit") cnConfig := ContainerConfig( "container", - pauseImage, + images.PauseImage, WithResources(&runtime.LinuxContainerResources{ MemoryLimitInBytes: 200 * 1024 * 1024, }), diff --git a/integration/container_volume_test.go b/integration/container_volume_test.go index 02b438522..7a9f06e4b 100644 --- a/integration/container_volume_test.go +++ b/integration/container_volume_test.go @@ -23,6 +23,7 @@ import ( "testing" "time" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -99,7 +100,7 @@ func TestContainerSymlinkVolumes(t *testing.T) { ) var ( - testImage = GetImage(BusyBox) + testImage = images.Get(images.BusyBox) containerName = "test-container" containerMountPath = "/mounted_file" ) diff --git a/integration/container_without_image_ref_test.go b/integration/container_without_image_ref_test.go index 0107102f6..b5198533c 100644 --- a/integration/container_without_image_ref_test.go +++ b/integration/container_without_image_ref_test.go @@ -19,6 +19,7 @@ package integration import ( "testing" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -30,7 +31,7 @@ func TestContainerLifecycleWithoutImageRef(t *testing.T) { sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox", "container-lifecycle-without-image-ref") var ( - testImage = GetImage(BusyBox) + testImage = images.Get(images.BusyBox) containerName = "test-container" ) diff --git a/integration/containerd_image_test.go b/integration/containerd_image_test.go index 3c0b16f25..87b325d1e 100644 --- a/integration/containerd_image_test.go +++ b/integration/containerd_image_test.go @@ -25,6 +25,7 @@ import ( "github.com/containerd/containerd" "github.com/containerd/containerd/errdefs" + "github.com/containerd/containerd/integration/images" "github.com/containerd/containerd/namespaces" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -33,7 +34,7 @@ import ( // Test to test the CRI plugin should see image pulled into containerd directly. func TestContainerdImage(t *testing.T) { - var testImage = GetImage(BusyBox) + var testImage = images.Get(images.BusyBox) ctx := context.Background() t.Logf("make sure the test image doesn't exist in the cri plugin") @@ -150,7 +151,7 @@ func TestContainerdImage(t *testing.T) { // Test image managed by CRI plugin shouldn't be affected by images in other namespaces. func TestContainerdImageInOtherNamespaces(t *testing.T) { - var testImage = GetImage(BusyBox) + var testImage = images.Get(images.BusyBox) ctx := context.Background() t.Logf("make sure the test image doesn't exist in the cri plugin") diff --git a/integration/duplicate_name_test.go b/integration/duplicate_name_test.go index 9b446484e..0f4e41103 100644 --- a/integration/duplicate_name_test.go +++ b/integration/duplicate_name_test.go @@ -19,6 +19,7 @@ package integration import ( "testing" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/require" ) @@ -30,12 +31,12 @@ func TestDuplicateName(t *testing.T) { _, err := runtimeService.RunPodSandbox(sbConfig, *runtimeHandler) require.Error(t, err) - EnsureImageExists(t, pauseImage) + EnsureImageExists(t, images.PauseImage) t.Logf("Create a container") cnConfig := ContainerConfig( "container", - pauseImage, + images.PauseImage, ) _, err = runtimeService.CreateContainer(sb, cnConfig, sbConfig) require.NoError(t, err) diff --git a/integration/image_load_test.go b/integration/image_load_test.go index 99647435c..9a3f05c60 100644 --- a/integration/image_load_test.go +++ b/integration/image_load_test.go @@ -21,6 +21,7 @@ import ( "testing" "time" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/require" exec "golang.org/x/sys/execabs" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -28,7 +29,7 @@ import ( // Test to load an image from tarball. func TestImageLoad(t *testing.T) { - testImage := GetImage(BusyBox) + testImage := images.Get(images.BusyBox) loadedImage := testImage _, err := exec.LookPath("docker") if err != nil { diff --git a/integration/imagefs_info_test.go b/integration/imagefs_info_test.go index ea83a2247..e2af553e5 100644 --- a/integration/imagefs_info_test.go +++ b/integration/imagefs_info_test.go @@ -22,6 +22,7 @@ import ( "testing" "time" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -32,7 +33,7 @@ func TestImageFSInfo(t *testing.T) { PodSandboxConfigWithCleanup(t, "running-pod", "imagefs") t.Logf("Pull an image to make sure image fs is not empty") - EnsureImageExists(t, GetImage(BusyBox)) + EnsureImageExists(t, images.Get(images.BusyBox)) // It takes time to populate imagefs stats. Use eventually // to check for a period of time. diff --git a/integration/common.go b/integration/images/image_list.go similarity index 70% rename from integration/common.go rename to integration/images/image_list.go index 6b794c641..2adda269a 100644 --- a/integration/common.go +++ b/integration/images/image_list.go @@ -14,20 +14,19 @@ limitations under the License. */ -package integration +package images import ( + "flag" "fmt" "os" - "testing" - cri "github.com/containerd/containerd/integration/cri-api/pkg/apis" "github.com/pelletier/go-toml" "github.com/sirupsen/logrus" - "github.com/stretchr/testify/require" - runtime "k8s.io/cri-api/pkg/apis/runtime/v1" ) +var imageListFile = flag.String("image-list", "", "The TOML file containing the non-default images to be used in tests.") + // ImageList holds public image references type ImageList struct { Alpine string @@ -39,12 +38,15 @@ type ImageList struct { } var ( - imageService cri.ImageManagerService - imageMap map[int]string - imageList ImageList - pauseImage string // This is the same with default sandbox image + imageMap map[int]string + imageList ImageList + PauseImage string // This is the same with default sandbox image ) +func init() { + initImages(*imageListFile) +} + func initImages(imageListFile string) { imageList = ImageList{ Alpine: "docker.io/library/alpine:latest", @@ -70,7 +72,7 @@ func initImages(imageListFile string) { logrus.Infof("Using the following image list: %+v", imageList) imageMap = initImageMap(imageList) - pauseImage = GetImage(Pause) + PauseImage = Get(Pause) } const ( @@ -101,24 +103,7 @@ func initImageMap(imageList ImageList) map[int]string { return images } -// GetImage returns the fully qualified URI to an image (including version) -func GetImage(image int) string { +// Get returns the fully qualified URI to an image (including version) +func Get(image int) string { return imageMap[image] } - -// EnsureImageExists pulls the given image, ensures that no error was encountered -// while pulling it. -func EnsureImageExists(t *testing.T, imageName string) string { - img, err := imageService.ImageStatus(&runtime.ImageSpec{Image: imageName}) - require.NoError(t, err) - if img != nil { - t.Logf("Image %q already exists, not pulling.", imageName) - return img.Id - } - - t.Logf("Pull test image %q", imageName) - imgID, err := imageService.PullImage(&runtime.ImageSpec{Image: imageName}, nil, nil) - require.NoError(t, err) - - return imgID -} diff --git a/integration/image_list.sample.toml b/integration/images/image_list.sample.toml similarity index 100% rename from integration/image_list.sample.toml rename to integration/images/image_list.sample.toml diff --git a/integration/main_test.go b/integration/main_test.go index 4659d0f70..ef780f70a 100644 --- a/integration/main_test.go +++ b/integration/main_test.go @@ -54,6 +54,7 @@ const ( var ( runtimeService cri.RuntimeService + imageService cri.ImageManagerService containerdClient *containerd.Client containerdEndpoint string ) @@ -62,11 +63,9 @@ var criEndpoint = flag.String("cri-endpoint", "unix:///run/containerd/containerd var criRoot = flag.String("cri-root", "/var/lib/containerd/io.containerd.grpc.v1.cri", "The root directory of cri plugin.") var runtimeHandler = flag.String("runtime-handler", "", "The runtime handler to use in the test.") var containerdBin = flag.String("containerd-bin", "containerd", "The containerd binary name. The name is used to restart containerd during test.") -var imageListFile = flag.String("image-list", "", "The TOML file containing the non-default images to be used in tests.") func TestMain(m *testing.M) { flag.Parse() - initImages(*imageListFile) if err := ConnectDaemons(); err != nil { logrus.WithError(err).Fatalf("Failed to connect daemons") } @@ -506,3 +505,20 @@ func RestartContainerd(t *testing.T) { return ConnectDaemons() == nil, nil }, time.Second, 30*time.Second), "wait for containerd to be restarted") } + +// EnsureImageExists pulls the given image, ensures that no error was encountered +// while pulling it. +func EnsureImageExists(t *testing.T, imageName string) string { + img, err := imageService.ImageStatus(&runtime.ImageSpec{Image: imageName}) + require.NoError(t, err) + if img != nil { + t.Logf("Image %q already exists, not pulling.", imageName) + return img.Id + } + + t.Logf("Pull test image %q", imageName) + imgID, err := imageService.PullImage(&runtime.ImageSpec{Image: imageName}, nil, nil) + require.NoError(t, err) + + return imgID +} diff --git a/integration/pod_dualstack_test.go b/integration/pod_dualstack_test.go index 14231f28c..89371a55e 100644 --- a/integration/pod_dualstack_test.go +++ b/integration/pod_dualstack_test.go @@ -25,6 +25,7 @@ import ( "testing" "time" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -37,7 +38,7 @@ func TestPodDualStack(t *testing.T) { sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox", "dualstack", WithPodLogDirectory(testPodLogDir)) var ( - testImage = GetImage(BusyBox) + testImage = images.Get(images.BusyBox) containerName = "test-container" ) diff --git a/integration/pod_hostname_test.go b/integration/pod_hostname_test.go index c7a47321d..3da545603 100644 --- a/integration/pod_hostname_test.go +++ b/integration/pod_hostname_test.go @@ -24,6 +24,7 @@ import ( "testing" "time" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -86,7 +87,7 @@ func TestPodHostname(t *testing.T) { } var ( - testImage = GetImage(BusyBox) + testImage = images.Get(images.BusyBox) containerName = "test-container" ) diff --git a/integration/restart_test.go b/integration/restart_test.go index d346af86c..e4151eb62 100644 --- a/integration/restart_test.go +++ b/integration/restart_test.go @@ -26,6 +26,7 @@ import ( "github.com/containerd/containerd" "github.com/containerd/containerd/errdefs" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -108,12 +109,12 @@ func TestContainerdRestart(t *testing.T) { runtimeService.RemovePodSandbox(sid) }() - EnsureImageExists(t, pauseImage) + EnsureImageExists(t, images.PauseImage) s.id = sid for j := range s.containers { c := &s.containers[j] - cfg := ContainerConfig(c.name, pauseImage, + cfg := ContainerConfig(c.name, images.PauseImage, // Set pid namespace as per container, so that container won't die // when sandbox container is killed. WithPidNamespace(runtime.NamespaceMode_CONTAINER), @@ -170,7 +171,7 @@ func TestContainerdRestart(t *testing.T) { } t.Logf("Pull test images") - for _, image := range []string{GetImage(BusyBox), GetImage(Pause)} { + for _, image := range []string{images.Get(images.BusyBox), images.Get(images.Pause)} { EnsureImageExists(t, image) } imagesBeforeRestart, err := imageService.ListImages(nil) diff --git a/integration/truncindex_test.go b/integration/truncindex_test.go index 684a22088..8f1fc1d5a 100644 --- a/integration/truncindex_test.go +++ b/integration/truncindex_test.go @@ -20,6 +20,7 @@ import ( goruntime "runtime" "testing" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -33,7 +34,7 @@ func TestTruncIndex(t *testing.T) { sbConfig := PodSandboxConfig("sandbox", "truncindex") t.Logf("Pull an image") - var appImage = GetImage(BusyBox) + var appImage = images.Get(images.BusyBox) imgID := EnsureImageExists(t, appImage) imgTruncID := genTruncIndex(imgID) diff --git a/integration/volume_copy_up_test.go b/integration/volume_copy_up_test.go index 1e0e20730..b2b4fb2f5 100644 --- a/integration/volume_copy_up_test.go +++ b/integration/volume_copy_up_test.go @@ -24,6 +24,7 @@ import ( "testing" "time" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -37,7 +38,7 @@ const ( func TestVolumeCopyUp(t *testing.T) { var ( - testImage = GetImage(VolumeCopyUp) + testImage = images.Get(images.VolumeCopyUp) execTimeout = time.Minute ) @@ -95,7 +96,7 @@ func TestVolumeCopyUp(t *testing.T) { func TestVolumeOwnership(t *testing.T) { var ( - testImage = GetImage(VolumeOwnership) + testImage = images.Get(images.VolumeOwnership) execTimeout = time.Minute ) From 2ae5f405d26481bca22db4cf1035bedc6f9a3f24 Mon Sep 17 00:00:00 2001 From: Maksym Pavlenko Date: Mon, 25 Jul 2022 10:54:17 -0700 Subject: [PATCH 2/4] Use image lists instead of hardcoded images Signed-off-by: Maksym Pavlenko --- integration/client/client_test.go | 3 ++- integration/client/image_test.go | 5 +++-- integration/client/lease_test.go | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/integration/client/client_test.go b/integration/client/client_test.go index 96814f387..12b612e07 100644 --- a/integration/client/client_test.go +++ b/integration/client/client_test.go @@ -30,6 +30,7 @@ import ( "github.com/containerd/containerd/defaults" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/images" + imagelist "github.com/containerd/containerd/integration/images" "github.com/containerd/containerd/leases" "github.com/containerd/containerd/log" "github.com/containerd/containerd/log/logtest" @@ -333,7 +334,7 @@ func TestImagePullAllPlatforms(t *testing.T) { defer cancel() cs := client.ContentStore() - img, err := client.Fetch(ctx, "k8s.gcr.io/pause:3.7") + img, err := client.Fetch(ctx, imagelist.PauseImage) if err != nil { t.Fatal(err) } diff --git a/integration/client/image_test.go b/integration/client/image_test.go index 6417dc9c0..b3654e549 100644 --- a/integration/client/image_test.go +++ b/integration/client/image_test.go @@ -26,12 +26,13 @@ import ( . "github.com/containerd/containerd" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/images" + imagelist "github.com/containerd/containerd/integration/images" "github.com/containerd/containerd/platforms" ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) func TestImageIsUnpacked(t *testing.T) { - const imageName = "k8s.gcr.io/pause:3.7" + imageName := imagelist.PauseImage ctx, cancel := testContext(t) defer cancel() @@ -137,7 +138,7 @@ func TestImageUsage(t *testing.T) { t.Skip() } - imageName := "k8s.gcr.io/pause:3.7" + imageName := imagelist.PauseImage ctx, cancel := testContext(t) defer cancel() diff --git a/integration/client/lease_test.go b/integration/client/lease_test.go index 105ff6c36..036bd1341 100644 --- a/integration/client/lease_test.go +++ b/integration/client/lease_test.go @@ -23,6 +23,7 @@ import ( . "github.com/containerd/containerd" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/images" + imagelist "github.com/containerd/containerd/integration/images" "github.com/containerd/containerd/leases" "github.com/opencontainers/image-spec/identity" ) @@ -55,7 +56,7 @@ func TestLeaseResources(t *testing.T) { defer ls.Delete(ctx, l, leases.SynchronousDelete) // step 1: download image - imageName := "k8s.gcr.io/pause:3.7" + imageName := imagelist.PauseImage image, err := client.Pull(ctx, imageName, WithPullUnpack, WithPullSnapshotter(snapshotterName)) if err != nil { From a9514da75706584c4277d1255c3677b7a627d14d Mon Sep 17 00:00:00 2001 From: Maksym Pavlenko Date: Mon, 25 Jul 2022 11:04:59 -0700 Subject: [PATCH 3/4] Update image references for Windows tests Signed-off-by: Maksym Pavlenko --- integration/windows_device_test.go | 3 ++- integration/windows_hostprocess_test.go | 2 ++ integration/windows_rootfs_size_test.go | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/integration/windows_device_test.go b/integration/windows_device_test.go index 370ab33d5..2baa7858e 100644 --- a/integration/windows_device_test.go +++ b/integration/windows_device_test.go @@ -26,6 +26,7 @@ import ( "testing" "time" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -41,7 +42,7 @@ func TestWindowsDevice(t *testing.T) { var ( // TODO: An image with the device-dumper - testImage = GetImage(BusyBox) + testImage = images.Get(images.BusyBox) containerName = "test-container" ) diff --git a/integration/windows_hostprocess_test.go b/integration/windows_hostprocess_test.go index 11495961d..d5f32e79f 100644 --- a/integration/windows_hostprocess_test.go +++ b/integration/windows_hostprocess_test.go @@ -24,6 +24,7 @@ import ( "os" "testing" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -37,6 +38,7 @@ var ( // Tests to verify the Windows HostProcess func TestWindowsHostProcess(t *testing.T) { + pauseImage := images.PauseImage EnsureImageExists(t, pauseImage) t.Run("run as Local Service", func(t *testing.T) { diff --git a/integration/windows_rootfs_size_test.go b/integration/windows_rootfs_size_test.go index 729a0dbe4..733458d81 100644 --- a/integration/windows_rootfs_size_test.go +++ b/integration/windows_rootfs_size_test.go @@ -28,6 +28,7 @@ import ( "testing" "time" + "github.com/containerd/containerd/integration/images" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" runtime "k8s.io/cri-api/pkg/apis/runtime/v1" @@ -42,7 +43,7 @@ func TestWindowsRootfsSize(t *testing.T) { ) var ( - testImage = GetImage(Pause) + testImage = images.Get(images.Pause) containerName = "test-container" ) From 2b92c70fa4ef9999c90132a6d32146660656a69c Mon Sep 17 00:00:00 2001 From: Maksym Pavlenko Date: Mon, 25 Jul 2022 14:19:40 -0700 Subject: [PATCH 4/4] Fix command line parsing for image list Signed-off-by: Maksym Pavlenko --- integration/client/client_test.go | 2 +- integration/client/image_test.go | 4 +-- integration/client/lease_test.go | 2 +- integration/container_restart_test.go | 12 +++++---- integration/container_stats_test.go | 25 +++++++++++-------- .../container_update_resources_test.go | 10 +++++--- integration/duplicate_name_test.go | 5 ++-- integration/images/image_list.go | 18 +++++++------ integration/main_test.go | 1 + integration/restart_test.go | 5 ++-- integration/windows_hostprocess_test.go | 2 +- 11 files changed, 50 insertions(+), 36 deletions(-) diff --git a/integration/client/client_test.go b/integration/client/client_test.go index 12b612e07..35d4278b3 100644 --- a/integration/client/client_test.go +++ b/integration/client/client_test.go @@ -334,7 +334,7 @@ func TestImagePullAllPlatforms(t *testing.T) { defer cancel() cs := client.ContentStore() - img, err := client.Fetch(ctx, imagelist.PauseImage) + img, err := client.Fetch(ctx, imagelist.Get(imagelist.Pause)) if err != nil { t.Fatal(err) } diff --git a/integration/client/image_test.go b/integration/client/image_test.go index b3654e549..faa1cae33 100644 --- a/integration/client/image_test.go +++ b/integration/client/image_test.go @@ -32,7 +32,7 @@ import ( ) func TestImageIsUnpacked(t *testing.T) { - imageName := imagelist.PauseImage + imageName := imagelist.Get(imagelist.Pause) ctx, cancel := testContext(t) defer cancel() @@ -138,7 +138,7 @@ func TestImageUsage(t *testing.T) { t.Skip() } - imageName := imagelist.PauseImage + imageName := imagelist.Get(imagelist.Pause) ctx, cancel := testContext(t) defer cancel() diff --git a/integration/client/lease_test.go b/integration/client/lease_test.go index 036bd1341..455e12814 100644 --- a/integration/client/lease_test.go +++ b/integration/client/lease_test.go @@ -56,7 +56,7 @@ func TestLeaseResources(t *testing.T) { defer ls.Delete(ctx, l, leases.SynchronousDelete) // step 1: download image - imageName := imagelist.PauseImage + imageName := imagelist.Get(imagelist.Pause) image, err := client.Pull(ctx, imageName, WithPullUnpack, WithPullSnapshotter(snapshotterName)) if err != nil { diff --git a/integration/container_restart_test.go b/integration/container_restart_test.go index 0f97c5952..5fb6b69dc 100644 --- a/integration/container_restart_test.go +++ b/integration/container_restart_test.go @@ -29,12 +29,13 @@ func TestContainerRestart(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox1", "restart") - EnsureImageExists(t, images.PauseImage) + pauseImage := images.Get(images.Pause) + EnsureImageExists(t, pauseImage) t.Logf("Create a container config and run container in a pod") containerConfig := ContainerConfig( "container1", - images.PauseImage, + pauseImage, WithTestLabels(), WithTestAnnotations(), ) @@ -63,12 +64,13 @@ func TestFailedContainerRestart(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox1", "restart") - EnsureImageExists(t, images.PauseImage) + pauseImage := images.Get(images.Pause) + EnsureImageExists(t, pauseImage) t.Logf("Create a container config in a pod with a command that fails") containerConfig := ContainerConfig( "container1", - images.PauseImage, + pauseImage, WithCommand("something-that-doesnt-exist"), WithTestLabels(), WithTestAnnotations(), @@ -89,7 +91,7 @@ func TestFailedContainerRestart(t *testing.T) { containerConfig = ContainerConfig( "container1", - images.PauseImage, + pauseImage, WithTestLabels(), WithTestAnnotations(), ) diff --git a/integration/container_stats_test.go b/integration/container_stats_test.go index da09a05c7..469ce253c 100644 --- a/integration/container_stats_test.go +++ b/integration/container_stats_test.go @@ -34,12 +34,13 @@ func TestContainerStats(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox1", "stats") - EnsureImageExists(t, images.PauseImage) + pauseImage := images.Get(images.Pause) + EnsureImageExists(t, pauseImage) t.Logf("Create a container config and run container in a pod") containerConfig := ContainerConfig( "container1", - images.PauseImage, + pauseImage, WithTestLabels(), WithTestAnnotations(), ) @@ -146,7 +147,8 @@ func TestContainerListStats(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "running-pod", "statsls") - EnsureImageExists(t, images.PauseImage) + pauseImage := images.Get(images.Pause) + EnsureImageExists(t, pauseImage) t.Logf("Create a container config and run containers in a pod") containerConfigMap := make(map[string]*runtime.ContainerConfig) @@ -154,7 +156,7 @@ func TestContainerListStats(t *testing.T) { cName := fmt.Sprintf("container%d", i) containerConfig := ContainerConfig( cName, - images.PauseImage, + pauseImage, WithTestLabels(), WithTestAnnotations(), ) @@ -200,7 +202,8 @@ func TestContainerListStatsWithIdFilter(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "running-pod", "statsls") - EnsureImageExists(t, images.PauseImage) + pauseImage := images.Get(images.Pause) + EnsureImageExists(t, pauseImage) t.Logf("Create a container config and run containers in a pod") containerConfigMap := make(map[string]*runtime.ContainerConfig) @@ -208,7 +211,7 @@ func TestContainerListStatsWithIdFilter(t *testing.T) { cName := fmt.Sprintf("container%d", i) containerConfig := ContainerConfig( cName, - images.PauseImage, + pauseImage, WithTestLabels(), WithTestAnnotations(), ) @@ -259,7 +262,8 @@ func TestContainerListStatsWithSandboxIdFilter(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "running-pod", "statsls") - EnsureImageExists(t, images.PauseImage) + pauseImage := images.Get(images.Pause) + EnsureImageExists(t, pauseImage) t.Logf("Create a container config and run containers in a pod") containerConfigMap := make(map[string]*runtime.ContainerConfig) @@ -267,7 +271,7 @@ func TestContainerListStatsWithSandboxIdFilter(t *testing.T) { cName := fmt.Sprintf("container%d", i) containerConfig := ContainerConfig( cName, - images.PauseImage, + pauseImage, WithTestLabels(), WithTestAnnotations(), ) @@ -319,7 +323,8 @@ func TestContainerListStatsWithIdSandboxIdFilter(t *testing.T) { t.Logf("Create a pod config and run sandbox container") sb, sbConfig := PodSandboxConfigWithCleanup(t, "running-pod", "statsls") - EnsureImageExists(t, images.PauseImage) + pauseImage := images.Get(images.Pause) + EnsureImageExists(t, pauseImage) t.Logf("Create container config and run containers in a pod") containerConfigMap := make(map[string]*runtime.ContainerConfig) @@ -327,7 +332,7 @@ func TestContainerListStatsWithIdSandboxIdFilter(t *testing.T) { cName := fmt.Sprintf("container%d", i) containerConfig := ContainerConfig( cName, - images.PauseImage, + pauseImage, WithTestLabels(), WithTestAnnotations(), ) diff --git a/integration/container_update_resources_test.go b/integration/container_update_resources_test.go index b59b2423e..9e8873668 100644 --- a/integration/container_update_resources_test.go +++ b/integration/container_update_resources_test.go @@ -152,7 +152,8 @@ func TestUpdateContainerResources_MemorySwap(t *testing.T) { t.Log("Create a sandbox") sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox", "update-container-swap-resources") - EnsureImageExists(t, images.PauseImage) + pauseImage := images.Get(images.Pause) + EnsureImageExists(t, pauseImage) memoryLimit := int64(128 * 1024 * 1024) baseSwapLimit := int64(200 * 1024 * 1024) @@ -169,7 +170,7 @@ func TestUpdateContainerResources_MemorySwap(t *testing.T) { t.Log("Create a container with memory limit but no swap") cnConfig := ContainerConfig( "container", - images.PauseImage, + pauseImage, WithResources(&runtime.LinuxContainerResources{ MemoryLimitInBytes: memoryLimit, MemorySwapLimitInBytes: baseSwapLimit, @@ -224,12 +225,13 @@ func TestUpdateContainerResources_MemoryLimit(t *testing.T) { t.Log("Create a sandbox") sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox", "update-container-resources") - EnsureImageExists(t, images.PauseImage) + pauseImage := images.Get(images.Pause) + EnsureImageExists(t, pauseImage) t.Log("Create a container with memory limit") cnConfig := ContainerConfig( "container", - images.PauseImage, + pauseImage, WithResources(&runtime.LinuxContainerResources{ MemoryLimitInBytes: 200 * 1024 * 1024, }), diff --git a/integration/duplicate_name_test.go b/integration/duplicate_name_test.go index 0f4e41103..1037d5fae 100644 --- a/integration/duplicate_name_test.go +++ b/integration/duplicate_name_test.go @@ -31,12 +31,13 @@ func TestDuplicateName(t *testing.T) { _, err := runtimeService.RunPodSandbox(sbConfig, *runtimeHandler) require.Error(t, err) - EnsureImageExists(t, images.PauseImage) + pauseImage := images.Get(images.Pause) + EnsureImageExists(t, pauseImage) t.Logf("Create a container") cnConfig := ContainerConfig( "container", - images.PauseImage, + pauseImage, ) _, err = runtimeService.CreateContainer(sb, cnConfig, sbConfig) require.NoError(t, err) diff --git a/integration/images/image_list.go b/integration/images/image_list.go index 2adda269a..6a4f3527a 100644 --- a/integration/images/image_list.go +++ b/integration/images/image_list.go @@ -20,6 +20,7 @@ import ( "flag" "fmt" "os" + "sync" "github.com/pelletier/go-toml" "github.com/sirupsen/logrus" @@ -38,14 +39,11 @@ type ImageList struct { } var ( - imageMap map[int]string - imageList ImageList - PauseImage string // This is the same with default sandbox image + imageMap map[int]string + imageList ImageList ) -func init() { - initImages(*imageListFile) -} +var initOnce sync.Once func initImages(imageListFile string) { imageList = ImageList{ @@ -58,6 +56,8 @@ func initImages(imageListFile string) { } if imageListFile != "" { + logrus.Infof("loading image list from file: %s", imageListFile) + fileContent, err := os.ReadFile(imageListFile) if err != nil { panic(fmt.Errorf("error reading '%v' file contents: %v", imageList, err)) @@ -70,9 +70,7 @@ func initImages(imageListFile string) { } logrus.Infof("Using the following image list: %+v", imageList) - imageMap = initImageMap(imageList) - PauseImage = Get(Pause) } const ( @@ -105,5 +103,9 @@ func initImageMap(imageList ImageList) map[int]string { // Get returns the fully qualified URI to an image (including version) func Get(image int) string { + initOnce.Do(func() { + initImages(*imageListFile) + }) + return imageMap[image] } diff --git a/integration/main_test.go b/integration/main_test.go index ef780f70a..7befa4a9b 100644 --- a/integration/main_test.go +++ b/integration/main_test.go @@ -32,6 +32,7 @@ import ( "github.com/containerd/containerd" cri "github.com/containerd/containerd/integration/cri-api/pkg/apis" + _ "github.com/containerd/containerd/integration/images" // Keep this around to parse `imageListFile` command line var "github.com/containerd/containerd/integration/remote" dialer "github.com/containerd/containerd/integration/remote/util" criconfig "github.com/containerd/containerd/pkg/cri/config" diff --git a/integration/restart_test.go b/integration/restart_test.go index e4151eb62..16ac5c8b6 100644 --- a/integration/restart_test.go +++ b/integration/restart_test.go @@ -109,12 +109,13 @@ func TestContainerdRestart(t *testing.T) { runtimeService.RemovePodSandbox(sid) }() - EnsureImageExists(t, images.PauseImage) + pauseImage := images.Get(images.Pause) + EnsureImageExists(t, pauseImage) s.id = sid for j := range s.containers { c := &s.containers[j] - cfg := ContainerConfig(c.name, images.PauseImage, + cfg := ContainerConfig(c.name, pauseImage, // Set pid namespace as per container, so that container won't die // when sandbox container is killed. WithPidNamespace(runtime.NamespaceMode_CONTAINER), diff --git a/integration/windows_hostprocess_test.go b/integration/windows_hostprocess_test.go index d5f32e79f..c0f7a74e6 100644 --- a/integration/windows_hostprocess_test.go +++ b/integration/windows_hostprocess_test.go @@ -38,7 +38,7 @@ var ( // Tests to verify the Windows HostProcess func TestWindowsHostProcess(t *testing.T) { - pauseImage := images.PauseImage + pauseImage := images.Get(images.Pause) EnsureImageExists(t, pauseImage) t.Run("run as Local Service", func(t *testing.T) {