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  }