From a4ba5f449fd54ee4dc0332e395d00ec13b09ce4c Mon Sep 17 00:00:00 2001 From: Toshiki Sonoda Date: Thu, 17 Nov 2022 18:51:20 +0900 Subject: [PATCH] Add support for podman-remote manifest annotate Now that podman manifest annotate is supported in the remote environment. Signed-off-by: Toshiki Sonoda --- cmd/podman/manifest/annotate.go | 1 - pkg/api/handlers/libpod/manifests.go | 14 +++++++------- pkg/domain/infra/tunnel/manifest.go | 23 +++++++++++++++++++++-- test/apiv2/15-manifest.at | 18 ++++++++++++++++++ test/e2e/manifest_test.go | 1 - 5 files changed, 46 insertions(+), 11 deletions(-) diff --git a/cmd/podman/manifest/annotate.go b/cmd/podman/manifest/annotate.go index 304c8e55f4..41e1b6b2be 100644 --- a/cmd/podman/manifest/annotate.go +++ b/cmd/podman/manifest/annotate.go @@ -13,7 +13,6 @@ import ( var ( manifestAnnotateOpts = entities.ManifestAnnotateOptions{} annotateCmd = &cobra.Command{ - Annotations: map[string]string{registry.EngineMode: registry.ABIMode}, Use: "annotate [options] LIST IMAGE", Short: "Add or update information about an entry in a manifest list or image index", Long: "Adds or updates information about an entry in a manifest list or image index.", diff --git a/pkg/api/handlers/libpod/manifests.go b/pkg/api/handlers/libpod/manifests.go index a2a1c3f9a2..0702facb3a 100644 --- a/pkg/api/handlers/libpod/manifests.go +++ b/pkg/api/handlers/libpod/manifests.go @@ -530,13 +530,13 @@ func ManifestModify(w http.ResponseWriter, r *http.Request) { } case strings.EqualFold("annotate", body.Operation): options := entities.ManifestAnnotateOptions{ - Annotation: body.Annotation, - Arch: body.Arch, - Features: body.Features, - OS: body.OS, - OSFeatures: body.OSFeatures, - OSVersion: body.OSVersion, - Variant: body.Variant, + Annotations: body.Annotations, + Arch: body.Arch, + Features: body.Features, + OS: body.OS, + OSFeatures: body.OSFeatures, + OSVersion: body.OSVersion, + Variant: body.Variant, } for _, image := range body.Images { id, err := imageEngine.ManifestAnnotate(r.Context(), name, image, options) diff --git a/pkg/domain/infra/tunnel/manifest.go b/pkg/domain/infra/tunnel/manifest.go index 10bafae306..87250c7825 100644 --- a/pkg/domain/infra/tunnel/manifest.go +++ b/pkg/domain/infra/tunnel/manifest.go @@ -3,7 +3,6 @@ package tunnel import ( "context" "encoding/json" - "errors" "fmt" "strings" @@ -92,7 +91,27 @@ func (ir *ImageEngine) ManifestAdd(_ context.Context, name string, imageNames [] // ManifestAnnotate updates an entry of the manifest list func (ir *ImageEngine) ManifestAnnotate(ctx context.Context, name, images string, opts entities.ManifestAnnotateOptions) (string, error) { - return "", errors.New("not implemented") + options := new(manifests.ModifyOptions).WithArch(opts.Arch).WithVariant(opts.Variant) + options.WithFeatures(opts.Features).WithOS(opts.OS).WithOSVersion(opts.OSVersion) + + if len(opts.Annotation) != 0 { + annotations := make(map[string]string) + for _, annotationSpec := range opts.Annotation { + spec := strings.SplitN(annotationSpec, "=", 2) + if len(spec) != 2 { + return "", fmt.Errorf("no value given for annotation %q", spec[0]) + } + annotations[spec[0]] = spec[1] + } + opts.Annotations = envLib.Join(opts.Annotations, annotations) + } + options.WithAnnotations(opts.Annotations) + + id, err := manifests.Annotate(ir.ClientCtx, name, []string{images}, options) + if err != nil { + return id, fmt.Errorf("annotating to manifest list %s: %w", name, err) + } + return id, nil } // ManifestRemoveDigest removes the digest from manifest list diff --git a/test/apiv2/15-manifest.at b/test/apiv2/15-manifest.at index 912ad3b1d8..8b43740e5a 100644 --- a/test/apiv2/15-manifest.at +++ b/test/apiv2/15-manifest.at @@ -4,6 +4,7 @@ start_registry +# Creates the manifest list t POST /v3.4.0/libpod/manifests/create?name=abc 200 \ .Id~[0-9a-f]\\{64\\} id_abc=$(jq -r '.Id' <<<"$output") @@ -27,6 +28,7 @@ RUN >file2 EOF ) +# manifest add --anotation tests t POST /v3.4.0/libpod/manifests/$id_abc/add images="[\"containers-storage:$id_abc_image\"]" 200 t PUT /v4.0.0/libpod/manifests/$id_xyz operation='update' images="[\"containers-storage:$id_xyz_image\"]" annotations="{\"foo\":\"bar\"}" annotation="[\"hoge=fuga\"]" 400 \ .cause='can not set both Annotation and Annotations' @@ -39,6 +41,22 @@ t PUT /v4.0.0/libpod/manifests/$id_xyz operation='update' images="[\"containers- t GET /v4.0.0/libpod/manifests/$id_xyz/json 200 \ .manifests[0].annotations.hoge="fuga" +# manifest annotate tests +t GET /v4.0.0/libpod/manifests/$id_xyz/json 200 +xyz_digest=$(jq -r '.manifests[0].digest' <<<"$output") + +t PUT /v4.0.0/libpod/manifests/$id_xyz operation='annotate' images="[\"containers-storage:$id_xyz_image\"]" annotations="{\"foo2\":\"bar2\"}" annotation="[\"hoge2=fuga2\"]" 400 \ + .cause='can not set both Annotation and Annotations' + +t PUT /v4.0.0/libpod/manifests/$id_xyz operation='annotate' images="[\"$xyz_digest\"]" annotations="{\"foo2\":\"bar2\"}" 200 +t GET /v4.0.0/libpod/manifests/$id_xyz/json 200 \ + .manifests[0].annotations.foo2="bar2" + +t PUT /v4.0.0/libpod/manifests/$id_xyz operation='annotate' images="[\"$xyz_digest\"]" annotation="[\"hoge2=fuga2\"]" 200 +t GET /v4.0.0/libpod/manifests/$id_xyz/json 200 \ + .manifests[0].annotations.hoge2="fuga2" + +# registry-related tests t POST "/v3.4.0/libpod/manifests/abc:latest/push?destination=localhost:$REGISTRY_PORT%2Fabc:latest&tlsVerify=false&all=true" 200 t POST "/v4.0.0/libpod/manifests/xyz:latest/registry/localhost:$REGISTRY_PORT%2Fxyz:latest?all=true" 400 \ .cause='x509: certificate signed by unknown authority' diff --git a/test/e2e/manifest_test.go b/test/e2e/manifest_test.go index 17439b980d..149d76af2b 100644 --- a/test/e2e/manifest_test.go +++ b/test/e2e/manifest_test.go @@ -202,7 +202,6 @@ var _ = Describe("Podman manifest", func() { }) It("annotate", func() { - SkipIfRemote("Not supporting annotate on remote connections") session := podmanTest.Podman([]string{"manifest", "create", "foo"}) session.WaitWithDefaultTimeout() Expect(session).Should(Exit(0))