Skip to content

Commit 7a3d99c

Browse files
Merge pull request #26577 from ninja-quokka/bindings
feat: Add Podman artifact support to Go bindings and remote clients
2 parents b841413 + 23ebb7d commit 7a3d99c

36 files changed

+1198
-175
lines changed

cmd/podman/artifact/add.go

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,17 @@ var (
2323
Example: `podman artifact add quay.io/myimage/myartifact:latest /tmp/foobar.txt
2424
podman artifact add --file-type text/yaml quay.io/myimage/myartifact:latest /tmp/foobar.yaml
2525
podman artifact add --append quay.io/myimage/myartifact:latest /tmp/foobar.tar.gz`,
26-
Annotations: map[string]string{registry.EngineMode: registry.ABIMode},
2726
}
2827
)
2928

30-
type artifactAddOptions struct {
31-
ArtifactType string
32-
Annotations []string
33-
Append bool
34-
FileType string
29+
// AddOptionsWrapper wraps entities.ArtifactsAddOptions and prevents leaking
30+
// CLI-only fields into the API types.
31+
type AddOptionsWrapper struct {
32+
entities.ArtifactAddOptions
33+
AnnotationsCLI []string // CLI only
3534
}
3635

37-
var (
38-
addOpts artifactAddOptions
39-
)
36+
var addOpts AddOptionsWrapper
4037

4138
func init() {
4239
registry.Commands = append(registry.Commands, registry.CliCommand{
@@ -46,34 +43,36 @@ func init() {
4643
flags := addCmd.Flags()
4744

4845
annotationFlagName := "annotation"
49-
flags.StringArrayVar(&addOpts.Annotations, annotationFlagName, nil, "set an `annotation` for the specified files of artifact")
46+
flags.StringArrayVar(&addOpts.AnnotationsCLI, annotationFlagName, nil, "set an `annotation` for the specified files of artifact")
5047
_ = addCmd.RegisterFlagCompletionFunc(annotationFlagName, completion.AutocompleteNone)
5148

52-
addTypeFlagName := "type"
53-
flags.StringVar(&addOpts.ArtifactType, addTypeFlagName, "", "Use type to describe an artifact")
54-
_ = addCmd.RegisterFlagCompletionFunc(addTypeFlagName, completion.AutocompleteNone)
49+
addMIMETypeFlagName := "type"
50+
flags.StringVar(&addOpts.ArtifactMIMEType, addMIMETypeFlagName, "", "Use type to describe an artifact")
51+
_ = addCmd.RegisterFlagCompletionFunc(addMIMETypeFlagName, completion.AutocompleteNone)
5552

5653
appendFlagName := "append"
5754
flags.BoolVarP(&addOpts.Append, appendFlagName, "a", false, "Append files to an existing artifact")
5855

59-
fileTypeFlagName := "file-type"
60-
flags.StringVarP(&addOpts.FileType, fileTypeFlagName, "", "", "Set file type to use for the artifact (layer)")
61-
_ = addCmd.RegisterFlagCompletionFunc(fileTypeFlagName, completion.AutocompleteNone)
56+
fileMIMETypeFlagName := "file-type"
57+
flags.StringVarP(&addOpts.FileMIMEType, fileMIMETypeFlagName, "", "", "Set file type to use for the artifact (layer)")
58+
_ = addCmd.RegisterFlagCompletionFunc(fileMIMETypeFlagName, completion.AutocompleteNone)
6259
}
6360

6461
func add(cmd *cobra.Command, args []string) error {
6562
artifactName := args[0]
6663
blobs := args[1:]
67-
opts := new(entities.ArtifactAddOptions)
6864

69-
annots, err := utils.ParseAnnotations(addOpts.Annotations)
65+
annots, err := utils.ParseAnnotations(addOpts.AnnotationsCLI)
7066
if err != nil {
7167
return err
7268
}
73-
opts.Annotations = annots
74-
opts.ArtifactType = addOpts.ArtifactType
75-
opts.Append = addOpts.Append
76-
opts.FileType = addOpts.FileType
69+
70+
opts := entities.ArtifactAddOptions{
71+
Annotations: annots,
72+
ArtifactMIMEType: addOpts.ArtifactMIMEType,
73+
Append: addOpts.Append,
74+
FileMIMEType: addOpts.FileMIMEType,
75+
}
7776

7877
artifactBlobs := make([]entities.ArtifactBlob, 0, len(blobs))
7978

cmd/podman/artifact/artifact.go

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,13 @@ import (
66
"github.com/spf13/cobra"
77
)
88

9-
var (
10-
// Command: podman _artifact_
11-
artifactCmd = &cobra.Command{
12-
Use: "artifact",
13-
Short: "Manage OCI artifacts",
14-
Long: "Manage OCI artifacts",
15-
RunE: validate.SubCommandExists,
16-
Annotations: map[string]string{registry.EngineMode: registry.ABIMode},
17-
}
18-
)
9+
// Command: podman _artifact_
10+
var artifactCmd = &cobra.Command{
11+
Use: "artifact",
12+
Short: "Manage OCI artifacts",
13+
Long: "Manage OCI artifacts",
14+
RunE: validate.SubCommandExists,
15+
}
1916

2017
func init() {
2118
registry.Commands = append(registry.Commands, registry.CliCommand{

cmd/podman/artifact/extract.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ var (
1818
ValidArgsFunction: common.AutocompleteArtifactAdd,
1919
Example: `podman artifact Extract quay.io/myimage/myartifact:latest /tmp/foobar.txt
2020
podman artifact Extract quay.io/myimage/myartifact:latest /home/paul/mydir`,
21-
Annotations: map[string]string{registry.EngineMode: registry.ABIMode},
2221
}
2322
)
2423

@@ -43,7 +42,7 @@ func init() {
4342
}
4443

4544
func extract(cmd *cobra.Command, args []string) error {
46-
err := registry.ImageEngine().ArtifactExtract(registry.Context(), args[0], args[1], &extractOpts)
45+
err := registry.ImageEngine().ArtifactExtract(registry.Context(), args[0], args[1], extractOpts)
4746
if err != nil {
4847
return err
4948
}

cmd/podman/artifact/inspect.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ var (
1717
Args: cobra.MinimumNArgs(1),
1818
ValidArgsFunction: common.AutocompleteArtifacts,
1919
Example: `podman artifact inspect quay.io/myimage/myartifact:latest`,
20-
Annotations: map[string]string{registry.EngineMode: registry.ABIMode},
2120
}
2221
)
2322

cmd/podman/artifact/list.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ var (
2525
Args: validate.NoArgs,
2626
ValidArgsFunction: completion.AutocompleteNone,
2727
Example: `podman artifact ls`,
28-
Annotations: map[string]string{registry.EngineMode: registry.ABIMode},
2928
}
3029
listFlag = listFlagType{}
3130
)

cmd/podman/artifact/pull.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ var (
3636
Args: cobra.ExactArgs(1),
3737
ValidArgsFunction: common.AutocompleteArtifacts,
3838
Example: `podman artifact pull quay.io/myimage/myartifact:latest`,
39-
Annotations: map[string]string{registry.EngineMode: registry.ABIMode},
4039
}
4140
)
4241

cmd/podman/artifact/push.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ var (
3939
Args: cobra.ExactArgs(1),
4040
ValidArgsFunction: common.AutocompleteArtifacts,
4141
Example: `podman artifact push quay.io/myimage/myartifact:latest`,
42-
Annotations: map[string]string{registry.EngineMode: registry.ABIMode},
4342
}
4443
)
4544

cmd/podman/artifact/rm.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ var (
2323
ValidArgsFunction: common.AutocompleteArtifacts,
2424
Example: `podman artifact rm quay.io/myimage/myartifact:latest
2525
podman artifact rm -a`,
26-
Annotations: map[string]string{registry.EngineMode: registry.ABIMode},
2726
}
2827

2928
rmOptions = entities.ArtifactRemoveOptions{}

pkg/api/handlers/libpod/artifacts.go

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,12 @@ func PullArtifact(w http.ResponseWriter, r *http.Request) {
127127
rc := errcd.ErrorCode().Descriptor().HTTPStatusCode
128128
// Check if the returned error is 401 StatusUnauthorized indicating the request was unauthorized
129129
if rc == http.StatusUnauthorized {
130-
utils.Error(w, http.StatusUnauthorized, errcd.ErrorCode())
130+
utils.Error(w, http.StatusUnauthorized, err)
131131
return
132132
}
133133
// Check if the returned error is 404 StatusNotFound indicating the artifact was not found
134134
if rc == http.StatusNotFound {
135-
utils.Error(w, http.StatusNotFound, errcd.ErrorCode())
135+
utils.Error(w, http.StatusNotFound, err)
136136
return
137137
}
138138
}
@@ -191,11 +191,11 @@ func AddArtifact(w http.ResponseWriter, r *http.Request) {
191191
return
192192
}
193193

194-
artifactAddOptions := &entities.ArtifactAddOptions{
195-
Append: query.Append,
196-
Annotations: annotations,
197-
ArtifactType: query.ArtifactMIMEType,
198-
FileType: query.FileMIMEType,
194+
artifactAddOptions := entities.ArtifactAddOptions{
195+
Append: query.Append,
196+
Annotations: annotations,
197+
ArtifactMIMEType: query.ArtifactMIMEType,
198+
FileMIMEType: query.FileMIMEType,
199199
}
200200

201201
artifactBlobs := []entities.ArtifactBlob{{
@@ -283,7 +283,7 @@ func PushArtifact(w http.ResponseWriter, r *http.Request) {
283283
rc := errcd.ErrorCode().Descriptor().HTTPStatusCode
284284
// Check if the returned error is 401 indicating the request was unauthorized
285285
if rc == 401 {
286-
utils.Error(w, 401, errcd.ErrorCode())
286+
utils.Error(w, 401, err)
287287
return
288288
}
289289
}
@@ -306,8 +306,9 @@ func ExtractArtifact(w http.ResponseWriter, r *http.Request) {
306306
decoder := r.Context().Value(api.DecoderKey).(*schema.Decoder)
307307

308308
query := struct {
309-
Digest string `schema:"digest"`
310-
Title string `schema:"title"`
309+
Digest string `schema:"digest"`
310+
Title string `schema:"title"`
311+
ExcludeTitle bool `schema:"excludetitle"`
311312
}{}
312313

313314
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
@@ -316,15 +317,16 @@ func ExtractArtifact(w http.ResponseWriter, r *http.Request) {
316317
}
317318

318319
extractOpts := entities.ArtifactExtractOptions{
319-
Title: query.Title,
320-
Digest: query.Digest,
320+
Title: query.Title,
321+
Digest: query.Digest,
322+
ExcludeTitle: query.ExcludeTitle,
321323
}
322324

323325
name := utils.GetName(r)
324326

325327
imageEngine := abi.ImageEngine{Libpod: runtime}
326328

327-
err := imageEngine.ArtifactExtractTarStream(r.Context(), w, name, &extractOpts)
329+
err := imageEngine.ArtifactExtractTarStream(r.Context(), w, name, extractOpts)
328330
if err != nil {
329331
if errors.Is(err, libartifact_types.ErrArtifactNotExist) {
330332
utils.ArtifactNotFound(w, name, err)

pkg/api/server/register_artifacts.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,9 +242,15 @@ func (s *APIServer) registerArtifactHandlers(r *mux.Router) error {
242242
// in: query
243243
// description: Only extract blob with the given digest
244244
// type: string
245+
// - name: excludeTitle
246+
// in: query
247+
// description: When extracting a single Artifact blob, don't use the blob title as the filename in the tar
248+
// type: boolean
245249
// responses:
246250
// 200:
247251
// description: Extract successful
252+
// schema:
253+
// type: file
248254
// 400:
249255
// $ref: "#/responses/badParamError"
250256
// 404:

0 commit comments

Comments
 (0)