Merge pull request #1919 from nalind/index-resolve-images

manifest add: check for local images last
This commit is contained in:
openshift-merge-bot[bot] 2024-04-02 18:44:48 +00:00 committed by GitHub
commit 93fa77f3c7
3 changed files with 45 additions and 30 deletions

View File

@ -314,6 +314,29 @@ type ManifestListAddOptions struct {
Password string
}
func (m *ManifestList) parseNameToExtantReference(ctx context.Context, name string, manifestList bool, what string) (types.ImageReference, error) {
ref, err := alltransports.ParseImageName(name)
if err != nil {
withDocker := fmt.Sprintf("%s://%s", docker.Transport.Name(), name)
ref, err = alltransports.ParseImageName(withDocker)
if err == nil {
var src types.ImageSource
src, err = ref.NewImageSource(ctx, nil)
if err == nil {
src.Close()
}
}
if err != nil {
image, _, lookupErr := m.image.runtime.LookupImage(name, &LookupImageOptions{ManifestList: manifestList})
if lookupErr != nil {
return nil, fmt.Errorf("locating %s: %q: %w; %q: %w", what, withDocker, err, name, lookupErr)
}
ref, err = image.storageReference, nil
}
}
return ref, err
}
// Add adds one or more manifests to the manifest list and returns the digest
// of the added instance.
func (m *ManifestList) Add(ctx context.Context, name string, options *ManifestListAddOptions) (digest.Digest, error) {
@ -321,13 +344,9 @@ func (m *ManifestList) Add(ctx context.Context, name string, options *ManifestLi
options = &ManifestListAddOptions{}
}
ref, err := alltransports.ParseImageName(name)
ref, err := m.parseNameToExtantReference(ctx, name, false, "image to add to manifest list")
if err != nil {
withDocker := fmt.Sprintf("%s://%s", docker.Transport.Name(), name)
ref, err = alltransports.ParseImageName(withDocker)
if err != nil {
return "", err
}
return "", err
}
// Now massage in the copy-related options into the system context.
@ -428,17 +447,9 @@ func (m *ManifestList) AddArtifact(ctx context.Context, options *ManifestListAdd
opts.LayerMediaType = &options.LayerType
}
if options.Subject != "" {
ref, err := alltransports.ParseImageName(options.Subject)
ref, err := m.parseNameToExtantReference(ctx, options.Subject, true, "subject for artifact manifest")
if err != nil {
withDocker := fmt.Sprintf("%s://%s", docker.Transport.Name(), options.Subject)
ref, err = alltransports.ParseImageName(withDocker)
if err != nil {
image, _, err := m.image.runtime.LookupImage(options.Subject, &LookupImageOptions{ManifestList: true})
if err != nil {
return "", fmt.Errorf("locating subject for artifact manifest: %w", err)
}
ref = image.storageReference
}
return "", err
}
opts.SubjectReference = ref
}
@ -541,17 +552,9 @@ func (m *ManifestList) AnnotateInstance(d digest.Digest, options *ManifestListAn
}
}
if options.Subject != "" {
ref, err := alltransports.ParseImageName(options.Subject)
ref, err := m.parseNameToExtantReference(ctx, options.Subject, true, "subject for image index")
if err != nil {
withDocker := fmt.Sprintf("%s://%s", docker.Transport.Name(), options.Subject)
ref, err = alltransports.ParseImageName(withDocker)
if err != nil {
image, _, err := m.image.runtime.LookupImage(options.Subject, &LookupImageOptions{ManifestList: true})
if err != nil {
return fmt.Errorf("locating subject for image index: %w", err)
}
ref = image.storageReference
}
return err
}
src, err := ref.NewImageSource(ctx, &m.image.runtime.systemContext)
if err != nil {

View File

@ -116,10 +116,22 @@ func TestCreateAndTagManifestList(t *testing.T) {
require.NoError(t, err)
require.NotNil(t, list)
_, err = runtime.Load(ctx, "testdata/oci-unnamed.tar.gz", nil)
require.NoError(t, err)
// add a remote reference
manifestListOpts := &ManifestListAddOptions{All: true}
_, err = list.Add(ctx, "docker://busybox", manifestListOpts)
require.NoError(t, err)
// add a remote reference where we have to figure out that it's remote
_, err = list.Add(ctx, "busybox", manifestListOpts)
require.NoError(t, err)
// add using a local image's ID
_, err = list.Add(ctx, "5c8aca8137ac47e84c69ae93ce650ce967917cc001ba7aad5494073fac75b8b6", manifestListOpts)
require.NoError(t, err)
list, err = runtime.LookupManifestList(listName)
require.NoError(t, err)
require.NotNil(t, list)

View File

@ -355,25 +355,25 @@ var _ = Describe("Config Local", func() {
// Given
config1, err := New(nil)
// Then
gomega.Expect(err).To(gomega.BeNil())
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config1.Engine.CdiSpecDirs.Get()).To(gomega.Equal([]string{"/etc/cdi"}))
// Given default just get default
config2, err := NewConfig("testdata/containers_default.conf")
// Then
gomega.Expect(err).To(gomega.BeNil())
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config2.Engine.CdiSpecDirs.Get()).To(gomega.Equal([]string{"/etc/cdi"}))
// Given override just get override
config3, err := NewConfig("testdata/containers_override.conf")
// Then
gomega.Expect(err).To(gomega.BeNil())
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config3.Engine.CdiSpecDirs.Get()).To(gomega.Equal([]string{"/somepath"}))
// Given override just get override
config4, err := NewConfig("testdata/containers_override2.conf")
// Then
gomega.Expect(err).To(gomega.BeNil())
gomega.Expect(err).ToNot(gomega.HaveOccurred())
gomega.Expect(config4.Engine.CdiSpecDirs.Get()).To(gomega.Equal([]string{"/somepath", "/some_other_path"}))
})