github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/pkg/api/handlers/compat/containers_prune.go (about) 1 package compat 2 3 import ( 4 "net/http" 5 6 "github.com/containers/libpod/libpod" 7 "github.com/containers/libpod/pkg/api/handlers" 8 "github.com/containers/libpod/pkg/api/handlers/utils" 9 "github.com/docker/docker/api/types" 10 "github.com/gorilla/schema" 11 "github.com/pkg/errors" 12 ) 13 14 func PruneContainers(w http.ResponseWriter, r *http.Request) { 15 var ( 16 delContainers []string 17 space int64 18 ) 19 runtime := r.Context().Value("runtime").(*libpod.Runtime) 20 decoder := r.Context().Value("decoder").(*schema.Decoder) 21 22 query := struct { 23 Filters map[string][]string `schema:"filters"` 24 }{} 25 if err := decoder.Decode(&query, r.URL.Query()); err != nil { 26 utils.Error(w, "Something went wrong.", http.StatusBadRequest, errors.Wrapf(err, "Failed to parse parameters for %s", r.URL.String())) 27 return 28 } 29 30 filterFuncs, err := utils.GenerateFilterFuncsFromMap(runtime, query.Filters) 31 if err != nil { 32 utils.InternalServerError(w, err) 33 return 34 } 35 prunedContainers, pruneErrors, err := runtime.PruneContainers(filterFuncs) 36 if err != nil { 37 utils.InternalServerError(w, err) 38 return 39 } 40 41 // Libpod response differs 42 if utils.IsLibpodRequest(r) { 43 var response []handlers.LibpodContainersPruneReport 44 for ctrID, size := range prunedContainers { 45 response = append(response, handlers.LibpodContainersPruneReport{ID: ctrID, SpaceReclaimed: size}) 46 } 47 for ctrID, err := range pruneErrors { 48 response = append(response, handlers.LibpodContainersPruneReport{ID: ctrID, PruneError: err.Error()}) 49 } 50 utils.WriteResponse(w, http.StatusOK, response) 51 return 52 } 53 for ctrID, size := range prunedContainers { 54 if pruneErrors[ctrID] == nil { 55 space += size 56 delContainers = append(delContainers, ctrID) 57 } 58 } 59 report := types.ContainersPruneReport{ 60 ContainersDeleted: delContainers, 61 SpaceReclaimed: uint64(space), 62 } 63 utils.WriteResponse(w, http.StatusOK, report) 64 }