summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.cirrus.yml3
-rw-r--r--.papr.sh3
-rw-r--r--.papr.yml1
-rw-r--r--Makefile5
-rw-r--r--cmd/podman/info.go3
-rw-r--r--cmd/podman/kill.go51
-rw-r--r--cmd/podman/pause.go72
-rw-r--r--cmd/podman/restart.go95
-rw-r--r--cmd/podman/run.go2
-rw-r--r--cmd/podman/shared/parallel.go27
-rw-r--r--cmd/podman/stop.go4
-rw-r--r--cmd/podman/unpause.go73
-rw-r--r--cmd/podman/version.go2
-rw-r--r--completions/bash/podman16
-rw-r--r--contrib/cirrus/README.md75
-rwxr-xr-xcontrib/cirrus/build_vm_images.sh4
-rw-r--r--contrib/cirrus/lib.sh36
-rw-r--r--contrib/cirrus/packer/fedora_setup.sh3
-rw-r--r--contrib/cirrus/packer/ubuntu_setup.sh7
-rw-r--r--contrib/python/podman/podman/libs/images.py2
-rw-r--r--contrib/python/pypodman/pypodman/lib/__init__.py5
-rw-r--r--contrib/python/pypodman/pypodman/lib/actions/commit_action.py32
-rw-r--r--contrib/python/pypodman/pypodman/lib/actions/export_action.py22
-rw-r--r--contrib/python/pypodman/pypodman/lib/actions/history_action.py2
-rw-r--r--contrib/python/pypodman/pypodman/lib/actions/images_action.py8
-rw-r--r--contrib/python/pypodman/pypodman/lib/actions/import_action.py41
-rw-r--r--contrib/python/pypodman/pypodman/lib/parser_actions.py51
-rw-r--r--contrib/python/pypodman/pypodman/lib/report.py29
-rw-r--r--docs/podman-kill.1.md2
-rw-r--r--docs/podman-pause.1.md19
-rw-r--r--docs/podman-restart.1.md26
-rw-r--r--docs/podman-unpause.1.md20
-rw-r--r--libpod/version.go10
-rw-r--r--pkg/util/utils.go2
-rw-r--r--pkg/varlinkapi/system.go13
-rw-r--r--test/e2e/config.go9
-rw-r--r--test/e2e/config_amd64.go11
-rw-r--r--test/e2e/config_ppc64le.go11
-rw-r--r--test/e2e/libpod_suite_test.go15
-rw-r--r--test/e2e/load_test.go3
-rw-r--r--test/e2e/logs_test.go6
-rw-r--r--test/e2e/pause_test.go66
-rw-r--r--test/e2e/pull_test.go4
-rw-r--r--test/e2e/push_test.go6
-rw-r--r--test/e2e/restart_test.go40
-rw-r--r--test/e2e/rmi_test.go11
-rw-r--r--test/e2e/rootless_test.go2
-rw-r--r--test/e2e/run_signal_test.go3
-rw-r--r--test/e2e/run_test.go10
-rw-r--r--test/e2e/search_test.go18
50 files changed, 767 insertions, 214 deletions
diff --git a/.cirrus.yml b/.cirrus.yml
index 65aef4b2f..f78205a49 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -47,6 +47,7 @@ full_vm_testing_task:
#image_name: "rhel-server-ec2-7-5-165-1-libpod-fce09afe"
#image_name: "centos-7-v20180911-libpod-fce09afe"
#image_name: "fedora-cloud-base-28-1-1-7-libpod-fce09afe"
+
timeout_in: 120m
# Every *_script runs in sequence, for each task. The name prefix is for
@@ -101,6 +102,8 @@ build_vm_images_task:
# Version of packer to use
PACKER_VER: "1.3.1"
+ # VMs created by packer are not cleaned up by cirrus
+ auto_cancellation: $CI != "true"
gce_instance:
image_name: "image-builder-image" # Simply CentOS 7 + packer dependencies
diff --git a/.papr.sh b/.papr.sh
index 120b3d94b..284326709 100644
--- a/.papr.sh
+++ b/.papr.sh
@@ -139,6 +139,3 @@ if [ $integrationtest -eq 1 ]; then
fi
make ginkgo GOPATH=/go $INTEGRATION_TEST_ENVS
fi
-
-
-exit 0
diff --git a/.papr.yml b/.papr.yml
index 8a043a04a..26b527a36 100644
--- a/.papr.yml
+++ b/.papr.yml
@@ -163,6 +163,7 @@ packages:
- python3-dateutil
- python3-psutil
- container-selinux
+ - https://kojipkgs.fedoraproject.org//packages/runc/1.0.0/54.dev.git00dc700.fc28/x86_64/runc-1.0.0-54.dev.git00dc700.fc28.x86_64.rpm
tests:
- sed 's/^expand-check.*/expand-check=0/g' -i /etc/selinux/semanage.conf
diff --git a/Makefile b/Makefile
index b3e2fcc26..ae1b263ad 100644
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,7 @@ BUILDTAGS_CROSS ?= containers_image_openpgp containers_image_ostree_stub exclude
ifneq (,$(findstring varlink,$(BUILDTAGS)))
PODMAN_VARLINK_DEPENDENCIES = cmd/podman/varlink/iopodman.go
endif
-CONTAINER_RUNTIME := $(shell command -v podman 2> /dev/null | echo docker)
+CONTAINER_RUNTIME := $(shell command -v podman 2> /dev/null || echo docker)
HAS_PYTHON3 := $(shell command -v python3 2>/dev/null)
@@ -36,7 +36,8 @@ PACKAGES ?= $(shell $(GO) list -tags "${BUILDTAGS}" ./... | grep -v github.com/c
COMMIT_NO ?= $(shell git rev-parse HEAD 2> /dev/null || true)
GIT_COMMIT ?= $(if $(shell git status --porcelain --untracked-files=no),"${COMMIT_NO}-dirty","${COMMIT_NO}")
BUILD_INFO ?= $(shell date +%s)
-LDFLAGS_PODMAN ?= $(LDFLAGS) -X main.gitCommit=$(GIT_COMMIT) -X main.buildInfo=$(BUILD_INFO)
+LIBPOD := ${PROJECT}/libpod
+LDFLAGS_PODMAN ?= $(LDFLAGS) -X $(LIBPOD).gitCommit=$(GIT_COMMIT) -X $(LIBPOD).buildInfo=$(BUILD_INFO)
ISODATE ?= $(shell date --iso-8601)
LIBSECCOMP_COMMIT := release-2.3
diff --git a/cmd/podman/info.go b/cmd/podman/info.go
index 563e63ba3..c0639725e 100644
--- a/cmd/podman/info.go
+++ b/cmd/podman/info.go
@@ -81,6 +81,7 @@ func debugInfo(c *cli.Context) map[string]interface{} {
info["compiler"] = runtime.Compiler
info["go version"] = runtime.Version()
info["podman version"] = c.App.Version
- info["git commit"] = libpod.GitCommit
+ version, _ := libpod.GetVersion()
+ info["git commit"] = version.GitCommit
return info
}
diff --git a/cmd/podman/kill.go b/cmd/podman/kill.go
index 7ca5bd7c5..27882aeee 100644
--- a/cmd/podman/kill.go
+++ b/cmd/podman/kill.go
@@ -1,15 +1,16 @@
package main
import (
- "os"
+ "fmt"
"syscall"
- "fmt"
"github.com/containers/libpod/cmd/podman/libpodruntime"
+ "github.com/containers/libpod/cmd/podman/shared"
"github.com/containers/libpod/libpod"
"github.com/containers/libpod/pkg/rootless"
"github.com/docker/docker/pkg/signal"
"github.com/pkg/errors"
+ "github.com/sirupsen/logrus"
"github.com/urfave/cli"
)
@@ -41,6 +42,12 @@ var (
// killCmd kills one or more containers with a signal
func killCmd(c *cli.Context) error {
+ var (
+ lastError error
+ killFuncs []shared.ParallelWorkerInput
+ killSignal uint = uint(syscall.SIGTERM)
+ )
+
if err := checkAllAndLatest(c); err != nil {
return err
}
@@ -56,7 +63,6 @@ func killCmd(c *cli.Context) error {
}
defer runtime.Shutdown(false)
- var killSignal uint = uint(syscall.SIGTERM)
if c.String("signal") != "" {
// Check if the signalString provided by the user is valid
// Invalid signals will return err
@@ -67,17 +73,40 @@ func killCmd(c *cli.Context) error {
killSignal = uint(sysSignal)
}
- containers, lastError := getAllOrLatestContainers(c, runtime, libpod.ContainerStateRunning, "running")
-
+ containers, err := getAllOrLatestContainers(c, runtime, libpod.ContainerStateRunning, "running")
+ if err != nil {
+ return err
+ }
for _, ctr := range containers {
- if err := ctr.Kill(killSignal); err != nil {
- if lastError != nil {
- fmt.Fprintln(os.Stderr, lastError)
+ con := ctr
+ f := func() error {
+ return con.Kill(killSignal)
+ }
+
+ killFuncs = append(killFuncs, shared.ParallelWorkerInput{
+ ContainerID: con.ID(),
+ ParallelFunc: f,
+ })
+ }
+
+ maxWorkers := shared.Parallelize("kill")
+ if c.GlobalIsSet("max-workers") {
+ maxWorkers = c.GlobalInt("max-workers")
+ }
+ logrus.Debugf("Setting maximum workers to %d", maxWorkers)
+
+ killErrors := shared.ParallelExecuteWorkerPool(maxWorkers, killFuncs)
+
+ for cid, result := range killErrors {
+ if result != nil {
+ if len(killErrors) > 1 {
+ fmt.Println(result.Error())
}
- lastError = errors.Wrapf(err, "unable to find container %v", ctr.ID())
- } else {
- fmt.Println(ctr.ID())
+ lastError = result
+ continue
}
+ fmt.Println(cid)
}
+
return lastError
}
diff --git a/cmd/podman/pause.go b/cmd/podman/pause.go
index 203fa6070..1e1585216 100644
--- a/cmd/podman/pause.go
+++ b/cmd/podman/pause.go
@@ -5,11 +5,20 @@ import (
"os"
"github.com/containers/libpod/cmd/podman/libpodruntime"
+ "github.com/containers/libpod/cmd/podman/shared"
+ "github.com/containers/libpod/libpod"
"github.com/pkg/errors"
+ "github.com/sirupsen/logrus"
"github.com/urfave/cli"
)
var (
+ pauseFlags = []cli.Flag{
+ cli.BoolFlag{
+ Name: "all, a",
+ Usage: "pause all running containers",
+ },
+ }
pauseDescription = `
podman pause
@@ -19,6 +28,7 @@ var (
Name: "pause",
Usage: "Pauses all the processes in one or more containers",
Description: pauseDescription,
+ Flags: pauseFlags,
Action: pauseCmd,
ArgsUsage: "CONTAINER-NAME [CONTAINER-NAME ...]",
OnUsageError: usageErrorHandler,
@@ -26,6 +36,11 @@ var (
)
func pauseCmd(c *cli.Context) error {
+ var (
+ lastError error
+ pauseContainers []*libpod.Container
+ pauseFuncs []shared.ParallelWorkerInput
+ )
if os.Geteuid() != 0 {
return errors.New("pause is not supported for rootless containers")
}
@@ -37,28 +52,55 @@ func pauseCmd(c *cli.Context) error {
defer runtime.Shutdown(false)
args := c.Args()
- if len(args) < 1 {
+ if len(args) < 1 && !c.Bool("all") {
return errors.Errorf("you must provide at least one container name or id")
}
-
- var lastError error
- for _, arg := range args {
- ctr, err := runtime.LookupContainer(arg)
+ if c.Bool("all") {
+ containers, err := getAllOrLatestContainers(c, runtime, libpod.ContainerStateRunning, "running")
if err != nil {
- if lastError != nil {
- fmt.Fprintln(os.Stderr, lastError)
+ return err
+ }
+ pauseContainers = append(pauseContainers, containers...)
+ } else {
+ for _, arg := range args {
+ ctr, err := runtime.LookupContainer(arg)
+ if err != nil {
+ return err
}
- lastError = errors.Wrapf(err, "error looking up container %q", arg)
- continue
+ pauseContainers = append(pauseContainers, ctr)
+ }
+ }
+
+ // Now assemble the slice of pauseFuncs
+ for _, ctr := range pauseContainers {
+ con := ctr
+
+ f := func() error {
+ return con.Pause()
}
- if err = ctr.Pause(); err != nil {
- if lastError != nil {
- fmt.Fprintln(os.Stderr, lastError)
+ pauseFuncs = append(pauseFuncs, shared.ParallelWorkerInput{
+ ContainerID: con.ID(),
+ ParallelFunc: f,
+ })
+ }
+
+ maxWorkers := shared.Parallelize("pause")
+ if c.GlobalIsSet("max-workers") {
+ maxWorkers = c.GlobalInt("max-workers")
+ }
+ logrus.Debugf("Setting maximum workers to %d", maxWorkers)
+
+ pauseErrors := shared.ParallelExecuteWorkerPool(maxWorkers, pauseFuncs)
+
+ for cid, result := range pauseErrors {
+ if result != nil {
+ if len(pauseErrors) > 1 {
+ fmt.Println(result.Error())
}
- lastError = errors.Wrapf(err, "failed to pause container %v", ctr.ID())
- } else {
- fmt.Println(ctr.ID())
+ lastError = result
+ continue
}
+ fmt.Println(cid)
}
return lastError
}
diff --git a/cmd/podman/restart.go b/cmd/podman/restart.go
index 7b48ef24e..2e264db79 100644
--- a/cmd/podman/restart.go
+++ b/cmd/podman/restart.go
@@ -1,18 +1,26 @@
package main
import (
- "context"
"fmt"
- "os"
"github.com/containers/libpod/cmd/podman/libpodruntime"
+ "github.com/containers/libpod/cmd/podman/shared"
"github.com/containers/libpod/libpod"
"github.com/pkg/errors"
+ "github.com/sirupsen/logrus"
"github.com/urfave/cli"
)
var (
restartFlags = []cli.Flag{
+ cli.BoolFlag{
+ Name: "all, a",
+ Usage: "restart all non-running containers",
+ },
+ cli.BoolFlag{
+ Name: "running",
+ Usage: "restart only running containers when --all is used",
+ },
cli.UintFlag{
Name: "timeout, time, t",
Usage: "Seconds to wait for stop before killing the container",
@@ -35,11 +43,19 @@ var (
)
func restartCmd(c *cli.Context) error {
+ var (
+ restartFuncs []shared.ParallelWorkerInput
+ containers []*libpod.Container
+ lastError error
+ restartContainers []*libpod.Container
+ )
+
args := c.Args()
- if len(args) < 1 && !c.Bool("latest") {
+ runOnly := c.Bool("running")
+ all := c.Bool("all")
+ if len(args) < 1 && !c.Bool("latest") && !all {
return errors.Wrapf(libpod.ErrInvalidArg, "you must provide at least one container name or ID")
}
-
if err := validateFlags(c, restartFlags); err != nil {
return err
}
@@ -50,8 +66,6 @@ func restartCmd(c *cli.Context) error {
}
defer runtime.Shutdown(false)
- var lastError error
-
timeout := c.Uint("timeout")
useTimeout := c.IsSet("timeout")
@@ -59,39 +73,66 @@ func restartCmd(c *cli.Context) error {
if c.Bool("latest") {
lastCtr, err := runtime.GetLatestContainer()
if err != nil {
- lastError = errors.Wrapf(err, "unable to get latest container")
- } else {
- ctrTimeout := lastCtr.StopTimeout()
- if useTimeout {
- ctrTimeout = timeout
- }
-
- lastError = lastCtr.RestartWithTimeout(context.TODO(), ctrTimeout)
+ return errors.Wrapf(err, "unable to get latest container")
}
- }
-
- for _, id := range args {
- ctr, err := runtime.LookupContainer(id)
+ restartContainers = append(restartContainers, lastCtr)
+ } else if runOnly {
+ containers, err = getAllOrLatestContainers(c, runtime, libpod.ContainerStateRunning, "running")
if err != nil {
- if lastError != nil {
- fmt.Fprintln(os.Stderr, lastError)
+ return err
+ }
+ restartContainers = append(restartContainers, containers...)
+ } else if all {
+ containers, err = runtime.GetAllContainers()
+ if err != nil {
+ return err
+ }
+ restartContainers = append(restartContainers, containers...)
+ } else {
+ for _, id := range args {
+ ctr, err := runtime.LookupContainer(id)
+ if err != nil {
+ return err
}
- lastError = errors.Wrapf(err, "unable to find container %s", id)
- continue
+ restartContainers = append(restartContainers, ctr)
}
+ }
+ // We now have a slice of all the containers to be restarted. Iterate them to
+ // create restart Funcs with a timeout as needed
+ for _, ctr := range restartContainers {
+ con := ctr
ctrTimeout := ctr.StopTimeout()
if useTimeout {
ctrTimeout = timeout
}
- if err := ctr.RestartWithTimeout(context.TODO(), ctrTimeout); err != nil {
- if lastError != nil {
- fmt.Fprintln(os.Stderr, lastError)
- }
- lastError = errors.Wrapf(err, "error restarting container %s", ctr.ID())
+ f := func() error {
+ return con.RestartWithTimeout(getContext(), ctrTimeout)
}
+
+ restartFuncs = append(restartFuncs, shared.ParallelWorkerInput{
+ ContainerID: con.ID(),
+ ParallelFunc: f,
+ })
+ }
+
+ maxWorkers := shared.Parallelize("restart")
+ if c.GlobalIsSet("max-workers") {
+ maxWorkers = c.GlobalInt("max-workers")
}
+ logrus.Debugf("Setting maximum workers to %d", maxWorkers)
+
+ restartErrors := shared.ParallelExecuteWorkerPool(maxWorkers, restartFuncs)
+
+ for cid, result := range restartErrors {
+ if result != nil {
+ fmt.Println(result.Error())
+ lastError = result
+ continue
+ }
+ fmt.Println(cid)
+ }
return lastError
}
diff --git a/cmd/podman/run.go b/cmd/podman/run.go
index e4b25eaf4..af6ced45d 100644
--- a/cmd/podman/run.go
+++ b/cmd/podman/run.go
@@ -96,8 +96,6 @@ func runCmd(c *cli.Context) error {
inputStream = nil
}
- inputStream = nil
-
attachTo := c.StringSlice("attach")
for _, stream := range attachTo {
switch strings.ToLower(stream) {
diff --git a/cmd/podman/shared/parallel.go b/cmd/podman/shared/parallel.go
index 03eba2f0b..633781a45 100644
--- a/cmd/podman/shared/parallel.go
+++ b/cmd/podman/shared/parallel.go
@@ -72,20 +72,37 @@ func ParallelExecuteWorkerPool(workers int, functions []ParallelWorkerInput) map
func Parallelize(job string) int {
numCpus := runtime.NumCPU()
switch job {
+ case "kill":
+ if numCpus <= 3 {
+ return numCpus * 3
+ }
+ return numCpus * 4
+ case "pause":
+ if numCpus <= 3 {
+ return numCpus * 3
+ }
+ return numCpus * 4
+ case "ps":
+ return 8
+ case "restart":
+ return numCpus * 2
+ case "rm":
+ if numCpus <= 3 {
+ return numCpus * 3
+ } else {
+ return numCpus * 4
+ }
case "stop":
if numCpus <= 2 {
return 4
} else {
return numCpus * 3
}
- case "rm":
+ case "unpause":
if numCpus <= 3 {
return numCpus * 3
- } else {
- return numCpus * 4
}
- case "ps":
- return 8
+ return numCpus * 4
}
return 3
}
diff --git a/cmd/podman/stop.go b/cmd/podman/stop.go
index afeb49f76..cb36fd5cd 100644
--- a/cmd/podman/stop.go
+++ b/cmd/podman/stop.go
@@ -89,7 +89,9 @@ func stopCmd(c *cli.Context) error {
for cid, result := range stopErrors {
if result != nil && result != libpod.ErrCtrStopped {
- fmt.Println(result.Error())
+ if len(stopErrors) > 1 {
+ fmt.Println(result.Error())
+ }
lastError = result
continue
}
diff --git a/cmd/podman/unpause.go b/cmd/podman/unpause.go
index a792aaf6d..648fc9d3d 100644
--- a/cmd/podman/unpause.go
+++ b/cmd/podman/unpause.go
@@ -5,11 +5,20 @@ import (
"os"
"github.com/containers/libpod/cmd/podman/libpodruntime"
+ "github.com/containers/libpod/cmd/podman/shared"
+ "github.com/containers/libpod/libpod"
"github.com/pkg/errors"
+ "github.com/sirupsen/logrus"
"github.com/urfave/cli"
)
var (
+ unpauseFlags = []cli.Flag{
+ cli.BoolFlag{
+ Name: "all, a",
+ Usage: "unpause all paused containers",
+ },
+ }
unpauseDescription = `
podman unpause
@@ -19,6 +28,7 @@ var (
Name: "unpause",
Usage: "Unpause the processes in one or more containers",
Description: unpauseDescription,
+ Flags: unpauseFlags,
Action: unpauseCmd,
ArgsUsage: "CONTAINER-NAME [CONTAINER-NAME ...]",
OnUsageError: usageErrorHandler,
@@ -26,6 +36,11 @@ var (
)
func unpauseCmd(c *cli.Context) error {
+ var (
+ lastError error
+ unpauseContainers []*libpod.Container
+ unpauseFuncs []shared.ParallelWorkerInput
+ )
if os.Geteuid() != 0 {
return errors.New("unpause is not supported for rootless containers")
}
@@ -37,28 +52,56 @@ func unpauseCmd(c *cli.Context) error {
defer runtime.Shutdown(false)
args := c.Args()
- if len(args) < 1 {
+ if len(args) < 1 && !c.Bool("all") {
return errors.Errorf("you must provide at least one container name or id")
}
-
- var lastError error
- for _, arg := range args {
- ctr, err := runtime.LookupContainer(arg)
+ if c.Bool("all") {
+ cs, err := getAllOrLatestContainers(c, runtime, libpod.ContainerStatePaused, "paused")
if err != nil {
- if lastError != nil {
- fmt.Fprintln(os.Stderr, lastError)
+ return err
+ }
+ unpauseContainers = append(unpauseContainers, cs...)
+ } else {
+ for _, arg := range args {
+ ctr, err := runtime.LookupContainer(arg)
+ if err != nil {
+ return err
}
- lastError = errors.Wrapf(err, "error looking up container %q", arg)
- continue
+ unpauseContainers = append(unpauseContainers, ctr)
}
- if err = ctr.Unpause(); err != nil {
- if lastError != nil {
- fmt.Fprintln(os.Stderr, lastError)
+ }
+
+ // Assemble the unpause funcs
+ for _, ctr := range unpauseContainers {
+ con := ctr
+ f := func() error {
+ return con.Unpause()
+ }
+
+ unpauseFuncs = append(unpauseFuncs, shared.ParallelWorkerInput{
+ ContainerID: con.ID(),
+ ParallelFunc: f,
+ })
+ }
+
+ maxWorkers := shared.Parallelize("unpause")
+ if c.GlobalIsSet("max-workers") {
+ maxWorkers = c.GlobalInt("max-workers")
+ }
+ logrus.Debugf("Setting maximum workers to %d", maxWorkers)
+
+ unpauseErrors := shared.ParallelExecuteWorkerPool(maxWorkers, unpauseFuncs)
+
+ for cid, result := range unpauseErrors {
+ if result != nil && result != libpod.ErrCtrStopped {
+ if len(unpauseErrors) > 1 {
+ fmt.Println(result.Error())
}
- lastError = errors.Wrapf(err, "failed to unpause container %v", ctr.ID())
- } else {
- fmt.Println(ctr.ID())
+ lastError = result
+ continue
}
+ fmt.Println(cid)
}
+
return lastError
}
diff --git a/cmd/podman/version.go b/cmd/podman/version.go
index f896229c4..d80f24a14 100644
--- a/cmd/podman/version.go
+++ b/cmd/podman/version.go
@@ -21,7 +21,7 @@ func versionCmd(c *cli.Context) error {
fmt.Println("Git Commit: ", output.GitCommit)
}
// Prints out the build time in readable format
- if libpod.BuildInfo != "" {
+ if output.Built != 0 {
fmt.Println("Built: ", time.Unix(output.Built, 0).Format(time.ANSIC))
}
diff --git a/completions/bash/podman b/completions/bash/podman
index 5cfed348f..c029f893a 100644
--- a/completions/bash/podman
+++ b/completions/bash/podman
@@ -1,5 +1,6 @@
: ${PROG:=$(basename ${BASH_SOURCE})}
+
__podman_previous_extglob_setting=$(shopt -p extglob)
shopt -s extglob
@@ -1770,8 +1771,13 @@ _podman_restart() {
--timeout -t
"
local boolean_options="
+ --all
+ -a
--latest
- -l"
+ -l
+ --running
+ --timeout
+ -t"
case "$cur" in
-*)
COMPREPLY=($(compgen -W "$boolean_options $options_with_args" -- "$cur"))
@@ -1929,6 +1935,10 @@ _podman_save() {
}
_podman_pause() {
+ local boolean_options="
+ -a
+ --all
+ "
local options_with_args="
--help -h
"
@@ -2030,6 +2040,10 @@ _podman_stop() {
}
_podman_unpause() {
+ local boolean_options="
+ -a
+ --all
+ "
local options_with_args="
--help -h
"
diff --git a/contrib/cirrus/README.md b/contrib/cirrus/README.md
new file mode 100644
index 000000000..0d315c4f5
--- /dev/null
+++ b/contrib/cirrus/README.md
@@ -0,0 +1,75 @@
+![PODMAN logo](../../logo/podman-logo-source.svg)
+
+# Cirrus-CI
+
+Similar to other integrated github CI/CD services, Cirrus utilizes a simple
+YAML-based configuration/description file: ``.cirrus.yml``. Ref: https://cirrus-ci.org/
+
+## Workflow
+
+All tasks execute in parallel, unless there are conditions or dependencies
+which alter this behavior. Within each task, each script executes in sequence,
+so long as any previous script exited successfully. The overall state of each
+task (pass or fail) is set based on the exit status of the last script to execute.
+
+### ``full_vm_testing`` Task
+
+1. Unconditionally, spin up one VM per ``matrix: image_name`` item defined
+ in ``.cirrus.yml``. Once accessible, ``ssh`` into each VM and run the following
+ scripts.
+
+2. ``setup_environment.sh``: Configure root's ``.bash_profile``
+ for all subsequent scripts (each run in a new shell). Any
+ distribution-specific environment variables are also defined
+ here. For example, setting tags/flags to use compiling.
+
+3. ``verify_source.sh``: Perform per-distribution source
+ verification, lint-checking, etc. This acts as a minimal
+ gate, blocking extended use of VMs when a PR's code or commits
+ would otherwise not be accepted. Should run for less than a minute.
+
+4. ``unit_test.sh``: Execute unit-testing, as defined by the ``Makefile``.
+ This should execute within 10-minutes, but often much faster.
+
+5. ``integration_test.sh``: Execute integration-testing. This is
+ much more involved, and relies on access to external
+ resources like container images and code from other repositories.
+ Total execution time is capped at 2-hours (includes all the above)
+ but this script normally completes in less than an hour.
+
+### ``build_vm_images`` Task
+
+1. When a PR is merged (``$CIRRUS_BRANCH`` == ``master``), run another
+ round of the ``full_vm_testing`` task (above).
+
+2. After confirming the tests all pass post-merge, spin up a special VM
+ capable of communicating with the GCE API. Once accessible, ``ssh`` into
+ the special VM and run the following scripts.
+
+3. ``setup_environment.sh``: Configure root's ``.bash_profile``
+ for all subsequent scripts (each run in a new shell). Any
+ distribution-specific environment variables are also defined
+ here. For example, setting tags/flags to use compiling.
+
+4. ``build_vm_images.sh``: Examine the merged PR's description on github.
+ If it contains the magic string ``***CIRRUS: REBUILD IMAGES***``, then
+ continue. Otherwise display a message, take no further action, and
+ exit successfully. This prevents production of new VM images unless
+ they are called for, thereby saving the cost of needlessly storing them.
+
+5. If the magic string was found, utilize [the packer tool](http://packer.io/docs/)
+ to produce new VM images. Create a new VM from each base-image, connect
+ to them with ``ssh``, and perform these steps as defined by the
+ ``libpod_images.json`` file.
+
+ 1. Copy the current state of the repository into ``/tmp/libpod``.
+ 2. Execute distribution-specific scripts to prepare the image for
+ use by the ``full_vm_testing`` task (above).
+ 3. If successful, shut down each VM and create a new GCE Image
+ named after the base image and the commit sha of the merge.
+
+***Note:*** The ``.cirrus.yml`` file must be manually updated with the new
+images names, then the change sent in via a secondary pull-request. This
+ensures that all the ``full_vm_testing`` tasks can pass with the new images,
+before subjecting all future PRs to them. A workflow to automate this
+process is described in comments at the end of the ``.cirrus.yml`` file.
diff --git a/contrib/cirrus/build_vm_images.sh b/contrib/cirrus/build_vm_images.sh
index 80c689a6c..ffbb2d5d5 100755
--- a/contrib/cirrus/build_vm_images.sh
+++ b/contrib/cirrus/build_vm_images.sh
@@ -22,9 +22,7 @@ SCRIPT_BASE $SCRIPT_BASE
PACKER_BASE $PACKER_BASE
"
-# TODO: Skip building images if $CIRRUS_BRANCH =~ "master" and
-# commit message of $CIRRUS_CHANGE_IN_REPO contains a magic word
-# produced by 'commit_and_create_upstream_pr.sh' script (see .cirrus.yml)
+require_regex '\*\*\*\s*CIRRUS:\s*REBUILD\s*IMAGES\s*\*\*\*' 'Not re-building VM images'
show_env_vars
diff --git a/contrib/cirrus/lib.sh b/contrib/cirrus/lib.sh
index 1e0052a65..2fa91258b 100644
--- a/contrib/cirrus/lib.sh
+++ b/contrib/cirrus/lib.sh
@@ -117,6 +117,22 @@ cdsudo() {
sudo --preserve-env=GOPATH --non-interactive bash -c "$CMD"
}
+# Skip a build if $1 does not match in the PR Title/Description with message $2
+require_regex() {
+ req_env_var "
+ CIRRUS_CHANGE_MESSAGE $CIRRUS_CHANGE_MESSAGE
+ 1 $1
+ 2 $2
+ "
+ regex="$1"
+ msg="$2"
+ if ! echo "$CIRRUS_CHANGE_MESSAGE" | egrep -q "$regex"
+ then
+ echo "***** The PR Title/Description did not match the regular expression: $MAGIC_RE"
+ echo "***** $msg"
+ exit 0
+ fi
+}
# Helper/wrapper script to only show stderr/stdout on non-zero exit
install_ooe() {
@@ -142,8 +158,8 @@ EOF
install_cni_plugins() {
echo "Installing CNI Plugins from commit $CNI_COMMIT"
req_env_var "
- GOPATH $GOPATH
- CNI_COMMIT $CNI_COMMIT
+ GOPATH $GOPATH
+ CNI_COMMIT $CNI_COMMIT
"
DEST="$GOPATH/src/github.com/containernetworking/plugins"
rm -rf "$DEST"
@@ -160,9 +176,9 @@ install_runc(){
echo "Installing RunC from commit $RUNC_COMMIT"
echo "Platform is $OS_RELEASE_ID"
req_env_var "
- GOPATH $GOPATH
- RUNC_COMMIT $RUNC_COMMIT
- OS_RELEASE_ID $OS_RELEASE_ID
+ GOPATH $GOPATH
+ RUNC_COMMIT $RUNC_COMMIT
+ OS_RELEASE_ID $OS_RELEASE_ID
"
if [[ "$OS_RELEASE_ID" =~ "ubuntu" ]]; then
echo "Running make install.libseccomp.sudo for ubuntu"
@@ -202,8 +218,8 @@ install_buildah() {
install_conmon(){
echo "Installing conmon from commit $CRIO_COMMIT"
req_env_var "
- GOPATH $GOPATH
- CRIO_COMMIT $CRIO_COMMIT
+ GOPATH $GOPATH
+ CRIO_COMMIT $CRIO_COMMIT
"
DEST="$GOPATH/src/github.com/kubernetes-sigs/cri-o.git"
rm -rf "$DEST"
@@ -234,8 +250,8 @@ install_criu(){
install_testing_dependencies() {
echo "Installing ginkgo, gomega, and easyjson into \$GOPATH=$GOPATH"
req_env_var "
- GOPATH $GOPATH
- GOSRC $GOSRC
+ GOPATH $GOPATH
+ GOSRC $GOSRC
"
cd "$GOSRC"
ooe.sh go get -u github.com/onsi/ginkgo/ginkgo
@@ -263,7 +279,7 @@ install_varlink(){
_finalize(){
echo "Removing leftover giblets from cloud-init"
cd /
- sudo rm -rf /var/lib/cloud
+ sudo rm -rf /var/lib/cloud/instance?
sudo rm -rf /root/.ssh/*
sudo rm -rf /home/*
}
diff --git a/contrib/cirrus/packer/fedora_setup.sh b/contrib/cirrus/packer/fedora_setup.sh
index 16b6e4e6b..f9fea04a7 100644
--- a/contrib/cirrus/packer/fedora_setup.sh
+++ b/contrib/cirrus/packer/fedora_setup.sh
@@ -21,8 +21,7 @@ install_ooe
export GOPATH="$(mktemp -d)"
trap "sudo rm -rf $GOPATH" EXIT
-# breaks networking on f28/29 in GCE
-# ooe.sh sudo dnf update -y
+ooe.sh sudo dnf update -y
ooe.sh sudo dnf install -y \
atomic-registries \
diff --git a/contrib/cirrus/packer/ubuntu_setup.sh b/contrib/cirrus/packer/ubuntu_setup.sh
index ff20944dc..4cf1f335b 100644
--- a/contrib/cirrus/packer/ubuntu_setup.sh
+++ b/contrib/cirrus/packer/ubuntu_setup.sh
@@ -21,9 +21,10 @@ install_ooe
export GOPATH="$(mktemp -d)"
trap "sudo rm -rf $GOPATH" EXIT
-ooe.sh sudo apt-get -qq update
-ooe.sh sudo apt-get -qq update # sometimes it needs to get it twice :S
-ooe.sh sudo apt-get -qq upgrade
+# Try twice as workaround for minor networking problems
+echo "Updating system and installing package dependencies"
+ooe.sh sudo apt-get -qq update || sudo apt-get -qq update
+ooe.sh sudo apt-get -qq upgrade || sudo apt-get -qq upgrade
ooe.sh sudo apt-get -qq install --no-install-recommends \
apparmor \
autoconf \
diff --git a/contrib/python/podman/podman/libs/images.py b/contrib/python/podman/podman/libs/images.py
index 982546cd2..9453fb416 100644
--- a/contrib/python/podman/podman/libs/images.py
+++ b/contrib/python/podman/podman/libs/images.py
@@ -137,7 +137,7 @@ class Images():
results = podman.DeleteUnusedImages()
return results['images']
- def import_image(self, source, reference, message=None, changes=None):
+ def import_image(self, source, reference, message='', changes=None):
"""Read image tarball from source and save in image store."""
with self._client() as podman:
results = podman.ImportImage(source, reference, message, changes)
diff --git a/contrib/python/pypodman/pypodman/lib/__init__.py b/contrib/python/pypodman/pypodman/lib/__init__.py
index 5525ddaef..be1b5f467 100644
--- a/contrib/python/pypodman/pypodman/lib/__init__.py
+++ b/contrib/python/pypodman/pypodman/lib/__init__.py
@@ -4,14 +4,15 @@ import sys
import podman
from pypodman.lib.action_base import AbstractActionBase
from pypodman.lib.parser_actions import (BooleanAction, BooleanValidate,
- PathAction, PositiveIntAction,
- UnitAction)
+ ChangeAction, PathAction,
+ PositiveIntAction, UnitAction)
from pypodman.lib.podman_parser import PodmanArgumentParser
from pypodman.lib.report import Report, ReportColumn
# Silence pylint overlording...
assert BooleanAction
assert BooleanValidate
+assert ChangeAction
assert PathAction
assert PositiveIntAction
assert UnitAction
diff --git a/contrib/python/pypodman/pypodman/lib/actions/commit_action.py b/contrib/python/pypodman/pypodman/lib/actions/commit_action.py
index 0da6a2078..21665ad0b 100644
--- a/contrib/python/pypodman/pypodman/lib/actions/commit_action.py
+++ b/contrib/python/pypodman/pypodman/lib/actions/commit_action.py
@@ -2,7 +2,7 @@
import sys
import podman
-from pypodman.lib import AbstractActionBase, BooleanAction
+from pypodman.lib import AbstractActionBase, BooleanAction, ChangeAction
class Commit(AbstractActionBase):
@@ -12,7 +12,9 @@ class Commit(AbstractActionBase):
def subparser(cls, parent):
"""Add Commit command to parent parser."""
parser = parent.add_parser(
- 'commit', help='create image from container')
+ 'commit',
+ help='create image from container',
+ )
parser.add_argument(
'--author',
help='Set the author for the committed image',
@@ -20,11 +22,7 @@ class Commit(AbstractActionBase):
parser.add_argument(
'--change',
'-c',
- choices=('CMD', 'ENTRYPOINT', 'ENV', 'EXPOSE', 'LABEL', 'ONBUILD',
- 'STOPSIGNAL', 'USER', 'VOLUME', 'WORKDIR'),
- action='append',
- type=str.upper,
- help='Apply the following possible changes to the created image',
+ action=ChangeAction,
)
parser.add_argument(
'--format',
@@ -69,27 +67,11 @@ class Commit(AbstractActionBase):
)
parser.set_defaults(class_=cls, method='commit')
- def __init__(self, args):
- """Construct Commit class."""
- if not args.container:
- raise ValueError('You must supply one container id'
- ' or name to be used as source.')
- if not args.image:
- raise ValueError('You must supply one image id'
- ' or name to be created.')
- super().__init__(args)
-
- # used only on client
- del self.opts['image']
- del self.opts['container']
-
def commit(self):
"""Create image from container."""
try:
try:
ctnr = self.client.containers.get(self._args.container[0])
- ident = ctnr.commit(**self.opts)
- print(ident)
except podman.ContainerNotFound as e:
sys.stdout.flush()
print(
@@ -97,6 +79,9 @@ class Commit(AbstractActionBase):
file=sys.stderr,
flush=True)
return 1
+ else:
+ ident = ctnr.commit(self.opts['image'][0], **self.opts)
+ print(ident)
except podman.ErrorOccurred as e:
sys.stdout.flush()
print(
@@ -104,3 +89,4 @@ class Commit(AbstractActionBase):
file=sys.stderr,
flush=True)
return 1
+ return 0
diff --git a/contrib/python/pypodman/pypodman/lib/actions/export_action.py b/contrib/python/pypodman/pypodman/lib/actions/export_action.py
index f62cd3535..7ef178c4c 100644
--- a/contrib/python/pypodman/pypodman/lib/actions/export_action.py
+++ b/contrib/python/pypodman/pypodman/lib/actions/export_action.py
@@ -12,13 +12,16 @@ class Export(AbstractActionBase):
def subparser(cls, parent):
"""Add Export command to parent parser."""
parser = parent.add_parser(
- 'export', help='export container to tarball')
+ 'export',
+ help='export container to tarball',
+ )
parser.add_argument(
'--output',
'-o',
metavar='PATH',
nargs=1,
- help='Write to a file',
+ required=True,
+ help='Write to this file on host',
)
parser.add_argument(
'container',
@@ -27,23 +30,11 @@ class Export(AbstractActionBase):
)
parser.set_defaults(class_=cls, method='export')
- def __init__(self, args):
- """Construct Export class."""
- if not args.container:
- raise ValueError('You must supply one container id'
- ' or name to be used as source.')
-
- if not args.output:
- raise ValueError('You must supply one filename'
- ' to be created as tarball using --output.')
- super().__init__(args)
-
def export(self):
"""Create tarball from container filesystem."""
try:
try:
ctnr = self.client.containers.get(self._args.container[0])
- ctnr.export(self._args.output[0])
except podman.ContainerNotFound as e:
sys.stdout.flush()
print(
@@ -51,6 +42,8 @@ class Export(AbstractActionBase):
file=sys.stderr,
flush=True)
return 1
+ else:
+ ctnr.export(self._args.output[0])
except podman.ErrorOccurred as e:
sys.stdout.flush()
print(
@@ -58,3 +51,4 @@ class Export(AbstractActionBase):
file=sys.stderr,
flush=True)
return 1
+ return 0
diff --git a/contrib/python/pypodman/pypodman/lib/actions/history_action.py b/contrib/python/pypodman/pypodman/lib/actions/history_action.py
index 3e3f539fc..f9aaa54f6 100644
--- a/contrib/python/pypodman/pypodman/lib/actions/history_action.py
+++ b/contrib/python/pypodman/pypodman/lib/actions/history_action.py
@@ -60,7 +60,7 @@ class History(AbstractActionBase):
if self._args.human:
fields.update({
'size':
- humanize.naturalsize(details.size, binary=True),
+ humanize.naturalsize(details.size),
'created':
humanize.naturaldate(
podman.datetime_parse(details.created)),
diff --git a/contrib/python/pypodman/pypodman/lib/actions/images_action.py b/contrib/python/pypodman/pypodman/lib/actions/images_action.py
index d28e32db9..29bf90dd2 100644
--- a/contrib/python/pypodman/pypodman/lib/actions/images_action.py
+++ b/contrib/python/pypodman/pypodman/lib/actions/images_action.py
@@ -37,7 +37,7 @@ class Images(AbstractActionBase):
self.columns = OrderedDict({
'name':
- ReportColumn('name', 'REPOSITORY', 40),
+ ReportColumn('name', 'REPOSITORY', 0),
'tag':
ReportColumn('tag', 'TAG', 10),
'id':
@@ -65,18 +65,18 @@ class Images(AbstractActionBase):
'created':
humanize.naturaldate(podman.datetime_parse(image.created)),
'size':
- humanize.naturalsize(int(image.size), binary=True),
+ humanize.naturalsize(int(image.size)),
'repoDigests':
' '.join(image.repoDigests),
})
for r in image.repoTags:
- name, tag = r.split(':', 1)
+ name, tag = r.rsplit(':', 1)
fields.update({
'name': name,
'tag': tag,
})
- rows.append(fields)
+ rows.append(fields)
if not self._args.digests:
del self.columns['repoDigests']
diff --git a/contrib/python/pypodman/pypodman/lib/actions/import_action.py b/contrib/python/pypodman/pypodman/lib/actions/import_action.py
index 49b8a5a57..43448144a 100644
--- a/contrib/python/pypodman/pypodman/lib/actions/import_action.py
+++ b/contrib/python/pypodman/pypodman/lib/actions/import_action.py
@@ -2,7 +2,7 @@
import sys
import podman
-from pypodman.lib import AbstractActionBase
+from pypodman.lib import AbstractActionBase, ChangeAction
class Import(AbstractActionBase):
@@ -12,18 +12,19 @@ class Import(AbstractActionBase):
def subparser(cls, parent):
"""Add Import command to parent parser."""
parser = parent.add_parser(
- 'import', help='import tarball as image filesystem')
+ 'import',
+ help='import tarball as image filesystem',
+ )
parser.add_argument(
'--change',
'-c',
- action='append',
- choices=('CMD', 'ENTRYPOINT', 'ENV', 'EXPOSE', 'LABEL',
- 'STOPSIGNAL', 'USER', 'VOLUME', 'WORKDIR'),
- type=str.upper,
- help='Apply the following possible instructions',
+ action=ChangeAction,
)
parser.add_argument(
- '--message', '-m', help='Set commit message for imported image.')
+ '--message',
+ '-m',
+ help='Set commit message for imported image.',
+ )
parser.add_argument(
'source',
metavar='PATH',
@@ -38,18 +39,25 @@ class Import(AbstractActionBase):
)
parser.set_defaults(class_=cls, method='import_')
- def __init__(self, args):
- """Construct Import class."""
- super().__init__(args)
-
def import_(self):
"""Import tarball as image filesystem."""
+ # ImportImage() validates it's parameters therefore we need to create
+ # pristine dict() for keywords
+ options = {}
+ if 'message' in self.opts:
+ options['message'] = self.opts['message']
+ if 'change' in self.opts and self.opts['change']:
+ options['changes'] = self.opts['change']
+
+ reference = self.opts['reference'][0] if 'reference' in self.opts\
+ else None
+
try:
ident = self.client.images.import_image(
- self.opts.source,
- self.opts.reference,
- message=self.opts.message,
- changes=self.opts.change)
+ self.opts['source'][0],
+ reference,
+ **options,
+ )
print(ident)
except podman.ErrorOccurred as e:
sys.stdout.flush()
@@ -58,3 +66,4 @@ class Import(AbstractActionBase):
file=sys.stderr,
flush=True)
return 1
+ return 0
diff --git a/contrib/python/pypodman/pypodman/lib/parser_actions.py b/contrib/python/pypodman/pypodman/lib/parser_actions.py
index 2a5859e47..c10b85495 100644
--- a/contrib/python/pypodman/pypodman/lib/parser_actions.py
+++ b/contrib/python/pypodman/pypodman/lib/parser_actions.py
@@ -4,9 +4,10 @@ Supplimental argparse.Action converters and validaters.
The constructors are very verbose but remain for IDE support.
"""
import argparse
+import copy
import os
-# API defined by argparse.Action shut up pylint
+# API defined by argparse.Action therefore shut up pylint
# pragma pylint: disable=redefined-builtin
# pragma pylint: disable=too-few-public-methods
# pragma pylint: disable=too-many-arguments
@@ -63,6 +64,54 @@ class BooleanAction(argparse.Action):
setattr(namespace, self.dest, val)
+class ChangeAction(argparse.Action):
+ """Convert and validate change argument."""
+
+ def __init__(self,
+ option_strings,
+ dest,
+ nargs=None,
+ const=None,
+ default=[],
+ type=None,
+ choices=None,
+ required=False,
+ help=None,
+ metavar='OPT=VALUE'):
+ """Create ChangeAction object."""
+ help = (help or '') + ('Apply change(s) to the new image.'
+ ' May be given multiple times.')
+
+ super().__init__(
+ option_strings=option_strings,
+ dest=dest,
+ nargs=nargs,
+ const=const,
+ default=default,
+ type=type,
+ choices=choices,
+ required=required,
+ help=help,
+ metavar=metavar)
+
+ def __call__(self, parser, namespace, values, option_string=None):
+ """Convert and Validate input."""
+ print(self.dest)
+ items = getattr(namespace, self.dest, None) or []
+ items = copy.copy(items)
+
+ choices = ('CMD', 'ENTRYPOINT', 'ENV', 'EXPOSE', 'LABEL', 'ONBUILD',
+ 'STOPSIGNAL', 'USER', 'VOLUME', 'WORKDIR')
+
+ opt, val = values.split('=', 1)
+ if opt not in choices:
+ parser.error('{} is not a supported "--change" option,'
+ ' valid options are: {}'.format(
+ opt, ', '.join(choices)))
+ items.append(values)
+ setattr(namespace, self.dest, items)
+
+
class UnitAction(argparse.Action):
"""Validate number given is positive integer, with optional suffix."""
diff --git a/contrib/python/pypodman/pypodman/lib/report.py b/contrib/python/pypodman/pypodman/lib/report.py
index 1db4268da..b689390fd 100644
--- a/contrib/python/pypodman/pypodman/lib/report.py
+++ b/contrib/python/pypodman/pypodman/lib/report.py
@@ -1,8 +1,23 @@
"""Report Manager."""
+import string
import sys
from collections import namedtuple
+class ReportFormatter(string.Formatter):
+ """Custom formatter to default missing keys to '<none>'."""
+
+ def get_value(self, key, args, kwargs):
+ """Map missing key to value '<none>'."""
+ try:
+ if isinstance(key, int):
+ return args[key]
+ else:
+ return kwargs[key]
+ except KeyError:
+ return '<none>'
+
+
class ReportColumn(namedtuple('ReportColumn', 'key display width default')):
"""Hold attributes of output column."""
@@ -26,18 +41,24 @@ class Report():
"""
self._columns = columns
self._file = file
+ self._format_string = None
+ self._formatter = ReportFormatter()
self._heading = heading
self.epilog = epilog
- self._format = None
def row(self, **fields):
"""Print row for report."""
if self._heading:
hdrs = {k: v.display for (k, v) in self._columns.items()}
- print(self._format.format(**hdrs), flush=True, file=self._file)
+ print(
+ self._formatter.format(self._format_string, **hdrs),
+ flush=True,
+ file=self._file,
+ )
self._heading = False
+
fields = {k: str(v) for k, v in fields.items()}
- print(self._format.format(**fields))
+ print(self._formatter.format(self._format_string, **fields))
def __enter__(self):
"""Return `self` upon entering the runtime context."""
@@ -63,4 +84,4 @@ class Report():
display_len = info.width
fmt.append('{{{0}:{1}.{1}}}'.format(key, display_len))
- self._format = ' '.join(fmt)
+ self._format_string = ' '.join(fmt)
diff --git a/docs/podman-kill.1.md b/docs/podman-kill.1.md
index 14066d151..85f68a73d 100644
--- a/docs/podman-kill.1.md
+++ b/docs/podman-kill.1.md
@@ -4,7 +4,7 @@
podman\-kill - Kills one or more containers with a signal
## SYNOPSIS
-**podman kill** [*options*] *container* ...
+**podman kill** [*options*] [*container* ...]
## DESCRIPTION
The main process inside each container specified will be sent SIGKILL, or any signal specified with option --signal.
diff --git a/docs/podman-pause.1.md b/docs/podman-pause.1.md
index b4930de8d..f19fa5d6a 100644
--- a/docs/podman-pause.1.md
+++ b/docs/podman-pause.1.md
@@ -4,16 +4,33 @@
podman\-pause - Pause one or more containers
## SYNOPSIS
-**podman pause** [*options*] *container* ...
+**podman pause** [*options*] [*container*...]
## DESCRIPTION
Pauses all the processes in one or more containers. You may use container IDs or names as input.
+## OPTIONS
+
+**--all, -a**
+
+Pause all running containers.
+
## EXAMPLE
+Pause a container named 'mywebserver'
+```
podman pause mywebserver
+```
+Pause a container by partial container ID.
+```
podman pause 860a4b23
+```
+
+Pause all **running** containers.
+```
+podman stop -a
+```
## SEE ALSO
podman(1), podman-unpause(1)
diff --git a/docs/podman-restart.1.md b/docs/podman-restart.1.md
index caacaf31d..875afa385 100644
--- a/docs/podman-restart.1.md
+++ b/docs/podman-restart.1.md
@@ -12,33 +12,51 @@ Containers will be stopped if they are running and then restarted. Stopped
containers will not be stopped and will only be started.
## OPTIONS
-**--timeout**
-
-Timeout to wait before forcibly stopping the container
+**--all, -a**
+Restart all containers regardless of their current state.
**--latest, -l**
-
Instead of providing the container name or ID, use the last created container. If you use methods other than Podman
to run containers such as CRI-O, the last started container could be from either of those methods.
+**--running**
+Restart all containers that are already in the *running* state.
+
+**--timeout**
+Timeout to wait before forcibly stopping the container.
+
+
## EXAMPLES ##
+Restart the latest container
```
$ podman restart -l
ec588fc80b05e19d3006bf2e8aa325f0a2e2ff1f609b7afb39176ca8e3e13467
```
+Restart a specific container by partial container ID
```
$ podman restart ff6cf1
ff6cf1e5e77e6dba1efc7f3fcdb20e8b89ad8947bc0518be1fcb2c78681f226f
```
+Restart two containers by name with a timeout of 4 seconds
```
$ podman restart --timeout 4 test1 test2
c3bb026838c30e5097f079fa365c9a4769d52e1017588278fa00d5c68ebc1502
17e13a63081a995136f907024bcfe50ff532917988a152da229db9d894c5a9ec
```
+Restart all running containers
+```
+$ podman restart --running
+```
+
+Restart all containers
+```
+$ podman restart --all
+```
+
## SEE ALSO
podman(1), podman-run(1), podman-start(1), podman-create(1)
diff --git a/docs/podman-unpause.1.md b/docs/podman-unpause.1.md
index 9404e7648..acfab0930 100644
--- a/docs/podman-unpause.1.md
+++ b/docs/podman-unpause.1.md
@@ -4,16 +4,34 @@
podman\-unpause - Unpause one or more containers
## SYNOPSIS
-**podman unpause** [*options*] *container* ...
+**podman unpause** [*options*] [*container*...]
## DESCRIPTION
Unpauses the processes in one or more containers. You may use container IDs or names as input.
+## OPTIONS
+
+**--all, -a**
+
+Unpause all paused containers.
+
## EXAMPLE
+Unpause a container called 'mywebserver'
+```
podman unpause mywebserver
+```
+Unpause a container by a partial container ID.
+
+```
podman unpause 860a4b23
+```
+
+Unpause all **paused** containers.
+```
+podman unpause -a
+```
## SEE ALSO
podman(1), podman-pause(1)
diff --git a/libpod/version.go b/libpod/version.go
index 5e7cd83c9..966588ae9 100644
--- a/libpod/version.go
+++ b/libpod/version.go
@@ -11,10 +11,10 @@ import (
var (
// GitCommit is the commit that the binary is being built from.
// It will be populated by the Makefile.
- GitCommit string
+ gitCommit string
// BuildInfo is the time at which the binary was built
// It will be populated by the Makefile.
- BuildInfo string
+ buildInfo string
)
//Version is an output struct for varlink
@@ -30,9 +30,9 @@ type Version struct {
func GetVersion() (Version, error) {
var err error
var buildTime int64
- if BuildInfo != "" {
+ if buildInfo != "" {
// Converts unix time from string to int64
- buildTime, err = strconv.ParseInt(BuildInfo, 10, 64)
+ buildTime, err = strconv.ParseInt(buildInfo, 10, 64)
if err != nil {
return Version{}, err
@@ -41,7 +41,7 @@ func GetVersion() (Version, error) {
return Version{
Version: podmanVersion.Version,
GoVersion: runtime.Version(),
- GitCommit: GitCommit,
+ GitCommit: gitCommit,
Built: buildTime,
OsArch: runtime.GOOS + "/" + runtime.GOARCH,
}, nil
diff --git a/pkg/util/utils.go b/pkg/util/utils.go
index 9107eec5c..69f49e72a 100644
--- a/pkg/util/utils.go
+++ b/pkg/util/utils.go
@@ -256,7 +256,7 @@ func GetRootlessStorageOpts() (storage.StoreOptions, error) {
if err != nil {
return opts, err
}
- opts.RunRoot = filepath.Join(rootlessRuntime, "run")
+ opts.RunRoot = rootlessRuntime
dataDir := os.Getenv("XDG_DATA_HOME")
if dataDir == "" {
diff --git a/pkg/varlinkapi/system.go b/pkg/varlinkapi/system.go
index 287f42209..a29d22e7d 100644
--- a/pkg/varlinkapi/system.go
+++ b/pkg/varlinkapi/system.go
@@ -34,6 +34,10 @@ func (i *LibpodAPI) Ping(call iopodman.VarlinkCall) error {
// GetInfo returns details about the podman host and its stores
func (i *LibpodAPI) GetInfo(call iopodman.VarlinkCall) error {
+ versionInfo, err := libpod.GetVersion()
+ if err != nil {
+ return err
+ }
var (
registries, insecureRegistries []string
)
@@ -64,11 +68,10 @@ func (i *LibpodAPI) GetInfo(call iopodman.VarlinkCall) error {
podmanInfo.Host = infoHost
store := info[1].Data
pmaninfo := iopodman.InfoPodmanBinary{
- Compiler: goruntime.Compiler,
- Go_version: goruntime.Version(),
- // TODO : How are we going to get this here?
- //Podman_version:
- Git_commit: libpod.GitCommit,
+ Compiler: goruntime.Compiler,
+ Go_version: goruntime.Version(),
+ Podman_version: versionInfo.Version,
+ Git_commit: versionInfo.GitCommit,
}
graphStatus := iopodman.InfoGraphStatus{
diff --git a/test/e2e/config.go b/test/e2e/config.go
new file mode 100644
index 000000000..8116d993b
--- /dev/null
+++ b/test/e2e/config.go
@@ -0,0 +1,9 @@
+package integration
+
+var (
+ redis = "docker.io/library/redis:alpine"
+ fedoraMinimal = "registry.fedoraproject.org/fedora-minimal:latest"
+ ALPINE = "docker.io/library/alpine:latest"
+ infra = "k8s.gcr.io/pause:3.1"
+ BB = "docker.io/library/busybox:latest"
+)
diff --git a/test/e2e/config_amd64.go b/test/e2e/config_amd64.go
new file mode 100644
index 000000000..3459bea6d
--- /dev/null
+++ b/test/e2e/config_amd64.go
@@ -0,0 +1,11 @@
+package integration
+
+var (
+ STORAGE_OPTIONS = "--storage-driver vfs"
+ ROOTLESS_STORAGE_OPTIONS = "--storage-driver vfs"
+ CACHE_IMAGES = []string{ALPINE, BB, fedoraMinimal, nginx, redis, registry, infra, labels}
+ nginx = "quay.io/libpod/alpine_nginx:latest"
+ BB_GLIBC = "docker.io/library/busybox:glibc"
+ registry = "docker.io/library/registry:2"
+ labels = "quay.io/libpod/alpine_labels:latest"
+)
diff --git a/test/e2e/config_ppc64le.go b/test/e2e/config_ppc64le.go
new file mode 100644
index 000000000..d1737fa6f
--- /dev/null
+++ b/test/e2e/config_ppc64le.go
@@ -0,0 +1,11 @@
+package integration
+
+var (
+ STORAGE_OPTIONS = "--storage-driver overlay"
+ ROOTLESS_STORAGE_OPTIONS = "--storage-driver vfs"
+ CACHE_IMAGES = []string{ALPINE, BB, fedoraMinimal, nginx, redis, infra, labels}
+ nginx = "quay.io/libpod/alpine_nginx-ppc64le:latest"
+ BB_GLIBC = "docker.io/ppc64le/busybox:glibc"
+ labels = "quay.io/libpod/alpine_labels-ppc64le:latest"
+ registry string
+)
diff --git a/test/e2e/libpod_suite_test.go b/test/e2e/libpod_suite_test.go
index 56a603f3e..ec274cc34 100644
--- a/test/e2e/libpod_suite_test.go
+++ b/test/e2e/libpod_suite_test.go
@@ -9,6 +9,7 @@ import (
"os"
"os/exec"
"path/filepath"
+ "runtime"
"strings"
"testing"
"time"
@@ -29,19 +30,8 @@ var (
RUNC_BINARY string
INTEGRATION_ROOT string
CGROUP_MANAGER = "systemd"
- STORAGE_OPTIONS = "--storage-driver vfs"
ARTIFACT_DIR = "/tmp/.artifacts"
- CACHE_IMAGES = []string{ALPINE, BB, fedoraMinimal, nginx, redis, registry, infra, labels}
RESTORE_IMAGES = []string{ALPINE, BB}
- ALPINE = "docker.io/library/alpine:latest"
- BB = "docker.io/library/busybox:latest"
- BB_GLIBC = "docker.io/library/busybox:glibc"
- fedoraMinimal = "registry.fedoraproject.org/fedora-minimal:latest"
- nginx = "quay.io/baude/alpine_nginx:latest"
- redis = "docker.io/library/redis:alpine"
- registry = "docker.io/library/registry:2"
- infra = "k8s.gcr.io/pause:3.1"
- labels = "quay.io/baude/alpine_labels:latest"
defaultWaitTimeout = 90
)
@@ -70,6 +60,7 @@ type PodmanTest struct {
type HostOS struct {
Distribution string
Version string
+ Arch string
}
// TestLibpod ginkgo master function
@@ -245,7 +236,6 @@ func (p *PodmanTest) Cleanup() {
// Remove all containers
stopall := p.Podman([]string{"stop", "-a", "--timeout", "0"})
stopall.WaitWithDefaultTimeout()
-
session := p.Podman([]string{"rm", "-fa"})
session.Wait(90)
// Nuke tempdir
@@ -662,6 +652,7 @@ func GetHostDistributionInfo() HostOS {
l := bufio.NewScanner(f)
host := HostOS{}
+ host.Arch = runtime.GOARCH
for l.Scan() {
if strings.HasPrefix(l.Text(), "ID=") {
host.Distribution = strings.Replace(strings.TrimSpace(strings.Join(strings.Split(l.Text(), "=")[1:], "")), "\"", "", -1)
diff --git a/test/e2e/load_test.go b/test/e2e/load_test.go
index 4f288c216..21e8a4859 100644
--- a/test/e2e/load_test.go
+++ b/test/e2e/load_test.go
@@ -139,6 +139,9 @@ var _ = Describe("Podman load", func() {
})
It("podman load multiple tags", func() {
+ if podmanTest.Host.Arch == "ppc64le" {
+ Skip("skip on ppc64le")
+ }
outfile := filepath.Join(podmanTest.TempDir, "alpine.tar")
alpVersion := "docker.io/library/alpine:3.2"
diff --git a/test/e2e/logs_test.go b/test/e2e/logs_test.go
index 871987db0..6888863ca 100644
--- a/test/e2e/logs_test.go
+++ b/test/e2e/logs_test.go
@@ -33,7 +33,6 @@ var _ = Describe("Podman logs", func() {
//sudo bin/podman run -it --rm fedora-minimal bash -c 'for a in `seq 5`; do echo hello; done'
It("podman logs for container", func() {
- podmanTest.RestoreArtifact(fedoraMinimal)
logc := podmanTest.Podman([]string{"run", "-dt", ALPINE, "sh", "-c", "echo podman; echo podman; echo podman"})
logc.WaitWithDefaultTimeout()
Expect(logc.ExitCode()).To(Equal(0))
@@ -46,7 +45,6 @@ var _ = Describe("Podman logs", func() {
})
It("podman logs tail two lines", func() {
- podmanTest.RestoreArtifact(fedoraMinimal)
logc := podmanTest.Podman([]string{"run", "-dt", ALPINE, "sh", "-c", "echo podman; echo podman; echo podman"})
logc.WaitWithDefaultTimeout()
Expect(logc.ExitCode()).To(Equal(0))
@@ -59,7 +57,6 @@ var _ = Describe("Podman logs", func() {
})
It("podman logs tail 99 lines", func() {
- podmanTest.RestoreArtifact(fedoraMinimal)
logc := podmanTest.Podman([]string{"run", "-dt", ALPINE, "sh", "-c", "echo podman; echo podman; echo podman"})
logc.WaitWithDefaultTimeout()
Expect(logc.ExitCode()).To(Equal(0))
@@ -72,7 +69,6 @@ var _ = Describe("Podman logs", func() {
})
It("podman logs tail 2 lines with timestamps", func() {
- podmanTest.RestoreArtifact(fedoraMinimal)
logc := podmanTest.Podman([]string{"run", "-dt", ALPINE, "sh", "-c", "echo podman; echo podman; echo podman"})
logc.WaitWithDefaultTimeout()
Expect(logc.ExitCode()).To(Equal(0))
@@ -85,7 +81,6 @@ var _ = Describe("Podman logs", func() {
})
It("podman logs latest with since time", func() {
- podmanTest.RestoreArtifact(fedoraMinimal)
logc := podmanTest.Podman([]string{"run", "-dt", ALPINE, "sh", "-c", "echo podman; echo podman; echo podman"})
logc.WaitWithDefaultTimeout()
Expect(logc.ExitCode()).To(Equal(0))
@@ -98,7 +93,6 @@ var _ = Describe("Podman logs", func() {
})
It("podman logs latest with since duration", func() {
- podmanTest.RestoreArtifact(fedoraMinimal)
logc := podmanTest.Podman([]string{"run", "-dt", ALPINE, "sh", "-c", "echo podman; echo podman; echo podman"})
logc.WaitWithDefaultTimeout()
Expect(logc.ExitCode()).To(Equal(0))
diff --git a/test/e2e/pause_test.go b/test/e2e/pause_test.go
index c34964f59..1a2eb1a09 100644
--- a/test/e2e/pause_test.go
+++ b/test/e2e/pause_test.go
@@ -213,4 +213,70 @@ var _ = Describe("Podman pause", func() {
result.WaitWithDefaultTimeout()
})
+ It("Pause all containers (no containers exist)", func() {
+ result := podmanTest.Podman([]string{"pause", "--all"})
+ result.WaitWithDefaultTimeout()
+ Expect(result.ExitCode()).To(Equal(0))
+ Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0))
+
+ })
+
+ It("Unpause all containers (no paused containers exist)", func() {
+ result := podmanTest.Podman([]string{"unpause", "--all"})
+ result.WaitWithDefaultTimeout()
+ Expect(result.ExitCode()).To(Equal(0))
+ Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0))
+ })
+
+ It("Pause a bunch of running containers", func() {
+ podmanTest.RestoreArtifact(nginx)
+ for i := 0; i < 3; i++ {
+ name := fmt.Sprintf("test%d", i)
+ run := podmanTest.Podman([]string{"run", "-dt", "--name", name, nginx})
+ run.WaitWithDefaultTimeout()
+ Expect(run.ExitCode()).To(Equal(0))
+
+ }
+ running := podmanTest.Podman([]string{"ps", "-q"})
+ running.WaitWithDefaultTimeout()
+ Expect(running.ExitCode()).To(Equal(0))
+ Expect(len(running.OutputToStringArray())).To(Equal(3))
+
+ pause := podmanTest.Podman([]string{"pause", "--all"})
+ pause.WaitWithDefaultTimeout()
+ Expect(pause.ExitCode()).To(Equal(0))
+
+ running = podmanTest.Podman([]string{"ps", "-q"})
+ running.WaitWithDefaultTimeout()
+ Expect(running.ExitCode()).To(Equal(0))
+ Expect(len(running.OutputToStringArray())).To(Equal(0))
+
+ unpause := podmanTest.Podman([]string{"unpause", "--all"})
+ unpause.WaitWithDefaultTimeout()
+ Expect(unpause.ExitCode()).To(Equal(0))
+ })
+
+ It("Unpause a bunch of running containers", func() {
+ podmanTest.RestoreArtifact(nginx)
+ for i := 0; i < 3; i++ {
+ name := fmt.Sprintf("test%d", i)
+ run := podmanTest.Podman([]string{"run", "-dt", "--name", name, nginx})
+ run.WaitWithDefaultTimeout()
+ Expect(run.ExitCode()).To(Equal(0))
+
+ }
+ pause := podmanTest.Podman([]string{"pause", "--all"})
+ pause.WaitWithDefaultTimeout()
+ Expect(pause.ExitCode()).To(Equal(0))
+
+ unpause := podmanTest.Podman([]string{"unpause", "--all"})
+ unpause.WaitWithDefaultTimeout()
+ Expect(unpause.ExitCode()).To(Equal(0))
+
+ running := podmanTest.Podman([]string{"ps", "-q"})
+ running.WaitWithDefaultTimeout()
+ Expect(running.ExitCode()).To(Equal(0))
+ Expect(len(running.OutputToStringArray())).To(Equal(3))
+ })
+
})
diff --git a/test/e2e/pull_test.go b/test/e2e/pull_test.go
index 821476f39..606160198 100644
--- a/test/e2e/pull_test.go
+++ b/test/e2e/pull_test.go
@@ -63,11 +63,11 @@ var _ = Describe("Podman pull", func() {
})
It("podman pull from alternate registry without tag", func() {
- session := podmanTest.Podman([]string{"pull", "quay.io/baude/alpine_nginx"})
+ session := podmanTest.Podman([]string{"pull", "quay.io/libpod/alpine_nginx"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
- session = podmanTest.Podman([]string{"rmi", "quay.io/baude/alpine_nginx"})
+ session = podmanTest.Podman([]string{"rmi", "quay.io/libpod/alpine_nginx"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
})
diff --git a/test/e2e/push_test.go b/test/e2e/push_test.go
index 3ee150551..5e3d3745a 100644
--- a/test/e2e/push_test.go
+++ b/test/e2e/push_test.go
@@ -58,6 +58,9 @@ var _ = Describe("Podman push", func() {
})
It("podman push to local registry", func() {
+ if podmanTest.Host.Arch == "ppc64le" {
+ Skip("No registry image for ppc64le")
+ }
podmanTest.RestoreArtifact(registry)
session := podmanTest.Podman([]string{"run", "-d", "--name", "registry", "-p", "5000:5000", registry, "/entrypoint.sh", "/etc/docker/registry/config.yml"})
session.WaitWithDefaultTimeout()
@@ -73,6 +76,9 @@ var _ = Describe("Podman push", func() {
})
It("podman push to local registry with authorization", func() {
+ if podmanTest.Host.Arch == "ppc64le" {
+ Skip("No registry image for ppc64le")
+ }
authPath := filepath.Join(podmanTest.TempDir, "auth")
os.Mkdir(authPath, os.ModePerm)
os.MkdirAll("/etc/containers/certs.d/localhost:5000", os.ModePerm)
diff --git a/test/e2e/restart_test.go b/test/e2e/restart_test.go
index d2fc35485..eca2bbcda 100644
--- a/test/e2e/restart_test.go
+++ b/test/e2e/restart_test.go
@@ -136,4 +136,44 @@ var _ = Describe("Podman restart", func() {
Expect(timeSince < 10*time.Second).To(BeTrue())
Expect(timeSince > 2*time.Second).To(BeTrue())
})
+
+ It("Podman restart --all", func() {
+ _, exitCode, _ := podmanTest.RunLsContainer("test1")
+ Expect(exitCode).To(Equal(0))
+
+ test2 := podmanTest.RunTopContainer("test2")
+ test2.WaitWithDefaultTimeout()
+ Expect(test2.ExitCode()).To(Equal(0))
+
+ startTime := podmanTest.Podman([]string{"inspect", "--format='{{.State.StartedAt}}'", "test1", "test2"})
+ startTime.WaitWithDefaultTimeout()
+
+ session := podmanTest.Podman([]string{"restart", "-all"})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ restartTime := podmanTest.Podman([]string{"inspect", "--format='{{.State.StartedAt}}'", "test1", "test2"})
+ restartTime.WaitWithDefaultTimeout()
+ Expect(restartTime.OutputToStringArray()[0]).To(Not(Equal(startTime.OutputToStringArray()[0])))
+ Expect(restartTime.OutputToStringArray()[1]).To(Not(Equal(startTime.OutputToStringArray()[1])))
+ })
+
+ It("Podman restart --all --running", func() {
+ _, exitCode, _ := podmanTest.RunLsContainer("test1")
+ Expect(exitCode).To(Equal(0))
+
+ test2 := podmanTest.RunTopContainer("test2")
+ test2.WaitWithDefaultTimeout()
+ Expect(test2.ExitCode()).To(Equal(0))
+
+ startTime := podmanTest.Podman([]string{"inspect", "--format='{{.State.StartedAt}}'", "test1", "test2"})
+ startTime.WaitWithDefaultTimeout()
+
+ session := podmanTest.Podman([]string{"restart", "-a", "--running"})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ restartTime := podmanTest.Podman([]string{"inspect", "--format='{{.State.StartedAt}}'", "test1", "test2"})
+ restartTime.WaitWithDefaultTimeout()
+ Expect(restartTime.OutputToStringArray()[0]).To(Equal(startTime.OutputToStringArray()[0]))
+ Expect(restartTime.OutputToStringArray()[1]).To(Not(Equal(startTime.OutputToStringArray()[1])))
+ })
})
diff --git a/test/e2e/rmi_test.go b/test/e2e/rmi_test.go
index 8224cd345..2a1a0da77 100644
--- a/test/e2e/rmi_test.go
+++ b/test/e2e/rmi_test.go
@@ -13,8 +13,6 @@ var _ = Describe("Podman rmi", func() {
tempdir string
err error
podmanTest PodmanTest
- image1 = "docker.io/library/alpine:latest"
- image3 = "docker.io/library/busybox:glibc"
)
BeforeEach(func() {
@@ -42,7 +40,7 @@ var _ = Describe("Podman rmi", func() {
})
It("podman rmi with fq name", func() {
- session := podmanTest.Podman([]string{"rmi", image1})
+ session := podmanTest.Podman([]string{"rmi", ALPINE})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
@@ -56,15 +54,18 @@ var _ = Describe("Podman rmi", func() {
})
It("podman rmi all images", func() {
- podmanTest.PullImages([]string{image3})
+ podmanTest.PullImages([]string{nginx})
session := podmanTest.Podman([]string{"rmi", "-a"})
session.WaitWithDefaultTimeout()
+ images := podmanTest.Podman([]string{"images"})
+ images.WaitWithDefaultTimeout()
+ fmt.Println(images.OutputToStringArray())
Expect(session.ExitCode()).To(Equal(0))
})
It("podman rmi all images forcibly with short options", func() {
- podmanTest.PullImages([]string{image3})
+ podmanTest.PullImages([]string{nginx})
session := podmanTest.Podman([]string{"rmi", "-fa"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
diff --git a/test/e2e/rootless_test.go b/test/e2e/rootless_test.go
index bd782a5fc..876e10969 100644
--- a/test/e2e/rootless_test.go
+++ b/test/e2e/rootless_test.go
@@ -40,6 +40,7 @@ var _ = Describe("Podman rootless", func() {
}
podmanTest = PodmanCreate(tempdir)
podmanTest.CgroupManager = "cgroupfs"
+ podmanTest.StorageOptions = ROOTLESS_STORAGE_OPTIONS
podmanTest.RestoreAllArtifacts()
})
@@ -92,6 +93,7 @@ var _ = Describe("Podman rootless", func() {
Expect(err).To(BeNil())
rootlessTest := PodmanCreate(tempdir)
rootlessTest.CgroupManager = "cgroupfs"
+ rootlessTest.StorageOptions = ROOTLESS_STORAGE_OPTIONS
err = filepath.Walk(tempdir, chownFunc)
Expect(err).To(BeNil())
diff --git a/test/e2e/run_signal_test.go b/test/e2e/run_signal_test.go
index 02b6f4941..5de17108c 100644
--- a/test/e2e/run_signal_test.go
+++ b/test/e2e/run_signal_test.go
@@ -56,6 +56,9 @@ var _ = Describe("Podman run with --sig-proxy", func() {
})
Specify("signals are forwarded to container using sig-proxy", func() {
+ if podmanTest.Host.Arch == "ppc64le" {
+ Skip("Doesnt work on ppc64le")
+ }
signal := syscall.SIGFPE
// Set up a socket for communication
udsDir := filepath.Join(tmpdir, "socket")
diff --git a/test/e2e/run_test.go b/test/e2e/run_test.go
index cb436ccca..98bf66a67 100644
--- a/test/e2e/run_test.go
+++ b/test/e2e/run_test.go
@@ -42,8 +42,9 @@ var _ = Describe("Podman run", func() {
})
It("podman run a container based on a complex local image name", func() {
+ imageName := strings.TrimPrefix(nginx, "quay.io/")
podmanTest.RestoreArtifact(nginx)
- session := podmanTest.Podman([]string{"run", "baude/alpine_nginx:latest", "ls"})
+ session := podmanTest.Podman([]string{"run", imageName, "ls"})
session.WaitWithDefaultTimeout()
Expect(session.ErrorToString()).ToNot(ContainSubstring("Trying to pull"))
Expect(session.ExitCode()).To(Equal(0))
@@ -51,13 +52,13 @@ var _ = Describe("Podman run", func() {
It("podman run a container based on on a short name with localhost", func() {
podmanTest.RestoreArtifact(nginx)
- tag := podmanTest.Podman([]string{"tag", nginx, "localhost/baude/alpine_nginx:latest"})
+ tag := podmanTest.Podman([]string{"tag", nginx, "localhost/libpod/alpine_nginx:latest"})
tag.WaitWithDefaultTimeout()
rmi := podmanTest.Podman([]string{"rmi", nginx})
rmi.WaitWithDefaultTimeout()
- session := podmanTest.Podman([]string{"run", "baude/alpine_nginx:latest", "ls"})
+ session := podmanTest.Podman([]string{"run", "libpod/alpine_nginx:latest", "ls"})
session.WaitWithDefaultTimeout()
Expect(session.ErrorToString()).ToNot(ContainSubstring("Trying to pull"))
Expect(session.ExitCode()).To(Equal(0))
@@ -203,6 +204,9 @@ var _ = Describe("Podman run", func() {
})
It("podman run with mount flag", func() {
+ if podmanTest.Host.Arch == "ppc64le" {
+ Skip("skip failing test on ppc64le")
+ }
mountPath := filepath.Join(podmanTest.TempDir, "secrets")
os.Mkdir(mountPath, 0755)
session := podmanTest.Podman([]string{"run", "--rm", "--mount", fmt.Sprintf("type=bind,src=%s,target=/run/test", mountPath), ALPINE, "grep", "/run/test", "/proc/self/mountinfo"})
diff --git a/test/e2e/search_test.go b/test/e2e/search_test.go
index 2848da259..84f1efbca 100644
--- a/test/e2e/search_test.go
+++ b/test/e2e/search_test.go
@@ -128,6 +128,9 @@ var _ = Describe("Podman search", func() {
})
It("podman search attempts HTTP if tls-verify flag is set false", func() {
+ if podmanTest.Host.Arch == "ppc64le" {
+ Skip("No registry image for ppc64le")
+ }
podmanTest.RestoreArtifact(registry)
fakereg := podmanTest.Podman([]string{"run", "-d", "--name", "registry", "-p", "5000:5000", registry, "/entrypoint.sh", "/etc/docker/registry/config.yml"})
fakereg.WaitWithDefaultTimeout()
@@ -148,6 +151,9 @@ var _ = Describe("Podman search", func() {
})
It("podman search in local registry", func() {
+ if podmanTest.Host.Arch == "ppc64le" {
+ Skip("No registry image for ppc64le")
+ }
podmanTest.RestoreArtifact(registry)
registry := podmanTest.Podman([]string{"run", "-d", "--name", "registry3", "-p", "5000:5000", registry, "/entrypoint.sh", "/etc/docker/registry/config.yml"})
registry.WaitWithDefaultTimeout()
@@ -168,6 +174,9 @@ var _ = Describe("Podman search", func() {
})
It("podman search attempts HTTP if registry is in registries.insecure and force secure is false", func() {
+ if podmanTest.Host.Arch == "ppc64le" {
+ Skip("No registry image for ppc64le")
+ }
podmanTest.RestoreArtifact(registry)
registry := podmanTest.Podman([]string{"run", "-d", "--name", "registry4", "-p", "5000:5000", registry, "/entrypoint.sh", "/etc/docker/registry/config.yml"})
registry.WaitWithDefaultTimeout()
@@ -197,6 +206,9 @@ var _ = Describe("Podman search", func() {
})
It("podman search doesn't attempt HTTP if force secure is true", func() {
+ if podmanTest.Host.Arch == "ppc64le" {
+ Skip("No registry image for ppc64le")
+ }
podmanTest.RestoreArtifact(registry)
registry := podmanTest.Podman([]string{"run", "-d", "-p", "5000:5000", "--name", "registry5", registry})
registry.WaitWithDefaultTimeout()
@@ -225,6 +237,9 @@ var _ = Describe("Podman search", func() {
})
It("podman search doesn't attempt HTTP if registry is not listed as insecure", func() {
+ if podmanTest.Host.Arch == "ppc64le" {
+ Skip("No registry image for ppc64le")
+ }
podmanTest.RestoreArtifact(registry)
registry := podmanTest.Podman([]string{"run", "-d", "-p", "5000:5000", "--name", "registry6", registry})
registry.WaitWithDefaultTimeout()
@@ -253,6 +268,9 @@ var _ = Describe("Podman search", func() {
})
It("podman search doesn't attempt HTTP if one registry is not listed as insecure", func() {
+ if podmanTest.Host.Arch == "ppc64le" {
+ Skip("No registry image for ppc64le")
+ }
podmanTest.RestoreArtifact(registry)
registryLocal := podmanTest.Podman([]string{"run", "-d", "-p", "5000:5000", "--name", "registry7", registry})
registryLocal.WaitWithDefaultTimeout()