-
Notifications
You must be signed in to change notification settings - Fork 201
Add support for multi-arch image indexes #503
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Add support for multi-arch image indexes #503
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Summary of Changes
Hello @jsing-canva, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!
This pull request significantly enhances the container-structure-test
tool by adding robust support for multi-architecture image indexes. It enables the tool to intelligently select and load the appropriate image variant from an index based on a specified platform, resolving a long-standing limitation and improving its utility in diverse container environments.
Highlights
- Multi-architecture Image Support: The
container-structure-test
tool now supports loading images from multi-architecture image indexes (manifest lists). Previously, it would terminate with a fatal error when encountering such indexes. - Platform-Specific Image Selection: Introduced new logic to parse a specified platform (e.g.,
linux/amd64
) and recursively search within an image index to find an image that satisfies the given platform requirements. This allows the tool to select the correct image variant from a multi-arch index. - New Helper Functions: Added
parsePlatform
to convert platform strings intogcrv1.Platform
objects andfindImageInIndex
to traverse image indexes and locate compatible images based on platform requirements, including handling nested indexes up to a defined depth. - Expanded Test Coverage: New test configurations (
fluent_bit_test.yaml
foramd64
andarm64
) and an updated shell script test (structure_test_tests.sh
) have been added to validate the multi-architecture image index loading functionality, ensuring the tool correctly identifies and tests platform-specific images.
Using Gemini Code Assist
The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.
Invoking Gemini
You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command>
or @gemini-code-assist <command>
. Below is a summary of the supported commands.
Feature | Command | Description |
---|---|---|
Code Review | /gemini review |
Performs a code review for the current pull request in its current state. |
Pull Request Summary | /gemini summary |
Provides a summary of the current pull request in its current state. |
Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in issue comments and review comments. |
Help | /gemini help |
Displays a list of available commands. |
Customization
To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/
folder in the base of the repository. Detailed instructions can be found here.
Limitations & Feedback
Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback.
You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.
Footnotes
-
Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request introduces support for multi-arch image indexes. There are a few critical issues in the Go implementation and a bug in the test script.
return nil, fmt.Errorf("failed to read index manifest: %w", err) | ||
} | ||
|
||
for _, desc:= range manifest.Manifests { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
var img gcrv1.Image | ||
if desc.MediaType.IsIndex() { | ||
logrus.Fatal("multi-arch images are not supported yet.") | ||
} | ||
|
||
img, err := l.Image(desc.Digest) | ||
platform, err := parsePlatform(opts.Platform) | ||
if err != nil { | ||
logrus.Fatalf("%s", err) | ||
} | ||
|
||
if err != nil { | ||
logrus.Fatalf("could not get image from %s: %v", opts.ImageFromLayout, err) | ||
img, err = findImageInIndex(l, platform, 0) | ||
if err != nil { | ||
logrus.Fatalf("could not get image from %s (platform %v): %v", opts.ImageFromLayout, opts.Platform, err) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The logic for finding an image within an OCI layout is flawed. It depends on desc := m.Manifests[0]
from line 175, which means it only ever considers the first manifest in the layout's index. For a multi-arch image, this may not be the correct platform. Instead, use findImageInIndex
directly on the loaded layout index l
.
var img gcrv1.Image
platform, err := parsePlatform(opts.Platform)
if err != nil {
logrus.Fatalf("%s", err)
}
img, err = findImageInIndex(l, platform, 0)
if err != nil {
logrus.Fatalf("could not get image from %s (platform %v): %v", opts.ImageFromLayout, opts.Platform, err)
}
|
||
res=$(./out/container-structure-test test --image-from-oci-layout="$tmp" --default-image-tag="test.local/$test_index" --config "${test_config_dir}/fluent_bit_test.yaml" 2>&1) | ||
code=$? | ||
if ! [[ ("$res" =~ "PASS" && "$code" == "0") ]]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The image loaded is based on the platform flag passed to the structure test binary, which defaults to linux/GOARCH. On hosts that are multi-platform capable, specifying an different platform flag will result in an alternative image being loaded from the index. Fixes GoogleContainerTools#435
b0a368a
to
a91423d
Compare
The image loaded is based on the platform flag passed to the structure test
binary, which defaults to linux/GOARCH. On hosts that are multi-platform
capable, specifying an different platform flag will result in an alternative
image being loaded from the index.
Fixes #435