Skip to content

Commit 273c2bb

Browse files
committed
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 <[email protected]>
1 parent feee16e commit 273c2bb

12 files changed

Lines changed: 45 additions & 78 deletions

integration/addition_gids_test.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,8 @@ func TestAdditionalGids(t *testing.T) {
4949
testImage = GetImage(BusyBox)
5050
containerName = "test-container"
5151
)
52-
t.Logf("Pull test image %q", testImage)
53-
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
54-
require.NoError(t, err)
55-
defer func() {
56-
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
57-
}()
52+
53+
EnsureImageExists(t, testImage)
5854

5955
t.Log("Create a container to print id")
6056
cnConfig := ContainerConfig(

integration/common.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@ package integration
2121
import (
2222
"fmt"
2323
"io/ioutil"
24+
"testing"
2425

2526
"github.com/pelletier/go-toml"
2627
"github.com/sirupsen/logrus"
28+
"github.com/stretchr/testify/require"
2729
cri "k8s.io/cri-api/pkg/apis"
30+
runtime "k8s.io/cri-api/pkg/apis/runtime/v1alpha2"
2831
)
2932

3033
// ImageList holds public image references
@@ -99,3 +102,20 @@ func initImageMap(imageList ImageList) map[int]string {
99102
func GetImage(image int) string {
100103
return imageMap[image]
101104
}
105+
106+
// EnsureImageExists pulls the given image, ensures that no error was encountered
107+
// while pulling it.
108+
func EnsureImageExists(t *testing.T, imageName string) string {
109+
img, err := imageService.ImageStatus(&runtime.ImageSpec{Image: imageName})
110+
require.NoError(t, err)
111+
if img != nil {
112+
t.Logf("Image %q already exists, not pulling.", imageName)
113+
return img.Id
114+
}
115+
116+
t.Logf("Pull test image %q", imageName)
117+
imgID, err := imageService.PullImage(&runtime.ImageSpec{Image: imageName}, nil, nil)
118+
require.NoError(t, err)
119+
120+
return imgID
121+
}

integration/container_log_test.go

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,8 @@ func TestContainerLogWithoutTailingNewLine(t *testing.T) {
5252
testImage = GetImage(BusyBox)
5353
containerName = "test-container"
5454
)
55-
t.Logf("Pull test image %q", testImage)
56-
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
57-
require.NoError(t, err)
58-
defer func() {
59-
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
60-
}()
55+
56+
EnsureImageExists(t, testImage)
6157

6258
t.Log("Create a container with log path")
6359
cnConfig := ContainerConfig(
@@ -112,12 +108,8 @@ func TestLongContainerLog(t *testing.T) {
112108
testImage = GetImage(BusyBox)
113109
containerName = "test-container"
114110
)
115-
t.Logf("Pull test image %q", testImage)
116-
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
117-
require.NoError(t, err)
118-
defer func() {
119-
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
120-
}()
111+
112+
EnsureImageExists(t, testImage)
121113

122114
t.Log("Create a container with log path")
123115
config, err := CRIConfig()

integration/container_stop_test.go

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,8 @@ func TestSharedPidMultiProcessContainerStop(t *testing.T) {
4646
testImage = GetImage(BusyBox)
4747
containerName = "test-container"
4848
)
49-
t.Logf("Pull test image %q", testImage)
50-
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
51-
require.NoError(t, err)
52-
defer func() {
53-
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
54-
}()
49+
50+
EnsureImageExists(t, testImage)
5551

5652
t.Log("Create a multi-process container")
5753
cnConfig := ContainerConfig(
@@ -90,12 +86,8 @@ func TestContainerStopCancellation(t *testing.T) {
9086
testImage = GetImage(BusyBox)
9187
containerName = "test-container"
9288
)
93-
t.Logf("Pull test image %q", testImage)
94-
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
95-
require.NoError(t, err)
96-
defer func() {
97-
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
98-
}()
89+
90+
EnsureImageExists(t, testImage)
9991

10092
t.Log("Create a container which traps sigterm")
10193
cnConfig := ContainerConfig(

integration/container_without_image_ref_test.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,8 @@ func TestContainerLifecycleWithoutImageRef(t *testing.T) {
4141
testImage = GetImage(BusyBox)
4242
containerName = "test-container"
4343
)
44-
t.Log("Pull test image")
45-
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
46-
require.NoError(t, err)
47-
defer func() {
48-
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
49-
}()
44+
45+
img := EnsureImageExists(t, testImage)
5046

5147
t.Log("Create test container")
5248
cnConfig := ContainerConfig(

integration/containerd_image_test.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,8 @@ func TestContainerdImageInOtherNamespaces(t *testing.T) {
185185
}
186186
require.NoError(t, Consistently(checkImage, 100*time.Millisecond, time.Second))
187187

188-
sbConfig := PodSandboxConfig("sandbox", "test")
189-
t.Logf("pull the image into cri plugin")
190-
id, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
191-
require.NoError(t, err)
192-
defer func() {
193-
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: id}))
194-
}()
188+
PodSandboxConfig("sandbox", "test")
189+
EnsureImageExists(t, testImage)
195190

196191
t.Logf("cri plugin should see the image now")
197192
img, err := imageService.ImageStatus(&runtime.ImageSpec{Image: testImage})

integration/imagefs_info_test.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,8 @@ func TestImageFSInfo(t *testing.T) {
3333
config := PodSandboxConfig("running-pod", "imagefs")
3434

3535
t.Logf("Pull an image to make sure image fs is not empty")
36-
img, err := imageService.PullImage(&runtime.ImageSpec{Image: GetImage(BusyBox)}, nil, config)
37-
require.NoError(t, err)
38-
defer func() {
39-
err := imageService.RemoveImage(&runtime.ImageSpec{Image: img})
40-
assert.NoError(t, err)
41-
}()
36+
EnsureImageExists(t, GetImage(BusyBox))
37+
4238
t.Logf("Create a sandbox to make sure there is an active snapshot")
4339
sb, err := runtimeService.RunPodSandbox(config, *runtimeHandler)
4440
require.NoError(t, err)

integration/pod_dualstack_test.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,8 @@ func TestPodDualStack(t *testing.T) {
5050
testImage = GetImage(BusyBox)
5151
containerName = "test-container"
5252
)
53-
t.Logf("Pull test image %q", testImage)
54-
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
55-
require.NoError(t, err)
56-
defer func() {
57-
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
58-
}()
53+
54+
EnsureImageExists(t, testImage)
5955

6056
t.Log("Create a container to print env")
6157
cnConfig := ContainerConfig(

integration/pod_hostname_test.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,8 @@ func TestPodHostname(t *testing.T) {
8686
testImage = GetImage(BusyBox)
8787
containerName = "test-container"
8888
)
89-
t.Logf("Pull test image %q", testImage)
90-
img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig)
91-
require.NoError(t, err)
92-
defer func() {
93-
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
94-
}()
89+
90+
EnsureImageExists(t, testImage)
9591

9692
t.Log("Create a container to print env")
9793
cnConfig := ContainerConfig(

integration/restart_test.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,7 @@ func TestContainerdRestart(t *testing.T) {
135135

136136
t.Logf("Pull test images")
137137
for _, image := range []string{GetImage(BusyBox), GetImage(Alpine)} {
138-
img, err := imageService.PullImage(&runtime.ImageSpec{Image: image}, nil, nil)
139-
require.NoError(t, err)
140-
defer func() {
141-
assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img}))
142-
}()
138+
EnsureImageExists(t, image)
143139
}
144140
imagesBeforeRestart, err := imageService.ListImages(nil)
145141
assert.NoError(t, err)

0 commit comments

Comments
 (0)