mirror of https://github.com/containers/podman.git
Fix for volumes prune in http compat api
Signed-off-by: Jakub Guzik <jakubmguzik@gmail.com>
This commit is contained in:
parent
e7dc59252b
commit
f4b2d597a8
|
@ -5,6 +5,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/containers/podman/v3/libpod"
|
"github.com/containers/podman/v3/libpod"
|
||||||
|
@ -31,7 +32,7 @@ func ListVolumes(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
|
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
|
||||||
utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest,
|
utils.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError,
|
||||||
errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
|
errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -40,7 +41,7 @@ func ListVolumes(w http.ResponseWriter, r *http.Request) {
|
||||||
// happily parse them for us.
|
// happily parse them for us.
|
||||||
for filter := range query.Filters {
|
for filter := range query.Filters {
|
||||||
if filter == "opts" {
|
if filter == "opts" {
|
||||||
utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest,
|
utils.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError,
|
||||||
errors.Errorf("unsupported libpod filters passed to docker endpoint"))
|
errors.Errorf("unsupported libpod filters passed to docker endpoint"))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -90,7 +91,7 @@ func CreateVolume(w http.ResponseWriter, r *http.Request) {
|
||||||
/* No query string data*/
|
/* No query string data*/
|
||||||
query := struct{}{}
|
query := struct{}{}
|
||||||
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
|
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
|
||||||
utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest,
|
utils.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError,
|
||||||
errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
|
errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -218,7 +219,7 @@ func RemoveVolume(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
|
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
|
||||||
utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest,
|
utils.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError,
|
||||||
errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
|
errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -263,25 +264,24 @@ func RemoveVolume(w http.ResponseWriter, r *http.Request) {
|
||||||
func PruneVolumes(w http.ResponseWriter, r *http.Request) {
|
func PruneVolumes(w http.ResponseWriter, r *http.Request) {
|
||||||
var (
|
var (
|
||||||
runtime = r.Context().Value("runtime").(*libpod.Runtime)
|
runtime = r.Context().Value("runtime").(*libpod.Runtime)
|
||||||
decoder = r.Context().Value("decoder").(*schema.Decoder)
|
|
||||||
)
|
)
|
||||||
// For some reason the prune filters are query parameters even though this
|
filtersList, err := filtersFromRequest(r)
|
||||||
// is a POST endpoint
|
if err != nil {
|
||||||
query := struct {
|
utils.Error(w, "Something went wrong.", http.StatusInternalServerError, errors.Wrap(err, "Decode()"))
|
||||||
Filters map[string][]string `schema:"filters"`
|
|
||||||
}{
|
|
||||||
// override any golang type defaults
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
|
|
||||||
utils.Error(w, "Something went wrong.", http.StatusBadRequest, errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
filterMap := map[string][]string{}
|
||||||
|
for _, filter := range filtersList {
|
||||||
|
split := strings.SplitN(filter, "=", 2)
|
||||||
|
if len(split) > 1 {
|
||||||
|
filterMap[split[0]] = append(filterMap[split[0]], split[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
f := (url.Values)(query.Filters)
|
f := (url.Values)(filterMap)
|
||||||
filterFuncs, err := filters.GenerateVolumeFilters(f)
|
filterFuncs, err := filters.GenerateVolumeFilters(f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Error(w, "Something when wrong.", http.StatusBadRequest, errors.Wrapf(err, "failed to parse filters for %s", f.Encode()))
|
utils.Error(w, "Something when wrong.", http.StatusInternalServerError, errors.Wrapf(err, "failed to parse filters for %s", f.Encode()))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,10 @@ t DELETE libpod/volumes/foo1 404 \
|
||||||
.message~.* \
|
.message~.* \
|
||||||
.response=404
|
.response=404
|
||||||
|
|
||||||
|
# Prune volumes - bad filter input
|
||||||
|
t POST volumes/prune?filters='garb1age}' 500 \
|
||||||
|
.cause="invalid character 'g' looking for beginning of value"
|
||||||
|
|
||||||
## Prune volumes with label matching 'testlabel1=testonly'
|
## Prune volumes with label matching 'testlabel1=testonly'
|
||||||
t POST libpod/volumes/prune?filters='{"label":["testlabel1=testonly"]}' 200
|
t POST libpod/volumes/prune?filters='{"label":["testlabel1=testonly"]}' 200
|
||||||
t GET libpod/volumes/json?filters='{"label":["testlabel1=testonly"]}' 200 length=0
|
t GET libpod/volumes/json?filters='{"label":["testlabel1=testonly"]}' 200 length=0
|
||||||
|
|
Loading…
Reference in New Issue