1ea809dc2a
Server and Client images of the image store are now provided. We have created an image metadata interface and converted the bolt functions to implement that interface over an transaction. A remote client implementation is provided that implements the same interface. Signed-off-by: Stephen J Day <stephen.day@docker.com>
87 lines
1.9 KiB
Go
87 lines
1.9 KiB
Go
package images
|
|
|
|
import (
|
|
imagesapi "github.com/containerd/containerd/api/services/images"
|
|
"github.com/containerd/containerd/api/types/descriptor"
|
|
"github.com/containerd/containerd/images"
|
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
|
"github.com/pkg/errors"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/codes"
|
|
)
|
|
|
|
func imagesToProto(images []images.Image) []imagesapi.Image {
|
|
var imagespb []imagesapi.Image
|
|
|
|
for _, image := range images {
|
|
imagespb = append(imagespb, imageToProto(&image))
|
|
}
|
|
|
|
return imagespb
|
|
}
|
|
|
|
func imagesFromProto(imagespb []imagesapi.Image) []images.Image {
|
|
var images []images.Image
|
|
|
|
for _, image := range imagespb {
|
|
images = append(images, imageFromProto(&image))
|
|
}
|
|
|
|
return images
|
|
}
|
|
|
|
func imageToProto(image *images.Image) imagesapi.Image {
|
|
return imagesapi.Image{
|
|
Name: image.Name,
|
|
Target: descToProto(&image.Target),
|
|
}
|
|
}
|
|
|
|
func imageFromProto(imagepb *imagesapi.Image) images.Image {
|
|
return images.Image{
|
|
Name: imagepb.Name,
|
|
Target: descFromProto(&imagepb.Target),
|
|
}
|
|
}
|
|
|
|
func descFromProto(desc *descriptor.Descriptor) ocispec.Descriptor {
|
|
return ocispec.Descriptor{
|
|
MediaType: desc.MediaType,
|
|
Size: desc.Size_,
|
|
Digest: desc.Digest,
|
|
}
|
|
}
|
|
|
|
func descToProto(desc *ocispec.Descriptor) descriptor.Descriptor {
|
|
return descriptor.Descriptor{
|
|
MediaType: desc.MediaType,
|
|
Size_: desc.Size,
|
|
Digest: desc.Digest,
|
|
}
|
|
}
|
|
|
|
func rewriteGRPCError(err error) error {
|
|
if err == nil {
|
|
return err
|
|
}
|
|
|
|
switch grpc.Code(errors.Cause(err)) {
|
|
case codes.AlreadyExists:
|
|
return images.ErrExists
|
|
case codes.NotFound:
|
|
return images.ErrNotFound
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
func mapGRPCError(err error, id string) error {
|
|
switch {
|
|
case images.IsNotFound(err):
|
|
return grpc.Errorf(codes.NotFound, "image %v not found", id)
|
|
case images.IsExists(err):
|
|
return grpc.Errorf(codes.AlreadyExists, "image %v already exists", id)
|
|
}
|
|
|
|
return err
|
|
}
|