summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/podman/common.go6
-rw-r--r--cmd/podman/common_test.go15
-rw-r--r--cmd/podman/pod_ps.go1
-rw-r--r--cmd/podman/pod_stats.go14
-rw-r--r--cmd/podman/ps.go117
-rw-r--r--cmd/podman/run_test.go1
-rw-r--r--cmd/podman/search.go5
-rw-r--r--cmd/podman/shared/create.go5
-rw-r--r--cmd/podman/trust_set_show.go5
-rw-r--r--cmd/podman/utils.go42
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 {