summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/podman/cliconfig/config.go2
-rw-r--r--cmd/podman/errors_remote.go2
-rw-r--r--cmd/podman/generate_systemd.go8
-rw-r--r--cmd/podman/pod_stop.go5
-rw-r--r--cmd/podman/restart.go9
-rw-r--r--cmd/podman/service.go2
-rw-r--r--cmd/podman/shared/intermediate_varlink.go2
-rw-r--r--cmd/podman/stop.go13
-rw-r--r--cmd/podman/utils.go2
-rw-r--r--cmd/podman/varlink.go2
-rw-r--r--cmd/podman/varlink/generate.go3
-rw-r--r--cmd/podman/varlink/io.podman.varlink1398
-rw-r--r--cmd/podmanV2/Makefile2
-rw-r--r--cmd/podmanV2/common/inspect.go18
-rw-r--r--cmd/podmanV2/containers/export.go57
-rw-r--r--cmd/podmanV2/containers/inspect.go32
-rw-r--r--cmd/podmanV2/containers/restart.go11
-rw-r--r--cmd/podmanV2/containers/stop.go16
-rw-r--r--cmd/podmanV2/healthcheck/healthcheck.go33
-rw-r--r--cmd/podmanV2/healthcheck/run.go42
-rw-r--r--cmd/podmanV2/images/import.go87
-rw-r--r--cmd/podmanV2/images/inspect.go141
-rw-r--r--cmd/podmanV2/images/list.go2
-rw-r--r--cmd/podmanV2/images/load.go61
-rw-r--r--cmd/podmanV2/images/pull.go140
-rw-r--r--cmd/podmanV2/images/tag.go34
-rw-r--r--cmd/podmanV2/images/untag.go33
-rw-r--r--cmd/podmanV2/inspect.go62
-rw-r--r--cmd/podmanV2/main.go7
-rw-r--r--cmd/podmanV2/pods/pod.go30
-rw-r--r--cmd/podmanV2/pods/ps.go134
-rw-r--r--cmd/podmanV2/pods/stop.go7
-rw-r--r--cmd/podmanV2/registry/registry.go17
-rw-r--r--cmd/podmanV2/report/templates.go3
-rw-r--r--cmd/podmanV2/root.go5
-rw-r--r--cmd/podmanV2/system/system.go2
-rw-r--r--cmd/podmanV2/utils/alias.go24
37 files changed, 897 insertions, 1551 deletions
diff --git a/cmd/podman/cliconfig/config.go b/cmd/podman/cliconfig/config.go
index faf292ea0..99f389799 100644
--- a/cmd/podman/cliconfig/config.go
+++ b/cmd/podman/cliconfig/config.go
@@ -174,7 +174,7 @@ type GenerateSystemdValues struct {
New bool
Files bool
RestartPolicy string
- StopTimeout int
+ StopTimeout uint
}
type HistoryValues struct {
diff --git a/cmd/podman/errors_remote.go b/cmd/podman/errors_remote.go
index 378f9398f..4b543ccd5 100644
--- a/cmd/podman/errors_remote.go
+++ b/cmd/podman/errors_remote.go
@@ -8,8 +8,8 @@ import (
"os/exec"
"syscall"
- "github.com/containers/libpod/cmd/podman/varlink"
"github.com/containers/libpod/libpod/define"
+ iopodman "github.com/containers/libpod/pkg/varlink"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
diff --git a/cmd/podman/generate_systemd.go b/cmd/podman/generate_systemd.go
index a9775f9cb..fd0d13d78 100644
--- a/cmd/podman/generate_systemd.go
+++ b/cmd/podman/generate_systemd.go
@@ -43,9 +43,10 @@ func init() {
if !remoteclient {
flags.BoolVarP(&containerSystemdCommand.Files, "files", "f", false, "generate files instead of printing to stdout")
}
- flags.IntVarP(&containerSystemdCommand.StopTimeout, "timeout", "t", -1, "stop timeout override")
+ flags.UintVarP(&containerSystemdCommand.StopTimeout, "time", "t", defaultContainerConfig.Engine.StopTimeout, "stop timeout override")
flags.StringVar(&containerSystemdCommand.RestartPolicy, "restart-policy", "on-failure", "applicable systemd restart-policy")
flags.BoolVarP(&containerSystemdCommand.New, "new", "", false, "create a new container instead of starting an existing one")
+ flags.SetNormalizeFunc(aliasFlags)
}
func generateSystemdCmd(c *cliconfig.GenerateSystemdValues) error {
@@ -55,11 +56,6 @@ func generateSystemdCmd(c *cliconfig.GenerateSystemdValues) error {
}
defer runtime.DeferredShutdown(false)
- // User input stop timeout must be 0 or greater
- if c.Flag("timeout").Changed && c.StopTimeout < 0 {
- return errors.New("timeout value must be 0 or greater")
- }
-
unit, err := runtime.GenerateSystemd(c)
if err != nil {
return err
diff --git a/cmd/podman/pod_stop.go b/cmd/podman/pod_stop.go
index 7d3951ec4..395731551 100644
--- a/cmd/podman/pod_stop.go
+++ b/cmd/podman/pod_stop.go
@@ -31,7 +31,7 @@ var (
},
Example: `podman pod stop mywebserverpod
podman pod stop --latest
- podman pod stop --timeout 0 490eb 3557fb`,
+ podman pod stop --time 0 490eb 3557fb`,
}
)
@@ -43,7 +43,8 @@ func init() {
flags.BoolVarP(&podStopCommand.All, "all", "a", false, "Stop all running pods")
flags.BoolVarP(&podStopCommand.Ignore, "ignore", "i", false, "Ignore errors when a specified pod is missing")
flags.BoolVarP(&podStopCommand.Latest, "latest", "l", false, "Stop the latest pod podman is aware of")
- flags.UintVarP(&podStopCommand.Timeout, "timeout", "t", 0, "Seconds to wait for pod stop before killing the container")
+ flags.UintVarP(&podStopCommand.Timeout, "time", "t", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for pod stop before killing the container")
+ flags.SetNormalizeFunc(aliasFlags)
markFlagHiddenForRemoteClient("ignore", flags)
markFlagHiddenForRemoteClient("latest", flags)
}
diff --git a/cmd/podman/restart.go b/cmd/podman/restart.go
index a55f83c67..4ee043442 100644
--- a/cmd/podman/restart.go
+++ b/cmd/podman/restart.go
@@ -1,6 +1,8 @@
package main
import (
+ "fmt"
+
"github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/adapter"
@@ -10,9 +12,9 @@ import (
var (
restartCommand cliconfig.RestartValues
- restartDescription = `Restarts one or more running containers. The container ID or name can be used.
+ restartDescription = fmt.Sprintf(`Restarts one or more running containers. The container ID or name can be used.
- A timeout before forcibly stopping can be set, but defaults to 10 seconds.`
+ A timeout before forcibly stopping can be set, but defaults to %d seconds.`, defaultContainerConfig.Engine.StopTimeout)
_restartCommand = &cobra.Command{
Use: "restart [flags] CONTAINER [CONTAINER...]",
Short: "Restart one or more containers",
@@ -40,10 +42,9 @@ func init() {
flags.BoolVarP(&restartCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
flags.BoolVar(&restartCommand.Running, "running", false, "Restart only running containers when --all is used")
flags.UintVarP(&restartCommand.Timeout, "time", "t", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
- flags.UintVar(&restartCommand.Timeout, "timeout", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
- markFlagHidden(flags, "timeout")
markFlagHiddenForRemoteClient("latest", flags)
+ flags.SetNormalizeFunc(aliasFlags)
}
func restartCmd(c *cliconfig.RestartValues) error {
diff --git a/cmd/podman/service.go b/cmd/podman/service.go
index 7606e3009..bcb37eac5 100644
--- a/cmd/podman/service.go
+++ b/cmd/podman/service.go
@@ -12,13 +12,13 @@ import (
"github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/containers/libpod/cmd/podman/libpodruntime"
- iopodman "github.com/containers/libpod/cmd/podman/varlink"
"github.com/containers/libpod/libpod"
"github.com/containers/libpod/pkg/adapter"
api "github.com/containers/libpod/pkg/api/server"
"github.com/containers/libpod/pkg/rootless"
"github.com/containers/libpod/pkg/systemd"
"github.com/containers/libpod/pkg/util"
+ iopodman "github.com/containers/libpod/pkg/varlink"
"github.com/containers/libpod/pkg/varlinkapi"
"github.com/containers/libpod/version"
"github.com/pkg/errors"
diff --git a/cmd/podman/shared/intermediate_varlink.go b/cmd/podman/shared/intermediate_varlink.go
index d2b048025..82594fb40 100644
--- a/cmd/podman/shared/intermediate_varlink.go
+++ b/cmd/podman/shared/intermediate_varlink.go
@@ -4,8 +4,8 @@ package shared
import (
"github.com/containers/libpod/cmd/podman/cliconfig"
- "github.com/containers/libpod/cmd/podman/varlink"
"github.com/containers/libpod/pkg/rootless"
+ iopodman "github.com/containers/libpod/pkg/varlink"
"github.com/pkg/errors"
)
diff --git a/cmd/podman/stop.go b/cmd/podman/stop.go
index 383a1f61c..5033218e4 100644
--- a/cmd/podman/stop.go
+++ b/cmd/podman/stop.go
@@ -1,6 +1,8 @@
package main
import (
+ "fmt"
+
"github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/containers/libpod/pkg/adapter"
"github.com/opentracing/opentracing-go"
@@ -10,9 +12,9 @@ import (
var (
stopCommand cliconfig.StopValues
- stopDescription = `Stops one or more running containers. The container name or ID can be used.
+ stopDescription = fmt.Sprintf(`Stops one or more running containers. The container name or ID can be used.
- A timeout to forcibly stop the container can also be set but defaults to 10 seconds otherwise.`
+ A timeout to forcibly stop the container can also be set but defaults to %d seconds otherwise.`, defaultContainerConfig.Engine.StopTimeout)
_stopCommand = &cobra.Command{
Use: "stop [flags] CONTAINER [CONTAINER...]",
Short: "Stop one or more containers",
@@ -42,19 +44,14 @@ func init() {
flags.StringArrayVarP(&stopCommand.CIDFiles, "cidfile", "", nil, "Read the container ID from the file")
flags.BoolVarP(&stopCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
flags.UintVarP(&stopCommand.Timeout, "time", "t", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
- flags.UintVar(&stopCommand.Timeout, "timeout", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
- markFlagHidden(flags, "timeout")
markFlagHiddenForRemoteClient("latest", flags)
markFlagHiddenForRemoteClient("cidfile", flags)
markFlagHiddenForRemoteClient("ignore", flags)
+ flags.SetNormalizeFunc(aliasFlags)
}
// stopCmd stops a container or containers
func stopCmd(c *cliconfig.StopValues) error {
- if c.Flag("timeout").Changed && c.Flag("time").Changed {
- return errors.New("the --timeout and --time flags are mutually exclusive")
- }
-
if c.Bool("trace") {
span, _ := opentracing.StartSpanFromContext(Ctx, "stopCmd")
defer span.Finish()
diff --git a/cmd/podman/utils.go b/cmd/podman/utils.go
index 44e65b223..938a3f41e 100644
--- a/cmd/podman/utils.go
+++ b/cmd/podman/utils.go
@@ -63,6 +63,8 @@ func aliasFlags(f *pflag.FlagSet, name string) pflag.NormalizedName {
name = "health-timeout"
case "net":
name = "network"
+ case "timeout":
+ name = "time"
}
return pflag.NormalizedName(name)
}
diff --git a/cmd/podman/varlink.go b/cmd/podman/varlink.go
index 047d94fc2..20334ec96 100644
--- a/cmd/podman/varlink.go
+++ b/cmd/podman/varlink.go
@@ -10,10 +10,10 @@ import (
"github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/containers/libpod/cmd/podman/libpodruntime"
- iopodman "github.com/containers/libpod/cmd/podman/varlink"
"github.com/containers/libpod/pkg/adapter"
"github.com/containers/libpod/pkg/rootless"
"github.com/containers/libpod/pkg/util"
+ iopodman "github.com/containers/libpod/pkg/varlink"
"github.com/containers/libpod/pkg/varlinkapi"
"github.com/containers/libpod/version"
"github.com/pkg/errors"
diff --git a/cmd/podman/varlink/generate.go b/cmd/podman/varlink/generate.go
deleted file mode 100644
index 2fa2d8e23..000000000
--- a/cmd/podman/varlink/generate.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package iopodman
-
-//go:generate go run ../../../vendor/github.com/varlink/go/cmd/varlink-go-interface-generator/main.go io.podman.varlink
diff --git a/cmd/podman/varlink/io.podman.varlink b/cmd/podman/varlink/io.podman.varlink
deleted file mode 100644
index 0cb95ef97..000000000
--- a/cmd/podman/varlink/io.podman.varlink
+++ /dev/null
@@ -1,1398 +0,0 @@
-# Podman Service Interface and API description. The master version of this document can be found
-# in the [API.md](https://github.com/containers/libpod/blob/master/API.md) file in the upstream libpod repository.
-interface io.podman
-
-type Volume (
- name: string,
- labels: [string]string,
- mountPoint: string,
- driver: string,
- options: [string]string
-)
-
-type NotImplemented (
- comment: string
-)
-
-type StringResponse (
- message: string
-)
-
-type RemoveImageResponse (
- untagged: []string,
- deleted: string
-)
-
-type LogLine (
- device: string,
- parseLogType : string,
- time: string,
- msg: string,
- cid: string
-)
-
-# ContainerChanges describes the return struct for ListContainerChanges
-type ContainerChanges (
- changed: []string,
- added: []string,
- deleted: []string
-)
-
-type ImageSaveOptions (
- name: string,
- format: string,
- output: string,
- outputType: string,
- moreTags: []string,
- quiet: bool,
- compress: bool
-)
-
-type VolumeCreateOpts (
- volumeName: string,
- driver: string,
- labels: [string]string,
- options: [string]string
-)
-
-type VolumeRemoveOpts (
- volumes: []string,
- all: bool,
- force: bool
-)
-
-type Image (
- id: string,
- digest: string,
- digests: []string,
- parentId: string,
- repoTags: []string,
- repoDigests: []string,
- created: string, # as RFC3339
- size: int,
- virtualSize: int,
- containers: int,
- labels: [string]string,
- isParent: bool,
- topLayer: string,
- readOnly: bool,
- history: []string
-)
-
-# ImageHistory describes the returned structure from ImageHistory.
-type ImageHistory (
- id: string,
- created: string, # as RFC3339
- createdBy: string,
- tags: []string,
- size: int,
- comment: string
-)
-
-# Represents a single search result from SearchImages
-type ImageSearchResult (
- description: string,
- is_official: bool,
- is_automated: bool,
- registry: string,
- name: string,
- star_count: int
-)
-
-type ImageSearchFilter (
- is_official: ?bool,
- is_automated: ?bool,
- star_count: int
-)
-
-type AuthConfig (
- username: string,
- password: string
-)
-
-type KubePodService (
- pod: string,
- service: string
-)
-
-type Container (
- id: string,
- image: string,
- imageid: string,
- command: []string,
- createdat: string, # as RFC3339
- runningfor: string,
- status: string,
- ports: []ContainerPortMappings,
- rootfssize: int,
- rwsize: int,
- names: string,
- labels: [string]string,
- mounts: []ContainerMount,
- containerrunning: bool,
- namespaces: ContainerNameSpace
-)
-
-# ContainerStats is the return struct for the stats of a container
-type ContainerStats (
- id: string,
- name: string,
- cpu: float,
- cpu_nano: int,
- system_nano: int,
- mem_usage: int,
- mem_limit: int,
- mem_perc: float,
- net_input: int,
- net_output: int,
- block_output: int,
- block_input: int,
- pids: int
-)
-
-type PsOpts (
- all: bool,
- filters: ?[]string,
- last: ?int,
- latest: ?bool,
- noTrunc: ?bool,
- pod: ?bool,
- quiet: ?bool,
- size: ?bool,
- sort: ?string,
- sync: ?bool
-)
-
-type PsContainer (
- id: string,
- image: string,
- command: string,
- created: string,
- ports: string,
- names: string,
- isInfra: bool,
- status: string,
- state: string,
- pidNum: int,
- rootFsSize: int,
- rwSize: int,
- pod: string,
- createdAt: string,
- exitedAt: string,
- startedAt: string,
- labels: [string]string,
- nsPid: string,
- cgroup: string,
- ipc: string,
- mnt: string,
- net: string,
- pidNs: string,
- user: string,
- uts: string,
- mounts: string
-)
-
-# ContainerMount describes the struct for mounts in a container
-type ContainerMount (
- destination: string,
- type: string,
- source: string,
- options: []string
-)
-
-# ContainerPortMappings describes the struct for portmappings in an existing container
-type ContainerPortMappings (
- host_port: string,
- host_ip: string,
- protocol: string,
- container_port: string
-)
-
-# ContainerNamespace describes the namespace structure for an existing container
-type ContainerNameSpace (
- user: string,
- uts: string,
- pidns: string,
- pid: string,
- cgroup: string,
- net: string,
- mnt: string,
- ipc: string
-)
-
-# InfoDistribution describes the host's distribution
-type InfoDistribution (
- distribution: string,
- version: string
-)
-
-# InfoHost describes the host stats portion of PodmanInfo
-type InfoHost (
- buildah_version: string,
- distribution: InfoDistribution,
- mem_free: int,
- mem_total: int,
- swap_free: int,
- swap_total: int,
- arch: string,
- cpus: int,
- hostname: string,
- kernel: string,
- os: string,
- uptime: string,
- eventlogger: string
-)
-
-# InfoGraphStatus describes the detailed status of the storage driver
-type InfoGraphStatus (
- backing_filesystem: string,
- native_overlay_diff: string,
- supports_d_type: string
-)
-
-# InfoRegistry describes the host's registry information
-type InfoRegistry (
- search: []string,
- insecure: []string,
- blocked: []string
-)
-
-# InfoStore describes the host's storage informatoin
-type InfoStore (
- containers: int,
- images: int,
- graph_driver_name: string,
- graph_driver_options: string,
- graph_root: string,
- graph_status: InfoGraphStatus,
- run_root: string
-)
-
-# InfoPodman provides details on the Podman binary
-type InfoPodmanBinary (
- compiler: string,
- go_version: string,
- podman_version: string,
- git_commit: string
-)
-
-# PodmanInfo describes the Podman host and build
-type PodmanInfo (
- host: InfoHost,
- registries: InfoRegistry,
- store: InfoStore,
- podman: InfoPodmanBinary
-)
-
-# Sockets describes sockets location for a container
-type Sockets(
- container_id: string,
- io_socket: string,
- control_socket: string
-)
-
-# Create is an input structure for creating containers.
-# args[0] is the image name or id
-# args[1-] are the new commands if changed
-type Create (
- args: []string,
- addHost: ?[]string,
- annotation: ?[]string,
- attach: ?[]string,
- blkioWeight: ?string,
- blkioWeightDevice: ?[]string,
- capAdd: ?[]string,
- capDrop: ?[]string,
- cgroupParent: ?string,
- cidFile: ?string,
- conmonPidfile: ?string,
- command: ?[]string,
- cpuPeriod: ?int,
- cpuQuota: ?int,
- cpuRtPeriod: ?int,
- cpuRtRuntime: ?int,
- cpuShares: ?int,
- cpus: ?float,
- cpuSetCpus: ?string,
- cpuSetMems: ?string,
- detach: ?bool,
- detachKeys: ?string,
- device: ?[]string,
- deviceReadBps: ?[]string,
- deviceReadIops: ?[]string,
- deviceWriteBps: ?[]string,
- deviceWriteIops: ?[]string,
- dns: ?[]string,
- dnsOpt: ?[]string,
- dnsSearch: ?[]string,
- dnsServers: ?[]string,
- entrypoint: ?string,
- env: ?[]string,
- envFile: ?[]string,
- expose: ?[]string,
- gidmap: ?[]string,
- groupadd: ?[]string,
- healthcheckCommand: ?string,
- healthcheckInterval: ?string,
- healthcheckRetries: ?int,
- healthcheckStartPeriod: ?string,
- healthcheckTimeout:?string,
- hostname: ?string,
- imageVolume: ?string,
- init: ?bool,
- initPath: ?string,
- interactive: ?bool,
- ip: ?string,
- ipc: ?string,
- kernelMemory: ?string,
- label: ?[]string,
- labelFile: ?[]string,
- logDriver: ?string,
- logOpt: ?[]string,
- macAddress: ?string,
- memory: ?string,
- memoryReservation: ?string,
- memorySwap: ?string,
- memorySwappiness: ?int,
- name: ?string,
- network: ?string,
- noHosts: ?bool,
- oomKillDisable: ?bool,
- oomScoreAdj: ?int,
- overrideArch: ?string,
- overrideOS: ?string,
- pid: ?string,
- pidsLimit: ?int,
- pod: ?string,
- privileged: ?bool,
- publish: ?[]string,
- publishAll: ?bool,
- pull: ?string,
- quiet: ?bool,
- readonly: ?bool,
- readonlytmpfs: ?bool,
- restart: ?string,
- rm: ?bool,
- rootfs: ?bool,
- securityOpt: ?[]string,
- shmSize: ?string,
- stopSignal: ?string,
- stopTimeout: ?int,
- storageOpt: ?[]string,
- subuidname: ?string,
- subgidname: ?string,
- sysctl: ?[]string,
- systemd: ?string,
- tmpfs: ?[]string,
- tty: ?bool,
- uidmap: ?[]string,
- ulimit: ?[]string,
- user: ?string,
- userns: ?string,
- uts: ?string,
- mount: ?[]string,
- volume: ?[]string,
- volumesFrom: ?[]string,
- workDir: ?string
-)
-
-# BuildOptions are are used to describe describe physical attributes of the build
-type BuildOptions (
- addHosts: []string,
- cgroupParent: string,
- cpuPeriod: int,
- cpuQuota: int,
- cpuShares: int,
- cpusetCpus: string,
- cpusetMems: string,
- memory: int,
- memorySwap: int,
- shmSize: string,
- ulimit: []string,
- volume: []string
-)
-
-# BuildInfo is used to describe user input for building images
-type BuildInfo (
- architecture: string,
- addCapabilities: []string,
- additionalTags: []string,
- annotations: []string,
- buildArgs: [string]string,
- buildOptions: BuildOptions,
- cniConfigDir: string,
- cniPluginDir: string,
- compression: string,
- contextDir: string,
- defaultsMountFilePath: string,
- devices: []string,
- dockerfiles: []string,
- dropCapabilities: []string,
- err: string,
- forceRmIntermediateCtrs: bool,
- iidfile: string,
- label: []string,
- layers: bool,
- nocache: bool,
- os: string,
- out: string,
- output: string,
- outputFormat: string,
- pullPolicy: string,
- quiet: bool,
- remoteIntermediateCtrs: bool,
- reportWriter: string,
- runtimeArgs: []string,
- signBy: string,
- squash: bool,
- target: string,
- transientMounts: []string
-)
-
-# MoreResponse is a struct for when responses from varlink requires longer output
-type MoreResponse (
- logs: []string,
- id: string
-)
-
-# ListPodContainerInfo is a returned struct for describing containers
-# in a pod.
-type ListPodContainerInfo (
- name: string,
- id: string,
- status: string
-)
-
-# PodCreate is an input structure for creating pods.
-# It emulates options to podman pod create. The infraCommand and
-# infraImage options are currently NotSupported.
-type PodCreate (
- name: string,
- cgroupParent: string,
- labels: [string]string,
- share: []string,
- infra: bool,
- infraCommand: string,
- infraImage: string,
- publish: []string
-)
-
-# ListPodData is the returned struct for an individual pod
-type ListPodData (
- id: string,
- name: string,
- createdat: string,
- cgroup: string,
- status: string,
- labels: [string]string,
- numberofcontainers: string,
- containersinfo: []ListPodContainerInfo
-)
-
-type PodContainerErrorData (
- containerid: string,
- reason: string
-)
-
-# Runlabel describes the required input for container runlabel
-type Runlabel(
- image: string,
- authfile: string,
- display: bool,
- name: string,
- pull: bool,
- label: string,
- extraArgs: []string,
- opts: [string]string
-)
-
-# Event describes a libpod struct
-type Event(
- # TODO: make status and type a enum at some point?
- # id is the container, volume, pod, image ID
- id: string,
- # image is the image name where applicable
- image: string,
- # name is the name of the pod, container, image
- name: string,
- # status describes the event that happened (i.e. create, remove, ...)
- status: string,
- # time the event happened
- time: string,
- # type describes object the event happened with (image, container...)
- type: string
-)
-
-type DiffInfo(
- # path that is different
- path: string,
- # Add, Delete, Modify
- changeType: string
-)
-
-type ExecOpts(
- # container name or id
- name: string,
- # Create pseudo tty
- tty: bool,
- # privileged access in container
- privileged: bool,
- # command to execute in container
- cmd: []string,
- # user to use in container
- user: ?string,
- # workdir to run command in container
- workdir: ?string,
- # slice of keyword=value environment variables
- env: ?[]string,
- # string of detach keys
- detachKeys: ?string
-)
-
-# GetVersion returns version and build information of the podman service
-method GetVersion() -> (
- version: string,
- go_version: string,
- git_commit: string,
- built: string, # as RFC3339
- os_arch: string,
- remote_api_version: int
-)
-
-# Reset resets Podman back to its initial state.
-# Removes all Pods, Containers, Images and Volumes
-method Reset() -> ()
-
-# GetInfo returns a [PodmanInfo](#PodmanInfo) struct that describes podman and its host such as storage stats,
-# build information of Podman, and system-wide registries.
-method GetInfo() -> (info: PodmanInfo)
-
-# ListContainers returns information about all containers.
-# See also [GetContainer](#GetContainer).
-method ListContainers() -> (containers: []Container)
-
-method Ps(opts: PsOpts) -> (containers: []PsContainer)
-
-method GetContainersByStatus(status: []string) -> (containerS: []Container)
-
-method Top (nameOrID: string, descriptors: []string) -> (top: []string)
-
-# HealthCheckRun executes defined container's healthcheck command
-# and returns the container's health status.
-method HealthCheckRun (nameOrID: string) -> (healthCheckStatus: string)
-
-# GetContainer returns information about a single container. If a container
-# with the given id doesn't exist, a [ContainerNotFound](#ContainerNotFound)
-# error will be returned. See also [ListContainers](ListContainers) and
-# [InspectContainer](#InspectContainer).
-method GetContainer(id: string) -> (container: Container)
-
-# GetContainersByContext allows you to get a list of container ids depending on all, latest, or a list of
-# container names. The definition of latest container means the latest by creation date. In a multi-
-# user environment, results might differ from what you expect.
-method GetContainersByContext(all: bool, latest: bool, args: []string) -> (containers: []string)
-
-# CreateContainer creates a new container from an image. It uses a [Create](#Create) type for input.
-method CreateContainer(create: Create) -> (container: string)
-
-# InspectContainer data takes a name or ID of a container returns the inspection
-# data in string format. You can then serialize the string into JSON. A [ContainerNotFound](#ContainerNotFound)
-# error will be returned if the container cannot be found. See also [InspectImage](#InspectImage).
-method InspectContainer(name: string) -> (container: string)
-
-# ListContainerProcesses takes a name or ID of a container and returns the processes
-# running inside the container as array of strings. It will accept an array of string
-# arguments that represent ps options. If the container cannot be found, a [ContainerNotFound](#ContainerNotFound)
-# error will be returned.
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.ListContainerProcesses '{"name": "135d71b9495f", "opts": []}'
-# {
-# "container": [
-# " UID PID PPID C STIME TTY TIME CMD",
-# " 0 21220 21210 0 09:05 pts/0 00:00:00 /bin/sh",
-# " 0 21232 21220 0 09:05 pts/0 00:00:00 top",
-# " 0 21284 21220 0 09:05 pts/0 00:00:00 vi /etc/hosts"
-# ]
-# }
-# ~~~
-method ListContainerProcesses(name: string, opts: []string) -> (container: []string)
-
-# GetContainerLogs takes a name or ID of a container and returns the logs of that container.
-# If the container cannot be found, a [ContainerNotFound](#ContainerNotFound) error will be returned.
-# The container logs are returned as an array of strings. GetContainerLogs will honor the streaming
-# capability of varlink if the client invokes it.
-method GetContainerLogs(name: string) -> (container: []string)
-
-method GetContainersLogs(names: []string, follow: bool, latest: bool, since: string, tail: int, timestamps: bool) -> (log: LogLine)
-
-# ListContainerChanges takes a name or ID of a container and returns changes between the container and
-# its base image. It returns a struct of changed, deleted, and added path names.
-method ListContainerChanges(name: string) -> (container: ContainerChanges)
-
-# ExportContainer creates an image from a container. It takes the name or ID of a container and a
-# path representing the target tarfile. If the container cannot be found, a [ContainerNotFound](#ContainerNotFound)
-# error will be returned.
-# The return value is the written tarfile.
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.ExportContainer '{"name": "flamboyant_payne", "path": "/tmp/payne.tar" }'
-# {
-# "tarfile": "/tmp/payne.tar"
-# }
-# ~~~
-method ExportContainer(name: string, path: string) -> (tarfile: string)
-
-# GetContainerStats takes the name or ID of a container and returns a single ContainerStats structure which
-# contains attributes like memory and cpu usage. If the container cannot be found, a
-# [ContainerNotFound](#ContainerNotFound) error will be returned. If the container is not running, a [NoContainerRunning](#NoContainerRunning)
-# error will be returned
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.GetContainerStats '{"name": "c33e4164f384"}'
-# {
-# "container": {
-# "block_input": 0,
-# "block_output": 0,
-# "cpu": 2.571123918839990154678e-08,
-# "cpu_nano": 49037378,
-# "id": "c33e4164f384aa9d979072a63319d66b74fd7a128be71fa68ede24f33ec6cfee",
-# "mem_limit": 33080606720,
-# "mem_perc": 2.166828456524753747370e-03,
-# "mem_usage": 716800,
-# "name": "competent_wozniak",
-# "net_input": 768,
-# "net_output": 5910,
-# "pids": 1,
-# "system_nano": 10000000
-# }
-# }
-# ~~~
-method GetContainerStats(name: string) -> (container: ContainerStats)
-
-# GetContainerStatsWithHistory takes a previous set of container statistics and uses libpod functions
-# to calculate the containers statistics based on current and previous measurements.
-method GetContainerStatsWithHistory(previousStats: ContainerStats) -> (container: ContainerStats)
-
-# This method has not be implemented yet.
-# method ResizeContainerTty() -> (notimplemented: NotImplemented)
-
-# StartContainer starts a created or stopped container. It takes the name or ID of container. It returns
-# the container ID once started. If the container cannot be found, a [ContainerNotFound](#ContainerNotFound)
-# error will be returned. See also [CreateContainer](#CreateContainer).
-method StartContainer(name: string) -> (container: string)
-
-# StopContainer stops a container given a timeout. It takes the name or ID of a container as well as a
-# timeout value. The timeout value the time before a forcible stop to the container is applied. It
-# returns the container ID once stopped. If the container cannot be found, a [ContainerNotFound](#ContainerNotFound)
-# error will be returned instead. See also [KillContainer](KillContainer).
-# #### Error
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.StopContainer '{"name": "135d71b9495f", "timeout": 5}'
-# {
-# "container": "135d71b9495f7c3967f536edad57750bfdb569336cd107d8aabab45565ffcfb6"
-# }
-# ~~~
-method StopContainer(name: string, timeout: int) -> (container: string)
-
-# InitContainer initializes the given container. It accepts a container name or
-# ID, and will initialize the container matching that ID if possible, and error
-# if not. Containers can only be initialized when they are in the Created or
-# Exited states. Initialization prepares a container to be started, but does not
-# start the container. It is intended to be used to debug a container's state
-# prior to starting it.
-method InitContainer(name: string) -> (container: string)
-
-# RestartContainer will restart a running container given a container name or ID and timeout value. The timeout
-# value is the time before a forcible stop is used to stop the container. If the container cannot be found by
-# name or ID, a [ContainerNotFound](#ContainerNotFound) error will be returned; otherwise, the ID of the
-# container will be returned.
-method RestartContainer(name: string, timeout: int) -> (container: string)
-
-# KillContainer takes the name or ID of a container as well as a signal to be applied to the container. Once the
-# container has been killed, the container's ID is returned. If the container cannot be found, a
-# [ContainerNotFound](#ContainerNotFound) error is returned. See also [StopContainer](StopContainer).
-method KillContainer(name: string, signal: int) -> (container: string)
-
-# This method has not be implemented yet.
-# method UpdateContainer() -> (notimplemented: NotImplemented)
-
-# This method has not be implemented yet.
-# method RenameContainer() -> (notimplemented: NotImplemented)
-
-# PauseContainer takes the name or ID of container and pauses it. If the container cannot be found,
-# a [ContainerNotFound](#ContainerNotFound) error will be returned; otherwise the ID of the container is returned.
-# See also [UnpauseContainer](#UnpauseContainer).
-method PauseContainer(name: string) -> (container: string)
-
-# UnpauseContainer takes the name or ID of container and unpauses a paused container. If the container cannot be
-# found, a [ContainerNotFound](#ContainerNotFound) error will be returned; otherwise the ID of the container is returned.
-# See also [PauseContainer](#PauseContainer).
-method UnpauseContainer(name: string) -> (container: string)
-
-# Attach takes the name or ID of a container and sets up the ability to remotely attach to its console. The start
-# bool is whether you wish to start the container in question first.
-method Attach(name: string, detachKeys: string, start: bool) -> ()
-
-method AttachControl(name: string) -> ()
-
-# GetAttachSockets takes the name or ID of an existing container. It returns file paths for two sockets needed
-# to properly communicate with a container. The first is the actual I/O socket that the container uses. The
-# second is a "control" socket where things like resizing the TTY events are sent. If the container cannot be
-# found, a [ContainerNotFound](#ContainerNotFound) error will be returned.
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/io.podman/io.podman.GetAttachSockets '{"name": "b7624e775431219161"}'
-# {
-# "sockets": {
-# "container_id": "b7624e7754312191613245ce1a46844abee60025818fe3c3f3203435623a1eca",
-# "control_socket": "/var/lib/containers/storage/overlay-containers/b7624e7754312191613245ce1a46844abee60025818fe3c3f3203435623a1eca/userdata/ctl",
-# "io_socket": "/var/run/libpod/socket/b7624e7754312191613245ce1a46844abee60025818fe3c3f3203435623a1eca/attach"
-# }
-# }
-# ~~~
-method GetAttachSockets(name: string) -> (sockets: Sockets)
-
-# WaitContainer takes the name or ID of a container and waits the given interval in milliseconds until the container
-# stops. Upon stopping, the return code of the container is returned. If the container container cannot be found by ID
-# or name, a [ContainerNotFound](#ContainerNotFound) error is returned.
-method WaitContainer(name: string, interval: int) -> (exitcode: int)
-
-# RemoveContainer requires the name or ID of a container as well as a boolean that
-# indicates whether a container should be forcefully removed (e.g., by stopping it), and a boolean
-# indicating whether to remove builtin volumes. Upon successful removal of the
-# container, its ID is returned. If the
-# container cannot be found by name or ID, a [ContainerNotFound](#ContainerNotFound) error will be returned.
-# See also [EvictContainer](EvictContainer).
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.RemoveContainer '{"name": "62f4fd98cb57"}'
-# {
-# "container": "62f4fd98cb57f529831e8f90610e54bba74bd6f02920ffb485e15376ed365c20"
-# }
-# ~~~
-method RemoveContainer(name: string, force: bool, removeVolumes: bool) -> (container: string)
-
-# EvictContainer requires the name or ID of a container as well as a boolean that
-# indicates to remove builtin volumes. Upon successful eviction of the container,
-# its ID is returned. If the container cannot be found by name or ID,
-# a [ContainerNotFound](#ContainerNotFound) error will be returned.
-# See also [RemoveContainer](RemoveContainer).
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.EvictContainer '{"name": "62f4fd98cb57"}'
-# {
-# "container": "62f4fd98cb57f529831e8f90610e54bba74bd6f02920ffb485e15376ed365c20"
-# }
-# ~~~
-method EvictContainer(name: string, removeVolumes: bool) -> (container: string)
-
-# DeleteStoppedContainers will delete all containers that are not running. It will return a list the deleted
-# container IDs. See also [RemoveContainer](RemoveContainer).
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.DeleteStoppedContainers
-# {
-# "containers": [
-# "451410b931d00def8aa9b4f8084e4d4a39e5e04ea61f358cf53a5cf95afcdcee",
-# "8b60f754a3e01389494a9581ade97d35c2765b6e2f19acd2d3040c82a32d1bc0",
-# "cf2e99d4d3cad6073df199ed32bbe64b124f3e1aba6d78821aa8460e70d30084",
-# "db901a329587312366e5ecff583d08f0875b4b79294322df67d90fc6eed08fc1"
-# ]
-# }
-# ~~~
-method DeleteStoppedContainers() -> (containers: []string)
-
-# ListImages returns information about the images that are currently in storage.
-# See also [InspectImage](#InspectImage).
-method ListImages() -> (images: []Image)
-
-# ListImagesWithFilters returns information about the images that are currently in storage
-# after one or more filters has been applied.
-# See also [InspectImage](#InspectImage).
-method ListImagesWithFilters(filters: []string) -> (images: []Image)
-
-# GetImage returns information about a single image in storage.
-# If the image caGetImage returns be found, [ImageNotFound](#ImageNotFound) will be returned.
-method GetImage(id: string) -> (image: Image)
-
-# BuildImage takes a [BuildInfo](#BuildInfo) structure and builds an image. At a minimum, you must provide the
-# contextDir tarball path, the 'dockerfiles' path, and 'output' option in the BuildInfo structure. The 'output'
-# options is the name of the of the resulting build. It will return a [MoreResponse](#MoreResponse) structure
-# that contains the build logs and resulting image ID.
-# #### Example
-# ~~~
-# $ sudo varlink call -m unix:///run/podman/io.podman/io.podman.BuildImage '{"build":{"contextDir":"/tmp/t/context.tar","dockerfiles":["Dockerfile"], "output":"foobar"}}'
-# {
-# "image": {
-# "id": "",
-# "logs": [
-# "STEP 1: FROM alpine\n"
-# ]
-# }
-# }
-# {
-# "image": {
-# "id": "",
-# "logs": [
-# "STEP 2: COMMIT foobar\n"
-# ]
-# }
-# }
-# {
-# "image": {
-# "id": "",
-# "logs": [
-# "b7b28af77ffec6054d13378df4fdf02725830086c7444d9c278af25312aa39b9\n"
-# ]
-# }
-# }
-# {
-# "image": {
-# "id": "b7b28af77ffec6054d13378df4fdf02725830086c7444d9c278af25312aa39b9",
-# "logs": []
-# }
-# }
-# ~~~
-method BuildImage(build: BuildInfo) -> (image: MoreResponse)
-
-# This function is not implemented yet.
-# method CreateImage() -> (notimplemented: NotImplemented)
-
-# InspectImage takes the name or ID of an image and returns a string representation of data associated with the
-#image. You must serialize the string into JSON to use it further. An [ImageNotFound](#ImageNotFound) error will
-# be returned if the image cannot be found.
-method InspectImage(name: string) -> (image: string)
-
-# HistoryImage takes the name or ID of an image and returns information about its history and layers. The returned
-# history is in the form of an array of ImageHistory structures. If the image cannot be found, an
-# [ImageNotFound](#ImageNotFound) error is returned.
-method HistoryImage(name: string) -> (history: []ImageHistory)
-
-# PushImage takes two input arguments: the name or ID of an image, the fully-qualified destination name of the image,
-# It will return an [ImageNotFound](#ImageNotFound) error if
-# the image cannot be found in local storage; otherwise it will return a [MoreResponse](#MoreResponse)
-method PushImage(name: string, tag: string, compress: bool, format: string, removeSignatures: bool, signBy: string) -> (reply: MoreResponse)
-
-# TagImage takes the name or ID of an image in local storage as well as the desired tag name. If the image cannot
-# be found, an [ImageNotFound](#ImageNotFound) error will be returned; otherwise, the ID of the image is returned on success.
-method TagImage(name: string, tagged: string) -> (image: string)
-
-# UntagImage takes the name or ID of an image in local storage as well as the
-# tag name to be removed. If the image cannot be found, an
-# [ImageNotFound](#ImageNotFound) error will be returned; otherwise, the ID of
-# the image is returned on success.
-method UntagImage(name: string, tag: string) -> (image: string)
-
-# RemoveImage takes the name or ID of an image as well as a boolean that determines if containers using that image
-# should be deleted. If the image cannot be found, an [ImageNotFound](#ImageNotFound) error will be returned. The
-# ID of the removed image is returned when complete. See also [DeleteUnusedImages](DeleteUnusedImages).
-# #### Example
-# ~~~
-# varlink call -m unix:/run/podman/io.podman/io.podman.RemoveImage '{"name": "registry.fedoraproject.org/fedora", "force": true}'
-# {
-# "image": "426866d6fa419873f97e5cbd320eeb22778244c1dfffa01c944db3114f55772e"
-# }
-# ~~~
-method RemoveImage(name: string, force: bool) -> (image: string)
-
-# RemoveImageWithResponse takes the name or ID of an image as well as a boolean that determines if containers using that image
-# should be deleted. If the image cannot be found, an [ImageNotFound](#ImageNotFound) error will be returned. The response is
-# in the form of a RemoveImageResponse .
-method RemoveImageWithResponse(name: string, force: bool) -> (response: RemoveImageResponse)
-
-# SearchImages searches available registries for images that contain the
-# contents of "query" in their name. If "limit" is given, limits the amount of
-# search results per registry.
-method SearchImages(query: string, limit: ?int, filter: ImageSearchFilter) -> (results: []ImageSearchResult)
-
-# DeleteUnusedImages deletes any images not associated with a container. The IDs of the deleted images are returned
-# in a string array.
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.DeleteUnusedImages
-# {
-# "images": [
-# "166ea6588079559c724c15223f52927f514f73dd5c5cf2ae2d143e3b2e6e9b52",
-# "da86e6ba6ca197bf6bc5e9d900febd906b133eaa4750e6bed647b0fbe50ed43e",
-# "3ef70f7291f47dfe2b82931a993e16f5a44a0e7a68034c3e0e086d77f5829adc",
-# "59788edf1f3e78cd0ebe6ce1446e9d10788225db3dedcfd1a59f764bad2b2690"
-# ]
-# }
-# ~~~
-method DeleteUnusedImages() -> (images: []string)
-
-# Commit, creates an image from an existing container. It requires the name or
-# ID of the container as well as the resulting image name. Optionally, you can define an author and message
-# to be added to the resulting image. You can also define changes to the resulting image for the following
-# attributes: _CMD, ENTRYPOINT, ENV, EXPOSE, LABEL, ONBUILD, STOPSIGNAL, USER, VOLUME, and WORKDIR_. To pause the
-# container while it is being committed, pass a _true_ bool for the pause argument. If the container cannot
-# be found by the ID or name provided, a (ContainerNotFound)[#ContainerNotFound] error will be returned; otherwise,
-# the resulting image's ID will be returned as a string inside a MoreResponse.
-method Commit(name: string, image_name: string, changes: []string, author: string, message: string, pause: bool, manifestType: string) -> (reply: MoreResponse)
-
-# ImportImage imports an image from a source (like tarball) into local storage. The image can have additional
-# descriptions added to it using the message and changes options. See also [ExportImage](ExportImage).
-method ImportImage(source: string, reference: string, message: string, changes: []string, delete: bool) -> (image: string)
-
-# ExportImage takes the name or ID of an image and exports it to a destination like a tarball. There is also
-# a boolean option to force compression. It also takes in a string array of tags to be able to save multiple
-# tags of the same image to a tarball (each tag should be of the form <image>:<tag>). Upon completion, the ID
-# of the image is returned. If the image cannot be found in local storage, an [ImageNotFound](#ImageNotFound)
-# error will be returned. See also [ImportImage](ImportImage).
-method ExportImage(name: string, destination: string, compress: bool, tags: []string) -> (image: string)
-
-# PullImage pulls an image from a repository to local storage. After a successful pull, the image id and logs
-# are returned as a [MoreResponse](#MoreResponse). This connection also will handle a WantsMores request to send
-# status as it occurs.
-method PullImage(name: string, creds: AuthConfig) -> (reply: MoreResponse)
-
-# CreatePod creates a new empty pod. It uses a [PodCreate](#PodCreate) type for input.
-# On success, the ID of the newly created pod will be returned.
-# #### Example
-# ~~~
-# $ varlink call unix:/run/podman/io.podman/io.podman.CreatePod '{"create": {"name": "test"}}'
-# {
-# "pod": "b05dee7bd4ccfee688099fe1588a7a898d6ddd6897de9251d4671c9b0feacb2a"
-# }
-#
-# $ varlink call unix:/run/podman/io.podman/io.podman.CreatePod '{"create": {"infra": true, "share": ["ipc", "net", "uts"]}}'
-# {
-# "pod": "d7697449a8035f613c1a8891286502aca68fff7d5d49a85279b3bda229af3b28"
-# }
-# ~~~
-method CreatePod(create: PodCreate) -> (pod: string)
-
-# ListPods returns a list of pods in no particular order. They are
-# returned as an array of ListPodData structs. See also [GetPod](#GetPod).
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.ListPods
-# {
-# "pods": [
-# {
-# "cgroup": "machine.slice",
-# "containersinfo": [
-# {
-# "id": "00c130a45de0411f109f1a0cfea2e298df71db20fa939de5cab8b2160a36be45",
-# "name": "1840835294cf-infra",
-# "status": "running"
-# },
-# {
-# "id": "49a5cce72093a5ca47c6de86f10ad7bb36391e2d89cef765f807e460865a0ec6",
-# "name": "upbeat_murdock",
-# "status": "running"
-# }
-# ],
-# "createdat": "2018-12-07 13:10:15.014139258 -0600 CST",
-# "id": "1840835294cf076a822e4e12ba4152411f131bd869e7f6a4e8b16df9b0ea5c7f",
-# "name": "foobar",
-# "numberofcontainers": "2",
-# "status": "Running"
-# },
-# {
-# "cgroup": "machine.slice",
-# "containersinfo": [
-# {
-# "id": "1ca4b7bbba14a75ba00072d4b705c77f3df87db0109afaa44d50cb37c04a477e",
-# "name": "784306f655c6-infra",
-# "status": "running"
-# }
-# ],
-# "createdat": "2018-12-07 13:09:57.105112457 -0600 CST",
-# "id": "784306f655c6200aea321dd430ba685e9b2cc1f7d7528a72f3ff74ffb29485a2",
-# "name": "nostalgic_pike",
-# "numberofcontainers": "1",
-# "status": "Running"
-# }
-# ]
-# }
-# ~~~
-method ListPods() -> (pods: []ListPodData)
-
-# GetPod takes a name or ID of a pod and returns single [ListPodData](#ListPodData)
-# structure. A [PodNotFound](#PodNotFound) error will be returned if the pod cannot be found.
-# See also [ListPods](ListPods).
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.GetPod '{"name": "foobar"}'
-# {
-# "pod": {
-# "cgroup": "machine.slice",
-# "containersinfo": [
-# {
-# "id": "00c130a45de0411f109f1a0cfea2e298df71db20fa939de5cab8b2160a36be45",
-# "name": "1840835294cf-infra",
-# "status": "running"
-# },
-# {
-# "id": "49a5cce72093a5ca47c6de86f10ad7bb36391e2d89cef765f807e460865a0ec6",
-# "name": "upbeat_murdock",
-# "status": "running"
-# }
-# ],
-# "createdat": "2018-12-07 13:10:15.014139258 -0600 CST",
-# "id": "1840835294cf076a822e4e12ba4152411f131bd869e7f6a4e8b16df9b0ea5c7f",
-# "name": "foobar",
-# "numberofcontainers": "2",
-# "status": "Running"
-# }
-# }
-# ~~~
-method GetPod(name: string) -> (pod: ListPodData)
-
-# InspectPod takes the name or ID of an image and returns a string representation of data associated with the
-# pod. You must serialize the string into JSON to use it further. A [PodNotFound](#PodNotFound) error will
-# be returned if the pod cannot be found.
-method InspectPod(name: string) -> (pod: string)
-
-# StartPod starts containers in a pod. It takes the name or ID of pod. If the pod cannot be found, a [PodNotFound](#PodNotFound)
-# error will be returned. Containers in a pod are started independently. If there is an error starting one container, the ID of those containers
-# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
-# If the pod was started with no errors, the pod ID is returned.
-# See also [CreatePod](#CreatePod).
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.StartPod '{"name": "135d71b9495f"}'
-# {
-# "pod": "135d71b9495f7c3967f536edad57750bfdb569336cd107d8aabab45565ffcfb6",
-# }
-# ~~~
-method StartPod(name: string) -> (pod: string)
-
-# StopPod stops containers in a pod. It takes the name or ID of a pod and a timeout.
-# If the pod cannot be found, a [PodNotFound](#PodNotFound) error will be returned instead.
-# Containers in a pod are stopped independently. If there is an error stopping one container, the ID of those containers
-# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
-# If the pod was stopped with no errors, the pod ID is returned.
-# See also [KillPod](KillPod).
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.StopPod '{"name": "135d71b9495f"}'
-# {
-# "pod": "135d71b9495f7c3967f536edad57750bfdb569336cd107d8aabab45565ffcfb6"
-# }
-# ~~~
-method StopPod(name: string, timeout: int) -> (pod: string)
-
-# RestartPod will restart containers in a pod given a pod name or ID. Containers in
-# the pod that are running will be stopped, then all stopped containers will be run.
-# If the pod cannot be found by name or ID, a [PodNotFound](#PodNotFound) error will be returned.
-# Containers in a pod are restarted independently. If there is an error restarting one container, the ID of those containers
-# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
-# If the pod was restarted with no errors, the pod ID is returned.
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.RestartPod '{"name": "135d71b9495f"}'
-# {
-# "pod": "135d71b9495f7c3967f536edad57750bfdb569336cd107d8aabab45565ffcfb6"
-# }
-# ~~~
-method RestartPod(name: string) -> (pod: string)
-
-# KillPod takes the name or ID of a pod as well as a signal to be applied to the pod. If the pod cannot be found, a
-# [PodNotFound](#PodNotFound) error is returned.
-# Containers in a pod are killed independently. If there is an error killing one container, the ID of those containers
-# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
-# If the pod was killed with no errors, the pod ID is returned.
-# See also [StopPod](StopPod).
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.KillPod '{"name": "foobar", "signal": 15}'
-# {
-# "pod": "1840835294cf076a822e4e12ba4152411f131bd869e7f6a4e8b16df9b0ea5c7f"
-# }
-# ~~~
-method KillPod(name: string, signal: int) -> (pod: string)
-
-# PausePod takes the name or ID of a pod and pauses the running containers associated with it. If the pod cannot be found,
-# a [PodNotFound](#PodNotFound) error will be returned.
-# Containers in a pod are paused independently. If there is an error pausing one container, the ID of those containers
-# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
-# If the pod was paused with no errors, the pod ID is returned.
-# See also [UnpausePod](#UnpausePod).
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.PausePod '{"name": "foobar"}'
-# {
-# "pod": "1840835294cf076a822e4e12ba4152411f131bd869e7f6a4e8b16df9b0ea5c7f"
-# }
-# ~~~
-method PausePod(name: string) -> (pod: string)
-
-# UnpausePod takes the name or ID of a pod and unpauses the paused containers associated with it. If the pod cannot be
-# found, a [PodNotFound](#PodNotFound) error will be returned.
-# Containers in a pod are unpaused independently. If there is an error unpausing one container, the ID of those containers
-# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
-# If the pod was unpaused with no errors, the pod ID is returned.
-# See also [PausePod](#PausePod).
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.UnpausePod '{"name": "foobar"}'
-# {
-# "pod": "1840835294cf076a822e4e12ba4152411f131bd869e7f6a4e8b16df9b0ea5c7f"
-# }
-# ~~~
-method UnpausePod(name: string) -> (pod: string)
-
-# RemovePod takes the name or ID of a pod as well a boolean representing whether a running
-# container in the pod can be stopped and removed. If a pod has containers associated with it, and force is not true,
-# an error will occur.
-# If the pod cannot be found by name or ID, a [PodNotFound](#PodNotFound) error will be returned.
-# Containers in a pod are removed independently. If there is an error removing any container, the ID of those containers
-# will be returned in a list, along with the ID of the pod in a [PodContainerError](#PodContainerError).
-# If the pod was removed with no errors, the pod ID is returned.
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.RemovePod '{"name": "62f4fd98cb57", "force": "true"}'
-# {
-# "pod": "62f4fd98cb57f529831e8f90610e54bba74bd6f02920ffb485e15376ed365c20"
-# }
-# ~~~
-method RemovePod(name: string, force: bool) -> (pod: string)
-
-# This method has not be implemented yet.
-# method WaitPod() -> (notimplemented: NotImplemented)
-
-method TopPod(pod: string, latest: bool, descriptors: []string) -> (stats: []string)
-
-# GetPodStats takes the name or ID of a pod and returns a pod name and slice of ContainerStats structure which
-# contains attributes like memory and cpu usage. If the pod cannot be found, a [PodNotFound](#PodNotFound)
-# error will be returned. If the pod has no running containers associated with it, a [NoContainerRunning](#NoContainerRunning)
-# error will be returned.
-# #### Example
-# ~~~
-# $ varlink call unix:/run/podman/io.podman/io.podman.GetPodStats '{"name": "7f62b508b6f12b11d8fe02e"}'
-# {
-# "containers": [
-# {
-# "block_input": 0,
-# "block_output": 0,
-# "cpu": 2.833470544016107524276e-08,
-# "cpu_nano": 54363072,
-# "id": "a64b51f805121fe2c5a3dc5112eb61d6ed139e3d1c99110360d08b58d48e4a93",
-# "mem_limit": 12276146176,
-# "mem_perc": 7.974359265237864966003e-03,
-# "mem_usage": 978944,
-# "name": "quirky_heisenberg",
-# "net_input": 866,
-# "net_output": 7388,
-# "pids": 1,
-# "system_nano": 20000000
-# }
-# ],
-# "pod": "7f62b508b6f12b11d8fe02e0db4de6b9e43a7d7699b33a4fc0d574f6e82b4ebd"
-# }
-# ~~~
-method GetPodStats(name: string) -> (pod: string, containers: []ContainerStats)
-
-# GetPodsByStatus searches for pods whose status is included in statuses
-method GetPodsByStatus(statuses: []string) -> (pods: []string)
-
-# ImageExists talks a full or partial image ID or name and returns an int as to whether
-# the image exists in local storage. An int result of 0 means the image does exist in
-# local storage; whereas 1 indicates the image does not exists in local storage.
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.ImageExists '{"name": "imageddoesntexist"}'
-# {
-# "exists": 1
-# }
-# ~~~
-method ImageExists(name: string) -> (exists: int)
-
-# ImageTree returns the image tree for the provided image name or ID
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.ImageTree '{"name": "alpine"}'
-# {
-# "tree": "Image ID: e7d92cdc71fe\nTags: [docker.io/library/alpine:latest]\nSize: 5.861MB\nImage Layers\n└── ID: 5216338b40a7 Size: 5.857MB Top Layer of: [docker.io/library/alpine:latest]\n"
-# }
-# ~~~
-method ImageTree(name: string, whatRequires: bool) -> (tree: string)
-
-# ContainerExists takes a full or partial container ID or name and returns an int as to
-# whether the container exists in local storage. A result of 0 means the container does
-# exists; whereas a result of 1 means it could not be found.
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.ContainerExists '{"name": "flamboyant_payne"}'{
-# "exists": 0
-# }
-# ~~~
-method ContainerExists(name: string) -> (exists: int)
-
-# ContainerCheckPoint performs a checkpopint on a container by its name or full/partial container
-# ID. On successful checkpoint, the id of the checkpointed container is returned.
-method ContainerCheckpoint(name: string, keep: bool, leaveRunning: bool, tcpEstablished: bool) -> (id: string)
-
-# ContainerRestore restores a container that has been checkpointed. The container to be restored can
-# be identified by its name or full/partial container ID. A successful restore will result in the return
-# of the container's ID.
-method ContainerRestore(name: string, keep: bool, tcpEstablished: bool) -> (id: string)
-
-# ContainerRunlabel runs executes a command as described by a given container image label.
-method ContainerRunlabel(runlabel: Runlabel) -> ()
-
-# ExecContainer executes a command in the given container.
-method ExecContainer(opts: ExecOpts) -> ()
-
-# ListContainerMounts gathers all the mounted container mount points and returns them as an array
-# of strings
-# #### Example
-# ~~~
-# $ varlink call unix:/run/podman/io.podman/io.podman.ListContainerMounts
-# {
-# "mounts": {
-# "04e4c255269ed2545e7f8bd1395a75f7949c50c223415c00c1d54bfa20f3b3d9": "/var/lib/containers/storage/overlay/a078925828f57e20467ca31cfca8a849210d21ec7e5757332b72b6924f441c17/merged",
-# "1d58c319f9e881a644a5122ff84419dccf6d138f744469281446ab243ef38924": "/var/lib/containers/storage/overlay/948fcf93f8cb932f0f03fd52e3180a58627d547192ffe3b88e0013b98ddcd0d2/merged"
-# }
-# }
-# ~~~
-method ListContainerMounts() -> (mounts: [string]string)
-
-# MountContainer mounts a container by name or full/partial ID. Upon a successful mount, the destination
-# mount is returned as a string.
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.MountContainer '{"name": "jolly_shannon"}'{
-# "path": "/var/lib/containers/storage/overlay/419eeb04e783ea159149ced67d9fcfc15211084d65e894792a96bedfae0470ca/merged"
-# }
-# ~~~
-method MountContainer(name: string) -> (path: string)
-
-# UnmountContainer umounts a container by its name or full/partial container ID.
-# #### Example
-# ~~~
-# $ varlink call -m unix:/run/podman/io.podman/io.podman.UnmountContainer '{"name": "jolly_shannon", "force": false}'
-# {}
-# ~~~
-method UnmountContainer(name: string, force: bool) -> ()
-
-# ImagesPrune removes all unused images from the local store. Upon successful pruning,
-# the IDs of the removed images are returned.
-method ImagesPrune(all: bool, filter: []string) -> (pruned: []string)
-
-# This function is not implemented yet.
-# method ListContainerPorts(name: string) -> (notimplemented: NotImplemented)
-
-# GenerateKube generates a Kubernetes v1 Pod description of a Podman container or pod
-# and its containers. The description is in YAML. See also [ReplayKube](ReplayKube).
-method GenerateKube(name: string, service: bool) -> (pod: KubePodService)
-
-# ReplayKube recreates a pod and its containers based on a Kubernetes v1 Pod description (in YAML)
-# like that created by GenerateKube. See also [GenerateKube](GenerateKube).
-# method ReplayKube() -> (notimplemented: NotImplemented)
-
-# ContainerConfig returns a container's config in string form. This call is for
-# development of Podman only and generally should not be used.
-method ContainerConfig(name: string) -> (config: string)
-
-# ContainerArtifacts returns a container's artifacts in string form. This call is for
-# development of Podman only and generally should not be used.
-method ContainerArtifacts(name: string, artifactName: string) -> (config: string)
-
-# ContainerInspectData returns a container's inspect data in string form. This call is for
-# development of Podman only and generally should not be used.
-method ContainerInspectData(name: string, size: bool) -> (config: string)
-
-# ContainerStateData returns a container's state config in string form. This call is for
-# development of Podman only and generally should not be used.
-method ContainerStateData(name: string) -> (config: string)
-
-# PodStateData returns inspectr level information of a given pod in string form. This call is for
-# development of Podman only and generally should not be used.
-method PodStateData(name: string) -> (config: string)
-
-# This call is for the development of Podman only and should not be used.
-method CreateFromCC(in: []string) -> (id: string)
-
-# Spec returns the oci spec for a container. This call is for development of Podman only and generally should not be used.
-method Spec(name: string) -> (config: string)
-
-# Sendfile allows a remote client to send a file to the host
-method SendFile(type: string, length: int) -> (file_handle: string)
-
-# ReceiveFile allows the host to send a remote client a file
-method ReceiveFile(path: string, delete: bool) -> (len: int)
-
-# VolumeCreate creates a volume on a remote host
-method VolumeCreate(options: VolumeCreateOpts) -> (volumeName: string)
-
-# VolumeRemove removes a volume on a remote host
-method VolumeRemove(options: VolumeRemoveOpts) -> (successes: []string, failures: [string]string)
-
-# GetVolumes gets slice of the volumes on a remote host
-method GetVolumes(args: []string, all: bool) -> (volumes: []Volume)
-
-# InspectVolume inspects a single volume. Returns inspect JSON in the form of a
-# string.
-method InspectVolume(name: string) -> (volume: string)
-
-# VolumesPrune removes unused volumes on the host
-method VolumesPrune() -> (prunedNames: []string, prunedErrors: []string)
-
-# ImageSave allows you to save an image from the local image storage to a tarball
-method ImageSave(options: ImageSaveOptions) -> (reply: MoreResponse)
-
-# GetPodsByContext allows you to get a list pod ids depending on all, latest, or a list of
-# pod names. The definition of latest pod means the latest by creation date. In a multi-
-# user environment, results might differ from what you expect.
-method GetPodsByContext(all: bool, latest: bool, args: []string) -> (pods: []string)
-
-# LoadImage allows you to load an image into local storage from a tarball.
-method LoadImage(name: string, inputFile: string, quiet: bool, deleteFile: bool) -> (reply: MoreResponse)
-
-# GetEvents returns known libpod events filtered by the options provided.
-method GetEvents(filter: []string, since: string, until: string) -> (events: Event)
-
-# Diff returns a diff between libpod objects
-method Diff(name: string) -> (diffs: []DiffInfo)
-
-# GetLayersMapWithImageInfo is for the development of Podman and should not be used.
-method GetLayersMapWithImageInfo() -> (layerMap: string)
-
-# BuildImageHierarchyMap is for the development of Podman and should not be used.
-method BuildImageHierarchyMap(name: string) -> (imageInfo: string)
-
-# ImageNotFound means the image could not be found by the provided name or ID in local storage.
-error ImageNotFound (id: string, reason: string)
-
-# ContainerNotFound means the container could not be found by the provided name or ID in local storage.
-error ContainerNotFound (id: string, reason: string)
-
-# NoContainerRunning means none of the containers requested are running in a command that requires a running container.
-error NoContainerRunning ()
-
-# PodNotFound means the pod could not be found by the provided name or ID in local storage.
-error PodNotFound (name: string, reason: string)
-
-# VolumeNotFound means the volume could not be found by the name or ID in local storage.
-error VolumeNotFound (id: string, reason: string)
-
-# PodContainerError means a container associated with a pod failed to perform an operation. It contains
-# a container ID of the container that failed.
-error PodContainerError (podname: string, errors: []PodContainerErrorData)
-
-# NoContainersInPod means a pod has no containers on which to perform the operation. It contains
-# the pod ID.
-error NoContainersInPod (name: string)
-
-# InvalidState indicates that a container or pod was in an improper state for the requested operation
-error InvalidState (id: string, reason: string)
-
-# ErrorOccurred is a generic error for an error that occurs during the execution. The actual error message
-# is includes as part of the error's text.
-error ErrorOccurred (reason: string)
-
-# RuntimeErrors generally means a runtime could not be found or gotten.
-error RuntimeError (reason: string)
-
-# The Podman endpoint requires that you use a streaming connection.
-error WantsMoreRequired (reason: string)
-
-# Container is already stopped
-error ErrCtrStopped (id: string)
-
-# This function requires CGroupsV2 to run in rootless mode.
-error ErrRequiresCgroupsV2ForRootless(reason: string)
diff --git a/cmd/podmanV2/Makefile b/cmd/podmanV2/Makefile
index 147a78d9c..f2f7bd73c 100644
--- a/cmd/podmanV2/Makefile
+++ b/cmd/podmanV2/Makefile
@@ -1,2 +1,2 @@
all:
- GO111MODULE=off go build -tags 'ABISupport'
+ GO111MODULE=off go build -tags 'ABISupport systemd'
diff --git a/cmd/podmanV2/common/inspect.go b/cmd/podmanV2/common/inspect.go
new file mode 100644
index 000000000..dfc6fe679
--- /dev/null
+++ b/cmd/podmanV2/common/inspect.go
@@ -0,0 +1,18 @@
+package common
+
+import (
+ "github.com/containers/libpod/pkg/domain/entities"
+ "github.com/spf13/cobra"
+)
+
+// AddInspectFlagSet takes a command and adds the inspect flags and returns an InspectOptions object
+// Since this cannot live in `package main` it lives here until a better home is found
+func AddInspectFlagSet(cmd *cobra.Command) *entities.InspectOptions {
+ opts := entities.InspectOptions{}
+
+ flags := cmd.Flags()
+ flags.BoolVarP(&opts.Size, "size", "s", false, "Display total file size")
+ flags.StringVarP(&opts.Format, "format", "f", "", "Change the output format to a Go template")
+
+ return &opts
+}
diff --git a/cmd/podmanV2/containers/export.go b/cmd/podmanV2/containers/export.go
new file mode 100644
index 000000000..b93b60878
--- /dev/null
+++ b/cmd/podmanV2/containers/export.go
@@ -0,0 +1,57 @@
+package containers
+
+import (
+ "context"
+ "os"
+
+ "github.com/containers/libpod/cmd/podmanV2/parse"
+ "github.com/containers/libpod/cmd/podmanV2/registry"
+ "github.com/containers/libpod/pkg/domain/entities"
+ "github.com/pkg/errors"
+ "github.com/spf13/cobra"
+ "golang.org/x/crypto/ssh/terminal"
+)
+
+var (
+ exportDescription = "Exports container's filesystem contents as a tar archive" +
+ " and saves it on the local machine."
+
+ exportCommand = &cobra.Command{
+ Use: "export [flags] CONTAINER",
+ Short: "Export container's filesystem contents as a tar archive",
+ Long: exportDescription,
+ PersistentPreRunE: preRunE,
+ RunE: export,
+ Args: cobra.ExactArgs(1),
+ Example: `podman export ctrID > myCtr.tar
+ podman export --output="myCtr.tar" ctrID`,
+ }
+)
+
+var (
+ exportOpts entities.ContainerExportOptions
+)
+
+func init() {
+ registry.Commands = append(registry.Commands, registry.CliCommand{
+ Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
+ Command: exportCommand,
+ })
+ exportCommand.SetHelpTemplate(registry.HelpTemplate())
+ exportCommand.SetUsageTemplate(registry.UsageTemplate())
+ flags := exportCommand.Flags()
+ flags.StringVarP(&exportOpts.Output, "output", "o", "", "Write to a specified file (default: stdout, which must be redirected)")
+}
+
+func export(cmd *cobra.Command, args []string) error {
+ if len(exportOpts.Output) == 0 {
+ file := os.Stdout
+ if terminal.IsTerminal(int(file.Fd())) {
+ return errors.Errorf("refusing to export to terminal. Use -o flag or redirect")
+ }
+ exportOpts.Output = "/dev/stdout"
+ } else if err := parse.ValidateFileName(exportOpts.Output); err != nil {
+ return err
+ }
+ return registry.ContainerEngine().ContainerExport(context.Background(), args[0], exportOpts)
+}
diff --git a/cmd/podmanV2/containers/inspect.go b/cmd/podmanV2/containers/inspect.go
index 648289f0b..3147426cb 100644
--- a/cmd/podmanV2/containers/inspect.go
+++ b/cmd/podmanV2/containers/inspect.go
@@ -7,9 +7,11 @@ import (
"strings"
"text/template"
+ "github.com/containers/libpod/cmd/podmanV2/common"
"github.com/containers/libpod/cmd/podmanV2/registry"
+
"github.com/containers/libpod/pkg/domain/entities"
- jsoniter "github.com/json-iterator/go"
+ json "github.com/json-iterator/go"
"github.com/spf13/cobra"
)
@@ -24,10 +26,7 @@ var (
Example: `podman container inspect myCtr
podman container inspect -l --format '{{.Id}} {{.Config.Labels}}'`,
}
-)
-
-var (
- inspectOptions entities.ContainerInspectOptions
+ inspectOpts *entities.InspectOptions
)
func init() {
@@ -36,29 +35,29 @@ func init() {
Command: inspectCmd,
Parent: containerCmd,
})
+ inspectOpts = common.AddInspectFlagSet(inspectCmd)
flags := inspectCmd.Flags()
- flags.StringVarP(&inspectOptions.Format, "format", "f", "", "Change the output format to a Go template")
- flags.BoolVarP(&inspectOptions.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
- flags.BoolVarP(&inspectOptions.Size, "size", "s", false, "Display total file size")
- if registry.IsRemote() {
- _ = flags.MarkHidden("latest")
+
+ if !registry.IsRemote() {
+ flags.BoolVarP(&inspectOpts.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
}
+
}
func inspect(cmd *cobra.Command, args []string) error {
- responses, err := registry.ContainerEngine().ContainerInspect(context.Background(), args, inspectOptions)
+ responses, err := registry.ContainerEngine().ContainerInspect(context.Background(), args, *inspectOpts)
if err != nil {
return err
}
- if inspectOptions.Format == "" {
- b, err := jsoniter.MarshalIndent(responses, "", " ")
+ if inspectOpts.Format == "" {
+ b, err := json.MarshalIndent(responses, "", " ")
if err != nil {
return err
}
fmt.Println(string(b))
return nil
}
- format := inspectOptions.Format
+ format := inspectOpts.Format
if !strings.HasSuffix(format, "\n") {
format += "\n"
}
@@ -73,3 +72,8 @@ func inspect(cmd *cobra.Command, args []string) error {
}
return nil
}
+
+func Inspect(cmd *cobra.Command, args []string, options *entities.InspectOptions) error {
+ inspectOpts = options
+ return inspect(cmd, args)
+}
diff --git a/cmd/podmanV2/containers/restart.go b/cmd/podmanV2/containers/restart.go
index 1f1bb11fa..5f1d3fe51 100644
--- a/cmd/podmanV2/containers/restart.go
+++ b/cmd/podmanV2/containers/restart.go
@@ -14,9 +14,10 @@ import (
)
var (
- restartDescription = `Restarts one or more running containers. The container ID or name can be used.
+ restartDescription = fmt.Sprintf(`Restarts one or more running containers. The container ID or name can be used.
+
+ A timeout before forcibly stopping can be set, but defaults to %d seconds.`, defaultContainerConfig.Engine.StopTimeout)
- A timeout before forcibly stopping can be set, but defaults to 10 seconds.`
restartCommand = &cobra.Command{
Use: "restart [flags] CONTAINER [CONTAINER...]",
Short: "Restart one or more containers",
@@ -46,11 +47,11 @@ func init() {
flags.BoolVarP(&restartOptions.All, "all", "a", false, "Restart all non-running containers")
flags.BoolVarP(&restartOptions.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
flags.BoolVar(&restartOptions.Running, "running", false, "Restart only running containers when --all is used")
- flags.UintVarP(&restartTimeout, "timeout", "t", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
- flags.UintVar(&restartTimeout, "time", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
+ flags.UintVarP(&restartTimeout, "time", "t", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
if registry.IsRemote() {
_ = flags.MarkHidden("latest")
}
+ flags.SetNormalizeFunc(utils.AliasFlags)
}
func restart(cmd *cobra.Command, args []string) error {
@@ -61,7 +62,7 @@ func restart(cmd *cobra.Command, args []string) error {
return errors.Wrapf(define.ErrInvalidArg, "you must provide at least one container name or ID")
}
- if cmd.Flag("timeout").Changed || cmd.Flag("time").Changed {
+ if cmd.Flag("time").Changed {
restartOptions.Timeout = &restartTimeout
}
responses, err := registry.ContainerEngine().ContainerRestart(context.Background(), args, restartOptions)
diff --git a/cmd/podmanV2/containers/stop.go b/cmd/podmanV2/containers/stop.go
index 9a106e8fe..d6f31352f 100644
--- a/cmd/podmanV2/containers/stop.go
+++ b/cmd/podmanV2/containers/stop.go
@@ -8,14 +8,13 @@ import (
"github.com/containers/libpod/cmd/podmanV2/registry"
"github.com/containers/libpod/cmd/podmanV2/utils"
"github.com/containers/libpod/pkg/domain/entities"
- "github.com/pkg/errors"
"github.com/spf13/cobra"
)
var (
- stopDescription = `Stops one or more running containers. The container name or ID can be used.
+ stopDescription = fmt.Sprintf(`Stops one or more running containers. The container name or ID can be used.
- A timeout to forcibly stop the container can also be set but defaults to 10 seconds otherwise.`
+ A timeout to forcibly stop the container can also be set but defaults to %d seconds otherwise.`, defaultContainerConfig.Engine.StopTimeout)
stopCommand = &cobra.Command{
Use: "stop [flags] CONTAINER [CONTAINER...]",
Short: "Stop one or more containers",
@@ -27,7 +26,7 @@ var (
},
Example: `podman stop ctrID
podman stop --latest
- podman stop --timeout 2 mywebserver 6e534f14da9d`,
+ podman stop --time 2 mywebserver 6e534f14da9d`,
}
)
@@ -46,24 +45,21 @@ func init() {
flags.BoolVarP(&stopOptions.Ignore, "ignore", "i", false, "Ignore errors when a specified container is missing")
flags.StringArrayVarP(&stopOptions.CIDFiles, "cidfile", "", nil, "Read the container ID from the file")
flags.BoolVarP(&stopOptions.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
- flags.UintVar(&stopTimeout, "time", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
- flags.UintVarP(&stopTimeout, "timeout", "t", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
+ flags.UintVarP(&stopTimeout, "time", "t", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
if registry.EngineOptions.EngineMode == entities.ABIMode {
_ = flags.MarkHidden("latest")
_ = flags.MarkHidden("cidfile")
_ = flags.MarkHidden("ignore")
}
+ flags.SetNormalizeFunc(utils.AliasFlags)
}
func stop(cmd *cobra.Command, args []string) error {
var (
errs utils.OutputErrors
)
- if cmd.Flag("timeout").Changed && cmd.Flag("time").Changed {
- return errors.New("the --timeout and --time flags are mutually exclusive")
- }
stopOptions.Timeout = defaultContainerConfig.Engine.StopTimeout
- if cmd.Flag("timeout").Changed || cmd.Flag("time").Changed {
+ if cmd.Flag("time").Changed {
stopOptions.Timeout = stopTimeout
}
diff --git a/cmd/podmanV2/healthcheck/healthcheck.go b/cmd/podmanV2/healthcheck/healthcheck.go
new file mode 100644
index 000000000..2af398ff0
--- /dev/null
+++ b/cmd/podmanV2/healthcheck/healthcheck.go
@@ -0,0 +1,33 @@
+package healthcheck
+
+import (
+ "github.com/containers/libpod/cmd/podmanV2/registry"
+ "github.com/containers/libpod/pkg/domain/entities"
+ "github.com/spf13/cobra"
+)
+
+var (
+ // Command: healthcheck
+ healthCmd = &cobra.Command{
+ Use: "healthcheck",
+ Short: "Manage Healthcheck",
+ Long: "Manage Healthcheck",
+ TraverseChildren: true,
+ PersistentPreRunE: preRunE,
+ RunE: registry.SubCommandExists,
+ }
+)
+
+func init() {
+ registry.Commands = append(registry.Commands, registry.CliCommand{
+ Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
+ Command: healthCmd,
+ })
+ healthCmd.SetHelpTemplate(registry.HelpTemplate())
+ healthCmd.SetUsageTemplate(registry.UsageTemplate())
+}
+
+func preRunE(cmd *cobra.Command, args []string) error {
+ _, err := registry.NewContainerEngine(cmd, args)
+ return err
+}
diff --git a/cmd/podmanV2/healthcheck/run.go b/cmd/podmanV2/healthcheck/run.go
new file mode 100644
index 000000000..bb2962eaf
--- /dev/null
+++ b/cmd/podmanV2/healthcheck/run.go
@@ -0,0 +1,42 @@
+package healthcheck
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/containers/libpod/cmd/podmanV2/registry"
+ "github.com/containers/libpod/pkg/domain/entities"
+ "github.com/spf13/cobra"
+)
+
+var (
+ healthcheckRunDescription = "run the health check of a container"
+ healthcheckrunCommand = &cobra.Command{
+ Use: "run [flags] CONTAINER",
+ Short: "run the health check of a container",
+ Long: healthcheckRunDescription,
+ Example: `podman healthcheck run mywebapp`,
+ RunE: run,
+ Args: cobra.ExactArgs(1),
+ }
+)
+
+func init() {
+ registry.Commands = append(registry.Commands, registry.CliCommand{
+ Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
+ Command: healthcheckrunCommand,
+ Parent: healthCmd,
+ })
+}
+
+func run(cmd *cobra.Command, args []string) error {
+ response, err := registry.ContainerEngine().HealthCheckRun(context.Background(), args[0], entities.HealthCheckOptions{})
+ if err != nil {
+ return err
+ }
+ if response.Status == "unhealthy" {
+ registry.SetExitCode(1)
+ }
+ fmt.Println(response.Status)
+ return err
+}
diff --git a/cmd/podmanV2/images/import.go b/cmd/podmanV2/images/import.go
new file mode 100644
index 000000000..09a15585f
--- /dev/null
+++ b/cmd/podmanV2/images/import.go
@@ -0,0 +1,87 @@
+package images
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/containers/libpod/cmd/podmanV2/parse"
+ "github.com/containers/libpod/cmd/podmanV2/registry"
+ "github.com/containers/libpod/pkg/domain/entities"
+ "github.com/hashicorp/go-multierror"
+ "github.com/pkg/errors"
+ "github.com/spf13/cobra"
+)
+
+var (
+ importDescription = `Create a container image from the contents of the specified tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz).
+
+ Note remote tar balls can be specified, via web address.
+ Optionally tag the image. You can specify the instructions using the --change option.`
+ importCommand = &cobra.Command{
+ Use: "import [flags] PATH [REFERENCE]",
+ Short: "Import a tarball to create a filesystem image",
+ Long: importDescription,
+ RunE: importCon,
+ PersistentPreRunE: preRunE,
+ Example: `podman import http://example.com/ctr.tar url-image
+ cat ctr.tar | podman -q import --message "importing the ctr.tar tarball" - image-imported
+ cat ctr.tar | podman import -`,
+ }
+)
+
+var (
+ importOpts entities.ImageImportOptions
+)
+
+func init() {
+ registry.Commands = append(registry.Commands, registry.CliCommand{
+ Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
+ Command: importCommand,
+ })
+
+ importCommand.SetHelpTemplate(registry.HelpTemplate())
+ importCommand.SetUsageTemplate(registry.UsageTemplate())
+ flags := importCommand.Flags()
+ flags.StringArrayVarP(&importOpts.Changes, "change", "c", []string{}, "Apply the following possible instructions to the created image (default []): CMD | ENTRYPOINT | ENV | EXPOSE | LABEL | STOPSIGNAL | USER | VOLUME | WORKDIR")
+ flags.StringVarP(&importOpts.Message, "message", "m", "", "Set commit message for imported image")
+ flags.BoolVarP(&importOpts.Quiet, "quiet", "q", false, "Suppress output")
+}
+
+func importCon(cmd *cobra.Command, args []string) error {
+ var (
+ source string
+ reference string
+ )
+ switch len(args) {
+ case 0:
+ return errors.Errorf("need to give the path to the tarball, or must specify a tarball of '-' for stdin")
+ case 1:
+ source = args[0]
+ case 2:
+ source = args[0]
+ // TODO when save is merged, we need to process reference
+ // like it is done in there or we end up with docker.io prepends
+ // instead of the localhost ones
+ reference = args[1]
+ default:
+ return errors.Errorf("too many arguments. Usage TARBALL [REFERENCE]")
+ }
+ errFileName := parse.ValidateFileName(source)
+ errURL := parse.ValidURL(source)
+ if errURL == nil {
+ importOpts.SourceIsURL = true
+ }
+ if errFileName != nil && errURL != nil {
+ return multierror.Append(errFileName, errURL)
+ }
+
+ importOpts.Source = source
+ importOpts.Reference = reference
+
+ response, err := registry.ImageEngine().Import(context.Background(), importOpts)
+ if err != nil {
+ return err
+ }
+ fmt.Println(response.Id)
+ return nil
+}
diff --git a/cmd/podmanV2/images/inspect.go b/cmd/podmanV2/images/inspect.go
index f8fd44571..d7f6b0ee1 100644
--- a/cmd/podmanV2/images/inspect.go
+++ b/cmd/podmanV2/images/inspect.go
@@ -1,71 +1,44 @@
package images
import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "os"
"strings"
+ "text/tabwriter"
+ "text/template"
"github.com/containers/buildah/pkg/formats"
+ "github.com/containers/libpod/cmd/podmanV2/common"
"github.com/containers/libpod/cmd/podmanV2/registry"
"github.com/containers/libpod/pkg/domain/entities"
- "github.com/containers/libpod/pkg/util"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
var (
- inspectOpts = entities.ImageInspectOptions{}
-
// Command: podman image _inspect_
inspectCmd = &cobra.Command{
Use: "inspect [flags] IMAGE",
Short: "Display the configuration of an image",
Long: `Displays the low-level information on an image identified by name or ID.`,
- PreRunE: populateEngines,
- RunE: imageInspect,
+ RunE: inspect,
Example: `podman image inspect alpine`,
}
-
- containerEngine entities.ContainerEngine
+ inspectOpts *entities.InspectOptions
)
-// Inspect is unique in that it needs both an ImageEngine and a ContainerEngine
-func populateEngines(cmd *cobra.Command, args []string) (err error) {
- // Populate registry.ImageEngine
- err = preRunE(cmd, args)
- if err != nil {
- return
- }
-
- // Populate registry.ContainerEngine
- containerEngine, err = registry.NewContainerEngine(cmd, args)
- return
-}
-
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: inspectCmd,
Parent: imageCmd,
})
-
- flags := inspectCmd.Flags()
- flags.BoolVarP(&inspectOpts.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
- flags.BoolVarP(&inspectOpts.Size, "size", "s", false, "Display total file size")
- flags.StringVarP(&inspectOpts.Format, "format", "f", "", "Change the output format to a Go template")
-
- if registry.EngineOptions.EngineMode == entities.ABIMode {
- // TODO: This is the same as V1. We could skip creating the flag altogether in V2...
- _ = flags.MarkHidden("latest")
- }
+ inspectOpts = common.AddInspectFlagSet(inspectCmd)
}
-const (
- inspectTypeContainer = "container"
- inspectTypeImage = "image"
- inspectAll = "all"
-)
-
-func imageInspect(cmd *cobra.Command, args []string) error {
- inspectType := inspectTypeImage
+func inspect(cmd *cobra.Command, args []string) error {
latestContainer := inspectOpts.Latest
if len(args) == 0 && !latestContainer {
@@ -76,49 +49,61 @@ func imageInspect(cmd *cobra.Command, args []string) error {
return errors.Errorf("you cannot provide additional arguments with --latest")
}
- if !util.StringInSlice(inspectType, []string{inspectTypeContainer, inspectTypeImage, inspectAll}) {
- return errors.Errorf("the only recognized types are %q, %q, and %q", inspectTypeContainer, inspectTypeImage, inspectAll)
+ results, err := registry.ImageEngine().Inspect(context.Background(), args, *inspectOpts)
+ if err != nil {
+ return err
}
- outputFormat := inspectOpts.Format
- if strings.Contains(outputFormat, "{{.Id}}") {
- outputFormat = strings.Replace(outputFormat, "{{.Id}}", formats.IDString, -1)
- }
- // These fields were renamed, so we need to provide backward compat for
- // the old names.
- if strings.Contains(outputFormat, ".Src") {
- outputFormat = strings.Replace(outputFormat, ".Src", ".Source", -1)
+ if len(results.Images) > 0 {
+ if inspectOpts.Format == "" {
+ buf, err := json.MarshalIndent(results.Images, "", " ")
+ if err != nil {
+ return err
+ }
+ fmt.Println(string(buf))
+
+ for id, e := range results.Errors {
+ fmt.Fprintf(os.Stderr, "%s: %s\n", id, e.Error())
+ }
+ return nil
+ }
+
+ row := inspectFormat(inspectOpts.Format)
+ format := "{{range . }}" + row + "{{end}}"
+ tmpl, err := template.New("inspect").Parse(format)
+ if err != nil {
+ return err
+ }
+
+ w := tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', 0)
+ defer func() { _ = w.Flush() }()
+ err = tmpl.Execute(w, results)
+ if err != nil {
+ return err
+ }
}
- if strings.Contains(outputFormat, ".Dst") {
- outputFormat = strings.Replace(outputFormat, ".Dst", ".Destination", -1)
- }
- if strings.Contains(outputFormat, ".ImageID") {
- outputFormat = strings.Replace(outputFormat, ".ImageID", ".Image", -1)
+
+ for id, e := range results.Errors {
+ fmt.Fprintf(os.Stderr, "%s: %s\n", id, e.Error())
}
- _ = outputFormat
- // if latestContainer {
- // lc, err := ctnrRuntime.GetLatestContainer()
- // if err != nil {
- // return err
- // }
- // args = append(args, lc.ID())
- // inspectType = inspectTypeContainer
- // }
-
- // inspectedObjects, iterateErr := iterateInput(getContext(), c.Size, args, runtime, inspectType)
- // if iterateErr != nil {
- // return iterateErr
- // }
- //
- // var out formats.Writer
- // if outputFormat != "" && outputFormat != formats.JSONString {
- // // template
- // out = formats.StdoutTemplateArray{Output: inspectedObjects, Template: outputFormat}
- // } else {
- // // default is json output
- // out = formats.JSONStructArray{Output: inspectedObjects}
- // }
- //
- // return out.Out()
return nil
}
+
+func inspectFormat(row string) string {
+ r := strings.NewReplacer("{{.Id}}", formats.IDString,
+ ".Src", ".Source",
+ ".Dst", ".Destination",
+ ".ImageID", ".Image",
+ )
+ row = r.Replace(row)
+
+ if !strings.HasSuffix(row, "\n") {
+ row += "\n"
+ }
+ return row
+}
+
+func Inspect(cmd *cobra.Command, args []string, options *entities.InspectOptions) error {
+ inspectOpts = options
+ return inspect(cmd, args)
+}
diff --git a/cmd/podmanV2/images/list.go b/cmd/podmanV2/images/list.go
index 9a5b47299..2d6cb3596 100644
--- a/cmd/podmanV2/images/list.go
+++ b/cmd/podmanV2/images/list.go
@@ -152,7 +152,7 @@ func writeTemplate(imageS []*entities.ImageSummary, err error) error {
hdr, row := imageListFormat(listFlag)
format := hdr + "{{range . }}" + row + "{{end}}"
- tmpl := template.Must(template.New("report").Funcs(report.PodmanTemplateFuncs()).Parse(format))
+ tmpl := template.Must(template.New("list").Funcs(report.PodmanTemplateFuncs()).Parse(format))
w := tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', 0)
defer w.Flush()
return tmpl.Execute(w, imgs)
diff --git a/cmd/podmanV2/images/load.go b/cmd/podmanV2/images/load.go
new file mode 100644
index 000000000..f60dc4908
--- /dev/null
+++ b/cmd/podmanV2/images/load.go
@@ -0,0 +1,61 @@
+package images
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/containers/libpod/cmd/podmanV2/registry"
+ "github.com/containers/libpod/libpod/image"
+ "github.com/containers/libpod/pkg/domain/entities"
+ "github.com/spf13/cobra"
+)
+
+var (
+ loadDescription = "Loads an image from a locally stored archive (tar file) into container storage."
+ loadCommand = &cobra.Command{
+ Use: "load [flags] [NAME[:TAG]]",
+ Short: "Load an image from container archive",
+ Long: loadDescription,
+ RunE: load,
+ Args: cobra.MaximumNArgs(1),
+ PersistentPreRunE: preRunE,
+ }
+)
+
+var (
+ loadOpts entities.ImageLoadOptions
+)
+
+func init() {
+ registry.Commands = append(registry.Commands, registry.CliCommand{
+ Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
+ Command: loadCommand,
+ })
+
+ loadCommand.SetHelpTemplate(registry.HelpTemplate())
+ loadCommand.SetUsageTemplate(registry.UsageTemplate())
+ flags := loadCommand.Flags()
+ flags.StringVarP(&loadOpts.Input, "input", "i", "", "Read from specified archive file (default: stdin)")
+ flags.BoolVarP(&loadOpts.Quiet, "quiet", "q", false, "Suppress the output")
+ flags.StringVar(&loadOpts.SignaturePolicy, "signature-policy", "", "Pathname of signature policy file")
+ if registry.IsRemote() {
+ _ = flags.MarkHidden("signature-policy")
+ }
+
+}
+
+func load(cmd *cobra.Command, args []string) error {
+ if len(args) > 0 {
+ repo, err := image.NormalizedTag(args[0])
+ if err != nil {
+ return err
+ }
+ loadOpts.Name = repo.Name()
+ }
+ response, err := registry.ImageEngine().Load(context.Background(), loadOpts)
+ if err != nil {
+ return err
+ }
+ fmt.Println("Loaded image: " + response.Name)
+ return nil
+}
diff --git a/cmd/podmanV2/images/pull.go b/cmd/podmanV2/images/pull.go
new file mode 100644
index 000000000..c7e325409
--- /dev/null
+++ b/cmd/podmanV2/images/pull.go
@@ -0,0 +1,140 @@
+package images
+
+import (
+ "fmt"
+
+ buildahcli "github.com/containers/buildah/pkg/cli"
+ "github.com/containers/image/v5/types"
+ "github.com/containers/libpod/cmd/podmanV2/registry"
+ "github.com/containers/libpod/pkg/domain/entities"
+ "github.com/opentracing/opentracing-go"
+ "github.com/pkg/errors"
+ "github.com/spf13/cobra"
+ "github.com/spf13/pflag"
+)
+
+// pullOptionsWrapper wraps entities.ImagePullOptions and prevents leaking
+// CLI-only fields into the API types.
+type pullOptionsWrapper struct {
+ entities.ImagePullOptions
+ TLSVerifyCLI bool // CLI only
+}
+
+var (
+ pullOptions = pullOptionsWrapper{}
+ pullDescription = `Pulls an image from a registry and stores it locally.
+
+ An image can be pulled by tag or digest. If a tag is not specified, the image with the 'latest' tag is pulled.`
+
+ // Command: podman pull
+ pullCmd = &cobra.Command{
+ Use: "pull [flags] IMAGE",
+ Short: "Pull an image from a registry",
+ Long: pullDescription,
+ PreRunE: preRunE,
+ RunE: imagePull,
+ Example: `podman pull imageName
+ podman pull fedora:latest`,
+ }
+
+ // Command: podman image pull
+ // It's basically a clone of `pullCmd` with the exception of being a
+ // child of the images command.
+ imagesPullCmd = &cobra.Command{
+ Use: pullCmd.Use,
+ Short: pullCmd.Short,
+ Long: pullCmd.Long,
+ PreRunE: pullCmd.PreRunE,
+ RunE: pullCmd.RunE,
+ Example: `podman image pull imageName
+ podman image pull fedora:latest`,
+ }
+)
+
+func init() {
+ // pull
+ registry.Commands = append(registry.Commands, registry.CliCommand{
+ Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
+ Command: pullCmd,
+ })
+
+ pullCmd.SetHelpTemplate(registry.HelpTemplate())
+ pullCmd.SetUsageTemplate(registry.UsageTemplate())
+
+ flags := pullCmd.Flags()
+ pullFlags(flags)
+
+ // images pull
+ registry.Commands = append(registry.Commands, registry.CliCommand{
+ Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
+ Command: imagesPullCmd,
+ Parent: imageCmd,
+ })
+
+ imagesPullCmd.SetHelpTemplate(registry.HelpTemplate())
+ imagesPullCmd.SetUsageTemplate(registry.UsageTemplate())
+ imagesPullFlags := imagesPullCmd.Flags()
+ pullFlags(imagesPullFlags)
+}
+
+// pullFlags set the flags for the pull command.
+func pullFlags(flags *pflag.FlagSet) {
+ flags.BoolVar(&pullOptions.AllTags, "all-tags", false, "All tagged images in the repository will be pulled")
+ flags.StringVar(&pullOptions.Authfile, "authfile", buildahcli.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
+ flags.StringVar(&pullOptions.CertDir, "cert-dir", "", "`Pathname` of a directory containing TLS certificates and keys")
+ flags.StringVar(&pullOptions.Credentials, "creds", "", "`Credentials` (USERNAME:PASSWORD) to use for authenticating to a registry")
+ flags.StringVar(&pullOptions.OverrideArch, "override-arch", "", "Use `ARCH` instead of the architecture of the machine for choosing images")
+ flags.StringVar(&pullOptions.OverrideOS, "override-os", "", "Use `OS` instead of the running OS for choosing images")
+ flags.BoolVarP(&pullOptions.Quiet, "quiet", "q", false, "Suppress output information when pulling images")
+ flags.StringVar(&pullOptions.SignaturePolicy, "signature-policy", "", "`Pathname` of signature policy file (not usually used)")
+ flags.BoolVar(&pullOptions.TLSVerifyCLI, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries")
+
+ if registry.IsRemote() {
+ _ = flags.MarkHidden("authfile")
+ _ = flags.MarkHidden("cert-dir")
+ _ = flags.MarkHidden("signature-policy")
+ _ = flags.MarkHidden("tls-verify")
+ }
+}
+
+// imagePull is implement the command for pulling images.
+func imagePull(cmd *cobra.Command, args []string) error {
+ // Sanity check input.
+ if len(args) == 0 {
+ return errors.Errorf("an image name must be specified")
+ }
+ if len(args) > 1 {
+ return errors.Errorf("too many arguments. Requires exactly 1")
+ }
+
+ // Start tracing if requested.
+ if cmd.Flags().Changed("trace") {
+ span, _ := opentracing.StartSpanFromContext(registry.GetContext(), "pullCmd")
+ defer span.Finish()
+ }
+
+ pullOptsAPI := pullOptions.ImagePullOptions
+ // TLS verification in c/image is controlled via a `types.OptionalBool`
+ // which allows for distinguishing among set-true, set-false, unspecified
+ // which is important to implement a sane way of dealing with defaults of
+ // boolean CLI flags.
+ if cmd.Flags().Changed("tls-verify") {
+ pullOptsAPI.TLSVerify = types.NewOptionalBool(pullOptions.TLSVerifyCLI)
+ }
+
+ // Let's do all the remaining Yoga in the API to prevent us from
+ // scattering logic across (too) many parts of the code.
+ pullReport, err := registry.ImageEngine().Pull(registry.GetContext(), args[0], pullOptsAPI)
+ if err != nil {
+ return err
+ }
+
+ if len(pullReport.Images) > 1 {
+ fmt.Println("Pulled Images:")
+ }
+ for _, img := range pullReport.Images {
+ fmt.Println(img)
+ }
+
+ return nil
+}
diff --git a/cmd/podmanV2/images/tag.go b/cmd/podmanV2/images/tag.go
new file mode 100644
index 000000000..f66fe7857
--- /dev/null
+++ b/cmd/podmanV2/images/tag.go
@@ -0,0 +1,34 @@
+package images
+
+import (
+ "github.com/containers/libpod/cmd/podmanV2/registry"
+ "github.com/containers/libpod/pkg/domain/entities"
+ "github.com/spf13/cobra"
+)
+
+var (
+ tagDescription = "Adds one or more additional names to locally-stored image."
+ tagCommand = &cobra.Command{
+ Use: "tag [flags] IMAGE TARGET_NAME [TARGET_NAME...]",
+ Short: "Add an additional name to a local image",
+ Long: tagDescription,
+ RunE: tag,
+ Args: cobra.MinimumNArgs(2),
+ Example: `podman tag 0e3bbc2 fedora:latest
+ podman tag imageID:latest myNewImage:newTag
+ podman tag httpd myregistryhost:5000/fedora/httpd:v2`,
+ }
+)
+
+func init() {
+ registry.Commands = append(registry.Commands, registry.CliCommand{
+ Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
+ Command: tagCommand,
+ })
+ tagCommand.SetHelpTemplate(registry.HelpTemplate())
+ tagCommand.SetUsageTemplate(registry.UsageTemplate())
+}
+
+func tag(cmd *cobra.Command, args []string) error {
+ return registry.ImageEngine().Tag(registry.GetContext(), args[0], args[1:], entities.ImageTagOptions{})
+}
diff --git a/cmd/podmanV2/images/untag.go b/cmd/podmanV2/images/untag.go
new file mode 100644
index 000000000..c84827bb3
--- /dev/null
+++ b/cmd/podmanV2/images/untag.go
@@ -0,0 +1,33 @@
+package images
+
+import (
+ "github.com/containers/libpod/cmd/podmanV2/registry"
+ "github.com/containers/libpod/pkg/domain/entities"
+ "github.com/spf13/cobra"
+)
+
+var (
+ untagCommand = &cobra.Command{
+ Use: "untag [flags] IMAGE [NAME...]",
+ Short: "Remove a name from a local image",
+ Long: "Removes one or more names from a locally-stored image.",
+ RunE: untag,
+ Args: cobra.MinimumNArgs(1),
+ Example: `podman untag 0e3bbc2
+ podman untag imageID:latest otherImageName:latest
+ podman untag httpd myregistryhost:5000/fedora/httpd:v2`,
+ }
+)
+
+func init() {
+ registry.Commands = append(registry.Commands, registry.CliCommand{
+ Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
+ Command: untagCommand,
+ })
+ untagCommand.SetHelpTemplate(registry.HelpTemplate())
+ untagCommand.SetUsageTemplate(registry.UsageTemplate())
+}
+
+func untag(cmd *cobra.Command, args []string) error {
+ return registry.ImageEngine().Untag(registry.GetContext(), args[0], args[1:], entities.ImageUntagOptions{})
+}
diff --git a/cmd/podmanV2/inspect.go b/cmd/podmanV2/inspect.go
new file mode 100644
index 000000000..4975cf632
--- /dev/null
+++ b/cmd/podmanV2/inspect.go
@@ -0,0 +1,62 @@
+package main
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/containers/libpod/cmd/podmanV2/common"
+ "github.com/containers/libpod/cmd/podmanV2/containers"
+ "github.com/containers/libpod/cmd/podmanV2/images"
+ "github.com/containers/libpod/cmd/podmanV2/registry"
+ "github.com/containers/libpod/pkg/domain/entities"
+ "github.com/spf13/cobra"
+)
+
+// Inspect is one of the out layer commands in that it operates on images/containers/...
+
+var (
+ inspectOpts *entities.InspectOptions
+
+ // Command: podman _inspect_ Object_ID
+ inspectCmd = &cobra.Command{
+ Use: "inspect [flags] {CONTAINER_ID | IMAGE_ID}",
+ Args: cobra.ExactArgs(1),
+ Short: "Display the configuration of object denoted by ID",
+ Long: "Displays the low-level information on an object identified by name or ID",
+ TraverseChildren: true,
+ RunE: inspect,
+ }
+)
+
+func init() {
+ registry.Commands = append(registry.Commands, registry.CliCommand{
+ Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
+ Command: inspectCmd,
+ })
+ inspectOpts = common.AddInspectFlagSet(inspectCmd)
+}
+
+func inspect(cmd *cobra.Command, args []string) error {
+ ie, err := registry.NewImageEngine(cmd, args)
+ if err != nil {
+ return err
+ }
+
+ if found, err := ie.Exists(context.Background(), args[0]); err != nil {
+ return err
+ } else if found.Value {
+ return images.Inspect(cmd, args, inspectOpts)
+ }
+
+ ce, err := registry.NewContainerEngine(cmd, args)
+ if err != nil {
+ return err
+ }
+
+ if found, err := ce.ContainerExists(context.Background(), args[0]); err != nil {
+ return err
+ } else if found.Value {
+ return containers.Inspect(cmd, args, inspectOpts)
+ }
+ return fmt.Errorf("%s not found on system", args[0])
+}
diff --git a/cmd/podmanV2/main.go b/cmd/podmanV2/main.go
index bd9fbb25e..6781a7f06 100644
--- a/cmd/podmanV2/main.go
+++ b/cmd/podmanV2/main.go
@@ -7,6 +7,7 @@ import (
"strings"
_ "github.com/containers/libpod/cmd/podmanV2/containers"
+ _ "github.com/containers/libpod/cmd/podmanV2/healthcheck"
_ "github.com/containers/libpod/cmd/podmanV2/images"
_ "github.com/containers/libpod/cmd/podmanV2/networks"
_ "github.com/containers/libpod/cmd/podmanV2/pods"
@@ -14,6 +15,7 @@ import (
_ "github.com/containers/libpod/cmd/podmanV2/volumes"
"github.com/containers/libpod/libpod"
"github.com/containers/libpod/pkg/domain/entities"
+ "github.com/containers/storage/pkg/reexec"
"github.com/sirupsen/logrus"
)
@@ -44,6 +46,11 @@ func init() {
}
func main() {
+ if reexec.Init() {
+ // We were invoked with a different argv[0] indicating that we
+ // had a specific job to do as a subprocess, and it's done.
+ return
+ }
for _, c := range registry.Commands {
if Contains(registry.EngineOptions.EngineMode, c.Mode) {
parent := rootCmd
diff --git a/cmd/podmanV2/pods/pod.go b/cmd/podmanV2/pods/pod.go
index 81c0d33e1..3766893bb 100644
--- a/cmd/podmanV2/pods/pod.go
+++ b/cmd/podmanV2/pods/pod.go
@@ -1,6 +1,9 @@
package pods
import (
+ "strings"
+ "text/template"
+
"github.com/containers/libpod/cmd/podmanV2/registry"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/spf13/cobra"
@@ -18,6 +21,33 @@ var (
}
)
+var podFuncMap = template.FuncMap{
+ "numCons": func(cons []*entities.ListPodContainer) int {
+ return len(cons)
+ },
+ "podcids": func(cons []*entities.ListPodContainer) string {
+ var ctrids []string
+ for _, c := range cons {
+ ctrids = append(ctrids, c.Id[:12])
+ }
+ return strings.Join(ctrids, ",")
+ },
+ "podconnames": func(cons []*entities.ListPodContainer) string {
+ var ctrNames []string
+ for _, c := range cons {
+ ctrNames = append(ctrNames, c.Names[:12])
+ }
+ return strings.Join(ctrNames, ",")
+ },
+ "podconstatuses": func(cons []*entities.ListPodContainer) string {
+ var statuses []string
+ for _, c := range cons {
+ statuses = append(statuses, c.Status)
+ }
+ return strings.Join(statuses, ",")
+ },
+}
+
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
diff --git a/cmd/podmanV2/pods/ps.go b/cmd/podmanV2/pods/ps.go
index d4c625b2e..9546dff9e 100644
--- a/cmd/podmanV2/pods/ps.go
+++ b/cmd/podmanV2/pods/ps.go
@@ -1,8 +1,19 @@
package pods
import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+ "text/tabwriter"
+ "text/template"
+
"github.com/containers/libpod/cmd/podmanV2/registry"
+ "github.com/containers/libpod/cmd/podmanV2/report"
"github.com/containers/libpod/pkg/domain/entities"
+ "github.com/pkg/errors"
"github.com/spf13/cobra"
)
@@ -19,14 +30,137 @@ var (
}
)
+var (
+ defaultHeaders string = "POD ID\tNAME\tSTATUS\tCREATED"
+ inputFilters string
+ noTrunc bool
+ psInput entities.PodPSOptions
+)
+
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: psCmd,
Parent: podCmd,
})
+ flags := psCmd.Flags()
+ flags.BoolVar(&psInput.CtrNames, "ctr-names", false, "Display the container names")
+ flags.BoolVar(&psInput.CtrIds, "ctr-ids", false, "Display the container UUIDs. If no-trunc is not set they will be truncated")
+ flags.BoolVar(&psInput.CtrStatus, "ctr-status", false, "Display the container status")
+ // TODO should we make this a [] ?
+ flags.StringVarP(&inputFilters, "filter", "f", "", "Filter output based on conditions given")
+ flags.StringVar(&psInput.Format, "format", "", "Pretty-print pods to JSON or using a Go template")
+ flags.BoolVarP(&psInput.Latest, "latest", "l", false, "Act on the latest pod podman is aware of")
+ flags.BoolVar(&psInput.Namespace, "namespace", false, "Display namespace information of the pod")
+ flags.BoolVar(&psInput.Namespace, "ns", false, "Display namespace information of the pod")
+ flags.BoolVar(&noTrunc, "no-trunc", false, "Do not truncate pod and container IDs")
+ flags.BoolVarP(&psInput.Quiet, "quiet", "q", false, "Print the numeric IDs of the pods only")
+ flags.StringVar(&psInput.Sort, "sort", "created", "Sort output by created, id, name, or number")
+ if registry.IsRemote() {
+ _ = flags.MarkHidden("latest")
+ }
}
func pods(cmd *cobra.Command, args []string) error {
+ var (
+ w io.Writer = os.Stdout
+ row string
+ )
+ if cmd.Flag("filter").Changed {
+ for _, f := range strings.Split(inputFilters, ",") {
+ split := strings.Split(f, "=")
+ if len(split) < 2 {
+ return errors.Errorf("filter input must be in the form of filter=value: %s is invalid", f)
+ }
+ psInput.Filters[split[0]] = append(psInput.Filters[split[0]], split[1])
+ }
+ }
+ responses, err := registry.ContainerEngine().PodPs(context.Background(), psInput)
+ if err != nil {
+ return err
+ }
+
+ if psInput.Format == "json" {
+ b, err := json.MarshalIndent(responses, "", " ")
+ if err != nil {
+ return err
+ }
+ fmt.Println(string(b))
+ return nil
+ }
+ headers, row := createPodPsOut(cmd)
+ if psInput.Quiet {
+ if noTrunc {
+ row = "{{.Id}}\n"
+ } else {
+ row = "{{slice .Id 0 12}}\n"
+ }
+ }
+ if cmd.Flag("format").Changed {
+ row = psInput.Format
+ if !strings.HasPrefix(row, "\n") {
+ row += "\n"
+ }
+ }
+ format := "{{range . }}" + row + "{{end}}"
+ if !psInput.Quiet && !cmd.Flag("format").Changed {
+ format = headers + format
+ }
+ funcs := report.AppendFuncMap(podFuncMap)
+ tmpl, err := template.New("listPods").Funcs(funcs).Parse(format)
+ if err != nil {
+ return err
+ }
+ if !psInput.Quiet {
+ w = tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', 0)
+ }
+ if err := tmpl.Execute(w, responses); err != nil {
+ return err
+ }
+ if flusher, ok := w.(interface{ Flush() error }); ok {
+ return flusher.Flush()
+ }
return nil
}
+
+func createPodPsOut(cmd *cobra.Command) (string, string) {
+ var row string
+ headers := defaultHeaders
+ if noTrunc {
+ row += "{{.Id}}"
+ } else {
+ row += "{{slice .Id 0 12}}"
+ }
+
+ row += "\t{{.Name}}\t{{.Status}}\t{{humanDurationFromTime .Created}}"
+
+ //rowFormat string = "{{slice .Id 0 12}}\t{{.Name}}\t{{.Status}}\t{{humanDurationFromTime .Created}}"
+ if psInput.CtrIds {
+ headers += "\tIDS"
+ row += "\t{{podcids .Containers}}"
+ }
+ if psInput.CtrNames {
+ headers += "\tNAMES"
+ row += "\t{{podconnames .Containers}}"
+ }
+ if psInput.CtrStatus {
+ headers += "\tSTATUS"
+ row += "\t{{podconstatuses .Containers}}"
+ }
+ if psInput.Namespace {
+ headers += "\tCGROUP\tNAMESPACES"
+ row += "\t{{.Cgroup}}\t{{.Namespace}}"
+ }
+ if !psInput.CtrStatus && !psInput.CtrNames && !psInput.CtrIds {
+ headers += "\t# OF CONTAINERS"
+ row += "\t{{numCons .Containers}}"
+
+ }
+ headers += "\tINFRA ID\n"
+ if noTrunc {
+ row += "\t{{.InfraId}}\n"
+ } else {
+ row += "\t{{slice .InfraId 0 12}}\n"
+ }
+ return headers, row
+}
diff --git a/cmd/podmanV2/pods/stop.go b/cmd/podmanV2/pods/stop.go
index 2b61850e2..403c7d95d 100644
--- a/cmd/podmanV2/pods/stop.go
+++ b/cmd/podmanV2/pods/stop.go
@@ -26,7 +26,7 @@ var (
},
Example: `podman pod stop mywebserverpod
podman pod stop --latest
- podman pod stop --timeout 0 490eb 3557fb`,
+ podman pod stop --time 0 490eb 3557fb`,
}
)
@@ -47,19 +47,20 @@ func init() {
flags.BoolVarP(&stopOptions.All, "all", "a", false, "Stop all running pods")
flags.BoolVarP(&stopOptions.Ignore, "ignore", "i", false, "Ignore errors when a specified pod is missing")
flags.BoolVarP(&stopOptions.Latest, "latest", "l", false, "Stop the latest pod podman is aware of")
- flags.UintVarP(&timeout, "timeout", "t", 0, "Seconds to wait for pod stop before killing the container")
+ flags.UintVarP(&timeout, "time", "t", 0, "Seconds to wait for pod stop before killing the container")
if registry.IsRemote() {
_ = flags.MarkHidden("latest")
_ = flags.MarkHidden("ignore")
}
+ flags.SetNormalizeFunc(utils.AliasFlags)
}
func stop(cmd *cobra.Command, args []string) error {
var (
errs utils.OutputErrors
)
- if cmd.Flag("timeout").Changed {
+ if cmd.Flag("time").Changed {
stopOptions.Timeout = int(timeout)
}
responses, err := registry.ContainerEngine().PodStop(context.Background(), args, stopOptions)
diff --git a/cmd/podmanV2/registry/registry.go b/cmd/podmanV2/registry/registry.go
index 5cdb8a840..401f82718 100644
--- a/cmd/podmanV2/registry/registry.go
+++ b/cmd/podmanV2/registry/registry.go
@@ -3,7 +3,6 @@ package registry
import (
"context"
- "github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/containers/libpod/pkg/domain/infra"
"github.com/pkg/errors"
@@ -18,24 +17,24 @@ type CliCommand struct {
Parent *cobra.Command
}
-var (
- Commands []CliCommand
+const ExecErrorCodeGeneric = 125
- imageEngine entities.ImageEngine
- containerEngine entities.ContainerEngine
+var (
cliCtx context.Context
+ containerEngine entities.ContainerEngine
+ exitCode = ExecErrorCodeGeneric
+ imageEngine entities.ImageEngine
+ Commands []CliCommand
EngineOptions entities.EngineOptions
-
- ExitCode = define.ExecErrorCodeGeneric
)
func SetExitCode(code int) {
- ExitCode = code
+ exitCode = code
}
func GetExitCode() int {
- return ExitCode
+ return exitCode
}
// HelpTemplate returns the help template for podman commands
diff --git a/cmd/podmanV2/report/templates.go b/cmd/podmanV2/report/templates.go
index f3bc06405..e46048e97 100644
--- a/cmd/podmanV2/report/templates.go
+++ b/cmd/podmanV2/report/templates.go
@@ -19,6 +19,9 @@ var defaultFuncMap = template.FuncMap{
"humanDuration": func(t int64) string {
return units.HumanDuration(time.Since(time.Unix(t, 0))) + " ago"
},
+ "humanDurationFromTime": func(t time.Time) string {
+ return units.HumanDuration(time.Since(t)) + " ago"
+ },
"humanSize": func(sz int64) string {
s := units.HumanSizeWithPrecision(float64(sz), 3)
i := strings.LastIndexFunc(s, unicode.IsNumber)
diff --git a/cmd/podmanV2/root.go b/cmd/podmanV2/root.go
index cb4cb4e00..6fc12f57e 100644
--- a/cmd/podmanV2/root.go
+++ b/cmd/podmanV2/root.go
@@ -7,7 +7,6 @@ import (
"path"
"github.com/containers/libpod/cmd/podmanV2/registry"
- "github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/containers/libpod/version"
"github.com/sirupsen/logrus"
@@ -88,8 +87,8 @@ func Execute() {
o := registry.NewOptions(rootCmd.Context(), &registry.EngineOptions)
if err := rootCmd.ExecuteContext(o); err != nil {
fmt.Fprintln(os.Stderr, "Error:", err.Error())
- } else if registry.GetExitCode() == define.ExecErrorCodeGeneric {
- // The exitCode modified from define.ExecErrorCodeGeneric,
+ } else if registry.GetExitCode() == registry.ExecErrorCodeGeneric {
+ // The exitCode modified from registry.ExecErrorCodeGeneric,
// indicates an application
// running inside of a container failed, as opposed to the
// podman command failed. Must exit with that exit code
diff --git a/cmd/podmanV2/system/system.go b/cmd/podmanV2/system/system.go
index 30ed328e8..4e805c7bd 100644
--- a/cmd/podmanV2/system/system.go
+++ b/cmd/podmanV2/system/system.go
@@ -1,4 +1,4 @@
-package images
+package system
import (
"github.com/containers/libpod/cmd/podmanV2/registry"
diff --git a/cmd/podmanV2/utils/alias.go b/cmd/podmanV2/utils/alias.go
new file mode 100644
index 000000000..54b3c5e89
--- /dev/null
+++ b/cmd/podmanV2/utils/alias.go
@@ -0,0 +1,24 @@
+package utils
+
+import "github.com/spf13/pflag"
+
+// AliasFlags is a function to handle backwards compatability with old flags
+func AliasFlags(f *pflag.FlagSet, name string) pflag.NormalizedName {
+ switch name {
+ case "healthcheck-command":
+ name = "health-cmd"
+ case "healthcheck-interval":
+ name = "health-interval"
+ case "healthcheck-retries":
+ name = "health-retries"
+ case "healthcheck-start-period":
+ name = "health-start-period"
+ case "healthcheck-timeout":
+ name = "health-timeout"
+ case "net":
+ name = "network"
+ case "timeout":
+ name = "time"
+ }
+ return pflag.NormalizedName(name)
+}