Skip to content

Commit 29669a5

Browse files
authored
Merge pull request kubernetes#74703 from johscheuer/refactor-csi-e2e-tests
Add patch method for container images
2 parents 835552e + 302e9d9 commit 29669a5

File tree

5 files changed

+206
-5
lines changed

5 files changed

+206
-5
lines changed

test/e2e/framework/create.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
"github.com/pkg/errors"
2525

2626
appsv1 "k8s.io/api/apps/v1"
27-
"k8s.io/api/core/v1"
27+
v1 "k8s.io/api/core/v1"
2828
rbacv1 "k8s.io/api/rbac/v1"
2929
storagev1 "k8s.io/api/storage/v1"
3030
apierrs "k8s.io/apimachinery/pkg/api/errors"
@@ -34,6 +34,7 @@ import (
3434
"k8s.io/client-go/kubernetes/scheme"
3535
"k8s.io/client-go/tools/cache"
3636
e2elog "k8s.io/kubernetes/test/e2e/framework/log"
37+
e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
3738
"k8s.io/kubernetes/test/e2e/framework/testfiles"
3839
)
3940

@@ -355,8 +356,20 @@ func (f *Framework) patchItemRecursively(item interface{}) error {
355356
f.PatchNamespace(&item.ObjectMeta.Namespace)
356357
case *appsv1.StatefulSet:
357358
f.PatchNamespace(&item.ObjectMeta.Namespace)
359+
if err := e2epod.PatchContainerImages(item.Spec.Template.Spec.Containers); err != nil {
360+
return err
361+
}
362+
if err := e2epod.PatchContainerImages(item.Spec.Template.Spec.InitContainers); err != nil {
363+
return err
364+
}
358365
case *appsv1.DaemonSet:
359366
f.PatchNamespace(&item.ObjectMeta.Namespace)
367+
if err := e2epod.PatchContainerImages(item.Spec.Template.Spec.Containers); err != nil {
368+
return err
369+
}
370+
if err := e2epod.PatchContainerImages(item.Spec.Template.Spec.InitContainers); err != nil {
371+
return err
372+
}
360373
default:
361374
return errors.Errorf("missing support for patching item of type %T", item)
362375
}

test/e2e/framework/pod/resource.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -688,3 +688,17 @@ func GetPodsScheduled(masterNodes sets.String, pods *v1.PodList) (scheduledPods,
688688
}
689689
return
690690
}
691+
692+
// PatchContainerImages replaces the specified Container Registry with a custom
693+
// one provided via the KUBE_TEST_REPO_LIST env variable
694+
func PatchContainerImages(containers []v1.Container) error {
695+
var err error
696+
for _, c := range containers {
697+
c.Image, err = imageutils.ReplaceRegistryInImageURL(c.Image)
698+
if err != nil {
699+
return err
700+
}
701+
}
702+
703+
return nil
704+
}

test/utils/image/BUILD

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package(default_visibility = ["//visibility:public"])
22

3-
load(
4-
"@io_bazel_rules_go//go:def.bzl",
5-
"go_library",
6-
)
3+
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
74

85
go_library(
96
name = "go_default_library",
@@ -26,3 +23,9 @@ filegroup(
2623
srcs = [":package-srcs"],
2724
tags = ["automanaged"],
2825
)
26+
27+
go_test(
28+
name = "go_default_test",
29+
srcs = ["manifest_test.go"],
30+
embed = [":go_default_library"],
31+
)

test/utils/image/manifest.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121
"io/ioutil"
2222
"os"
23+
"strings"
2324

2425
yaml "gopkg.in/yaml.v2"
2526
)
@@ -31,9 +32,11 @@ type RegistryList struct {
3132
E2eRegistry string `yaml:"e2eRegistry"`
3233
InvalidRegistry string `yaml:"invalidRegistry"`
3334
GcRegistry string `yaml:"gcRegistry"`
35+
GcrReleaseRegistry string `yaml:"gcrReleaseRegistry"`
3436
GoogleContainerRegistry string `yaml:"googleContainerRegistry"`
3537
PrivateRegistry string `yaml:"privateRegistry"`
3638
SampleRegistry string `yaml:"sampleRegistry"`
39+
QuayK8sCSI string `yaml:"quayK8sCSI"`
3740
}
3841

3942
// Config holds an images registry, name, and version
@@ -65,9 +68,11 @@ func initReg() RegistryList {
6568
E2eRegistry: "gcr.io/kubernetes-e2e-test-images",
6669
InvalidRegistry: "invalid.com/invalid",
6770
GcRegistry: "k8s.gcr.io",
71+
GcrReleaseRegistry: "gcr.io/gke-release",
6872
GoogleContainerRegistry: "gcr.io/google-containers",
6973
PrivateRegistry: "gcr.io/k8s-authenticated-test",
7074
SampleRegistry: "gcr.io/google-samples",
75+
QuayK8sCSI: "quay.io/k8scsi",
7176
}
7277
repoList := os.Getenv("KUBE_TEST_REPO_LIST")
7378
if repoList == "" {
@@ -93,8 +98,10 @@ var (
9398
e2eGcRegistry = "gcr.io/kubernetes-e2e-test-images"
9499
gcAuthenticatedRegistry = registry.GcAuthenticatedRegistry
95100
gcRegistry = registry.GcRegistry
101+
gcrReleaseRegistry = registry.GcrReleaseRegistry
96102
googleContainerRegistry = registry.GoogleContainerRegistry
97103
invalidRegistry = registry.InvalidRegistry
104+
quayK8sCSI = registry.QuayK8sCSI
98105
// PrivateRegistry is an image repository that requires authentication
99106
PrivateRegistry = registry.PrivateRegistry
100107
sampleRegistry = registry.SampleRegistry
@@ -269,3 +276,38 @@ func (i *Config) GetE2EImage() string {
269276
func GetPauseImageName() string {
270277
return GetE2EImage(Pause)
271278
}
279+
280+
// ReplaceRegistryInImageURL replaces the registry in the image URL with a custom one
281+
func ReplaceRegistryInImageURL(imageURL string) (string, error) {
282+
parts := strings.Split(imageURL, "/")
283+
countParts := len(parts)
284+
registryAndUser := strings.Join(parts[:countParts-1], "/")
285+
286+
switch registryAndUser {
287+
case "gcr.io/kubernetes-e2e-test-images":
288+
registryAndUser = e2eRegistry
289+
case "k8s.gcr.io":
290+
registryAndUser = gcRegistry
291+
case "gcr.io/k8s-authenticated-test":
292+
registryAndUser = PrivateRegistry
293+
case "gcr.io/google-samples":
294+
registryAndUser = sampleRegistry
295+
case "gcr.io/gke-release":
296+
registryAndUser = gcrReleaseRegistry
297+
case "docker.io/library":
298+
registryAndUser = dockerLibraryRegistry
299+
case "quay.io/k8scsi":
300+
registryAndUser = quayK8sCSI
301+
default:
302+
if countParts == 1 {
303+
// We assume we found an image from docker hub library
304+
// e.g. openjdk -> docker.io/library/openjdk
305+
registryAndUser = dockerLibraryRegistry
306+
break
307+
}
308+
309+
return "", fmt.Errorf("Registry: %s is missing in test/utils/image/manifest.go, please add the registry, otherwise the test will fail on air-gapped clusters", registryAndUser)
310+
}
311+
312+
return fmt.Sprintf("%s/%s", registryAndUser, parts[countParts-1]), nil
313+
}

test/utils/image/manifest_test.go

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/*
2+
Copyright 2019 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package image
18+
19+
import (
20+
"fmt"
21+
"testing"
22+
)
23+
24+
type result struct {
25+
result string
26+
err error
27+
}
28+
29+
var registryTests = []struct {
30+
in string
31+
out result
32+
}{
33+
{
34+
"docker.io/library/test:123",
35+
result{
36+
result: "test.io/library/test:123",
37+
err: nil,
38+
},
39+
},
40+
{
41+
"docker.io/library/test",
42+
result{
43+
result: "test.io/library/test",
44+
err: nil,
45+
},
46+
},
47+
{
48+
"test",
49+
result{
50+
result: "test.io/library/test",
51+
err: nil,
52+
},
53+
},
54+
{
55+
"gcr.io/kubernetes-e2e-test-images/test:123",
56+
result{
57+
result: "test.io/kubernetes-e2e-test-images/test:123",
58+
err: nil,
59+
},
60+
},
61+
{
62+
"k8s.gcr.io/test:123",
63+
result{
64+
result: "test.io/test:123",
65+
err: nil,
66+
},
67+
},
68+
{
69+
"gcr.io/k8s-authenticated-test/test:123",
70+
result{
71+
result: "test.io/k8s-authenticated-test/test:123",
72+
err: nil,
73+
},
74+
},
75+
{
76+
"gcr.io/gke-release/test:latest",
77+
result{
78+
result: "test.io/gke-release/test:latest",
79+
err: nil,
80+
},
81+
},
82+
{
83+
"gcr.io/google-samples/test:latest",
84+
result{
85+
result: "test.io/google-samples/test:latest",
86+
err: nil,
87+
},
88+
},
89+
{
90+
"quay.io/k8scsi/test:latest",
91+
result{
92+
result: "test.io/k8scsi/test:latest",
93+
err: nil,
94+
},
95+
},
96+
{
97+
"unknwon.io/google-samples/test:latest",
98+
result{
99+
result: "",
100+
err: fmt.Errorf("Registry: unknwon.io/google-samples is missing in test/utils/image/manifest.go, please add the registry, otherwise the test will fail on air-gapped clusters"),
101+
},
102+
},
103+
}
104+
105+
// ToDo Add Benchmark
106+
func TestReplaceRegistryInImageURL(t *testing.T) {
107+
// Set custom registries
108+
dockerLibraryRegistry = "test.io/library"
109+
e2eRegistry = "test.io/kubernetes-e2e-test-images"
110+
gcRegistry = "test.io"
111+
gcrReleaseRegistry = "test.io/gke-release"
112+
PrivateRegistry = "test.io/k8s-authenticated-test"
113+
sampleRegistry = "test.io/google-samples"
114+
quayK8sCSI = "test.io/k8scsi"
115+
116+
for _, tt := range registryTests {
117+
t.Run(tt.in, func(t *testing.T) {
118+
s, err := ReplaceRegistryInImageURL(tt.in)
119+
120+
if err != nil && err.Error() != tt.out.err.Error() {
121+
t.Errorf("got %q, want %q", err, tt.out.err)
122+
}
123+
124+
if s != tt.out.result {
125+
t.Errorf("got %q, want %q", s, tt.out.result)
126+
}
127+
})
128+
}
129+
}

0 commit comments

Comments
 (0)