From 98633b8b61dfe538c017b5d95310d652248a1a76 Mon Sep 17 00:00:00 2001 From: Yiyang Huang Date: Sun, 4 Jun 2023 19:36:44 +0800 Subject: [PATCH] feat: support manifest annotations Signed-off-by: Yiyang Huang --- pkg/adapter/annotation/annotation.go | 22 ++++++++++++++-------- pkg/converter/converter.go | 9 +++++++++ pkg/driver/nydus/nydus.go | 25 +++++++++++++++++++------ 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/pkg/adapter/annotation/annotation.go b/pkg/adapter/annotation/annotation.go index 7e425302..b0abce15 100644 --- a/pkg/adapter/annotation/annotation.go +++ b/pkg/adapter/annotation/annotation.go @@ -27,9 +27,10 @@ import ( ) type Appended struct { - DriverName string - DriverVersion string - SourceDigest string + DriverName string + DriverVersion string + SourceDigest string + ExtraAnnotations map[string]string } const ( @@ -57,6 +58,12 @@ func annotate(annotations map[string]string, appended Appended) map[string]strin } annotations[AnnotationAccelerationSourceDigest] = appended.SourceDigest + if appended.ExtraAnnotations != nil { + for k, v := range appended.ExtraAnnotations { + annotations[k] = v + } + } + return annotations } @@ -65,7 +72,8 @@ func Append(ctx context.Context, provider providerContent.Provider, desc *ocispe var err error switch desc.MediaType { - case ocispec.MediaTypeImageManifest: + // Refer: https://github.com/goharbor/harbor/blob/main/src/controller/artifact/abstractor.go#L75 + case ocispec.MediaTypeImageManifest, images.MediaTypeDockerSchema2Manifest: var manifest ocispec.Manifest labels, err = utils.ReadJSON(ctx, provider.ContentStore(), &manifest, *desc) if err != nil { @@ -80,7 +88,8 @@ func Append(ctx context.Context, provider providerContent.Provider, desc *ocispe return desc, nil - case ocispec.MediaTypeImageIndex: + // Refer: https://github.com/goharbor/harbor/blob/main/src/controller/artifact/abstractor.go#L79 + case ocispec.MediaTypeImageIndex, images.MediaTypeDockerSchema2ManifestList: var index ocispec.Index labels, err = utils.ReadJSON(ctx, provider.ContentStore(), &index, *desc) if err != nil { @@ -94,9 +103,6 @@ func Append(ctx context.Context, provider providerContent.Provider, desc *ocispe } return desc, nil - - case images.MediaTypeDockerSchema2Manifest, images.MediaTypeDockerSchema2ManifestList: - return nil, fmt.Errorf("docker manifest not support to append annotation") } return nil, fmt.Errorf("invalid mediatype %s", desc.MediaType) diff --git a/pkg/converter/converter.go b/pkg/converter/converter.go index 8127fd25..b7f5291c 100644 --- a/pkg/converter/converter.go +++ b/pkg/converter/converter.go @@ -17,6 +17,7 @@ package converter import ( "context" "fmt" + "github.com/goharbor/acceleration-service/pkg/adapter/annotation" "time" "github.com/pkg/errors" @@ -123,6 +124,14 @@ func (cvt *Converter) Convert(ctx context.Context, source, target string) (*Metr if err != nil { return nil, errors.Wrap(err, "convert image") } + desc, err = annotation.Append(ctx, cvt.provider, desc, annotation.Appended{ + DriverName: cvt.driver.Name(), + DriverVersion: cvt.driver.Version(), + ExtraAnnotations: desc.Annotations, + }) + if err != nil { + return nil, errors.Wrap(err, "append annotation") + } metric.ConversionElapsed = time.Since(start) if err := metric.SetTargetImageSize(ctx, cvt, desc); err != nil { return nil, errors.Wrap(err, "get target image size") diff --git a/pkg/driver/nydus/nydus.go b/pkg/driver/nydus/nydus.go index 31f2b94b..01cdfa05 100644 --- a/pkg/driver/nydus/nydus.go +++ b/pkg/driver/nydus/nydus.go @@ -18,24 +18,30 @@ import ( "bytes" "context" "fmt" + "github.com/goharbor/acceleration-service/pkg/adapter/annotation" "os" "strconv" + accelcontent "github.com/goharbor/acceleration-service/pkg/content" + "github.com/goharbor/acceleration-service/pkg/driver/nydus/parser" + nydusutils "github.com/goharbor/acceleration-service/pkg/driver/nydus/utils" + "github.com/goharbor/acceleration-service/pkg/errdefs" + "github.com/goharbor/acceleration-service/pkg/utils" + "github.com/containerd/containerd/content" "github.com/containerd/containerd/images/converter" "github.com/containerd/containerd/platforms" "github.com/containerd/nydus-snapshotter/pkg/backend" nydusify "github.com/containerd/nydus-snapshotter/pkg/converter" - "github.com/goharbor/acceleration-service/pkg/driver/nydus/parser" - "github.com/goharbor/acceleration-service/pkg/errdefs" "github.com/opencontainers/image-spec/specs-go" ocispec "github.com/opencontainers/image-spec/specs-go/v1" "github.com/pkg/errors" "github.com/sirupsen/logrus" +) - accelcontent "github.com/goharbor/acceleration-service/pkg/content" - nydusutils "github.com/goharbor/acceleration-service/pkg/driver/nydus/utils" - "github.com/goharbor/acceleration-service/pkg/utils" +const ( + // AnnotationNydusFlag is used to indicate a image which is nydus format. + AnnotationNydusFlag = "containerd.io/snapshot/nydus" ) type chunkDictInfo struct { @@ -178,7 +184,14 @@ func (d *Driver) Convert(ctx context.Context, provider accelcontent.Provider, so return nil, err } if d.mergeManifest { - return d.makeManifestIndex(ctx, provider.ContentStore(), *image, *desc) + desc, err = d.makeManifestIndex(ctx, provider.ContentStore(), *image, *desc) + if err != nil { + return nil, err + } + } + desc.Annotations = map[string]string{ + AnnotationNydusFlag: "true", + annotation.AnnotationAccelerationSourceDigest: image.Digest.String(), } return desc, err }