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
2425func  NewImagesCommand () * cobra.Command  {
@@ -112,14 +113,13 @@ type imagesOptions struct {
112113// TAG is the hash described above. 
113114func  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+ }
0 commit comments