mirror of https://github.com/containers/podman.git
Add support for podman-remote manifest annotate
Now that podman manifest annotate is supported in the remote environment. Signed-off-by: Toshiki Sonoda <sonoda.toshiki@fujitsu.com>
This commit is contained in:
parent
54b1fd35bd
commit
a4ba5f449f
|
@ -13,7 +13,6 @@ import (
|
||||||
var (
|
var (
|
||||||
manifestAnnotateOpts = entities.ManifestAnnotateOptions{}
|
manifestAnnotateOpts = entities.ManifestAnnotateOptions{}
|
||||||
annotateCmd = &cobra.Command{
|
annotateCmd = &cobra.Command{
|
||||||
Annotations: map[string]string{registry.EngineMode: registry.ABIMode},
|
|
||||||
Use: "annotate [options] LIST IMAGE",
|
Use: "annotate [options] LIST IMAGE",
|
||||||
Short: "Add or update information about an entry in a manifest list or image index",
|
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.",
|
Long: "Adds or updates information about an entry in a manifest list or image index.",
|
||||||
|
|
|
@ -530,13 +530,13 @@ func ManifestModify(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
case strings.EqualFold("annotate", body.Operation):
|
case strings.EqualFold("annotate", body.Operation):
|
||||||
options := entities.ManifestAnnotateOptions{
|
options := entities.ManifestAnnotateOptions{
|
||||||
Annotation: body.Annotation,
|
Annotations: body.Annotations,
|
||||||
Arch: body.Arch,
|
Arch: body.Arch,
|
||||||
Features: body.Features,
|
Features: body.Features,
|
||||||
OS: body.OS,
|
OS: body.OS,
|
||||||
OSFeatures: body.OSFeatures,
|
OSFeatures: body.OSFeatures,
|
||||||
OSVersion: body.OSVersion,
|
OSVersion: body.OSVersion,
|
||||||
Variant: body.Variant,
|
Variant: body.Variant,
|
||||||
}
|
}
|
||||||
for _, image := range body.Images {
|
for _, image := range body.Images {
|
||||||
id, err := imageEngine.ManifestAnnotate(r.Context(), name, image, options)
|
id, err := imageEngine.ManifestAnnotate(r.Context(), name, image, options)
|
||||||
|
|
|
@ -3,7 +3,6 @@ package tunnel
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -92,7 +91,27 @@ func (ir *ImageEngine) ManifestAdd(_ context.Context, name string, imageNames []
|
||||||
|
|
||||||
// ManifestAnnotate updates an entry of the manifest list
|
// ManifestAnnotate updates an entry of the manifest list
|
||||||
func (ir *ImageEngine) ManifestAnnotate(ctx context.Context, name, images string, opts entities.ManifestAnnotateOptions) (string, error) {
|
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
|
// ManifestRemoveDigest removes the digest from manifest list
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
start_registry
|
start_registry
|
||||||
|
|
||||||
|
# Creates the manifest list
|
||||||
t POST /v3.4.0/libpod/manifests/create?name=abc 200 \
|
t POST /v3.4.0/libpod/manifests/create?name=abc 200 \
|
||||||
.Id~[0-9a-f]\\{64\\}
|
.Id~[0-9a-f]\\{64\\}
|
||||||
id_abc=$(jq -r '.Id' <<<"$output")
|
id_abc=$(jq -r '.Id' <<<"$output")
|
||||||
|
@ -27,6 +28,7 @@ RUN >file2
|
||||||
EOF
|
EOF
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# manifest add --anotation tests
|
||||||
t POST /v3.4.0/libpod/manifests/$id_abc/add images="[\"containers-storage:$id_abc_image\"]" 200
|
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 \
|
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'
|
.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 \
|
t GET /v4.0.0/libpod/manifests/$id_xyz/json 200 \
|
||||||
.manifests[0].annotations.hoge="fuga"
|
.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 "/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 \
|
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'
|
.cause='x509: certificate signed by unknown authority'
|
||||||
|
|
|
@ -202,7 +202,6 @@ var _ = Describe("Podman manifest", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("annotate", func() {
|
It("annotate", func() {
|
||||||
SkipIfRemote("Not supporting annotate on remote connections")
|
|
||||||
session := podmanTest.Podman([]string{"manifest", "create", "foo"})
|
session := podmanTest.Podman([]string{"manifest", "create", "foo"})
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session).Should(Exit(0))
|
Expect(session).Should(Exit(0))
|
||||||
|
|
Loading…
Reference in New Issue