Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 35 additions & 23 deletions pkg/cmd/openshift-tests/images/images_command.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import (
"time"

"golang.org/x/exp/slices"
k8simage "k8s.io/kubernetes/test/utils/image"

"github.com/openshift-eng/openshift-tests-extension/pkg/extension"
"github.com/openshift/library-go/pkg/image/reference"
"github.com/openshift/origin/pkg/clioptions/imagesetup"
"github.com/openshift/origin/pkg/cmd"
Expand All @@ -19,6 +19,7 @@ import (
"github.com/spf13/cobra"
"k8s.io/kube-openapi/pkg/util/sets"
"k8s.io/kubectl/pkg/util/templates"
k8simage "k8s.io/kubernetes/test/utils/image"
)

func NewImagesCommand() *cobra.Command {
Expand Down Expand Up @@ -112,14 +113,10 @@ type imagesOptions struct {
// TAG is the hash described above.
func createImageMirrorForInternalImages(prefix string, ref reference.DockerImageReference, mirrored bool) ([]string, error) {
source := ref.Exact()

initialImageSets := []extensions.ImageSet{
k8simage.GetOriginalImageConfigs(),
}
externalImageSets := []extension.Image{}

// If ENV is not set, the list of images should come from external binaries
if len(os.Getenv("OPENSHIFT_SKIP_EXTERNAL_TESTS")) == 0 {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need the images from both builtin and external binaries tests; I'm not sure I understand why we're dropping the env var here.

// Extract all test binaries
extractionContext, extractionContextCancel := context.WithTimeout(context.Background(), 30*time.Minute)
defer extractionContextCancel()
cleanUpFn, externalBinaries, err := extensions.ExtractAllTestBinaries(extractionContext, 10)
Expand All @@ -138,30 +135,34 @@ func createImageMirrorForInternalImages(prefix string, ref reference.DockerImage
if len(imageSetsFromBinaries) == 0 {
return nil, fmt.Errorf("no test images were reported by external binaries")
}
initialImageSets = imageSetsFromBinaries
externalImageSets = imageSetsFromBinaries
}

// Take the initial images coming from external binaries and remove any exceptions that might exist.
// Also, split the images into default, updated, and initial sets (initial set is the images that are not mapped)
exceptions := image.Exceptions.List()
defaultImageSets := []extensions.ImageSet{}
for i := range initialImageSets {
filtered := extensions.ImageSet{}
for imageID, imageConfig := range initialImageSets[i] {
if !slices.ContainsFunc(exceptions, func(e string) bool {
return strings.Contains(imageConfig.GetE2EImage(), e)
}) {
filtered[imageID] = imageConfig
updatedImageSets := []extensions.ImageSet{}
initialImageSets := []extensions.ImageSet{}
for _, image := range externalImageSets {
originalImage := covertMappedImageToImageSet(image)
imageConfig := originalImage[k8simage.ImageID(image.Index)]
if !slices.ContainsFunc(exceptions, func(e string) bool {
return strings.Contains(imageConfig.GetE2EImage(), e)
}) {
defaultImageSets = append(defaultImageSets, originalImage)
if image.Mapped != nil {
mappedImage := covertMappedImageToImageSet(*image.Mapped)
updatedImageSets = append(updatedImageSets, mappedImage)
} else {
initialImageSets = append(initialImageSets, originalImage)
}
}
if len(filtered) > 0 {
defaultImageSets = append(defaultImageSets, filtered)
}
}

// Created a new slice with the updatedImageSets addresses for the images
updatedImageSets := []extensions.ImageSet{}
for i := range defaultImageSets {
updatedImageSets = append(updatedImageSets, k8simage.GetMappedImageConfigs(defaultImageSets[i], ref.Exact()))
// Map initial images to the target repository
for i := range initialImageSets {
updatedImageSets = append(updatedImageSets, k8simage.GetMappedImageConfigs(initialImageSets[i], ref.Exact()))
}

openshiftDefaults := image.OriginalImages()
Expand All @@ -178,9 +179,9 @@ func createImageMirrorForInternalImages(prefix string, ref reference.DockerImage
covered := sets.NewString()
for i := range updatedImageSets {
for imageID, imageConfig := range updatedImageSets[i] {
defaultConfig := defaultImageSets[i][imageID]
originalConfig := defaultImageSets[i][imageID]
pullSpec := imageConfig.GetE2EImage()
if pullSpec == defaultConfig.GetE2EImage() {
if pullSpec == originalConfig.GetE2EImage() {
continue
}
if covered.Has(pullSpec) {
Expand Down Expand Up @@ -250,3 +251,14 @@ func createImageMirrorForInternalImages(prefix string, ref reference.DockerImage
sort.Strings(lines)
return lines, nil
}

func covertMappedImageToImageSet(image extension.Image) extensions.ImageSet {
imageSet := extensions.ImageSet{}
imageConfig := k8simage.Config{}
imageConfig.SetName(image.Name)
imageConfig.SetVersion(image.Version)
imageConfig.SetRegistry(image.Registry)
imageSet[k8simage.ImageID(image.Index)] = imageConfig

return imageSet
}
23 changes: 7 additions & 16 deletions pkg/test/extensions/binary.go
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ func (b *TestBinary) RunTests(ctx context.Context, timeout time.Duration, env []
return results
}

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

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

var images []Image
var images []extension.Image
err = json.Unmarshal(output, &images)
if err != nil {
return nil, err
}

result := make(ImageSet, len(images))
for _, image := range images {
imageConfig := k8simage.Config{}
imageConfig.SetName(image.Name)
imageConfig.SetVersion(image.Version)
imageConfig.SetRegistry(image.Registry)
result[k8simage.ImageID(image.Index)] = imageConfig
}

logrus.Infof("Listed %d test images for %q in %v", len(images), binName, time.Since(start))
return result, nil
return images, nil
}

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

func (binaries TestBinaries) ListImages(ctx context.Context, parallelism int) ([]ImageSet, error) {
func (binaries TestBinaries) ListImages(ctx context.Context, parallelism int) ([]extension.Image, error) {
var (
allImages []ImageSet
allImages []extension.Image
mu sync.Mutex
wg sync.WaitGroup
errCh = make(chan error, len(binaries))
Expand Down Expand Up @@ -651,12 +642,12 @@ func (binaries TestBinaries) ListImages(ctx context.Context, parallelism int) ([
continue // Skip self - only external binaries need to be queried for images
}

imageConfig, err := binary.ListImages(ctx)
image, err := binary.ListImages(ctx)
if err != nil {
errCh <- err
}
mu.Lock()
allImages = append(allImages, imageConfig)
allImages = append(allImages, image...)
mu.Unlock()
}
}
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.