github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/pkg/api/handlers/compat/containers_prune.go (about) 1 package compat 2 3 import ( 4 "net/http" 5 6 "github.com/containers/podman/v2/libpod" 7 lpfilters "github.com/containers/podman/v2/libpod/filters" 8 "github.com/containers/podman/v2/pkg/api/handlers/utils" 9 "github.com/containers/podman/v2/pkg/domain/entities" 10 "github.com/docker/docker/api/types" 11 "github.com/gorilla/schema" 12 "github.com/pkg/errors" 13 ) 14 15 func PruneContainers(w http.ResponseWriter, r *http.Request) { 16 var ( 17 delContainers []string 18 space int64 19 ) 20 runtime := r.Context().Value("runtime").(*libpod.Runtime) 21 decoder := r.Context().Value("decoder").(*schema.Decoder) 22 23 query := struct { 24 Filters map[string][]string `schema:"filters"` 25 }{} 26 if err := decoder.Decode(&query, r.URL.Query()); err != nil { 27 utils.Error(w, "Something went wrong.", http.StatusBadRequest, errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String())) 28 return 29 } 30 filterFuncs := make([]libpod.ContainerFilter, 0, len(query.Filters)) 31 for k, v := range query.Filters { 32 generatedFunc, err := lpfilters.GenerateContainerFilterFuncs(k, v, runtime) 33 if err != nil { 34 utils.InternalServerError(w, err) 35 return 36 } 37 filterFuncs = append(filterFuncs, generatedFunc) 38 } 39 40 // Libpod response differs 41 if utils.IsLibpodRequest(r) { 42 report, err := PruneContainersHelper(w, r, filterFuncs) 43 if err != nil { 44 utils.InternalServerError(w, err) 45 return 46 } 47 48 utils.WriteResponse(w, http.StatusOK, report) 49 return 50 } 51 52 prunedContainers, pruneErrors, err := runtime.PruneContainers(filterFuncs) 53 if err != nil { 54 utils.InternalServerError(w, err) 55 return 56 } 57 for ctrID, size := range prunedContainers { 58 if pruneErrors[ctrID] == nil { 59 space += size 60 delContainers = append(delContainers, ctrID) 61 } 62 } 63 report := types.ContainersPruneReport{ 64 ContainersDeleted: delContainers, 65 SpaceReclaimed: uint64(space), 66 } 67 utils.WriteResponse(w, http.StatusOK, report) 68 } 69 70 func PruneContainersHelper(w http.ResponseWriter, r *http.Request, filterFuncs []libpod.ContainerFilter) ( 71 *entities.ContainerPruneReport, error) { 72 runtime := r.Context().Value("runtime").(*libpod.Runtime) 73 prunedContainers, pruneErrors, err := runtime.PruneContainers(filterFuncs) 74 if err != nil { 75 utils.InternalServerError(w, err) 76 return nil, err 77 } 78 79 report := &entities.ContainerPruneReport{ 80 Err: pruneErrors, 81 ID: prunedContainers, 82 } 83 return report, nil 84 }