48 lines
1.3 KiB
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()
|
|
}
|