mirror of
https://github.com/containers/podman.git
synced 2025-08-06 19:44:14 +08:00

Containers endpoints for HTTP compad and libpod APIs allowed usage of list HTTP endpoint filter funcs. Documentation in case of libpod and compat API does not allow that. This commit aligns code with the documentation. Signed-off-by: Jakub Guzik <jakubmguzik@gmail.com>
76 lines
2.1 KiB
Go
76 lines
2.1 KiB
Go
package compat
|
|
|
|
import (
|
|
"bytes"
|
|
"net/http"
|
|
|
|
"github.com/containers/podman/v3/libpod"
|
|
"github.com/containers/podman/v3/pkg/api/handlers"
|
|
"github.com/containers/podman/v3/pkg/api/handlers/utils"
|
|
"github.com/containers/podman/v3/pkg/domain/entities/reports"
|
|
"github.com/containers/podman/v3/pkg/domain/filters"
|
|
"github.com/containers/podman/v3/pkg/util"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
func PruneContainers(w http.ResponseWriter, r *http.Request) {
|
|
runtime := r.Context().Value("runtime").(*libpod.Runtime)
|
|
filtersMap, err := util.PrepareFilters(r)
|
|
if err != nil {
|
|
utils.Error(w, "Something went wrong.", http.StatusInternalServerError, errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String()))
|
|
return
|
|
}
|
|
|
|
filterFuncs := make([]libpod.ContainerFilter, 0, len(*filtersMap))
|
|
for k, v := range *filtersMap {
|
|
generatedFunc, err := filters.GeneratePruneContainerFilterFuncs(k, v, runtime)
|
|
if err != nil {
|
|
utils.InternalServerError(w, err)
|
|
return
|
|
}
|
|
filterFuncs = append(filterFuncs, generatedFunc)
|
|
}
|
|
|
|
report, err := PruneContainersHelper(r, filterFuncs)
|
|
if err != nil {
|
|
utils.InternalServerError(w, err)
|
|
return
|
|
}
|
|
|
|
// Libpod response differs
|
|
if utils.IsLibpodRequest(r) {
|
|
utils.WriteResponse(w, http.StatusOK, report)
|
|
return
|
|
}
|
|
|
|
var payload handlers.ContainersPruneReport
|
|
var errorMsg bytes.Buffer
|
|
for _, pr := range report {
|
|
if pr.Err != nil {
|
|
// Docker stops on first error vs. libpod which keeps going. Given API constraints, concatenate all errors
|
|
// and return that string.
|
|
errorMsg.WriteString(pr.Err.Error())
|
|
errorMsg.WriteString("; ")
|
|
continue
|
|
}
|
|
payload.ContainersDeleted = append(payload.ContainersDeleted, pr.Id)
|
|
payload.SpaceReclaimed += pr.Size
|
|
}
|
|
if errorMsg.Len() > 0 {
|
|
utils.InternalServerError(w, errors.New(errorMsg.String()))
|
|
return
|
|
}
|
|
|
|
utils.WriteResponse(w, http.StatusOK, payload)
|
|
}
|
|
|
|
func PruneContainersHelper(r *http.Request, filterFuncs []libpod.ContainerFilter) ([]*reports.PruneReport, error) {
|
|
runtime := r.Context().Value("runtime").(*libpod.Runtime)
|
|
|
|
report, err := runtime.PruneContainers(filterFuncs)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return report, nil
|
|
}
|