1
0
mirror of https://github.com/openshift/image-registry.git synced 2026-02-05 09:45:55 +01:00
Files
Flavian Missi f9d93c44be pkg,test: import distribution/distribution/v3
instead of the deprecated docker/distribution
2023-06-19 12:06:47 +02:00

80 lines
2.4 KiB
Go

package imagestream
import (
"context"
"fmt"
dcontext "github.com/distribution/distribution/v3/context"
"github.com/opencontainers/go-digest"
kerrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
imageapiv1 "github.com/openshift/api/image/v1"
"github.com/openshift/image-registry/pkg/dockerregistry/server/client"
rerrors "github.com/openshift/image-registry/pkg/errors"
"github.com/openshift/library-go/pkg/image/imageutil"
)
const (
ErrImageGetterCode = "ImageGetter:"
ErrImageGetterUnknownCode = ErrImageGetterCode + "Unknown"
ErrImageGetterNotFoundCode = ErrImageGetterCode + "NotFound"
ErrImageGetterForbiddenCode = ErrImageGetterCode + "Forbidden"
)
func IsImageManaged(image *imageapiv1.Image) bool {
managed, ok := image.ObjectMeta.Annotations[imageapiv1.ManagedByOpenShiftAnnotation]
return ok && managed == "true"
}
type imageGetter interface {
Get(ctx context.Context, dgst digest.Digest) (*imageapiv1.Image, rerrors.Error)
}
type cachedImageGetter struct {
client client.Interface
cache map[digest.Digest]*imageapiv1.Image
}
func newCachedImageGetter(client client.Interface) imageGetter {
return &cachedImageGetter{
client: client,
cache: make(map[digest.Digest]*imageapiv1.Image),
}
}
// Get retrieves the Image resource with the digest dgst. No authorization check is made.
func (ig *cachedImageGetter) Get(ctx context.Context, dgst digest.Digest) (*imageapiv1.Image, rerrors.Error) {
if image, ok := ig.cache[dgst]; ok {
dcontext.GetLogger(ctx).Debugf("(*cachedImageGetter).Get: found image %s in cache", image.Name)
return image, nil
}
image, err := ig.client.Images().Get(ctx, dgst.String(), metav1.GetOptions{})
if err != nil {
switch {
case kerrors.IsNotFound(err):
return nil, rerrors.NewError(ErrImageGetterNotFoundCode, dgst.String(), err)
case kerrors.IsForbidden(err):
return nil, rerrors.NewError(ErrImageGetterForbiddenCode, dgst.String(), err)
}
return nil, rerrors.NewError(ErrImageGetterUnknownCode, dgst.String(), err)
}
dcontext.GetLogger(ctx).Debugf("(*cachedImageGetter).Get: got image %s from server", image.Name)
if err := imageutil.ImageWithMetadata(image); err != nil {
return nil, rerrors.NewError(
ErrImageGetterUnknownCode,
fmt.Sprintf("Get: unable to initialize image %s from metadata", dgst.String()),
err,
)
}
ig.cache[dgst] = image
return image, nil
}