tests: Prepull images used in tests

Most of the tests are pulling and deleting the same test images, which
can be quite inefficient, especially on Windows nodes, where the images
are larger than the Linux ones (a nanoserver Container image is ~250MB
in size). We can instead pull them only once, and reuse them. This will
reduce the test run time on Windows considerably.

Additionally, some of the test images are currently hosted on dockerhub
(busybox image), which has introduced image ratelimiting in November 2020,
which means that test runners could potentially hit that limit faster with
the current implementation. This will reduce that risk.

Some tests are specifically deleting images, so we always have to ensure
that they are pulled.

Signed-off-by: Claudiu Belu <cbelu@cloudbasesolutions.com>
This commit is contained in:
Claudiu Belu 2021-04-19 20:51:42 +00:00
parent feee16e0e3
commit 273c2bb168
12 changed files with 45 additions and 78 deletions

View File

@ -49,12 +49,8 @@ func TestAdditionalGids(t *testing.T) {
testImage = GetImage(BusyBox)
containerName = "test-container"
)
t.Logf("Pull test image %q", testImage)
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
require.NoError(t, err)
defer func() {
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
}()
EnsureImageExists(t, testImage)
t.Log("Create a container to print id")
cnConfig := ContainerConfig(

View File

@ -21,10 +21,13 @@ package integration
import (
"fmt"
"io/ioutil"
"testing"
"github.com/pelletier/go-toml"
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"
cri "k8s.io/cri-api/pkg/apis"
runtime "k8s.io/cri-api/pkg/apis/runtime/v1alpha2"
)
// ImageList holds public image references
@ -99,3 +102,20 @@ func initImageMap(imageList ImageList) map[int]string {
func GetImage(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
}

View File

@ -52,12 +52,8 @@ func TestContainerLogWithoutTailingNewLine(t *testing.T) {
testImage = GetImage(BusyBox)
containerName = "test-container"
)
t.Logf("Pull test image %q", testImage)
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
require.NoError(t, err)
defer func() {
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
}()
EnsureImageExists(t, testImage)
t.Log("Create a container with log path")
cnConfig := ContainerConfig(
@ -112,12 +108,8 @@ func TestLongContainerLog(t *testing.T) {
testImage = GetImage(BusyBox)
containerName = "test-container"
)
t.Logf("Pull test image %q", testImage)
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
require.NoError(t, err)
defer func() {
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
}()
EnsureImageExists(t, testImage)
t.Log("Create a container with log path")
config, err := CRIConfig()

View File

@ -46,12 +46,8 @@ func TestSharedPidMultiProcessContainerStop(t *testing.T) {
testImage = GetImage(BusyBox)
containerName = "test-container"
)
t.Logf("Pull test image %q", testImage)
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
require.NoError(t, err)
defer func() {
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
}()
EnsureImageExists(t, testImage)
t.Log("Create a multi-process container")
cnConfig := ContainerConfig(
@ -90,12 +86,8 @@ func TestContainerStopCancellation(t *testing.T) {
testImage = GetImage(BusyBox)
containerName = "test-container"
)
t.Logf("Pull test image %q", testImage)
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
require.NoError(t, err)
defer func() {
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
}()
EnsureImageExists(t, testImage)
t.Log("Create a container which traps sigterm")
cnConfig := ContainerConfig(

View File

@ -41,12 +41,8 @@ func TestContainerLifecycleWithoutImageRef(t *testing.T) {
testImage = GetImage(BusyBox)
containerName = "test-container"
)
t.Log("Pull test image")
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
require.NoError(t, err)
defer func() {
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
}()
img := EnsureImageExists(t, testImage)
t.Log("Create test container")
cnConfig := ContainerConfig(

View File

@ -185,13 +185,8 @@ func TestContainerdImageInOtherNamespaces(t *testing.T) {
}
require.NoError(t, Consistently(checkImage, 100*time.Millisecond, time.Second))
sbConfig := PodSandboxConfig("sandbox", "test")
t.Logf("pull the image into cri plugin")
id, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
require.NoError(t, err)
defer func() {
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: id}))
}()
PodSandboxConfig("sandbox", "test")
EnsureImageExists(t, testImage)
t.Logf("cri plugin should see the image now")
img, err := imageService.ImageStatus(&runtime.ImageSpec{Image: testImage})

View File

@ -33,12 +33,8 @@ func TestImageFSInfo(t *testing.T) {
config := PodSandboxConfig("running-pod", "imagefs")
t.Logf("Pull an image to make sure image fs is not empty")
img, err := imageService.PullImage(&runtime.ImageSpec{Image: GetImage(BusyBox)}, nil, config)
require.NoError(t, err)
defer func() {
err := imageService.RemoveImage(&runtime.ImageSpec{Image: img})
assert.NoError(t, err)
}()
EnsureImageExists(t, GetImage(BusyBox))
t.Logf("Create a sandbox to make sure there is an active snapshot")
sb, err := runtimeService.RunPodSandbox(config, *runtimeHandler)
require.NoError(t, err)

View File

@ -50,12 +50,8 @@ func TestPodDualStack(t *testing.T) {
testImage = GetImage(BusyBox)
containerName = "test-container"
)
t.Logf("Pull test image %q", testImage)
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
require.NoError(t, err)
defer func() {
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
}()
EnsureImageExists(t, testImage)
t.Log("Create a container to print env")
cnConfig := ContainerConfig(

View File

@ -86,12 +86,8 @@ func TestPodHostname(t *testing.T) {
testImage = GetImage(BusyBox)
containerName = "test-container"
)
t.Logf("Pull test image %q", testImage)
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
require.NoError(t, err)
defer func() {
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
}()
EnsureImageExists(t, testImage)
t.Log("Create a container to print env")
cnConfig := ContainerConfig(

View File

@ -135,11 +135,7 @@ func TestContainerdRestart(t *testing.T) {
t.Logf("Pull test images")
for _, image := range []string{GetImage(BusyBox), GetImage(Alpine)} {
img, err := imageService.PullImage(&runtime.ImageSpec{Image: image}, nil, nil)
require.NoError(t, err)
defer func() {
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
}()
EnsureImageExists(t, image)
}
imagesBeforeRestart, err := imageService.ListImages(nil)
assert.NoError(t, err)

View File

@ -35,12 +35,9 @@ func TestTruncIndex(t *testing.T) {
t.Logf("Pull an image")
var appImage = GetImage(BusyBox)
imgID, err := imageService.PullImage(&runtimeapi.ImageSpec{Image: appImage}, nil, sbConfig)
require.NoError(t, err)
imgID := EnsureImageExists(t, appImage)
imgTruncID := genTruncIndex(imgID)
defer func() {
assert.NoError(t, imageService.RemoveImage(&runtimeapi.ImageSpec{Image: imgTruncID}))
}()
t.Logf("Get image status by truncindex, truncID: %s", imgTruncID)
res, err := imageService.ImageStatus(&runtimeapi.ImageSpec{Image: imgTruncID})

View File

@ -26,7 +26,6 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
runtime "k8s.io/cri-api/pkg/apis/runtime/v1alpha2"
)
func TestVolumeCopyUp(t *testing.T) {
@ -44,9 +43,7 @@ func TestVolumeCopyUp(t *testing.T) {
assert.NoError(t, runtimeService.RemovePodSandbox(sb))
}()
t.Logf("Pull test image")
_, err = imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
require.NoError(t, err)
EnsureImageExists(t, testImage)
t.Logf("Create a container with volume-copy-up test image")
cnConfig := ContainerConfig(
@ -106,9 +103,7 @@ func TestVolumeOwnership(t *testing.T) {
assert.NoError(t, runtimeService.RemovePodSandbox(sb))
}()
t.Logf("Pull test image")
_, err = imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
require.NoError(t, err)
EnsureImageExists(t, testImage)
t.Logf("Create a container with volume-ownership test image")
cnConfig := ContainerConfig(