Skip to content

Commit

Permalink
Merge pull request #1919 from nalind/index-resolve-images
Browse files Browse the repository at this point in the history
manifest add: check for local images last
  • Loading branch information
openshift-merge-bot[bot] authored Apr 2, 2024
2 parents db1c3c4 + 6dc211e commit e4c2a97
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 30 deletions.
55 changes: 29 additions & 26 deletions libimage/manifest_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,20 +314,39 @@ 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) {
if options == nil {
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.
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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 {
Expand Down
12 changes: 12 additions & 0 deletions libimage/manifest_list_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
8 changes: 4 additions & 4 deletions pkg/config/config_local_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"}))
})

Expand Down

0 comments on commit e4c2a97

Please sign in to comment.