github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/pkg/api/handlers/utils/pods.go (about)

     1  package utils
     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/domain/entities"
     9  	"github.com/gorilla/schema"
    10  )
    11  
    12  func GetPods(w http.ResponseWriter, r *http.Request) ([]*entities.ListPodsReport, error) {
    13  	var (
    14  		pods []*libpod.Pod
    15  	)
    16  	runtime := r.Context().Value("runtime").(*libpod.Runtime)
    17  	decoder := r.Context().Value("decoder").(*schema.Decoder)
    18  
    19  	query := struct {
    20  		All     bool
    21  		Filters map[string][]string `schema:"filters"`
    22  		Digests bool
    23  	}{}
    24  
    25  	if err := decoder.Decode(&query, r.URL.Query()); err != nil {
    26  		return nil, err
    27  	}
    28  	if _, found := r.URL.Query()["digests"]; found && query.Digests {
    29  		UnSupportedParameter("digests")
    30  	}
    31  
    32  	filters := make([]libpod.PodFilter, 0, len(query.Filters))
    33  	for k, v := range query.Filters {
    34  		f, err := lpfilters.GeneratePodFilterFunc(k, v)
    35  		if err != nil {
    36  			return nil, err
    37  		}
    38  		filters = append(filters, f)
    39  	}
    40  	pods, err := runtime.Pods(filters...)
    41  	if err != nil {
    42  		return nil, err
    43  	}
    44  
    45  	if len(pods) == 0 {
    46  		return []*entities.ListPodsReport{}, nil
    47  	}
    48  
    49  	lps := make([]*entities.ListPodsReport, 0, len(pods))
    50  	for _, pod := range pods {
    51  		status, err := pod.GetPodStatus()
    52  		if err != nil {
    53  			return nil, err
    54  		}
    55  		ctrs, err := pod.AllContainers()
    56  		if err != nil {
    57  			return nil, err
    58  		}
    59  		infraID, err := pod.InfraContainerID()
    60  		if err != nil {
    61  			return nil, err
    62  		}
    63  		lp := entities.ListPodsReport{
    64  			Cgroup:    pod.CgroupParent(),
    65  			Created:   pod.CreatedTime(),
    66  			Id:        pod.ID(),
    67  			Name:      pod.Name(),
    68  			Namespace: pod.Namespace(),
    69  			Status:    status,
    70  			InfraId:   infraID,
    71  			Labels:    pod.Labels(),
    72  		}
    73  		for _, ctr := range ctrs {
    74  			state, err := ctr.State()
    75  			if err != nil {
    76  				return nil, err
    77  			}
    78  			lp.Containers = append(lp.Containers, &entities.ListPodContainer{
    79  				Id:     ctr.ID(),
    80  				Names:  ctr.Name(),
    81  				Status: state.String(),
    82  			})
    83  		}
    84  		lps = append(lps, &lp)
    85  	}
    86  	return lps, nil
    87  }