CRI: Retrieve image spec on client
Signed-off-by: Maksym Pavlenko <pavlenko.maksym@gmail.com>
This commit is contained in:
parent
c4e29027d4
commit
b5366f8d7e
22
image.go
22
image.go
@ -64,6 +64,8 @@ type Image interface {
|
|||||||
Metadata() images.Image
|
Metadata() images.Image
|
||||||
// Platform returns the platform match comparer. Can be nil.
|
// Platform returns the platform match comparer. Can be nil.
|
||||||
Platform() platforms.MatchComparer
|
Platform() platforms.MatchComparer
|
||||||
|
// Spec returns the OCI image spec for a given image.
|
||||||
|
Spec(ctx context.Context) (ocispec.Image, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type usageOptions struct {
|
type usageOptions struct {
|
||||||
@ -279,6 +281,26 @@ func (i *image) IsUnpacked(ctx context.Context, snapshotterName string) (bool, e
|
|||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (i *image) Spec(ctx context.Context) (ocispec.Image, error) {
|
||||||
|
var ociImage ocispec.Image
|
||||||
|
|
||||||
|
desc, err := i.Config(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return ociImage, fmt.Errorf("get image config descriptor: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
blob, err := content.ReadBlob(ctx, i.ContentStore(), desc)
|
||||||
|
if err != nil {
|
||||||
|
return ociImage, fmt.Errorf("read image config from content store: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := json.Unmarshal(blob, &ociImage); err != nil {
|
||||||
|
return ociImage, fmt.Errorf("unmarshal image config %s: %w", blob, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ociImage, nil
|
||||||
|
}
|
||||||
|
|
||||||
// UnpackConfig provides configuration for the unpack of an image
|
// UnpackConfig provides configuration for the unpack of an image
|
||||||
type UnpackConfig struct {
|
type UnpackConfig struct {
|
||||||
// ApplyOpts for applying a diff to a snapshotter
|
// ApplyOpts for applying a diff to a snapshotter
|
||||||
|
@ -18,12 +18,10 @@ package image
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/containerd/containerd"
|
"github.com/containerd/containerd"
|
||||||
"github.com/containerd/containerd/content"
|
|
||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/pkg/cri/util"
|
"github.com/containerd/containerd/pkg/cri/util"
|
||||||
|
|
||||||
@ -132,15 +130,12 @@ func getImage(ctx context.Context, i containerd.Image) (*Image, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("get image config descriptor: %w", err)
|
return nil, fmt.Errorf("get image config descriptor: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
id := desc.Digest.String()
|
id := desc.Digest.String()
|
||||||
|
|
||||||
rb, err := content.ReadBlob(ctx, i.ContentStore(), desc)
|
spec, err := i.Spec(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("read image config from content store: %w", err)
|
return nil, fmt.Errorf("failed to read get image spec: %w", err)
|
||||||
}
|
|
||||||
var ociimage imagespec.Image
|
|
||||||
if err := json.Unmarshal(rb, &ociimage); err != nil {
|
|
||||||
return nil, fmt.Errorf("unmarshal image config %s: %w", rb, err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return &Image{
|
return &Image{
|
||||||
@ -148,7 +143,7 @@ func getImage(ctx context.Context, i containerd.Image) (*Image, error) {
|
|||||||
References: []string{i.Name()},
|
References: []string{i.Name()},
|
||||||
ChainID: chainID.String(),
|
ChainID: chainID.String(),
|
||||||
Size: size,
|
Size: size,
|
||||||
ImageSpec: ociimage,
|
ImageSpec: spec,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user