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  }