Skip to content

Commit

Permalink
Support podman-remote manifest annotate
Browse files Browse the repository at this point in the history
Now that podman manifest annotate is supported
in the remote environment.

Signed-off-by: Toshiki Sonoda <sonoda.toshiki@fujitsu.com>
  • Loading branch information
sstosh committed Nov 18, 2022
1 parent 54b1fd3 commit 6843007
Show file tree
Hide file tree
Showing 9 changed files with 184 additions and 16 deletions.
1 change: 0 additions & 1 deletion cmd/podman/manifest/annotate.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.",
Expand Down
14 changes: 7 additions & 7 deletions pkg/api/handlers/libpod/manifests.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
19 changes: 16 additions & 3 deletions pkg/bindings/manifests/manifests.go
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,20 @@ func Modify(ctx context.Context, name string, images []string, options *ModifyOp
// Annotate modifies the given manifest list using options and the optional list of images
//
// As of 4.0.0
func Annotate(ctx context.Context, name string, images []string, options *ModifyOptions) (string, error) {
options.WithOperation("annotate")
return Modify(ctx, name, images, options)
func Annotate(ctx context.Context, name string, image string, options *AnnotateOptions) (string, error) {
if options == nil {
options = new(AnnotateOptions)
}

optionsv4 := ModifyOptions{
Annotations: options.Annotation,
Arch: options.Arch,
Features: options.Features,
OS: options.OS,
OSFeatures: nil,
OSVersion: options.OSVersion,
Variant: options.Variant,
}
optionsv4.WithOperation("annotate")
return Modify(ctx, name, []string{image}, &optionsv4)
}
12 changes: 12 additions & 0 deletions pkg/bindings/manifests/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,18 @@ type AddOptions struct {
SkipTLSVerify *bool `schema:"-"`
}

// AnnotateOptions are optional options for annotating manifest lists
//
//go:generate go run ../generator/generator.go AnnotateOptions
type AnnotateOptions struct {
Annotation map[string]string
Arch *string
Features []string
OS *string
OSVersion *string
Variant *string
}

// RemoveOptions are optional options for removing manifest lists
//
//go:generate go run ../generator/generator.go RemoveOptions
Expand Down
108 changes: 108 additions & 0 deletions pkg/bindings/manifests/types_annotate_options.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions pkg/bindings/test/manifests_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,8 @@ var _ = Describe("Podman manifests", func() {
Expect(len(data.Manifests)).To(BeNumerically("==", 1))

digest := data.Manifests[0].Digest.String()
annoOpts := new(manifests.ModifyOptions).WithOS("foo")
_, err = manifests.Annotate(bt.conn, id, []string{digest}, annoOpts)
annoOpts := new(manifests.AnnotateOptions).WithOS("foo")
_, err = manifests.Annotate(bt.conn, id, digest, annoOpts)
Expect(err).ToNot(HaveOccurred())

list, err := manifests.Inspect(bt.conn, id, nil)
Expand Down
23 changes: 21 additions & 2 deletions pkg/domain/infra/tunnel/manifest.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package tunnel
import (
"context"
"encoding/json"
"errors"
"fmt"
"strings"

Expand Down Expand Up @@ -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.AnnotateOptions).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.WithAnnotation(opts.Annotations)

id, err := manifests.Annotate(ir.ClientCtx, name, 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
Expand Down
18 changes: 18 additions & 0 deletions test/apiv2/15-manifest.at
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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'
Expand All @@ -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'
Expand Down
1 change: 0 additions & 1 deletion test/e2e/manifest_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down

0 comments on commit 6843007

Please sign in to comment.