Skip to content

Commit 604459b

Browse files
Merge pull request #9711 from jmguzik/volume-prune-fix-http-compat
Fix for volumes prune in http compat api when using filters
2 parents 0f954e2 + f4b2d59 commit 604459b

File tree

2 files changed

+21
-17
lines changed

2 files changed

+21
-17
lines changed

pkg/api/handlers/compat/volumes.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"net/http"
77
"net/url"
8+
"strings"
89
"time"
910

1011
"github.com/containers/podman/v3/libpod"
@@ -31,7 +32,7 @@ func ListVolumes(w http.ResponseWriter, r *http.Request) {
3132
}
3233

3334
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
34-
utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest,
35+
utils.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError,
3536
errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
3637
return
3738
}
@@ -40,7 +41,7 @@ func ListVolumes(w http.ResponseWriter, r *http.Request) {
4041
// happily parse them for us.
4142
for filter := range query.Filters {
4243
if filter == "opts" {
43-
utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest,
44+
utils.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError,
4445
errors.Errorf("unsupported libpod filters passed to docker endpoint"))
4546
return
4647
}
@@ -90,7 +91,7 @@ func CreateVolume(w http.ResponseWriter, r *http.Request) {
9091
/* No query string data*/
9192
query := struct{}{}
9293
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
93-
utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest,
94+
utils.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError,
9495
errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
9596
return
9697
}
@@ -218,7 +219,7 @@ func RemoveVolume(w http.ResponseWriter, r *http.Request) {
218219
}
219220

220221
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
221-
utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest,
222+
utils.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError,
222223
errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
223224
return
224225
}
@@ -263,25 +264,24 @@ func RemoveVolume(w http.ResponseWriter, r *http.Request) {
263264
func PruneVolumes(w http.ResponseWriter, r *http.Request) {
264265
var (
265266
runtime = r.Context().Value("runtime").(*libpod.Runtime)
266-
decoder = r.Context().Value("decoder").(*schema.Decoder)
267267
)
268-
// For some reason the prune filters are query parameters even though this
269-
// is a POST endpoint
270-
query := struct {
271-
Filters map[string][]string `schema:"filters"`
272-
}{
273-
// override any golang type defaults
274-
}
275-
276-
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
277-
utils.Error(w, "Something went wrong.", http.StatusBadRequest, errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
268+
filtersList, err := filtersFromRequest(r)
269+
if err != nil {
270+
utils.Error(w, "Something went wrong.", http.StatusInternalServerError, errors.Wrap(err, "Decode()"))
278271
return
279272
}
273+
filterMap := map[string][]string{}
274+
for _, filter := range filtersList {
275+
split := strings.SplitN(filter, "=", 2)
276+
if len(split) > 1 {
277+
filterMap[split[0]] = append(filterMap[split[0]], split[1])
278+
}
279+
}
280280

281-
f := (url.Values)(query.Filters)
281+
f := (url.Values)(filterMap)
282282
filterFuncs, err := filters.GenerateVolumeFilters(f)
283283
if err != nil {
284-
utils.Error(w, "Something when wrong.", http.StatusBadRequest, errors.Wrapf(err, "failed to parse filters for %s", f.Encode()))
284+
utils.Error(w, "Something when wrong.", http.StatusInternalServerError, errors.Wrapf(err, "failed to parse filters for %s", f.Encode()))
285285
return
286286
}
287287

test/apiv2/30-volumes.at

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ t DELETE libpod/volumes/foo1 404 \
8686
.message~.* \
8787
.response=404
8888

89+
# Prune volumes - bad filter input
90+
t POST volumes/prune?filters='garb1age}' 500 \
91+
.cause="invalid character 'g' looking for beginning of value"
92+
8993
## Prune volumes with label matching 'testlabel1=testonly'
9094
t POST libpod/volumes/prune?filters='{"label":["testlabel1=testonly"]}' 200
9195
t GET libpod/volumes/json?filters='{"label":["testlabel1=testonly"]}' 200 length=0

0 commit comments

Comments
 (0)