github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/pkg/api/handlers/compat/containers_prune.go (about) 1 package compat 2 3 import ( 4 "bytes" 5 "net/http" 6 7 "github.com/hanks177/podman/v4/libpod" 8 "github.com/hanks177/podman/v4/pkg/api/handlers" 9 "github.com/hanks177/podman/v4/pkg/api/handlers/utils" 10 api "github.com/hanks177/podman/v4/pkg/api/types" 11 "github.com/hanks177/podman/v4/pkg/domain/entities/reports" 12 "github.com/hanks177/podman/v4/pkg/domain/filters" 13 "github.com/hanks177/podman/v4/pkg/util" 14 "github.com/pkg/errors" 15 ) 16 17 func PruneContainers(w http.ResponseWriter, r *http.Request) { 18 runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime) 19 filtersMap, err := util.PrepareFilters(r) 20 if err != nil { 21 utils.Error(w, http.StatusInternalServerError, errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String())) 22 return 23 } 24 25 filterFuncs := make([]libpod.ContainerFilter, 0, len(*filtersMap)) 26 for k, v := range *filtersMap { 27 generatedFunc, err := filters.GeneratePruneContainerFilterFuncs(k, v, runtime) 28 if err != nil { 29 utils.InternalServerError(w, err) 30 return 31 } 32 filterFuncs = append(filterFuncs, generatedFunc) 33 } 34 35 report, err := PruneContainersHelper(r, filterFuncs) 36 if err != nil { 37 utils.InternalServerError(w, err) 38 return 39 } 40 41 // Libpod response differs 42 if utils.IsLibpodRequest(r) { 43 utils.WriteResponse(w, http.StatusOK, report) 44 return 45 } 46 47 var payload handlers.ContainersPruneReport 48 var errorMsg bytes.Buffer 49 for _, pr := range report { 50 if pr.Err != nil { 51 // Docker stops on first error vs. libpod which keeps going. Given API constraints, concatenate all errors 52 // and return that string. 53 errorMsg.WriteString(pr.Err.Error()) 54 errorMsg.WriteString("; ") 55 continue 56 } 57 payload.ContainersDeleted = append(payload.ContainersDeleted, pr.Id) 58 payload.SpaceReclaimed += pr.Size 59 } 60 if errorMsg.Len() > 0 { 61 utils.InternalServerError(w, errors.New(errorMsg.String())) 62 return 63 } 64 65 utils.WriteResponse(w, http.StatusOK, payload) 66 } 67 68 func PruneContainersHelper(r *http.Request, filterFuncs []libpod.ContainerFilter) ([]*reports.PruneReport, error) { 69 runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime) 70 71 report, err := runtime.PruneContainers(filterFuncs) 72 if err != nil { 73 return nil, err 74 } 75 return report, nil 76 }