buildr/modules/packaging/ociimg/helpers.go

48 lines
1.3 KiB
Go

package ociimg
import (
"context"
"fmt"
"github.com/google/go-containerregistry/pkg/name"
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/google/go-containerregistry/pkg/v1/remote"
"github.com/google/go-containerregistry/pkg/v1/types"
)
func imageFromIndex(index v1.ImageIndex, platform *v1.Platform) (v1.Image, v1.Descriptor, error) {
im, err := index.IndexManifest()
if err != nil {
return nil, v1.Descriptor{}, err
}
for i := range im.Manifests {
manifest := im.Manifests[i]
if manifest.MediaType != types.OCIManifestSchema1 && im.MediaType != types.DockerManifestSchema2 {
return nil, v1.Descriptor{}, fmt.Errorf("%q has unexpected mediaType %q in base for %q", manifest.Digest, manifest.MediaType, platform)
}
if manifest.Platform.Satisfies(*platform) {
img, err := index.Image(manifest.Digest)
return img, manifest, err
}
}
return nil, v1.Descriptor{}, fmt.Errorf("index does not contain image satisfying the requested platoform %q", platform)
}
func fetch(ctx context.Context, ref name.Reference) (imageOrIndex, error) {
ropt := []remote.Option{
remote.WithUserAgent(userAgent),
remote.WithContext(ctx),
}
desc, err := remote.Get(ref, ropt...)
if err != nil {
return nil, err
}
if desc.MediaType.IsIndex() {
return desc.ImageIndex()
}
return desc.Image()
}