Merge pull request #3000 from stefanberger/descriptor_annotations.pr
Add missing annotations map to Descriptor for gRPC transfer
This commit is contained in:
@@ -24,15 +24,26 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
bucketKeyLabels = []byte("labels")
|
||||
bucketKeyCreatedAt = []byte("createdat")
|
||||
bucketKeyUpdatedAt = []byte("updatedat")
|
||||
bucketKeyAnnotations = []byte("annotations")
|
||||
bucketKeyLabels = []byte("labels")
|
||||
bucketKeyCreatedAt = []byte("createdat")
|
||||
bucketKeyUpdatedAt = []byte("updatedat")
|
||||
)
|
||||
|
||||
// ReadLabels reads the labels key from the bucket
|
||||
// Uses the key "labels"
|
||||
func ReadLabels(bkt *bolt.Bucket) (map[string]string, error) {
|
||||
lbkt := bkt.Bucket(bucketKeyLabels)
|
||||
return readMap(bkt, bucketKeyLabels)
|
||||
}
|
||||
|
||||
// ReadAnnotations reads the OCI Descriptor Annotations key from the bucket
|
||||
// Uses the key "annotations"
|
||||
func ReadAnnotations(bkt *bolt.Bucket) (map[string]string, error) {
|
||||
return readMap(bkt, bucketKeyAnnotations)
|
||||
}
|
||||
|
||||
func readMap(bkt *bolt.Bucket, bucketName []byte) (map[string]string, error) {
|
||||
lbkt := bkt.Bucket(bucketName)
|
||||
if lbkt == nil {
|
||||
return nil, nil
|
||||
}
|
||||
@@ -53,9 +64,18 @@ func ReadLabels(bkt *bolt.Bucket) (map[string]string, error) {
|
||||
// bucket. Typically, this removes zero-value entries.
|
||||
// Uses the key "labels"
|
||||
func WriteLabels(bkt *bolt.Bucket, labels map[string]string) error {
|
||||
return writeMap(bkt, bucketKeyLabels, labels)
|
||||
}
|
||||
|
||||
// WriteAnnotations writes the OCI Descriptor Annotations
|
||||
func WriteAnnotations(bkt *bolt.Bucket, labels map[string]string) error {
|
||||
return writeMap(bkt, bucketKeyAnnotations, labels)
|
||||
}
|
||||
|
||||
func writeMap(bkt *bolt.Bucket, bucketName []byte, labels map[string]string) error {
|
||||
// Remove existing labels to keep from merging
|
||||
if lbkt := bkt.Bucket(bucketKeyLabels); lbkt != nil {
|
||||
if err := bkt.DeleteBucket(bucketKeyLabels); err != nil {
|
||||
if lbkt := bkt.Bucket(bucketName); lbkt != nil {
|
||||
if err := bkt.DeleteBucket(bucketName); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -64,7 +84,7 @@ func WriteLabels(bkt *bolt.Bucket, labels map[string]string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
lbkt, err := bkt.CreateBucket(bucketKeyLabels)
|
||||
lbkt, err := bkt.CreateBucket(bucketName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -192,6 +192,14 @@ func (s *imageStore) Update(ctx context.Context, image images.Image, fieldpaths
|
||||
key := strings.TrimPrefix(path, "labels.")
|
||||
updated.Labels[key] = image.Labels[key]
|
||||
continue
|
||||
} else if strings.HasPrefix(path, "annotations.") {
|
||||
if updated.Target.Annotations == nil {
|
||||
updated.Target.Annotations = map[string]string{}
|
||||
}
|
||||
|
||||
key := strings.TrimPrefix(path, "annotations.")
|
||||
updated.Target.Annotations[key] = image.Target.Annotations[key]
|
||||
continue
|
||||
}
|
||||
|
||||
switch path {
|
||||
@@ -204,6 +212,8 @@ func (s *imageStore) Update(ctx context.Context, image images.Image, fieldpaths
|
||||
// make sense to modify the size or digest without touching the
|
||||
// mediatype, as well, for example.
|
||||
updated.Target = image.Target
|
||||
case "annotations":
|
||||
updated.Target.Annotations = image.Target.Annotations
|
||||
default:
|
||||
return errors.Wrapf(errdefs.ErrInvalidArgument, "cannot update %q field on image %q", path, image.Name)
|
||||
}
|
||||
@@ -298,6 +308,11 @@ func readImage(image *images.Image, bkt *bolt.Bucket) error {
|
||||
}
|
||||
image.Labels = labels
|
||||
|
||||
image.Target.Annotations, err = boltutil.ReadAnnotations(bkt)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
tbkt := bkt.Bucket(bucketKeyTarget)
|
||||
if tbkt == nil {
|
||||
return errors.New("unable to read target bucket")
|
||||
@@ -331,6 +346,10 @@ func writeImage(bkt *bolt.Bucket, image *images.Image) error {
|
||||
return errors.Wrapf(err, "writing labels for image %v", image.Name)
|
||||
}
|
||||
|
||||
if err := boltutil.WriteAnnotations(bkt, image.Target.Annotations); err != nil {
|
||||
return errors.Wrapf(err, "writing Annotations for image %v", image.Name)
|
||||
}
|
||||
|
||||
// write the target bucket
|
||||
tbkt, err := bkt.CreateBucketIfNotExists(bucketKeyTarget)
|
||||
if err != nil {
|
||||
|
||||
@@ -49,6 +49,9 @@ func TestImagesList(t *testing.T) {
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.containerd.test",
|
||||
Digest: digest.FromString(id),
|
||||
Annotations: map[string]string{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -168,6 +171,9 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.oci.blab",
|
||||
Annotations: map[string]string{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
expected: images.Image{
|
||||
@@ -178,6 +184,9 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.oci.blab",
|
||||
Annotations: map[string]string{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -203,6 +212,9 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.oci.blab",
|
||||
Annotations: map[string]string{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
expected: images.Image{
|
||||
@@ -213,6 +225,9 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.oci.blab",
|
||||
Annotations: map[string]string{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -227,6 +242,10 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 20, // ignored
|
||||
MediaType: "application/vnd.oci.blab+ignored", // make sure other stuff is ignored
|
||||
Annotations: map[string]string{
|
||||
"not": "bar",
|
||||
"new": "boo",
|
||||
},
|
||||
},
|
||||
},
|
||||
fieldpaths: []string{"labels"},
|
||||
@@ -238,6 +257,41 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.oci.blab",
|
||||
Annotations: map[string]string{
|
||||
"foo": "bar",
|
||||
"baz": "boo",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "ReplaceLabelsAnnotationsFieldPath",
|
||||
original: imageBase(),
|
||||
input: images.Image{
|
||||
Labels: map[string]string{
|
||||
"for": "bar",
|
||||
"boo": "boo",
|
||||
},
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 20, // ignored
|
||||
MediaType: "application/vnd.oci.blab+ignored", // make sure other stuff is ignored
|
||||
Annotations: map[string]string{
|
||||
"foo": "boo",
|
||||
},
|
||||
},
|
||||
},
|
||||
fieldpaths: []string{"annotations", "labels"},
|
||||
expected: images.Image{
|
||||
Labels: map[string]string{
|
||||
"for": "bar",
|
||||
"boo": "boo",
|
||||
},
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.oci.blab",
|
||||
Annotations: map[string]string{
|
||||
"foo": "boo",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -252,6 +306,9 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 20, // ignored
|
||||
MediaType: "application/vnd.oci.blab+ignored", // make sure other stuff is ignored
|
||||
Annotations: map[string]string{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
fieldpaths: []string{"labels.foo"},
|
||||
@@ -263,6 +320,43 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.oci.blab",
|
||||
Annotations: map[string]string{
|
||||
"foo": "bar",
|
||||
"baz": "boo",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "ReplaceAnnotation",
|
||||
original: imageBase(),
|
||||
input: images.Image{
|
||||
Labels: map[string]string{
|
||||
"foo": "baz",
|
||||
"baz": "bunk",
|
||||
},
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 20, // ignored
|
||||
MediaType: "application/vnd.oci.blab+ignored", // make sure other stuff is ignored
|
||||
Annotations: map[string]string{
|
||||
"foo": "baz",
|
||||
"baz": "bunk",
|
||||
},
|
||||
},
|
||||
},
|
||||
fieldpaths: []string{"annotations.foo"},
|
||||
expected: images.Image{
|
||||
Labels: map[string]string{
|
||||
"foo": "bar",
|
||||
"baz": "boo",
|
||||
},
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.oci.blab",
|
||||
Annotations: map[string]string{
|
||||
"foo": "baz",
|
||||
"baz": "boo",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -273,6 +367,9 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.oci.blab+replaced",
|
||||
Annotations: map[string]string{
|
||||
"fox": "dog",
|
||||
},
|
||||
},
|
||||
},
|
||||
fieldpaths: []string{"target"},
|
||||
@@ -284,6 +381,9 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.oci.blab+replaced",
|
||||
Annotations: map[string]string{
|
||||
"fox": "dog",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -298,6 +398,9 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 0,
|
||||
MediaType: "application/vnd.oci.blab",
|
||||
Annotations: map[string]string{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
cause: errdefs.ErrInvalidArgument,
|
||||
@@ -311,6 +414,9 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
},
|
||||
Target: ocispec.Descriptor{
|
||||
MediaType: "application/vnd.oci.blab",
|
||||
Annotations: map[string]string{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
createerr: errdefs.ErrInvalidArgument,
|
||||
@@ -352,6 +458,9 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.oci.blab",
|
||||
Annotations: map[string]string{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
input: images.Image{
|
||||
@@ -363,6 +472,9 @@ func TestImagesCreateUpdateDelete(t *testing.T) {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.oci.blab",
|
||||
Annotations: map[string]string{
|
||||
"foo": "bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
cause: errdefs.ErrNotFound,
|
||||
@@ -440,6 +552,10 @@ func imageBase() images.Image {
|
||||
Target: ocispec.Descriptor{
|
||||
Size: 10,
|
||||
MediaType: "application/vnd.oci.blab",
|
||||
Annotations: map[string]string{
|
||||
"foo": "bar",
|
||||
"baz": "boo",
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user