Skip to content

Commit 6364e89

Browse files
committed
Updated openshift-tests images to utilize mapped images from external binary
Currently, openshift-tests images cmd uses vendored GetMappedImageConfigs() function to map upstream images to mirrored ones. After this change, images cmd will parsed mapped images directly from outputs from the k8s-tests-ext binary. This prevents unexpected issues from imcompatible upstreams changes with vendored funcs. Signed-off-by: Vu Dinh <[email protected]>
1 parent da8a7f3 commit 6364e89

File tree

4 files changed

+77
-27
lines changed

4 files changed

+77
-27
lines changed

pkg/cmd/openshift-tests/images/images_command.go

Lines changed: 68 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import (
99
"time"
1010

1111
"golang.org/x/exp/slices"
12-
k8simage "k8s.io/kubernetes/test/utils/image"
1312

13+
"github.com/openshift-eng/openshift-tests-extension/pkg/extension"
1414
"github.com/openshift/library-go/pkg/image/reference"
1515
"github.com/openshift/origin/pkg/clioptions/imagesetup"
1616
"github.com/openshift/origin/pkg/cmd"
@@ -19,6 +19,7 @@ import (
1919
"github.com/spf13/cobra"
2020
"k8s.io/kube-openapi/pkg/util/sets"
2121
"k8s.io/kubectl/pkg/util/templates"
22+
k8simage "k8s.io/kubernetes/test/utils/image"
2223
)
2324

2425
func NewImagesCommand() *cobra.Command {
@@ -112,14 +113,13 @@ type imagesOptions struct {
112113
// TAG is the hash described above.
113114
func createImageMirrorForInternalImages(prefix string, ref reference.DockerImageReference, mirrored bool) ([]string, error) {
114115
source := ref.Exact()
115-
116+
externalImageSets := []extension.Image{}
116117
initialImageSets := []extensions.ImageSet{
117118
k8simage.GetOriginalImageConfigs(),
118119
}
119120

120121
// If ENV is not set, the list of images should come from external binaries
121122
if len(os.Getenv("OPENSHIFT_SKIP_EXTERNAL_TESTS")) == 0 {
122-
// Extract all test binaries
123123
extractionContext, extractionContextCancel := context.WithTimeout(context.Background(), 30*time.Minute)
124124
defer extractionContextCancel()
125125
cleanUpFn, externalBinaries, err := extensions.ExtractAllTestBinaries(extractionContext, 10)
@@ -138,11 +138,31 @@ func createImageMirrorForInternalImages(prefix string, ref reference.DockerImage
138138
if len(imageSetsFromBinaries) == 0 {
139139
return nil, fmt.Errorf("no test images were reported by external binaries")
140140
}
141-
initialImageSets = imageSetsFromBinaries
141+
externalImageSets = imageSetsFromBinaries
142142
}
143143

144-
// Take the initial images coming from external binaries and remove any exceptions that might exist.
144+
// Convert external images to initial and updated image sets
145+
// Add mapped images to updated image set if they exist
145146
exceptions := image.Exceptions.List()
147+
updatedImageSets := []extensions.ImageSet{}
148+
initial := extensions.ImageSet{}
149+
updated := extensions.ImageSet{}
150+
for _, image := range externalImageSets {
151+
imageConfig := covertMappedImageToImageConfig(image)
152+
if !slices.ContainsFunc(exceptions, func(e string) bool {
153+
return strings.Contains(imageConfig.GetE2EImage(), e)
154+
}) {
155+
initial[k8simage.ImageID(image.Index)] = imageConfig
156+
if image.Mapped != nil {
157+
updated[k8simage.ImageID(image.Index)] = covertMappedImageToImageConfig(*image.Mapped)
158+
}
159+
}
160+
}
161+
if len(initial) > 0 {
162+
initialImageSets = []extensions.ImageSet{initial}
163+
}
164+
165+
// Take the initial images coming from external binaries and remove any exceptions that might exist.
146166
defaultImageSets := []extensions.ImageSet{}
147167
for i := range initialImageSets {
148168
filtered := extensions.ImageSet{}
@@ -158,12 +178,40 @@ func createImageMirrorForInternalImages(prefix string, ref reference.DockerImage
158178
}
159179
}
160180

161-
// Created a new slice with the updatedImageSets addresses for the images
162-
updatedImageSets := []extensions.ImageSet{}
163-
for i := range defaultImageSets {
164-
updatedImageSets = append(updatedImageSets, k8simage.GetMappedImageConfigs(defaultImageSets[i], ref.Exact()))
181+
// Map initial images to the target repository
182+
for _, img := range defaultImageSets {
183+
for imageID, imageConfig := range img {
184+
// If the imageID is in the updated image set, skip it
185+
if _, ok := updated[imageID]; ok {
186+
continue
187+
}
188+
m := map[string]k8simage.ImageID{
189+
imageConfig.GetE2EImage(): k8simage.ImageID(imageID),
190+
}
191+
mappedImage := map[string]string{}
192+
switch imageID {
193+
// These images are special and can't be run out of the cloud - some because they
194+
// are authenticated, and others because they are not real images. Tests that depend
195+
// on these images can't be run without access to the public internet.
196+
case k8simage.InvalidRegistryImage, k8simage.AgnhostPrivate, k8simage.AuthenticatedAlpine:
197+
mappedImage[imageConfig.GetE2EImage()] = imageConfig.GetE2EImage()
198+
default:
199+
mappedImage = image.GetMappedImages(m, source)
200+
}
201+
ref, err := reference.Parse(mappedImage[imageConfig.GetE2EImage()])
202+
if err != nil {
203+
continue
204+
}
205+
config := k8simage.Config{}
206+
config.SetRegistry(ref.Registry)
207+
config.SetName(ref.RepositoryName())
208+
config.SetVersion(ref.Tag)
209+
updated[k8simage.ImageID(imageID)] = config
210+
}
165211
}
166212

213+
updatedImageSets = []extensions.ImageSet{updated}
214+
167215
openshiftDefaults := image.OriginalImages()
168216
openshiftUpdated := image.GetMappedImages(openshiftDefaults, imagesetup.DefaultTestImageMirrorLocation)
169217

@@ -178,9 +226,9 @@ func createImageMirrorForInternalImages(prefix string, ref reference.DockerImage
178226
covered := sets.NewString()
179227
for i := range updatedImageSets {
180228
for imageID, imageConfig := range updatedImageSets[i] {
181-
defaultConfig := defaultImageSets[i][imageID]
229+
originalConfig := defaultImageSets[i][imageID]
182230
pullSpec := imageConfig.GetE2EImage()
183-
if pullSpec == defaultConfig.GetE2EImage() {
231+
if pullSpec == originalConfig.GetE2EImage() {
184232
continue
185233
}
186234
if covered.Has(pullSpec) {
@@ -250,3 +298,12 @@ func createImageMirrorForInternalImages(prefix string, ref reference.DockerImage
250298
sort.Strings(lines)
251299
return lines, nil
252300
}
301+
302+
func covertMappedImageToImageConfig(image extension.Image) k8simage.Config {
303+
imageConfig := k8simage.Config{}
304+
imageConfig.SetName(image.Name)
305+
imageConfig.SetVersion(image.Version)
306+
imageConfig.SetRegistry(image.Registry)
307+
308+
return imageConfig
309+
}

pkg/test/extensions/binary.go

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ func (b *TestBinary) RunTests(ctx context.Context, timeout time.Duration, env []
397397
return results
398398
}
399399

400-
func (b *TestBinary) ListImages(ctx context.Context) (ImageSet, error) {
400+
func (b *TestBinary) ListImages(ctx context.Context) ([]extension.Image, error) {
401401
start := time.Now()
402402
binName := filepath.Base(b.binaryPath)
403403

@@ -408,23 +408,14 @@ func (b *TestBinary) ListImages(ctx context.Context) (ImageSet, error) {
408408
return nil, fmt.Errorf("failed running '%s list': %w\nOutput: %s", b.binaryPath, err, output)
409409
}
410410

411-
var images []Image
411+
var images []extension.Image
412412
err = json.Unmarshal(output, &images)
413413
if err != nil {
414414
return nil, err
415415
}
416416

417-
result := make(ImageSet, len(images))
418-
for _, image := range images {
419-
imageConfig := k8simage.Config{}
420-
imageConfig.SetName(image.Name)
421-
imageConfig.SetVersion(image.Version)
422-
imageConfig.SetRegistry(image.Registry)
423-
result[k8simage.ImageID(image.Index)] = imageConfig
424-
}
425-
426417
logrus.Infof("Listed %d test images for %q in %v", len(images), binName, time.Since(start))
427-
return result, nil
418+
return images, nil
428419
}
429420

430421
// ExtractAllTestBinaries determines the optimal release payload to use, and extracts all the external
@@ -613,9 +604,9 @@ func (binaries TestBinaries) Info(ctx context.Context, parallelism int) ([]*Exte
613604
return infos, nil
614605
}
615606

616-
func (binaries TestBinaries) ListImages(ctx context.Context, parallelism int) ([]ImageSet, error) {
607+
func (binaries TestBinaries) ListImages(ctx context.Context, parallelism int) ([]extension.Image, error) {
617608
var (
618-
allImages []ImageSet
609+
allImages []extension.Image
619610
mu sync.Mutex
620611
wg sync.WaitGroup
621612
errCh = make(chan error, len(binaries))
@@ -651,12 +642,12 @@ func (binaries TestBinaries) ListImages(ctx context.Context, parallelism int) ([
651642
continue // Skip self - only external binaries need to be queried for images
652643
}
653644

654-
imageConfig, err := binary.ListImages(ctx)
645+
image, err := binary.ListImages(ctx)
655646
if err != nil {
656647
errCh <- err
657648
}
658649
mu.Lock()
659-
allImages = append(allImages, imageConfig)
650+
allImages = append(allImages, image...)
660651
mu.Unlock()
661652
}
662653
}

test/extended/util/image/zz_generated.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# This file is generated by hack/update-generated.sh
22
docker.io/library/registry:2.8.0-beta.1 quay.io/openshift/community-e2e-images:e2e-docker-io-library-registry-2-8-0-beta-1-8x_YFKSuz9Xw6lZD
3+
gcr.io/authenticated-image-pulling/windows-nanoserver:v1 quay.io/openshift/community-e2e-images:e2e-6-gcr-io-authenticated-image-pulling-windows-nanoserver-v1-JL_XVPCftjC9psmR
34
quay.io/keycloak/keycloak:25.0 quay.io/openshift/community-e2e-images:e2e-quay-io-keycloak-keycloak-25-0-rEIw9B2Zcc3L1M6k
45
quay.io/kubevirt/fedora-with-test-tooling-container-disk:20241024_891122a6fc quay.io/openshift/community-e2e-images:e2e-quay-io-kubevirt-fedora-with-test-tooling-container-disk-20241024_891122a6fc-IycYTh-87XrXse4E
56
quay.io/openshifttest/ldap:1.2 quay.io/openshift/community-e2e-images:e2e-quay-io-openshifttest-ldap-1-2-O3f5zPgtmWzEtasv

vendor/github.com/openshift-eng/openshift-tests-extension/pkg/extension/types.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)