summaryrefslogtreecommitdiff
path: root/pkg/api
diff options
context:
space:
mode:
authorSascha Grunert <sgrunert@suse.com>2020-02-05 12:07:44 +0100
committerSascha Grunert <sgrunert@suse.com>2020-02-17 11:12:35 +0100
commit93358ef915f639e52088b0f6aec52e77d3da0af7 (patch)
tree797e7b98b6efe2b0bdb74e93146b53c798367308 /pkg/api
parentff0f8388138f7b66c4312db0e984f0bedcac2558 (diff)
downloadpodman-93358ef915f639e52088b0f6aec52e77d3da0af7.tar.gz
podman-93358ef915f639e52088b0f6aec52e77d3da0af7.tar.bz2
podman-93358ef915f639e52088b0f6aec52e77d3da0af7.zip
Refactor image tree for API usage
Signed-off-by: Sascha Grunert <sgrunert@suse.com>
Diffstat (limited to 'pkg/api')
-rw-r--r--pkg/api/handlers/libpod/images.go41
-rw-r--r--pkg/api/handlers/swagger.go9
-rw-r--r--pkg/api/server/register_images.go25
3 files changed, 63 insertions, 12 deletions
diff --git a/pkg/api/handlers/libpod/images.go b/pkg/api/handlers/libpod/images.go
index bcbe4977e..eac0e4dad 100644
--- a/pkg/api/handlers/libpod/images.go
+++ b/pkg/api/handlers/libpod/images.go
@@ -46,17 +46,34 @@ func ImageExists(w http.ResponseWriter, r *http.Request) {
}
func ImageTree(w http.ResponseWriter, r *http.Request) {
- // tree is a bit of a mess ... logic is in adapter and therefore not callable from here. needs rework
-
- // name := utils.GetName(r)
- // _, layerInfoMap, _, err := s.Runtime.Tree(name)
- // if err != nil {
- // Error(w, "Something went wrong.", http.StatusInternalServerError, errors.Wrapf(err, "Failed to find image information for %q", name))
- // return
- // }
- // it is not clear to me how to deal with this given all the processing of the image
- // is in main. we need to discuss how that really should be and return something useful.
- handlers.UnsupportedHandler(w, r)
+ runtime := r.Context().Value("runtime").(*libpod.Runtime)
+ name := utils.GetName(r)
+
+ img, err := runtime.ImageRuntime().NewFromLocal(name)
+ if err != nil {
+ utils.Error(w, "Something went wrong.", http.StatusNotFound, errors.Wrapf(err, "Failed to find image %s", name))
+ return
+ }
+
+ decoder := r.Context().Value("decoder").(*schema.Decoder)
+ query := struct {
+ WhatRequires bool `schema:"whatrequires"`
+ }{
+ WhatRequires: false,
+ }
+ if err := decoder.Decode(&query, r.URL.Query()); err != nil {
+ utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest,
+ errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
+ return
+ }
+
+ tree, err := img.GenerateTree(query.WhatRequires)
+ if err != nil {
+ utils.Error(w, "Server error", http.StatusInternalServerError, errors.Wrapf(err, "failed to generate image tree for %s", name))
+ return
+ }
+
+ utils.WriteResponse(w, http.StatusOK, tree)
}
func GetImage(w http.ResponseWriter, r *http.Request) {
@@ -72,8 +89,8 @@ func GetImage(w http.ResponseWriter, r *http.Request) {
return
}
utils.WriteResponse(w, http.StatusOK, inspect)
-
}
+
func GetImages(w http.ResponseWriter, r *http.Request) {
images, err := utils.GetImages(w, r)
if err != nil {
diff --git a/pkg/api/handlers/swagger.go b/pkg/api/handlers/swagger.go
index 10525bfc7..4ba123ba9 100644
--- a/pkg/api/handlers/swagger.go
+++ b/pkg/api/handlers/swagger.go
@@ -136,3 +136,12 @@ type swagInspectVolumeResponse struct {
libpod.InspectVolumeData
}
}
+
+// Image tree response
+// swagger:response LibpodImageTreeResponse
+type swagImageTreeResponse struct {
+ // in:body
+ Body struct {
+ ImageTreeResponse
+ }
+}
diff --git a/pkg/api/server/register_images.go b/pkg/api/server/register_images.go
index f082c5fec..4706a7c69 100644
--- a/pkg/api/server/register_images.go
+++ b/pkg/api/server/register_images.go
@@ -578,6 +578,31 @@ func (s *APIServer) registerImagesHandlers(r *mux.Router) error {
// 500:
// $ref: '#/responses/InternalError'
r.Handle(VersionedPath("/libpod/images/{name}/exists"), APIHandler(s.Context, libpod.ImageExists))
+ // swagger:operation POST /libpod/images/{name}/tree libpod libpodImageTree
+ // ---
+ // tags:
+ // - images
+ // summary: Image tree
+ // description: Retrieve the image tree for the provided image name or ID
+ // parameters:
+ // - in: path
+ // name: name
+ // type: string
+ // required: true
+ // description: the name or ID of the container
+ // - in: query
+ // name: whatrequires
+ // type: boolean
+ // description: show all child images and layers of the specified image
+ // produces:
+ // - application/json
+ // responses:
+ // 200:
+ // $ref: '#/responses/LibpodImageTreeResponse'
+ // 401:
+ // $ref: '#/responses/NoSuchImage'
+ // 500:
+ // $ref: '#/responses/InternalError'
r.Handle(VersionedPath("/libpod/images/{name}/tree"), APIHandler(s.Context, libpod.ImageTree))
// swagger:operation GET /libpod/images/{name}/history libpod libpodImageHistory
// ---