diff options
Diffstat (limited to 'cmd/podman')
-rw-r--r-- | cmd/podman/common.go | 6 | ||||
-rw-r--r-- | cmd/podman/common_test.go | 15 | ||||
-rw-r--r-- | cmd/podman/pod_ps.go | 1 | ||||
-rw-r--r-- | cmd/podman/pod_stats.go | 14 | ||||
-rw-r--r-- | cmd/podman/ps.go | 117 | ||||
-rw-r--r-- | cmd/podman/run_test.go | 1 | ||||
-rw-r--r-- | cmd/podman/search.go | 5 | ||||
-rw-r--r-- | cmd/podman/shared/create.go | 5 | ||||
-rw-r--r-- | cmd/podman/trust_set_show.go | 5 | ||||
-rw-r--r-- | cmd/podman/utils.go | 42 |
10 files changed, 193 insertions, 18 deletions
diff --git a/cmd/podman/common.go b/cmd/podman/common.go index f4d128df2..10fed053e 100644 --- a/cmd/podman/common.go +++ b/cmd/podman/common.go @@ -10,13 +10,17 @@ import ( "github.com/containers/libpod/cmd/podman/cliconfig" "github.com/containers/libpod/libpod" "github.com/containers/libpod/pkg/rootless" + "github.com/containers/storage" "github.com/fatih/camelcase" jsoniter "github.com/json-iterator/go" "github.com/pkg/errors" "github.com/spf13/cobra" ) -var json = jsoniter.ConfigCompatibleWithStandardLibrary +var ( + stores = make(map[storage.Store]struct{}) + json = jsoniter.ConfigCompatibleWithStandardLibrary +) const ( idTruncLength = 12 diff --git a/cmd/podman/common_test.go b/cmd/podman/common_test.go new file mode 100644 index 000000000..a24173003 --- /dev/null +++ b/cmd/podman/common_test.go @@ -0,0 +1,15 @@ +package main + +import ( + "os/user" + "testing" +) + +func skipTestIfNotRoot(t *testing.T) { + u, err := user.Current() + if err != nil { + t.Skip("Could not determine user. Running without root may cause tests to fail") + } else if u.Uid != "0" { + t.Skip("tests will fail unless run as root") + } +} diff --git a/cmd/podman/pod_ps.go b/cmd/podman/pod_ps.go index d0cc6aa12..a956882cf 100644 --- a/cmd/podman/pod_ps.go +++ b/cmd/podman/pod_ps.go @@ -20,6 +20,7 @@ import ( ) const ( + STOPPED = "Stopped" RUNNING = "Running" PAUSED = "Paused" EXITED = "Exited" diff --git a/cmd/podman/pod_stats.go b/cmd/podman/pod_stats.go index 744602268..36b0b95ed 100644 --- a/cmd/podman/pod_stats.go +++ b/cmd/podman/pod_stats.go @@ -298,3 +298,17 @@ func outputJson(stats []*adapter.PodContainerStats) error { fmt.Println(string(b)) return nil } + +func getPodsByList(podList []string, r *libpod.Runtime) ([]*libpod.Pod, error) { + var ( + pods []*libpod.Pod + ) + for _, p := range podList { + pod, err := r.LookupPod(p) + if err != nil { + return nil, err + } + pods = append(pods, pod) + } + return pods, nil +} diff --git a/cmd/podman/ps.go b/cmd/podman/ps.go index 232cf4b77..759a03b86 100644 --- a/cmd/podman/ps.go +++ b/cmd/podman/ps.go @@ -18,31 +18,35 @@ import ( "github.com/containers/libpod/cmd/podman/shared" "github.com/containers/libpod/libpod" "github.com/containers/libpod/pkg/util" + "github.com/cri-o/ocicni/pkg/ocicni" "github.com/docker/go-units" "github.com/opentracing/opentracing-go" "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/fields" ) const ( - hid = "CONTAINER ID" - himage = "IMAGE" - hcommand = "COMMAND" - hcreated = "CREATED" - hstatus = "STATUS" - hports = "PORTS" - hnames = "NAMES" - hsize = "SIZE" - hpod = "POD" - nspid = "PID" - nscgroup = "CGROUPNS" - nsipc = "IPC" - nsmnt = "MNT" - nsnet = "NET" - nspidns = "PIDNS" - nsuserns = "USERNS" - nsuts = "UTS" + mountTruncLength = 12 + hid = "CONTAINER ID" + himage = "IMAGE" + hcommand = "COMMAND" + hcreated = "CREATED" + hstatus = "STATUS" + hports = "PORTS" + hnames = "NAMES" + hsize = "SIZE" + hinfra = "IS INFRA" + hpod = "POD" + nspid = "PID" + nscgroup = "CGROUPNS" + nsipc = "IPC" + nsmnt = "MNT" + nsnet = "NET" + nspidns = "PIDNS" + nsuserns = "USERNS" + nsuts = "UTS" ) type psTemplateParams struct { @@ -69,6 +73,34 @@ type psTemplateParams struct { IsInfra bool } +// psJSONParams is used as a base structure for the psParams +// If template output is requested, psJSONParams will be converted to +// psTemplateParams. +// psJSONParams will be populated by data from libpod.Container, +// the members of the struct are the sama data types as their sources. +type psJSONParams struct { + ID string `json:"id"` + Image string `json:"image"` + ImageID string `json:"image_id"` + Command []string `json:"command"` + ExitCode int32 `json:"exitCode"` + Exited bool `json:"exited"` + CreatedAt time.Time `json:"createdAt"` + StartedAt time.Time `json:"startedAt"` + ExitedAt time.Time `json:"exitedAt"` + Status string `json:"status"` + PID int `json:"PID"` + Ports []ocicni.PortMapping `json:"ports"` + Size *shared.ContainerSize `json:"size,omitempty"` + Names string `json:"names"` + Labels fields.Set `json:"labels"` + Mounts []string `json:"mounts"` + ContainerRunning bool `json:"ctrRunning"` + Namespaces *shared.Namespace `json:"namespace,omitempty"` + Pod string `json:"pod,omitempty"` + IsInfra bool `json:"infra"` +} + // Type declaration and functions for sorting the PS output type psSorted []shared.PsContainerOutput @@ -411,6 +443,57 @@ func sortPsOutput(sortBy string, psOutput psSorted) (psSorted, error) { return psOutput, nil } +// getLabels converts the labels to a string of the form "key=value, key2=value2" +func formatLabels(labels map[string]string) string { + var arr []string + if len(labels) > 0 { + for key, val := range labels { + temp := key + "=" + val + arr = append(arr, temp) + } + return strings.Join(arr, ",") + } + return "" +} + +// getMounts converts the volumes mounted to a string of the form "mount1, mount2" +// it truncates it if noTrunc is false +func getMounts(mounts []string, noTrunc bool) string { + return strings.Join(getMountsArray(mounts, noTrunc), ",") +} + +func getMountsArray(mounts []string, noTrunc bool) []string { + var arr []string + if len(mounts) == 0 { + return mounts + } + for _, mount := range mounts { + splitArr := strings.Split(mount, ":") + if len(splitArr[0]) > mountTruncLength && !noTrunc { + arr = append(arr, splitArr[0][:mountTruncLength]+"...") + continue + } + arr = append(arr, splitArr[0]) + } + return arr +} + +// portsToString converts the ports used to a string of the from "port1, port2" +func portsToString(ports []ocicni.PortMapping) string { + var portDisplay []string + if len(ports) == 0 { + return "" + } + for _, v := range ports { + hostIP := v.HostIP + if hostIP == "" { + hostIP = "0.0.0.0" + } + portDisplay = append(portDisplay, fmt.Sprintf("%s:%d->%d/%s", hostIP, v.HostPort, v.ContainerPort, v.Protocol)) + } + return strings.Join(portDisplay, ", ") +} + func printFormat(format string, containers []shared.PsContainerOutput) error { // return immediately if no containers are present if len(containers) == 0 { diff --git a/cmd/podman/run_test.go b/cmd/podman/run_test.go index dea8eb7a2..0bf9cb4d9 100644 --- a/cmd/podman/run_test.go +++ b/cmd/podman/run_test.go @@ -18,6 +18,7 @@ import ( var ( sysInfo = sysinfo.New(true) + cmd = []string{"podman", "test", "alpine"} CLI *cliconfig.PodmanCommand ) diff --git a/cmd/podman/search.go b/cmd/podman/search.go index f72c82b43..e614887fc 100644 --- a/cmd/podman/search.go +++ b/cmd/podman/search.go @@ -12,6 +12,11 @@ import ( "github.com/spf13/cobra" ) +const ( + descriptionTruncLength = 44 + maxQueries = 25 +) + var ( searchCommand cliconfig.SearchValues searchDescription = `Search registries for a given image. Can search all the default registries or a specific registry. diff --git a/cmd/podman/shared/create.go b/cmd/podman/shared/create.go index 57e509c2a..cd82e4f1c 100644 --- a/cmd/podman/shared/create.go +++ b/cmd/podman/shared/create.go @@ -34,6 +34,11 @@ import ( "github.com/sirupsen/logrus" ) +// getContext returns a non-nil, empty context +func getContext() context.Context { + return context.TODO() +} + func CreateContainer(ctx context.Context, c *cliconfig.PodmanCommand, runtime *libpod.Runtime) (*libpod.Container, *cc.CreateConfig, error) { var ( healthCheck *manifest.Schema2HealthConfig diff --git a/cmd/podman/trust_set_show.go b/cmd/podman/trust_set_show.go index cd6c4897e..626d27aae 100644 --- a/cmd/podman/trust_set_show.go +++ b/cmd/podman/trust_set_show.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/containers/buildah/pkg/formats" + "github.com/containers/image/types" "github.com/containers/libpod/cmd/podman/cliconfig" "github.com/containers/libpod/cmd/podman/libpodruntime" "github.com/containers/libpod/libpod/image" @@ -236,6 +237,10 @@ func isValidTrustType(t string) bool { return false } +func getDefaultPolicyPath() string { + return trust.DefaultPolicyPath(&types.SystemContext{}) +} + func getPolicyJSON(policyContentStruct trust.PolicyContent, systemRegistriesDirPath string) (map[string]map[string]interface{}, error) { registryConfigs, err := trust.LoadAndMergeConfig(systemRegistriesDirPath) if err != nil { diff --git a/cmd/podman/utils.go b/cmd/podman/utils.go index 2327a943a..45d081512 100644 --- a/cmd/podman/utils.go +++ b/cmd/podman/utils.go @@ -7,6 +7,7 @@ import ( "os" gosignal "os/signal" + "github.com/containers/libpod/cmd/podman/cliconfig" "github.com/containers/libpod/libpod" "github.com/docker/docker/pkg/signal" "github.com/docker/docker/pkg/term" @@ -158,6 +159,47 @@ func (f *RawTtyFormatter) Format(entry *logrus.Entry) ([]byte, error) { return bytes, err } +// For pod commands that have a latest and all flag, getPodsFromContext gets +// pods the user specifies. If there's an error before getting pods, the pods slice +// will be empty and error will be not nil. If an error occured after, the pod slice +// will hold all of the successful pods, and error will hold the last error. +// The remaining errors will be logged. On success, pods will hold all pods and +// error will be nil. +func getPodsFromContext(c *cliconfig.PodmanCommand, r *libpod.Runtime) ([]*libpod.Pod, error) { + args := c.InputArgs + var pods []*libpod.Pod + var lastError error + var err error + + if c.Bool("all") { + pods, err = r.GetAllPods() + if err != nil { + return nil, errors.Wrapf(err, "unable to get running pods") + } + } + + if c.Bool("latest") { + pod, err := r.GetLatestPod() + if err != nil { + return nil, errors.Wrapf(err, "unable to get latest pod") + } + pods = append(pods, pod) + } + + for _, i := range args { + pod, err := r.LookupPod(i) + if err != nil { + if lastError != nil { + logrus.Errorf("%q", lastError) + } + lastError = errors.Wrapf(err, "unable to find pod %s", i) + continue + } + pods = append(pods, pod) + } + return pods, lastError +} + //printParallelOutput takes the map of parallel worker results and outputs them // to stdout func printParallelOutput(m map[string]error, errCount int) error { |