summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/apiv2/25-containersMore.at27
-rw-r--r--test/apiv2/rest_api/__init__.py15
-rw-r--r--test/apiv2/rest_api/test_rest_v2_0_0.py90
-rw-r--r--test/apiv2/rest_api/v1_test_rest_v1_0_0.py4
-rw-r--r--test/e2e/common_test.go8
-rw-r--r--test/e2e/config/containers-remote.conf51
-rw-r--r--test/e2e/containers_conf_test.go68
-rw-r--r--test/e2e/create_staticmac_test.go18
-rw-r--r--test/e2e/libpod_suite_remote_test.go1
-rw-r--r--test/e2e/libpod_suite_test.go3
-rw-r--r--test/e2e/libpod_suite_varlink_test.go207
-rw-r--r--test/e2e/network_connect_disconnect_test.go217
-rw-r--r--test/e2e/network_create_test.go6
-rw-r--r--test/e2e/network_test.go205
-rw-r--r--test/e2e/play_kube_test.go89
-rw-r--r--test/e2e/ps_test.go6
-rw-r--r--test/e2e/run_test.go4
-rw-r--r--test/e2e/system_reset_test.go2
-rw-r--r--test/endpoint/commit.go49
-rw-r--r--test/endpoint/config.go24
-rw-r--r--test/endpoint/endpoint.go225
-rw-r--r--test/endpoint/endpoint_suite_test.go72
-rw-r--r--test/endpoint/exists_test.go68
-rw-r--r--test/endpoint/pull_test.go46
-rw-r--r--test/endpoint/setup.go214
-rw-r--r--test/endpoint/version_test.go43
-rw-r--r--test/python/docker/__init__.py14
-rw-r--r--test/python/docker/common.py4
-rw-r--r--test/python/docker/test_containers.py2
-rw-r--r--test/python/docker/test_images.py4
-rw-r--r--test/system/010-images.bats6
-rw-r--r--test/system/030-run.bats20
-rw-r--r--test/system/040-ps.bats47
-rw-r--r--test/system/070-build.bats17
-rw-r--r--test/system/075-exec.bats3
-rw-r--r--test/system/200-pod.bats4
36 files changed, 674 insertions, 1209 deletions
diff --git a/test/apiv2/25-containersMore.at b/test/apiv2/25-containersMore.at
index e0e6f7222..4f6b80a5f 100644
--- a/test/apiv2/25-containersMore.at
+++ b/test/apiv2/25-containersMore.at
@@ -52,4 +52,31 @@ t POST libpod/containers/foo/unmount '' 204
t DELETE libpod/containers/foo?force=true 204
+podman run $IMAGE true
+
+t GET libpod/containers/json?last=1 200 \
+ length=1 \
+ .[0].Id~[0-9a-f]\\{64\\} \
+ .[0].Image=$IMAGE \
+ .[0].Command[0]="true" \
+ .[0].State~\\\(exited\\\|stopped\\\) \
+ .[0].ExitCode=0 \
+ .[0].IsInfra=false
+
+cid=$(jq -r '.[0].Id' <<<"$output")
+
+t GET libpod/generate/$cid/kube 200
+like "$output" ".*apiVersion:.*" "Check generated kube yaml - apiVersion"
+like "$output" ".*kind:\\sPod.*" "Check generated kube yaml - kind: Pod"
+like "$output" ".*metadata:.*" "Check generated kube yaml - metadata"
+like "$output" ".*spec:.*" "Check generated kube yaml - spec"
+
+t GET libpod/generate/$cid/kube?service=true 200
+like "$output" ".*apiVersion:.*" "Check generated kube yaml(service=true) - apiVersion"
+like "$output" ".*kind:\\sPod.*" "Check generated kube yaml(service=true) - kind: Pod"
+like "$output" ".*metadata:.*" "Check generated kube yaml(service=true) - metadata"
+like "$output" ".*spec:.*" "Check generated kube yaml(service=true) - spec"
+like "$output" ".*kind:\\sService.*" "Check generated kube yaml(service=true) - kind: Service"
+
+t DELETE libpod/containers/$cid 204
# vim: filetype=sh
diff --git a/test/apiv2/rest_api/__init__.py b/test/apiv2/rest_api/__init__.py
index 8100a4df5..db0257f03 100644
--- a/test/apiv2/rest_api/__init__.py
+++ b/test/apiv2/rest_api/__init__.py
@@ -16,19 +16,18 @@ class Podman(object):
binary = os.getenv("PODMAN", "bin/podman")
self.cmd = [binary, "--storage-driver=vfs"]
- cgroupfs = os.getenv("CGROUP_MANAGER", "cgroupfs")
+ cgroupfs = os.getenv("CGROUP_MANAGER", "systemd")
self.cmd.append(f"--cgroup-manager={cgroupfs}")
if os.getenv("DEBUG"):
self.cmd.append("--log-level=debug")
+ self.cmd.append("--syslog=true")
self.anchor_directory = tempfile.mkdtemp(prefix="podman_restapi_")
self.cmd.append("--root=" + os.path.join(self.anchor_directory, "crio"))
self.cmd.append("--runroot=" + os.path.join(self.anchor_directory, "crio-run"))
- os.environ["REGISTRIES_CONFIG_PATH"] = os.path.join(
- self.anchor_directory, "registry.conf"
- )
+ os.environ["REGISTRIES_CONFIG_PATH"] = os.path.join(self.anchor_directory, "registry.conf")
p = configparser.ConfigParser()
p.read_dict(
{
@@ -40,14 +39,10 @@ class Podman(object):
with open(os.environ["REGISTRIES_CONFIG_PATH"], "w") as w:
p.write(w)
- os.environ["CNI_CONFIG_PATH"] = os.path.join(
- self.anchor_directory, "cni", "net.d"
- )
+ os.environ["CNI_CONFIG_PATH"] = os.path.join(self.anchor_directory, "cni", "net.d")
os.makedirs(os.environ["CNI_CONFIG_PATH"], exist_ok=True)
self.cmd.append("--cni-config-dir=" + os.environ["CNI_CONFIG_PATH"])
- cni_cfg = os.path.join(
- os.environ["CNI_CONFIG_PATH"], "87-podman-bridge.conflist"
- )
+ cni_cfg = os.path.join(os.environ["CNI_CONFIG_PATH"], "87-podman-bridge.conflist")
# json decoded and encoded to ensure legal json
buf = json.loads(
"""
diff --git a/test/apiv2/rest_api/test_rest_v2_0_0.py b/test/apiv2/rest_api/test_rest_v2_0_0.py
index 49e18f063..52348d4f4 100644
--- a/test/apiv2/rest_api/test_rest_v2_0_0.py
+++ b/test/apiv2/rest_api/test_rest_v2_0_0.py
@@ -61,9 +61,7 @@ class TestApi(unittest.TestCase):
super().setUpClass()
TestApi.podman = Podman()
- TestApi.service = TestApi.podman.open(
- "system", "service", "tcp:localhost:8080", "--time=0"
- )
+ TestApi.service = TestApi.podman.open("system", "service", "tcp:localhost:8080", "--time=0")
# give the service some time to be ready...
time.sleep(2)
@@ -165,11 +163,71 @@ class TestApi(unittest.TestCase):
r = requests.get(_url(ctnr("/containers/{}/logs?stdout=true")))
self.assertEqual(r.status_code, 200, r.text)
- def test_post_create_compat(self):
+ # TODO Need to support Docker-py order of network/container creates
+ def test_post_create_compat_connect(self):
"""Create network and container then connect to network"""
- net = requests.post(
- PODMAN_URL + "/v1.40/networks/create", json={"Name": "TestNetwork"}
+ net_default = requests.post(
+ PODMAN_URL + "/v1.40/networks/create", json={"Name": "TestDefaultNetwork"}
+ )
+ self.assertEqual(net_default.status_code, 201, net_default.text)
+
+ create = requests.post(
+ PODMAN_URL + "/v1.40/containers/create?name=postCreate",
+ json={
+ "Cmd": ["top"],
+ "Image": "alpine:latest",
+ "NetworkDisabled": False,
+ # FIXME adding these 2 lines cause: (This is sampled from docker-py)
+ # "network already exists","message":"container
+ # 01306e499df5441560d70071a54342611e422a94de20865add50a9565fd79fb9 is already connected to CNI network \"TestDefaultNetwork\": network already exists"
+ # "HostConfig": {"NetworkMode": "TestDefaultNetwork"},
+ # "NetworkingConfig": {"EndpointsConfig": {"TestDefaultNetwork": None}},
+ # FIXME These two lines cause:
+ # CNI network \"TestNetwork\" not found","message":"error configuring network namespace for container 369ddfa7d3211ebf1fbd5ddbff91bd33fa948858cea2985c133d6b6507546dff: CNI network \"TestNetwork\" not found"
+ # "HostConfig": {"NetworkMode": "TestNetwork"},
+ # "NetworkingConfig": {"EndpointsConfig": {"TestNetwork": None}},
+ # FIXME no networking defined cause: (note this error is from the container inspect below)
+ # "internal libpod error","message":"network inspection mismatch: asked to join 2 CNI network(s) [TestDefaultNetwork podman], but have information on 1 network(s): internal libpod error"
+ },
+ )
+ self.assertEqual(create.status_code, 201, create.text)
+ payload = json.loads(create.text)
+ self.assertIsNotNone(payload["Id"])
+
+ start = requests.post(PODMAN_URL + f"/v1.40/containers/{payload['Id']}/start")
+ self.assertEqual(start.status_code, 204, start.text)
+
+ connect = requests.post(
+ PODMAN_URL + "/v1.40/networks/TestDefaultNetwork/connect",
+ json={"Container": payload["Id"]},
+ )
+ self.assertEqual(connect.status_code, 200, connect.text)
+ self.assertEqual(connect.text, "OK\n")
+
+ inspect = requests.get(f"{PODMAN_URL}/v1.40/containers/{payload['Id']}/json")
+ self.assertEqual(inspect.status_code, 200, inspect.text)
+
+ payload = json.loads(inspect.text)
+ self.assertFalse(payload["Config"].get("NetworkDisabled", False))
+
+ self.assertEqual(
+ "TestDefaultNetwork",
+ payload["NetworkSettings"]["Networks"]["TestDefaultNetwork"]["NetworkID"],
)
+ # TODO restore this to test, when joining multiple networks possible
+ # self.assertEqual(
+ # "TestNetwork",
+ # payload["NetworkSettings"]["Networks"]["TestNetwork"]["NetworkID"],
+ # )
+ # TODO Need to support network aliases
+ # self.assertIn(
+ # "test_post_create",
+ # payload["NetworkSettings"]["Networks"]["TestNetwork"]["Aliases"],
+ # )
+
+ def test_post_create_compat(self):
+ """Create network and connect container during create"""
+ net = requests.post(PODMAN_URL + "/v1.40/networks/create", json={"Name": "TestNetwork"})
self.assertEqual(net.status_code, 201, net.text)
create = requests.post(
@@ -178,23 +236,21 @@ class TestApi(unittest.TestCase):
"Cmd": ["date"],
"Image": "alpine:latest",
"NetworkDisabled": False,
- "NetworkConfig": {
- "EndpointConfig": {"TestNetwork": {"Aliases": ["test_post_create"]}}
- },
+ "HostConfig": {"NetworkMode": "TestNetwork"},
},
)
self.assertEqual(create.status_code, 201, create.text)
payload = json.loads(create.text)
self.assertIsNotNone(payload["Id"])
- # This cannot be done until full completion of the network connect
- # stack and network disconnect stack are complete
- # connect = requests.post(
- # PODMAN_URL + "/v1.40/networks/TestNetwork/connect",
- # json={"Container": payload["Id"]},
- # )
- # self.assertEqual(connect.status_code, 200, connect.text)
- # self.assertEqual(connect.text, "OK\n")
+ inspect = requests.get(f"{PODMAN_URL}/v1.40/containers/{payload['Id']}/json")
+ self.assertEqual(inspect.status_code, 200, inspect.text)
+ payload = json.loads(inspect.text)
+ self.assertFalse(payload["Config"].get("NetworkDisabled", False))
+ self.assertEqual(
+ "TestNetwork",
+ payload["NetworkSettings"]["Networks"]["TestNetwork"]["NetworkID"],
+ )
def test_commit(self):
r = requests.post(_url(ctnr("/commit?container={}")))
diff --git a/test/apiv2/rest_api/v1_test_rest_v1_0_0.py b/test/apiv2/rest_api/v1_test_rest_v1_0_0.py
index acd6273ef..23528a246 100644
--- a/test/apiv2/rest_api/v1_test_rest_v1_0_0.py
+++ b/test/apiv2/rest_api/v1_test_rest_v1_0_0.py
@@ -84,9 +84,7 @@ class TestApi(unittest.TestCase):
print("\nService Stderr:\n" + stderr.decode("utf-8"))
if TestApi.podman.returncode > 0:
- sys.stderr.write(
- "podman exited with error code {}\n".format(TestApi.podman.returncode)
- )
+ sys.stderr.write("podman exited with error code {}\n".format(TestApi.podman.returncode))
sys.exit(2)
return super().tearDownClass()
diff --git a/test/e2e/common_test.go b/test/e2e/common_test.go
index facafcb77..16d8bb770 100644
--- a/test/e2e/common_test.go
+++ b/test/e2e/common_test.go
@@ -661,7 +661,7 @@ func (p *PodmanTestIntegration) PodmanAsUser(args []string, uid, gid uint32, cwd
return &PodmanSessionIntegration{podmanSession}
}
-// We don't support running Varlink when local
+// RestartRemoteService stop and start API Server, usually to change config
func (p *PodmanTestIntegration) RestartRemoteService() {
p.StopRemoteService()
p.StartRemoteService()
@@ -788,3 +788,9 @@ func generateNetworkConfig(p *PodmanTestIntegration) (string, string) {
return name, path
}
+
+func (p *PodmanTestIntegration) removeCNINetwork(name string) {
+ session := p.Podman([]string{"network", "rm", "-f", name})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(BeNumerically("<=", 1))
+}
diff --git a/test/e2e/config/containers-remote.conf b/test/e2e/config/containers-remote.conf
new file mode 100644
index 000000000..bc9eab951
--- /dev/null
+++ b/test/e2e/config/containers-remote.conf
@@ -0,0 +1,51 @@
+[containers]
+
+# A list of ulimits to be set in containers by default, specified as
+# "<ulimit name>=<soft limit>:<hard limit>", for example:
+# "nofile=1024:2048"
+# See setrlimit(2) for a list of resource names.
+# Any limit not specified here will be inherited from the process launching the
+# container engine.
+# Ulimits has limits for non privileged container engines.
+#
+default_ulimits = [
+ "nofile=100:100",
+]
+
+# Environment variable list for the conmon process; used for passing necessary
+# environment variables to conmon or the runtime.
+#
+env = [
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+ "foo=bar1",
+]
+
+# container engines use container separation using MAC(SELinux) labeling.
+# Flag is ignored on label disabled systems.
+#
+label = false
+
+# Size of /dev/shm. Specified as <number><unit>.
+# Unit is optional, values:
+# b (bytes), k (kilobytes), m (megabytes), or g (gigabytes).
+# If the unit is omitted, the system uses bytes.
+#
+shm_size = "202k"
+
+# List of devices. Specified as
+# "<device-on-host>:<device-on-container>:<permissions>", for example:
+# "/dev/sdc:/dev/xvdc:rwm".
+# If it is empty or commented out, only the default devices will be used
+#
+devices = []
+
+default_sysctls = [
+ "net.ipv4.ping_group_range=0 0",
+]
+
+dns_searches=[ "barfoo.com", ]
+dns_servers=[ "4.3.2.1", ]
+
+tz = "America/New_York"
+
+umask = "0022"
diff --git a/test/e2e/containers_conf_test.go b/test/e2e/containers_conf_test.go
index 1d5be218b..906153c0f 100644
--- a/test/e2e/containers_conf_test.go
+++ b/test/e2e/containers_conf_test.go
@@ -177,6 +177,9 @@ var _ = Describe("Podman run", func() {
}
os.Setenv("CONTAINERS_CONF", conffile)
+ if IsRemote() {
+ podmanTest.RestartRemoteService()
+ }
result := podmanTest.Podman([]string{"run", ALPINE, "ls", tempdir})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(0))
@@ -224,6 +227,17 @@ var _ = Describe("Podman run", func() {
Expect(session.LineInOuputStartsWith("search")).To(BeFalse())
})
+ It("podman run use containers.conf search domain", func() {
+ session := podmanTest.Podman([]string{"run", ALPINE, "cat", "/etc/resolv.conf"})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ Expect(session.LineInOuputStartsWith("search")).To(BeTrue())
+ Expect(session.OutputToString()).To(ContainSubstring("foobar.com"))
+
+ Expect(session.OutputToString()).To(ContainSubstring("1.2.3.4"))
+ Expect(session.OutputToString()).To(ContainSubstring("debug"))
+ })
+
It("podman run containers.conf timezone", func() {
//containers.conf timezone set to Pacific/Honolulu
session := podmanTest.Podman([]string{"run", ALPINE, "date", "+'%H %Z'"})
@@ -231,6 +245,7 @@ var _ = Describe("Podman run", func() {
Expect(session.ExitCode()).To(Equal(0))
Expect(session.OutputToString()).To(ContainSubstring("HST"))
})
+
It("podman run containers.conf umask", func() {
//containers.conf umask set to 0002
if !strings.Contains(podmanTest.OCIRuntime, "crun") {
@@ -243,4 +258,57 @@ var _ = Describe("Podman run", func() {
Expect(session.OutputToString()).To(Equal("0002"))
})
+ It("podman-remote test localcontainers.conf versus remote containers.conf", func() {
+ if !IsRemote() {
+ Skip("this test is only for remote")
+ }
+
+ os.Setenv("CONTAINERS_CONF", "config/containers-remote.conf")
+ // Configuration that comes from remote server
+ // env
+ session := podmanTest.Podman([]string{"run", ALPINE, "printenv", "foo"})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ Expect(session.OutputToString()).To(Equal("bar"))
+
+ // dns-search, server, options
+ session = podmanTest.Podman([]string{"run", ALPINE, "cat", "/etc/resolv.conf"})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ Expect(session.LineInOuputStartsWith("search")).To(BeTrue())
+ Expect(session.OutputToString()).To(ContainSubstring("foobar.com"))
+ Expect(session.OutputToString()).To(ContainSubstring("1.2.3.4"))
+ Expect(session.OutputToString()).To(ContainSubstring("debug"))
+
+ // sysctls
+ session = podmanTest.Podman([]string{"run", "--rm", ALPINE, "cat", "/proc/sys/net/ipv4/ping_group_range"})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ Expect(session.OutputToString()).To(ContainSubstring("1000"))
+
+ // shm-size
+ session = podmanTest.Podman([]string{"run", ALPINE, "grep", "shm", "/proc/self/mounts"})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ Expect(session.OutputToString()).To(ContainSubstring("size=200k"))
+
+ // ulimits
+ session = podmanTest.Podman([]string{"run", "--rm", fedoraMinimal, "ulimit", "-n"})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ Expect(session.OutputToString()).To(ContainSubstring("500"))
+
+ // Configuration that comes from remote client
+ // Timezone
+ session = podmanTest.Podman([]string{"run", ALPINE, "date", "+'%H %Z'"})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ Expect(session.OutputToString()).To(ContainSubstring("EST"))
+
+ // Umask
+ session = podmanTest.Podman([]string{"run", "--rm", ALPINE, "sh", "-c", "umask"})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ Expect(session.OutputToString()).To(Equal("0022"))
+ })
})
diff --git a/test/e2e/create_staticmac_test.go b/test/e2e/create_staticmac_test.go
index adffdc1ca..1ac431da2 100644
--- a/test/e2e/create_staticmac_test.go
+++ b/test/e2e/create_staticmac_test.go
@@ -5,6 +5,7 @@ import (
"github.com/containers/podman/v2/pkg/rootless"
. "github.com/containers/podman/v2/test/utils"
+ "github.com/containers/storage/pkg/stringid"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
@@ -45,4 +46,21 @@ var _ = Describe("Podman run with --mac-address flag", func() {
Expect(result.OutputToString()).To(ContainSubstring("92:d0:c6:0a:29:34"))
}
})
+
+ It("Podman run --mac-address with custom network", func() {
+ net := "n1" + stringid.GenerateNonCryptoID()
+ session := podmanTest.Podman([]string{"network", "create", net})
+ session.WaitWithDefaultTimeout()
+ defer podmanTest.removeCNINetwork(net)
+ Expect(session.ExitCode()).To(BeZero())
+
+ result := podmanTest.Podman([]string{"run", "--network", net, "--mac-address", "92:d0:c6:00:29:34", ALPINE, "ip", "addr"})
+ result.WaitWithDefaultTimeout()
+ if rootless.IsRootless() {
+ Expect(result.ExitCode()).To(Equal(125))
+ } else {
+ Expect(result.ExitCode()).To(Equal(0))
+ Expect(result.OutputToString()).To(ContainSubstring("92:d0:c6:00:29:34"))
+ }
+ })
})
diff --git a/test/e2e/libpod_suite_remote_test.go b/test/e2e/libpod_suite_remote_test.go
index fe8b8fe56..da57bb4c0 100644
--- a/test/e2e/libpod_suite_remote_test.go
+++ b/test/e2e/libpod_suite_remote_test.go
@@ -107,7 +107,6 @@ func (p *PodmanTestIntegration) StopRemoteService() {
}
} else {
- //p.ResetVarlinkAddress()
parentPid := fmt.Sprintf("%d", p.RemoteSession.Pid)
pgrep := exec.Command("pgrep", "-P", parentPid)
fmt.Printf("running: pgrep %s\n", parentPid)
diff --git a/test/e2e/libpod_suite_test.go b/test/e2e/libpod_suite_test.go
index c37b24ab6..0ae30ca10 100644
--- a/test/e2e/libpod_suite_test.go
+++ b/test/e2e/libpod_suite_test.go
@@ -59,13 +59,12 @@ func (p *PodmanTestIntegration) RestoreArtifact(image string) error {
}
func (p *PodmanTestIntegration) StopRemoteService() {}
-func (p *PodmanTestIntegration) DelayForVarlink() {}
// SeedImages is a no-op for localized testing
func (p *PodmanTestIntegration) SeedImages() error {
return nil
}
-// We don't support running Varlink when local
+// We don't support running API service when local
func (p *PodmanTestIntegration) StartRemoteService() {
}
diff --git a/test/e2e/libpod_suite_varlink_test.go b/test/e2e/libpod_suite_varlink_test.go
deleted file mode 100644
index 275a1115e..000000000
--- a/test/e2e/libpod_suite_varlink_test.go
+++ /dev/null
@@ -1,207 +0,0 @@
-// +build remoteclientvarlink
-
-package integration
-
-import (
- "bytes"
- "fmt"
- "io/ioutil"
- "os"
- "os/exec"
- "path/filepath"
- "strconv"
- "strings"
- "syscall"
- "time"
-
- "github.com/containers/podman/v2/pkg/rootless"
-
- "github.com/onsi/ginkgo"
-)
-
-func IsRemote() bool {
- return true
-}
-
-func SkipIfRemote(reason string) {
- ginkgo.Skip("[remote]: " + reason)
-}
-
-// Podman is the exec call to podman on the filesystem
-func (p *PodmanTestIntegration) Podman(args []string) *PodmanSessionIntegration {
- podmanSession := p.PodmanBase(args, false, false)
- return &PodmanSessionIntegration{podmanSession}
-}
-
-// PodmanExtraFiles is the exec call to podman on the filesystem and passes down extra files
-func (p *PodmanTestIntegration) PodmanExtraFiles(args []string, extraFiles []*os.File) *PodmanSessionIntegration {
- podmanSession := p.PodmanAsUserBase(args, 0, 0, "", nil, false, false, nil, extraFiles)
- return &PodmanSessionIntegration{podmanSession}
-}
-
-// PodmanNoCache calls podman with out adding the imagecache
-func (p *PodmanTestIntegration) PodmanNoCache(args []string) *PodmanSessionIntegration {
- podmanSession := p.PodmanBase(args, false, true)
- return &PodmanSessionIntegration{podmanSession}
-}
-
-// PodmanNoEvents calls the Podman command without an imagecache and without an
-// events backend. It is used mostly for caching and uncaching images.
-func (p *PodmanTestIntegration) PodmanNoEvents(args []string) *PodmanSessionIntegration {
- podmanSession := p.PodmanBase(args, true, true)
- return &PodmanSessionIntegration{podmanSession}
-}
-
-func (p *PodmanTestIntegration) setDefaultRegistriesConfigEnv() {
- defaultFile := filepath.Join(INTEGRATION_ROOT, "test/registries.conf")
- os.Setenv("REGISTRIES_CONFIG_PATH", defaultFile)
-}
-
-func (p *PodmanTestIntegration) setRegistriesConfigEnv(b []byte) {
- outfile := filepath.Join(p.TempDir, "registries.conf")
- os.Setenv("REGISTRIES_CONFIG_PATH", outfile)
- ioutil.WriteFile(outfile, b, 0644)
-}
-
-func resetRegistriesConfigEnv() {
- os.Setenv("REGISTRIES_CONFIG_PATH", "")
-}
-func PodmanTestCreate(tempDir string) *PodmanTestIntegration {
- pti := PodmanTestCreateUtil(tempDir, true)
- pti.StartRemoteService()
- return pti
-}
-
-func (p *PodmanTestIntegration) ResetVarlinkAddress() {
- //os.Unsetenv("PODMAN_VARLINK_ADDRESS")
-}
-
-func (p *PodmanTestIntegration) SetVarlinkAddress(addr string) {
- //os.Setenv("PODMAN_VARLINK_ADDRESS", addr)
-}
-
-func (p *PodmanTestIntegration) StartVarlink() {
- if os.Geteuid() == 0 {
- os.MkdirAll("/run/podman", 0755)
- }
- varlinkEndpoint := p.RemoteSocket
- p.SetVarlinkAddress(p.RemoteSocket)
-
- args := []string{"varlink", "--time", "0", varlinkEndpoint}
- podmanOptions := getVarlinkOptions(p, args)
- command := exec.Command(p.PodmanBinary, podmanOptions...)
- fmt.Printf("Running: %s %s\n", p.PodmanBinary, strings.Join(podmanOptions, " "))
- command.Start()
- command.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
- p.RemoteCommand = command
- p.RemoteSession = command.Process
- p.DelayForService()
-}
-
-func (p *PodmanTestIntegration) StopVarlink() {
- var out bytes.Buffer
- var pids []int
- varlinkSession := p.RemoteSession
-
- if !rootless.IsRootless() {
- if err := varlinkSession.Kill(); err != nil {
- fmt.Fprintf(os.Stderr, "error on varlink stop-kill %q", err)
- }
- if _, err := varlinkSession.Wait(); err != nil {
- fmt.Fprintf(os.Stderr, "error on varlink stop-wait %q", err)
- }
-
- } else {
- p.ResetVarlinkAddress()
- parentPid := fmt.Sprintf("%d", p.RemoteSession.Pid)
- pgrep := exec.Command("pgrep", "-P", parentPid)
- fmt.Printf("running: pgrep %s\n", parentPid)
- pgrep.Stdout = &out
- err := pgrep.Run()
- if err != nil {
- fmt.Fprint(os.Stderr, "unable to find varlink pid")
- }
-
- for _, s := range strings.Split(out.String(), "\n") {
- if len(s) == 0 {
- continue
- }
- p, err := strconv.Atoi(s)
- if err != nil {
- fmt.Fprintf(os.Stderr, "unable to convert %s to int", s)
- }
- if p != 0 {
- pids = append(pids, p)
- }
- }
-
- pids = append(pids, p.RemoteSession.Pid)
- for _, pid := range pids {
- syscall.Kill(pid, syscall.SIGKILL)
- }
- }
- socket := strings.Split(p.RemoteSocket, ":")[1]
- if err := os.Remove(socket); err != nil {
- fmt.Println(err)
- }
-}
-
-//MakeOptions assembles all the podman main options
-func (p *PodmanTestIntegration) makeOptions(args []string, noEvents, noCache bool) []string {
- return args
-}
-
-//MakeOptions assembles all the podman main options
-func getVarlinkOptions(p *PodmanTestIntegration, args []string) []string {
- podmanOptions := strings.Split(fmt.Sprintf("--root %s --runroot %s --runtime %s --conmon %s --cni-config-dir %s --cgroup-manager %s",
- p.CrioRoot, p.RunRoot, p.OCIRuntime, p.ConmonBinary, p.CNIConfigDir, p.CgroupManager), " ")
- if os.Getenv("HOOK_OPTION") != "" {
- podmanOptions = append(podmanOptions, os.Getenv("HOOK_OPTION"))
- }
- podmanOptions = append(podmanOptions, strings.Split(p.StorageOptions, " ")...)
- podmanOptions = append(podmanOptions, args...)
- return podmanOptions
-}
-
-func (p *PodmanTestIntegration) RestoreArtifactToCache(image string) error {
- fmt.Printf("Restoring %s...\n", image)
- dest := strings.Split(image, "/")
- destName := fmt.Sprintf("/tmp/%s.tar", strings.Replace(strings.Join(strings.Split(dest[len(dest)-1], "/"), ""), ":", "-", -1))
- p.CrioRoot = p.ImageCacheDir
- restore := p.PodmanNoEvents([]string{"load", "-q", "-i", destName})
- restore.WaitWithDefaultTimeout()
- return nil
-}
-
-// SeedImages restores all the artifacts into the main store for remote tests
-func (p *PodmanTestIntegration) SeedImages() error {
- return p.RestoreAllArtifacts()
-}
-
-// RestoreArtifact puts the cached image into our test store
-func (p *PodmanTestIntegration) RestoreArtifact(image string) error {
- fmt.Printf("Restoring %s...\n", image)
- dest := strings.Split(image, "/")
- destName := fmt.Sprintf("/tmp/%s.tar", strings.Replace(strings.Join(strings.Split(dest[len(dest)-1], "/"), ""), ":", "-", -1))
- args := []string{"load", "-q", "-i", destName}
- podmanOptions := getVarlinkOptions(p, args)
- command := exec.Command(p.PodmanBinary, podmanOptions...)
- fmt.Printf("Running: %s %s\n", p.PodmanBinary, strings.Join(podmanOptions, " "))
- command.Start()
- command.Wait()
- return nil
-}
-
-func (p *PodmanTestIntegration) DelayForVarlink() {
- for i := 0; i < 5; i++ {
- session := p.Podman([]string{"info"})
- session.WaitWithDefaultTimeout()
- if session.ExitCode() == 0 || i == 4 {
- break
- }
- time.Sleep(1 * time.Second)
- }
-}
-
-func populateCache(podman *PodmanTestIntegration) {}
-func removeCache() {}
diff --git a/test/e2e/network_connect_disconnect_test.go b/test/e2e/network_connect_disconnect_test.go
new file mode 100644
index 000000000..7cdad9bf2
--- /dev/null
+++ b/test/e2e/network_connect_disconnect_test.go
@@ -0,0 +1,217 @@
+package integration
+
+import (
+ "os"
+
+ . "github.com/containers/podman/v2/test/utils"
+ "github.com/containers/storage/pkg/stringid"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("Podman network connect and disconnect", func() {
+ var (
+ tempdir string
+ err error
+ podmanTest *PodmanTestIntegration
+ )
+
+ BeforeEach(func() {
+ tempdir, err = CreateTempDirInTempDir()
+ if err != nil {
+ os.Exit(1)
+ }
+ podmanTest = PodmanTestCreate(tempdir)
+ podmanTest.Setup()
+ })
+
+ AfterEach(func() {
+ podmanTest.Cleanup()
+ f := CurrentGinkgoTestDescription()
+ processTestResult(f)
+
+ })
+
+ It("bad network name in disconnect should result in error", func() {
+ SkipIfRootless("network connect and disconnect are only rootfull")
+ dis := podmanTest.Podman([]string{"network", "disconnect", "foobar", "test"})
+ dis.WaitWithDefaultTimeout()
+ Expect(dis.ExitCode()).ToNot(BeZero())
+
+ })
+
+ It("bad container name in network disconnect should result in error", func() {
+ SkipIfRootless("network connect and disconnect are only rootfull")
+ netName := "aliasTest" + stringid.GenerateNonCryptoID()
+ session := podmanTest.Podman([]string{"network", "create", netName})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(BeZero())
+ defer podmanTest.removeCNINetwork(netName)
+
+ dis := podmanTest.Podman([]string{"network", "disconnect", netName, "foobar"})
+ dis.WaitWithDefaultTimeout()
+ Expect(dis.ExitCode()).ToNot(BeZero())
+
+ })
+
+ It("podman network disconnect", func() {
+ SkipIfRootless("network connect and disconnect are only rootfull")
+ netName := "aliasTest" + stringid.GenerateNonCryptoID()
+ session := podmanTest.Podman([]string{"network", "create", netName})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(BeZero())
+ defer podmanTest.removeCNINetwork(netName)
+
+ ctr := podmanTest.Podman([]string{"run", "-dt", "--name", "test", "--network", netName, ALPINE, "top"})
+ ctr.WaitWithDefaultTimeout()
+ Expect(ctr.ExitCode()).To(BeZero())
+
+ exec := podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"})
+ exec.WaitWithDefaultTimeout()
+ Expect(exec.ExitCode()).To(BeZero())
+
+ dis := podmanTest.Podman([]string{"network", "disconnect", netName, "test"})
+ dis.WaitWithDefaultTimeout()
+ Expect(dis.ExitCode()).To(BeZero())
+
+ exec = podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"})
+ exec.WaitWithDefaultTimeout()
+ Expect(exec.ExitCode()).ToNot(BeZero())
+ })
+
+ It("bad network name in connect should result in error", func() {
+ SkipIfRootless("network connect and disconnect are only rootfull")
+ dis := podmanTest.Podman([]string{"network", "connect", "foobar", "test"})
+ dis.WaitWithDefaultTimeout()
+ Expect(dis.ExitCode()).ToNot(BeZero())
+
+ })
+
+ It("bad container name in network connect should result in error", func() {
+ SkipIfRootless("network connect and disconnect are only rootfull")
+ netName := "aliasTest" + stringid.GenerateNonCryptoID()
+ session := podmanTest.Podman([]string{"network", "create", netName})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(BeZero())
+ defer podmanTest.removeCNINetwork(netName)
+
+ dis := podmanTest.Podman([]string{"network", "connect", netName, "foobar"})
+ dis.WaitWithDefaultTimeout()
+ Expect(dis.ExitCode()).ToNot(BeZero())
+
+ })
+
+ It("podman connect on a container that already is connected to the network should error", func() {
+ SkipIfRootless("network connect and disconnect are only rootfull")
+ netName := "aliasTest" + stringid.GenerateNonCryptoID()
+ session := podmanTest.Podman([]string{"network", "create", netName})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(BeZero())
+ defer podmanTest.removeCNINetwork(netName)
+
+ ctr := podmanTest.Podman([]string{"create", "--name", "test", "--network", netName, ALPINE, "top"})
+ ctr.WaitWithDefaultTimeout()
+ Expect(ctr.ExitCode()).To(BeZero())
+
+ con := podmanTest.Podman([]string{"network", "connect", netName, "test"})
+ con.WaitWithDefaultTimeout()
+ Expect(con.ExitCode()).ToNot(BeZero())
+ })
+
+ It("podman network connect", func() {
+ SkipIfRemote("This requires a pending PR to be merged before it will work")
+ SkipIfRootless("network connect and disconnect are only rootfull")
+ netName := "aliasTest" + stringid.GenerateNonCryptoID()
+ session := podmanTest.Podman([]string{"network", "create", netName})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(BeZero())
+ defer podmanTest.removeCNINetwork(netName)
+
+ ctr := podmanTest.Podman([]string{"run", "-dt", "--name", "test", "--network", netName, ALPINE, "top"})
+ ctr.WaitWithDefaultTimeout()
+ Expect(ctr.ExitCode()).To(BeZero())
+
+ exec := podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"})
+ exec.WaitWithDefaultTimeout()
+ Expect(exec.ExitCode()).To(BeZero())
+
+ // Create a second network
+ newNetName := "aliasTest" + stringid.GenerateNonCryptoID()
+ session = podmanTest.Podman([]string{"network", "create", newNetName})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(BeZero())
+ defer podmanTest.removeCNINetwork(newNetName)
+
+ connect := podmanTest.Podman([]string{"network", "connect", newNetName, "test"})
+ connect.WaitWithDefaultTimeout()
+ Expect(connect.ExitCode()).To(BeZero())
+
+ exec = podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth1"})
+ exec.WaitWithDefaultTimeout()
+ Expect(exec.ExitCode()).To(BeZero())
+ })
+
+ It("podman network connect when not running", func() {
+ SkipIfRootless("network connect and disconnect are only rootfull")
+ netName := "aliasTest" + stringid.GenerateNonCryptoID()
+ session := podmanTest.Podman([]string{"network", "create", netName})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(BeZero())
+ defer podmanTest.removeCNINetwork(netName)
+
+ ctr := podmanTest.Podman([]string{"create", "--name", "test", ALPINE, "top"})
+ ctr.WaitWithDefaultTimeout()
+ Expect(ctr.ExitCode()).To(BeZero())
+
+ dis := podmanTest.Podman([]string{"network", "connect", netName, "test"})
+ dis.WaitWithDefaultTimeout()
+ Expect(dis.ExitCode()).To(BeZero())
+
+ start := podmanTest.Podman([]string{"start", "test"})
+ start.WaitWithDefaultTimeout()
+ Expect(start.ExitCode()).To(BeZero())
+
+ exec := podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"})
+ exec.WaitWithDefaultTimeout()
+ Expect(exec.ExitCode()).To(BeZero())
+
+ exec = podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth1"})
+ exec.WaitWithDefaultTimeout()
+ Expect(exec.ExitCode()).To(BeZero())
+ })
+
+ It("podman network disconnect when not running", func() {
+ SkipIfRootless("network connect and disconnect are only rootfull")
+ netName1 := "aliasTest" + stringid.GenerateNonCryptoID()
+ session := podmanTest.Podman([]string{"network", "create", netName1})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(BeZero())
+ defer podmanTest.removeCNINetwork(netName1)
+
+ netName2 := "aliasTest" + stringid.GenerateNonCryptoID()
+ session2 := podmanTest.Podman([]string{"network", "create", netName2})
+ session2.WaitWithDefaultTimeout()
+ Expect(session2.ExitCode()).To(BeZero())
+ defer podmanTest.removeCNINetwork(netName2)
+
+ ctr := podmanTest.Podman([]string{"create", "--name", "test", "--network", netName1 + "," + netName2, ALPINE, "top"})
+ ctr.WaitWithDefaultTimeout()
+ Expect(ctr.ExitCode()).To(BeZero())
+
+ dis := podmanTest.Podman([]string{"network", "disconnect", netName1, "test"})
+ dis.WaitWithDefaultTimeout()
+ Expect(dis.ExitCode()).To(BeZero())
+
+ start := podmanTest.Podman([]string{"start", "test"})
+ start.WaitWithDefaultTimeout()
+ Expect(start.ExitCode()).To(BeZero())
+
+ exec := podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"})
+ exec.WaitWithDefaultTimeout()
+ Expect(exec.ExitCode()).To(BeZero())
+
+ exec = podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth1"})
+ exec.WaitWithDefaultTimeout()
+ Expect(exec.ExitCode()).ToNot(BeZero())
+ })
+})
diff --git a/test/e2e/network_create_test.go b/test/e2e/network_create_test.go
index cb997d10a..043046c33 100644
--- a/test/e2e/network_create_test.go
+++ b/test/e2e/network_create_test.go
@@ -55,12 +55,6 @@ func genericPluginsToPortMap(plugins interface{}, pluginType string) (network.Po
return portMap, err
}
-func (p *PodmanTestIntegration) removeCNINetwork(name string) {
- session := p.Podman([]string{"network", "rm", "-f", name})
- session.WaitWithDefaultTimeout()
- Expect(session.ExitCode()).To(BeNumerically("<=", 1))
-}
-
func removeNetworkDevice(name string) {
session := SystemExec("ip", []string{"link", "delete", name})
session.WaitWithDefaultTimeout()
diff --git a/test/e2e/network_test.go b/test/e2e/network_test.go
index c6593df34..20e1d5b6b 100644
--- a/test/e2e/network_test.go
+++ b/test/e2e/network_test.go
@@ -76,31 +76,36 @@ var _ = Describe("Podman network", func() {
Expect(session.LineInOutputContains(name)).To(BeFalse())
})
- It("podman network rm no args", func() {
- session := podmanTest.Podman([]string{"network", "rm"})
- session.WaitWithDefaultTimeout()
- Expect(session.ExitCode()).ToNot(BeZero())
- })
+ rm_func := func(rm string) {
+ It(fmt.Sprintf("podman network %s no args", rm), func() {
+ session := podmanTest.Podman([]string{"network", rm})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).ToNot(BeZero())
- It("podman network rm", func() {
- SkipIfRootless("FIXME: This one is definitely broken in rootless mode")
- name, path := generateNetworkConfig(podmanTest)
- defer removeConf(path)
+ })
- session := podmanTest.Podman([]string{"network", "ls", "--quiet"})
- session.WaitWithDefaultTimeout()
- Expect(session.ExitCode()).To(Equal(0))
- Expect(session.LineInOutputContains(name)).To(BeTrue())
+ It(fmt.Sprintf("podman network %s", rm), func() {
+ name, path := generateNetworkConfig(podmanTest)
+ defer removeConf(path)
- rm := podmanTest.Podman([]string{"network", "rm", name})
- rm.WaitWithDefaultTimeout()
- Expect(rm.ExitCode()).To(BeZero())
+ session := podmanTest.Podman([]string{"network", "ls", "--quiet"})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ Expect(session.LineInOutputContains(name)).To(BeTrue())
- results := podmanTest.Podman([]string{"network", "ls", "--quiet"})
- results.WaitWithDefaultTimeout()
- Expect(results.ExitCode()).To(Equal(0))
- Expect(results.LineInOutputContains(name)).To(BeFalse())
- })
+ rm := podmanTest.Podman([]string{"network", rm, name})
+ rm.WaitWithDefaultTimeout()
+ Expect(rm.ExitCode()).To(BeZero())
+
+ results := podmanTest.Podman([]string{"network", "ls", "--quiet"})
+ results.WaitWithDefaultTimeout()
+ Expect(results.ExitCode()).To(Equal(0))
+ Expect(results.LineInOutputContains(name)).To(BeFalse())
+ })
+ }
+
+ rm_func("rm")
+ rm_func("remove")
It("podman network inspect no args", func() {
session := podmanTest.Podman([]string{"network", "inspect"})
@@ -342,156 +347,14 @@ var _ = Describe("Podman network", func() {
Expect(c3.ExitCode()).To(BeZero())
})
- It("bad network name in disconnect should result in error", func() {
- SkipIfRootless("network connect and disconnect are only rootfull")
- dis := podmanTest.Podman([]string{"network", "disconnect", "foobar", "test"})
- dis.WaitWithDefaultTimeout()
- Expect(dis.ExitCode()).ToNot(BeZero())
-
- })
-
- It("bad container name in network disconnect should result in error", func() {
- SkipIfRootless("network connect and disconnect are only rootfull")
- netName := "aliasTest" + stringid.GenerateNonCryptoID()
- session := podmanTest.Podman([]string{"network", "create", netName})
- session.WaitWithDefaultTimeout()
- Expect(session.ExitCode()).To(BeZero())
- defer podmanTest.removeCNINetwork(netName)
-
- dis := podmanTest.Podman([]string{"network", "disconnect", netName, "foobar"})
- dis.WaitWithDefaultTimeout()
- Expect(dis.ExitCode()).ToNot(BeZero())
-
- })
-
- It("podman network disconnect with invalid container state should result in error", func() {
- SkipIfRootless("network connect and disconnect are only rootfull")
- netName := "aliasTest" + stringid.GenerateNonCryptoID()
- session := podmanTest.Podman([]string{"network", "create", netName})
- session.WaitWithDefaultTimeout()
- Expect(session.ExitCode()).To(BeZero())
- defer podmanTest.removeCNINetwork(netName)
-
- ctr := podmanTest.Podman([]string{"create", "--name", "test", "--network", netName, ALPINE, "top"})
- ctr.WaitWithDefaultTimeout()
- Expect(ctr.ExitCode()).To(BeZero())
-
- dis := podmanTest.Podman([]string{"network", "disconnect", netName, "test"})
- dis.WaitWithDefaultTimeout()
- Expect(dis.ExitCode()).ToNot(BeZero())
- })
-
- It("podman network disconnect", func() {
- SkipIfRootless("network connect and disconnect are only rootfull")
- netName := "aliasTest" + stringid.GenerateNonCryptoID()
- session := podmanTest.Podman([]string{"network", "create", netName})
- session.WaitWithDefaultTimeout()
- Expect(session.ExitCode()).To(BeZero())
- defer podmanTest.removeCNINetwork(netName)
-
- ctr := podmanTest.Podman([]string{"run", "-dt", "--name", "test", "--network", netName, ALPINE, "top"})
- ctr.WaitWithDefaultTimeout()
- Expect(ctr.ExitCode()).To(BeZero())
-
- exec := podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"})
- exec.WaitWithDefaultTimeout()
- Expect(exec.ExitCode()).To(BeZero())
-
- dis := podmanTest.Podman([]string{"network", "disconnect", netName, "test"})
- dis.WaitWithDefaultTimeout()
- Expect(dis.ExitCode()).To(BeZero())
-
- exec = podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"})
- exec.WaitWithDefaultTimeout()
- Expect(exec.ExitCode()).ToNot(BeZero())
- })
-
- It("bad network name in connect should result in error", func() {
- SkipIfRootless("network connect and disconnect are only rootfull")
- dis := podmanTest.Podman([]string{"network", "connect", "foobar", "test"})
- dis.WaitWithDefaultTimeout()
- Expect(dis.ExitCode()).ToNot(BeZero())
-
- })
-
- It("bad container name in network connect should result in error", func() {
- SkipIfRootless("network connect and disconnect are only rootfull")
- netName := "aliasTest" + stringid.GenerateNonCryptoID()
- session := podmanTest.Podman([]string{"network", "create", netName})
- session.WaitWithDefaultTimeout()
- Expect(session.ExitCode()).To(BeZero())
- defer podmanTest.removeCNINetwork(netName)
-
- dis := podmanTest.Podman([]string{"network", "connect", netName, "foobar"})
- dis.WaitWithDefaultTimeout()
- Expect(dis.ExitCode()).ToNot(BeZero())
-
- })
-
- It("podman connect on a container that already is connected to the network should error", func() {
- SkipIfRootless("network connect and disconnect are only rootfull")
- netName := "aliasTest" + stringid.GenerateNonCryptoID()
- session := podmanTest.Podman([]string{"network", "create", netName})
- session.WaitWithDefaultTimeout()
- Expect(session.ExitCode()).To(BeZero())
- defer podmanTest.removeCNINetwork(netName)
-
- ctr := podmanTest.Podman([]string{"create", "--name", "test", "--network", netName, ALPINE, "top"})
- ctr.WaitWithDefaultTimeout()
- Expect(ctr.ExitCode()).To(BeZero())
-
- con := podmanTest.Podman([]string{"network", "connect", netName, "test"})
- con.WaitWithDefaultTimeout()
- Expect(con.ExitCode()).ToNot(BeZero())
- })
-
- It("podman network connect with invalid container state should result in error", func() {
- SkipIfRootless("network connect and disconnect are only rootfull")
- netName := "aliasTest" + stringid.GenerateNonCryptoID()
- session := podmanTest.Podman([]string{"network", "create", netName})
- session.WaitWithDefaultTimeout()
- Expect(session.ExitCode()).To(BeZero())
- defer podmanTest.removeCNINetwork(netName)
-
- ctr := podmanTest.Podman([]string{"create", "--name", "test", "--network", netName, ALPINE, "top"})
- ctr.WaitWithDefaultTimeout()
- Expect(ctr.ExitCode()).To(BeZero())
-
- dis := podmanTest.Podman([]string{"network", "connect", netName, "test"})
- dis.WaitWithDefaultTimeout()
- Expect(dis.ExitCode()).ToNot(BeZero())
- })
-
- It("podman network connect", func() {
- SkipIfRemote("This requires a pending PR to be merged before it will work")
- SkipIfRootless("network connect and disconnect are only rootfull")
- netName := "aliasTest" + stringid.GenerateNonCryptoID()
- session := podmanTest.Podman([]string{"network", "create", netName})
- session.WaitWithDefaultTimeout()
- Expect(session.ExitCode()).To(BeZero())
- defer podmanTest.removeCNINetwork(netName)
-
- ctr := podmanTest.Podman([]string{"run", "-dt", "--name", "test", "--network", netName, ALPINE, "top"})
- ctr.WaitWithDefaultTimeout()
- Expect(ctr.ExitCode()).To(BeZero())
-
- exec := podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"})
- exec.WaitWithDefaultTimeout()
- Expect(exec.ExitCode()).To(BeZero())
-
- // Create a second network
- newNetName := "aliasTest" + stringid.GenerateNonCryptoID()
- session = podmanTest.Podman([]string{"network", "create", newNetName})
- session.WaitWithDefaultTimeout()
- Expect(session.ExitCode()).To(BeZero())
- defer podmanTest.removeCNINetwork(newNetName)
-
- connect := podmanTest.Podman([]string{"network", "connect", newNetName, "test"})
- connect.WaitWithDefaultTimeout()
- Expect(connect.ExitCode()).To(BeZero())
+ It("podman network create/remove macvlan", func() {
+ net := "macvlan" + stringid.GenerateNonCryptoID()
+ nc := podmanTest.Podman([]string{"network", "create", "--macvlan", "lo", net})
+ nc.WaitWithDefaultTimeout()
+ Expect(nc.ExitCode()).To(Equal(0))
- exec = podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth1"})
- exec.WaitWithDefaultTimeout()
- Expect(exec.ExitCode()).To(BeZero())
+ nc = podmanTest.Podman([]string{"network", "rm", net})
+ nc.WaitWithDefaultTimeout()
+ Expect(nc.ExitCode()).To(Equal(0))
})
})
diff --git a/test/e2e/play_kube_test.go b/test/e2e/play_kube_test.go
index 92e4544f9..5ecfdd6b5 100644
--- a/test/e2e/play_kube_test.go
+++ b/test/e2e/play_kube_test.go
@@ -164,9 +164,15 @@ spec:
volumes:
{{ range . }}
- name: {{ .Name }}
+ {{- if (eq .VolumeType "HostPath") }}
hostPath:
- path: {{ .Path }}
- type: {{ .Type }}
+ path: {{ .HostPath.Path }}
+ type: {{ .HostPath.Type }}
+ {{- end }}
+ {{- if (eq .VolumeType "PersistentVolumeClaim") }}
+ persistentVolumeClaim:
+ claimName: {{ .PersistentVolumeClaim.ClaimName }}
+ {{- end }}
{{ end }}
{{ end }}
status: {}
@@ -692,19 +698,44 @@ func getCtrNameInPod(pod *Pod) string {
return fmt.Sprintf("%s-%s", pod.Name, defaultCtrName)
}
-type Volume struct {
- Name string
+type HostPath struct {
Path string
Type string
}
-// getVolume takes a type and a location for a volume
-// giving it a default name of volName
-func getVolume(vType, vPath string) *Volume {
+type PersistentVolumeClaim struct {
+ ClaimName string
+}
+
+type Volume struct {
+ VolumeType string
+ Name string
+ HostPath
+ PersistentVolumeClaim
+}
+
+// getHostPathVolume takes a type and a location for a HostPath
+// volume giving it a default name of volName
+func getHostPathVolume(vType, vPath string) *Volume {
+ return &Volume{
+ VolumeType: "HostPath",
+ Name: defaultVolName,
+ HostPath: HostPath{
+ Path: vPath,
+ Type: vType,
+ },
+ }
+}
+
+// getHostPathVolume takes a name for a Persistentvolumeclaim
+// volume giving it a default name of volName
+func getPersistentVolumeClaimVolume(vName string) *Volume {
return &Volume{
- Name: defaultVolName,
- Path: vPath,
- Type: vType,
+ VolumeType: "PersistentVolumeClaim",
+ Name: defaultVolName,
+ PersistentVolumeClaim: PersistentVolumeClaim{
+ ClaimName: vName,
+ },
}
}
@@ -1257,7 +1288,7 @@ spec:
It("podman play kube test with non-existent empty HostPath type volume", func() {
hostPathLocation := filepath.Join(tempdir, "file")
- pod := getPod(withVolume(getVolume(`""`, hostPathLocation)))
+ pod := getPod(withVolume(getHostPathVolume(`""`, hostPathLocation)))
err := generateKubeYaml("pod", pod, kubeYaml)
Expect(err).To(BeNil())
@@ -1272,7 +1303,7 @@ spec:
Expect(err).To(BeNil())
f.Close()
- pod := getPod(withVolume(getVolume(`""`, hostPathLocation)))
+ pod := getPod(withVolume(getHostPathVolume(`""`, hostPathLocation)))
err = generateKubeYaml("pod", pod, kubeYaml)
Expect(err).To(BeNil())
@@ -1284,7 +1315,7 @@ spec:
It("podman play kube test with non-existent File HostPath type volume", func() {
hostPathLocation := filepath.Join(tempdir, "file")
- pod := getPod(withVolume(getVolume("File", hostPathLocation)))
+ pod := getPod(withVolume(getHostPathVolume("File", hostPathLocation)))
err := generateKubeYaml("pod", pod, kubeYaml)
Expect(err).To(BeNil())
@@ -1299,7 +1330,7 @@ spec:
Expect(err).To(BeNil())
f.Close()
- pod := getPod(withVolume(getVolume("File", hostPathLocation)))
+ pod := getPod(withVolume(getHostPathVolume("File", hostPathLocation)))
err = generateKubeYaml("pod", pod, kubeYaml)
Expect(err).To(BeNil())
@@ -1311,7 +1342,7 @@ spec:
It("podman play kube test with FileOrCreate HostPath type volume", func() {
hostPathLocation := filepath.Join(tempdir, "file")
- pod := getPod(withVolume(getVolume("FileOrCreate", hostPathLocation)))
+ pod := getPod(withVolume(getHostPathVolume("FileOrCreate", hostPathLocation)))
err := generateKubeYaml("pod", pod, kubeYaml)
Expect(err).To(BeNil())
@@ -1327,7 +1358,7 @@ spec:
It("podman play kube test with DirectoryOrCreate HostPath type volume", func() {
hostPathLocation := filepath.Join(tempdir, "file")
- pod := getPod(withVolume(getVolume("DirectoryOrCreate", hostPathLocation)))
+ pod := getPod(withVolume(getHostPathVolume("DirectoryOrCreate", hostPathLocation)))
err := generateKubeYaml("pod", pod, kubeYaml)
Expect(err).To(BeNil())
@@ -1347,7 +1378,7 @@ spec:
Expect(err).To(BeNil())
f.Close()
- pod := getPod(withVolume(getVolume("Socket", hostPathLocation)))
+ pod := getPod(withVolume(getHostPathVolume("Socket", hostPathLocation)))
err = generateKubeYaml("pod", pod, kubeYaml)
Expect(err).To(BeNil())
@@ -1356,14 +1387,14 @@ spec:
Expect(kube.ExitCode()).NotTo(Equal(0))
})
- It("podman play kube test with read only volume", func() {
+ It("podman play kube test with read only HostPath volume", func() {
hostPathLocation := filepath.Join(tempdir, "file")
f, err := os.Create(hostPathLocation)
Expect(err).To(BeNil())
f.Close()
ctr := getCtr(withVolumeMount(hostPathLocation, true), withImage(BB))
- pod := getPod(withVolume(getVolume("File", hostPathLocation)), withCtr(ctr))
+ pod := getPod(withVolume(getHostPathVolume("File", hostPathLocation)), withCtr(ctr))
err = generateKubeYaml("pod", pod, kubeYaml)
Expect(err).To(BeNil())
@@ -1379,6 +1410,26 @@ spec:
Expect(inspect.OutputToString()).To(ContainSubstring(correct))
})
+ It("podman play kube test with PersistentVolumeClaim volume", func() {
+ volumeName := "namedVolume"
+
+ ctr := getCtr(withVolumeMount("/test", false), withImage(BB))
+ pod := getPod(withVolume(getPersistentVolumeClaimVolume(volumeName)), withCtr(ctr))
+ err = generateKubeYaml("pod", pod, kubeYaml)
+ Expect(err).To(BeNil())
+
+ kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
+ kube.WaitWithDefaultTimeout()
+ Expect(kube.ExitCode()).To(Equal(0))
+
+ inspect := podmanTest.Podman([]string{"inspect", getCtrNameInPod(pod), "--format", "{{ (index .Mounts 0).Type }}:{{ (index .Mounts 0).Name }}"})
+ inspect.WaitWithDefaultTimeout()
+ Expect(inspect.ExitCode()).To(Equal(0))
+
+ correct := fmt.Sprintf("volume:%s", volumeName)
+ Expect(inspect.OutputToString()).To(Equal(correct))
+ })
+
It("podman play kube applies labels to pods", func() {
var numReplicas int32 = 5
expectedLabelKey := "key1"
diff --git a/test/e2e/ps_test.go b/test/e2e/ps_test.go
index fd08d4308..05571157c 100644
--- a/test/e2e/ps_test.go
+++ b/test/e2e/ps_test.go
@@ -44,6 +44,12 @@ var _ = Describe("Podman ps", func() {
Expect(session.ExitCode()).To(Equal(0))
})
+ It("podman container ps no containers", func() {
+ session := podmanTest.Podman([]string{"container", "ps"})
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ })
+
It("podman ps default", func() {
session := podmanTest.RunTopContainer("")
session.WaitWithDefaultTimeout()
diff --git a/test/e2e/run_test.go b/test/e2e/run_test.go
index 5ee85efb9..0d65a3e59 100644
--- a/test/e2e/run_test.go
+++ b/test/e2e/run_test.go
@@ -75,11 +75,9 @@ var _ = Describe("Podman run", func() {
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
- // the --rm option conflicts with --restart, when the restartPolicy is not "" and "no"
- // so the exitCode should not equal 0
session = podmanTest.Podman([]string{"run", "--rm", "--restart", "on-failure", ALPINE})
session.WaitWithDefaultTimeout()
- Expect(session.ExitCode()).To(Not(Equal(0)))
+ Expect(session.ExitCode()).To(Equal(0))
session = podmanTest.Podman([]string{"run", "--rm", "--restart", "always", ALPINE})
session.WaitWithDefaultTimeout()
diff --git a/test/e2e/system_reset_test.go b/test/e2e/system_reset_test.go
index b2d350436..e716ce4f3 100644
--- a/test/e2e/system_reset_test.go
+++ b/test/e2e/system_reset_test.go
@@ -59,7 +59,7 @@ var _ = Describe("podman system reset", func() {
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
- // If remote then the varlink service should have exited
+ // If remote then the API service should have exited
// On local tests this is a noop
podmanTest.StartRemoteService()
diff --git a/test/endpoint/commit.go b/test/endpoint/commit.go
deleted file mode 100644
index 97e10efb0..000000000
--- a/test/endpoint/commit.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// +build varlink
-
-package endpoint
-
-import (
- "encoding/json"
- "os"
-
- . "github.com/containers/podman/v2/test/utils"
- . "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
-)
-
-var _ = Describe("Podman commit", func() {
- var (
- tempdir string
- err error
- endpointTest *EndpointTestIntegration
- )
-
- BeforeEach(func() {
- tempdir, err = CreateTempDirInTempDir()
- if err != nil {
- os.Exit(1)
- }
- endpointTest = Setup(tempdir)
- endpointTest.StartVarlinkWithCache()
- })
-
- AfterEach(func() {
- endpointTest.Cleanup()
-
- })
-
- It("ensure commit with uppercase image name does not panic", func() {
- body := make(map[string]string)
- body["image_name"] = "FOO"
- body["format"] = "oci"
- body["name"] = "top"
- b, err := json.Marshal(body)
- Expect(err).To(BeNil())
- // run the container to be committed
- _ = endpointTest.startTopContainer("top")
- result := endpointTest.Varlink("Commit", string(b), false)
- // This indicates an error occurred
- Expect(len(result.StdErrToString())).To(BeNumerically(">", 0))
- })
-
-})
diff --git a/test/endpoint/config.go b/test/endpoint/config.go
deleted file mode 100644
index 9d2a5a239..000000000
--- a/test/endpoint/config.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// +build varlink
-
-package endpoint
-
-import "encoding/json"
-
-var (
- STORAGE_FS = "vfs"
- STORAGE_OPTIONS = "--storage-driver vfs"
- ROOTLESS_STORAGE_FS = "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.6"
- labels = "quay.io/libpod/alpine_labels:latest"
-)
-
-func makeNameMessage(name string) string {
- n := make(map[string]string)
- n["name"] = name
- b, _ := json.Marshal(n)
- return string(b)
-}
diff --git a/test/endpoint/endpoint.go b/test/endpoint/endpoint.go
deleted file mode 100644
index d2c143824..000000000
--- a/test/endpoint/endpoint.go
+++ /dev/null
@@ -1,225 +0,0 @@
-// +build varlink
-
-package endpoint
-
-import (
- "bytes"
- "encoding/json"
- "fmt"
- "os"
- "os/exec"
- "strconv"
- "strings"
- "syscall"
- "time"
-
- "github.com/containers/podman/v2/pkg/rootless"
- iopodman "github.com/containers/podman/v2/pkg/varlink"
- . "github.com/onsi/ginkgo"
- "github.com/onsi/gomega/gexec"
-)
-
-var (
- ARTIFACT_DIR = "/tmp/.artifacts"
- CGROUP_MANAGER = "systemd"
- defaultWaitTimeout = 90
- //RESTORE_IMAGES = []string{ALPINE, BB}
- INTEGRATION_ROOT string
- ImageCacheDir = "/tmp/podman/imagecachedir"
- VarlinkBinary = "/usr/bin/varlink"
- ALPINE = "docker.io/library/alpine:latest"
- infra = "k8s.gcr.io/pause:3.2"
- BB = "docker.io/library/busybox:latest"
- redis = "docker.io/library/redis:alpine"
- fedoraMinimal = "quay.io/libpod/fedora-minimal:latest"
-)
-
-type EndpointTestIntegration struct {
- ArtifactPath string
- CNIConfigDir string
- CgroupManager string
- ConmonBinary string
- CrioRoot string
- //Host HostOS
- ImageCacheDir string
- ImageCacheFS string
- OCIRuntime string
- PodmanBinary string
- RemoteTest bool
- RunRoot string
- SignaturePolicyPath string
- StorageOptions string
- TmpDir string
- Timings []string
- VarlinkBinary string
- VarlinkCommand *exec.Cmd
- VarlinkEndpoint string
- VarlinkSession *os.Process
-}
-
-func (p *EndpointTestIntegration) StartVarlink() {
- p.startVarlink(false)
-}
-
-func (p *EndpointTestIntegration) StartVarlinkWithCache() {
- p.startVarlink(true)
-}
-
-func (p *EndpointTestIntegration) startVarlink(useImageCache bool) {
- var (
- counter int
- )
- if os.Geteuid() == 0 {
- os.MkdirAll("/run/podman", 0755)
- }
- varlinkEndpoint := p.VarlinkEndpoint
- //p.SetVarlinkAddress(p.RemoteSocket)
-
- args := []string{"varlink", "--time", "0", varlinkEndpoint}
- podmanOptions := getVarlinkOptions(p, args)
- if useImageCache {
- cacheOptions := []string{"--storage-opt", fmt.Sprintf("%s.imagestore=%s", p.ImageCacheFS, p.ImageCacheDir)}
- podmanOptions = append(cacheOptions, podmanOptions...)
- }
- command := exec.Command(p.PodmanBinary, podmanOptions...)
- fmt.Printf("Running: %s %s\n", p.PodmanBinary, strings.Join(podmanOptions, " "))
- command.Start()
- command.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
- p.VarlinkCommand = command
- p.VarlinkSession = command.Process
- for {
- if result := p.endpointReady(); result == 0 {
- break
- }
- fmt.Println("Waiting for varlink connection to become active", counter)
- time.Sleep(250 * time.Millisecond)
- counter++
- if counter > 40 {
- Fail("varlink endpoint never became ready")
- }
- }
-}
-
-func (p *EndpointTestIntegration) endpointReady() int {
- session := p.Varlink("GetVersion", "", false)
- return session.ExitCode()
-}
-
-func (p *EndpointTestIntegration) StopVarlink() {
- var out bytes.Buffer
- var pids []int
- varlinkSession := p.VarlinkSession
-
- if !rootless.IsRootless() {
- if err := varlinkSession.Kill(); err != nil {
- fmt.Fprintf(os.Stderr, "error on varlink stop-kill %q", err)
- }
- if _, err := varlinkSession.Wait(); err != nil {
- fmt.Fprintf(os.Stderr, "error on varlink stop-wait %q", err)
- }
-
- } else {
- //p.ResetVarlinkAddress()
- parentPid := fmt.Sprintf("%d", p.VarlinkSession.Pid)
- pgrep := exec.Command("pgrep", "-P", parentPid)
- fmt.Printf("running: pgrep %s\n", parentPid)
- pgrep.Stdout = &out
- err := pgrep.Run()
- if err != nil {
- fmt.Fprint(os.Stderr, "unable to find varlink pid")
- }
-
- for _, s := range strings.Split(out.String(), "\n") {
- if len(s) == 0 {
- continue
- }
- p, err := strconv.Atoi(s)
- if err != nil {
- fmt.Fprintf(os.Stderr, "unable to convert %s to int", s)
- }
- if p != 0 {
- pids = append(pids, p)
- }
- }
-
- pids = append(pids, p.VarlinkSession.Pid)
- for _, pid := range pids {
- syscall.Kill(pid, syscall.SIGKILL)
- }
- }
- socket := strings.Split(p.VarlinkEndpoint, ":")[1]
- if err := os.Remove(socket); err != nil {
- fmt.Println(err)
- }
-}
-
-type EndpointSession struct {
- *gexec.Session
-}
-
-func getVarlinkOptions(p *EndpointTestIntegration, args []string) []string {
- podmanOptions := strings.Split(fmt.Sprintf("--root %s --runroot %s --runtime %s --conmon %s --cni-config-dir %s --cgroup-manager %s",
- p.CrioRoot, p.RunRoot, p.OCIRuntime, p.ConmonBinary, p.CNIConfigDir, p.CgroupManager), " ")
- if os.Getenv("HOOK_OPTION") != "" {
- podmanOptions = append(podmanOptions, os.Getenv("HOOK_OPTION"))
- }
- podmanOptions = append(podmanOptions, strings.Split(p.StorageOptions, " ")...)
- podmanOptions = append(podmanOptions, args...)
- return podmanOptions
-}
-
-func (p *EndpointTestIntegration) Varlink(endpoint, message string, more bool) *EndpointSession {
- //call unix:/run/user/1000/podman/io.podman/io.podman.GetContainerStats '{"name": "foobar" }'
- var (
- command *exec.Cmd
- )
-
- args := []string{"call"}
- if more {
- args = append(args, "-m")
- }
- args = append(args, []string{fmt.Sprintf("%s/io.podman.%s", p.VarlinkEndpoint, endpoint)}...)
- if len(message) > 0 {
- args = append(args, message)
- }
- command = exec.Command(p.VarlinkBinary, args...)
- session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter)
- if err != nil {
- Fail(fmt.Sprintf("unable to run varlink command: %s\n%v", strings.Join(args, " "), err))
- }
- session.Wait(defaultWaitTimeout)
- return &EndpointSession{session}
-}
-
-func (s *EndpointSession) StdErrToString() string {
- fields := strings.Fields(string(s.Err.Contents()))
- return strings.Join(fields, " ")
-}
-
-func (s *EndpointSession) OutputToString() string {
- fields := strings.Fields(string(s.Out.Contents()))
- return strings.Join(fields, " ")
-}
-
-func (s *EndpointSession) OutputToBytes() []byte {
- out := s.OutputToString()
- return []byte(out)
-}
-
-func (s *EndpointSession) OutputToStringMap() map[string]string {
- var out map[string]string
- json.Unmarshal(s.OutputToBytes(), &out)
- return out
-}
-
-func (s *EndpointSession) OutputToMapToInt() map[string]int {
- var out map[string]int
- json.Unmarshal(s.OutputToBytes(), &out)
- return out
-}
-
-func (s *EndpointSession) OutputToMoreResponse() iopodman.MoreResponse {
- out := make(map[string]iopodman.MoreResponse)
- json.Unmarshal(s.OutputToBytes(), &out)
- return out["reply"]
-}
diff --git a/test/endpoint/endpoint_suite_test.go b/test/endpoint/endpoint_suite_test.go
deleted file mode 100644
index 1cd5c2b9d..000000000
--- a/test/endpoint/endpoint_suite_test.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// +build varlink
-
-package endpoint
-
-import (
- "fmt"
- "io/ioutil"
- "os"
- "path/filepath"
- "testing"
-
- . "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
-)
-
-func TestEndpoint(t *testing.T) {
- RegisterFailHandler(Fail)
- RunSpecs(t, "Endpoint Suite")
-}
-
-var LockTmpDir string
-
-var _ = SynchronizedBeforeSuite(func() []byte {
- // Cache images
- cwd, _ := os.Getwd()
- INTEGRATION_ROOT = filepath.Join(cwd, "../../")
- podman := Setup("/tmp")
- podman.ArtifactPath = ARTIFACT_DIR
- if _, err := os.Stat(ARTIFACT_DIR); os.IsNotExist(err) {
- if err = os.Mkdir(ARTIFACT_DIR, 0777); err != nil {
- fmt.Printf("%q\n", err)
- os.Exit(1)
- }
- }
-
- // make cache dir
- if err := os.MkdirAll(ImageCacheDir, 0777); err != nil {
- fmt.Printf("%q\n", err)
- os.Exit(1)
- }
-
- podman.StartVarlink()
- for _, image := range CACHE_IMAGES {
- podman.createArtifact(image)
- }
- podman.StopVarlink()
- // If running localized tests, the cache dir is created and populated. if the
- // tests are remote, this is a no-op
- populateCache(podman)
-
- path, err := ioutil.TempDir("", "libpodlock")
- if err != nil {
- fmt.Println(err)
- os.Exit(1)
- }
- return []byte(path)
-}, func(data []byte) {
- LockTmpDir = string(data)
-})
-
-var _ = SynchronizedAfterSuite(func() {},
- func() {
- podman := Setup("/tmp")
- if err := os.RemoveAll(podman.CrioRoot); err != nil {
- fmt.Printf("%q\n", err)
- os.Exit(1)
- }
- if err := os.RemoveAll(podman.ImageCacheDir); err != nil {
- fmt.Printf("%q\n", err)
- os.Exit(1)
- }
- })
diff --git a/test/endpoint/exists_test.go b/test/endpoint/exists_test.go
deleted file mode 100644
index f7fa8eb44..000000000
--- a/test/endpoint/exists_test.go
+++ /dev/null
@@ -1,68 +0,0 @@
-// +build varlink
-
-package endpoint
-
-import (
- "os"
-
- . "github.com/containers/podman/v2/test/utils"
- . "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
-)
-
-var _ = Describe("Podman exists", func() {
- var (
- tempdir string
- err error
- endpointTest *EndpointTestIntegration
- )
-
- BeforeEach(func() {
- tempdir, err = CreateTempDirInTempDir()
- if err != nil {
- os.Exit(1)
- }
- endpointTest = Setup(tempdir)
- endpointTest.StartVarlinkWithCache()
- })
-
- AfterEach(func() {
- endpointTest.Cleanup()
- //f := CurrentGinkgoTestDescription()
- //processTestResult(f)
-
- })
-
- It("image exists in local storage", func() {
- result := endpointTest.Varlink("ImageExists", makeNameMessage(ALPINE), false)
- Expect(result.ExitCode()).To(BeZero())
-
- output := result.OutputToMapToInt()
- Expect(output["exists"]).To(BeZero())
- })
-
- It("image exists in local storage by shortname", func() {
- result := endpointTest.Varlink("ImageExists", makeNameMessage("alpine"), false)
- Expect(result.ExitCode()).To(BeZero())
-
- output := result.OutputToMapToInt()
- Expect(output["exists"]).To(BeZero())
- })
-
- It("image does not exist in local storage", func() {
- result := endpointTest.Varlink("ImageExists", makeNameMessage("alpineforest"), false)
- Expect(result.ExitCode()).To(BeZero())
-
- output := result.OutputToMapToInt()
- Expect(output["exists"]).To(Equal(1))
- })
-
- It("container exists in local storage by name", func() {
- _ = endpointTest.startTopContainer("top")
- result := endpointTest.Varlink("ContainerExists", makeNameMessage("top"), false)
- Expect(result.ExitCode()).To(BeZero())
- output := result.OutputToMapToInt()
- Expect(output["exists"]).To(BeZero())
- })
-
-})
diff --git a/test/endpoint/pull_test.go b/test/endpoint/pull_test.go
deleted file mode 100644
index b3683b7db..000000000
--- a/test/endpoint/pull_test.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// +build varlink
-
-package endpoint
-
-import (
- "os"
-
- . "github.com/containers/podman/v2/test/utils"
- . "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
-)
-
-var _ = Describe("Podman pull", func() {
- var (
- tempdir string
- err error
- endpointTest *EndpointTestIntegration
- )
-
- BeforeEach(func() {
- tempdir, err = CreateTempDirInTempDir()
- if err != nil {
- os.Exit(1)
- }
- endpointTest = Setup(tempdir)
- endpointTest.StartVarlink()
- })
-
- AfterEach(func() {
- endpointTest.Cleanup()
- //f := CurrentGinkgoTestDescription()
- //processTestResult(f)
-
- })
-
- It("podman pull", func() {
- session := endpointTest.Varlink("PullImage", makeNameMessage(ALPINE), false)
- Expect(session.ExitCode()).To(BeZero())
-
- result := endpointTest.Varlink("ImageExists", makeNameMessage(ALPINE), false)
- Expect(result.ExitCode()).To(BeZero())
-
- output := result.OutputToMapToInt()
- Expect(output["exists"]).To(BeZero())
- })
-})
diff --git a/test/endpoint/setup.go b/test/endpoint/setup.go
deleted file mode 100644
index 6bbc8d2bc..000000000
--- a/test/endpoint/setup.go
+++ /dev/null
@@ -1,214 +0,0 @@
-// +build varlink
-
-package endpoint
-
-import (
- "encoding/json"
- "fmt"
- "os"
- "os/exec"
- "path/filepath"
- "strings"
-
- "github.com/containers/podman/v2/pkg/rootless"
- iopodman "github.com/containers/podman/v2/pkg/varlink"
- "github.com/containers/storage/pkg/stringid"
- "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
- "github.com/sirupsen/logrus"
-)
-
-func Setup(tempDir string) *EndpointTestIntegration {
- var (
- endpoint string
- )
- cwd, _ := os.Getwd()
- INTEGRATION_ROOT = filepath.Join(cwd, "../../")
-
- podmanBinary := filepath.Join(cwd, "../../bin/podman")
- if os.Getenv("PODMAN_BINARY") != "" {
- podmanBinary = os.Getenv("PODMAN_BINARY")
- }
- conmonBinary := filepath.Join("/usr/libexec/podman/conmon")
- altConmonBinary := "/usr/bin/conmon"
- if _, err := os.Stat(conmonBinary); os.IsNotExist(err) {
- conmonBinary = altConmonBinary
- }
- if os.Getenv("CONMON_BINARY") != "" {
- conmonBinary = os.Getenv("CONMON_BINARY")
- }
- storageOptions := STORAGE_OPTIONS
- if os.Getenv("STORAGE_OPTIONS") != "" {
- storageOptions = os.Getenv("STORAGE_OPTIONS")
- }
- cgroupManager := CGROUP_MANAGER
- if rootless.IsRootless() {
- cgroupManager = "cgroupfs"
- }
- if os.Getenv("CGROUP_MANAGER") != "" {
- cgroupManager = os.Getenv("CGROUP_MANAGER")
- }
-
- ociRuntime := os.Getenv("OCI_RUNTIME")
- if ociRuntime == "" {
- ociRuntime = "runc"
- }
- os.Setenv("DISABLE_HC_SYSTEMD", "true")
- CNIConfigDir := "/etc/cni/net.d"
-
- storageFs := STORAGE_FS
- if rootless.IsRootless() {
- storageFs = ROOTLESS_STORAGE_FS
- }
-
- uuid := stringid.GenerateNonCryptoID()
- if !rootless.IsRootless() {
- endpoint = fmt.Sprintf("unix:/run/podman/io.podman-%s", uuid)
- } else {
- runtimeDir := os.Getenv("XDG_RUNTIME_DIR")
- socket := fmt.Sprintf("io.podman-%s", uuid)
- fqpath := filepath.Join(runtimeDir, socket)
- endpoint = fmt.Sprintf("unix:%s", fqpath)
- }
-
- eti := EndpointTestIntegration{
- ArtifactPath: ARTIFACT_DIR,
- CNIConfigDir: CNIConfigDir,
- CgroupManager: cgroupManager,
- ConmonBinary: conmonBinary,
- CrioRoot: filepath.Join(tempDir, "crio"),
- ImageCacheDir: ImageCacheDir,
- ImageCacheFS: storageFs,
- OCIRuntime: ociRuntime,
- PodmanBinary: podmanBinary,
- RunRoot: filepath.Join(tempDir, "crio-run"),
- SignaturePolicyPath: filepath.Join(INTEGRATION_ROOT, "test/policy.json"),
- StorageOptions: storageOptions,
- TmpDir: tempDir,
- // Timings: nil,
- VarlinkBinary: VarlinkBinary,
- VarlinkCommand: nil,
- VarlinkEndpoint: endpoint,
- VarlinkSession: nil,
- }
- return &eti
-}
-
-func (p *EndpointTestIntegration) Cleanup() {
- // Remove all containers
- // TODO Make methods to do all this?
-
- p.stopAllContainers()
-
- // TODO need to make stop all pods
-
- p.StopVarlink()
- // Nuke tempdir
- if err := os.RemoveAll(p.TmpDir); err != nil {
- fmt.Printf("%q\n", err)
- }
-
- // Clean up the registries configuration file ENV variable set in Create
- resetRegistriesConfigEnv()
-}
-
-func (p *EndpointTestIntegration) listContainers() []iopodman.Container {
- containers := p.Varlink("ListContainers", "", false)
- var varlinkContainers map[string][]iopodman.Container
- if err := json.Unmarshal(containers.OutputToBytes(), &varlinkContainers); err != nil {
- logrus.Error("failed to unmarshal containers")
- }
- return varlinkContainers["containers"]
-}
-
-func (p *EndpointTestIntegration) stopAllContainers() {
- containers := p.listContainers()
- for _, container := range containers {
- p.stopContainer(container.Id)
- }
-}
-
-func (p *EndpointTestIntegration) stopContainer(cid string) {
- p.Varlink("StopContainer", fmt.Sprintf("{\"name\":\"%s\", \"timeout\":0}", cid), false)
-}
-
-func resetRegistriesConfigEnv() {
- os.Setenv("REGISTRIES_CONFIG_PATH", "")
-}
-
-func (p *EndpointTestIntegration) createArtifact(image string) {
- if os.Getenv("NO_TEST_CACHE") != "" {
- return
- }
- dest := strings.Split(image, "/")
- destName := fmt.Sprintf("/tmp/%s.tar", strings.Replace(strings.Join(strings.Split(dest[len(dest)-1], "/"), ""), ":", "-", -1))
- fmt.Printf("Caching %s at %s...", image, destName)
- if _, err := os.Stat(destName); os.IsNotExist(err) {
- pull := p.Varlink("PullImage", fmt.Sprintf("{\"name\":\"%s\"}", image), false)
- Expect(pull.ExitCode()).To(Equal(0))
-
- imageSave := iopodman.ImageSaveOptions{
- // Name:image,
- // Output: destName,
- // Format: "oci-archive",
- }
- imageSave.Name = image
- imageSave.Output = destName
- imageSave.Format = "oci-archive"
- foo := make(map[string]iopodman.ImageSaveOptions)
- foo["options"] = imageSave
- f, _ := json.Marshal(foo)
- save := p.Varlink("ImageSave", string(f), false)
- result := save.OutputToMoreResponse()
- Expect(save.ExitCode()).To(Equal(0))
- Expect(os.Rename(result.Id, destName)).To(BeNil())
- fmt.Printf("\n")
- } else {
- fmt.Printf(" already exists.\n")
- }
-}
-
-func populateCache(p *EndpointTestIntegration) {
- p.CrioRoot = p.ImageCacheDir
- p.StartVarlink()
- for _, image := range CACHE_IMAGES {
- p.RestoreArtifactToCache(image)
- }
- p.StopVarlink()
-}
-
-func (p *EndpointTestIntegration) RestoreArtifactToCache(image string) error {
- fmt.Printf("Restoring %s...\n", image)
- dest := strings.Split(image, "/")
- destName := fmt.Sprintf("/tmp/%s.tar", strings.Replace(strings.Join(strings.Split(dest[len(dest)-1], "/"), ""), ":", "-", -1))
- // fmt.Println(destName, p.ImageCacheDir)
- load := p.Varlink("LoadImage", fmt.Sprintf("{\"name\": \"%s\", \"inputFile\": \"%s\"}", image, destName), false)
- Expect(load.ExitCode()).To(BeZero())
- return nil
-}
-
-func (p *EndpointTestIntegration) startTopContainer(name string) string {
- t := true
- args := iopodman.Create{
- Args: []string{"docker.io/library/alpine:latest", "top"},
- Tty: &t,
- Detach: &t,
- }
- if len(name) > 0 {
- args.Name = &name
- }
- b, err := json.Marshal(args)
- if err != nil {
- ginkgo.Fail("failed to marshal data for top container")
- }
- input := fmt.Sprintf("{\"create\":%s}", string(b))
- top := p.Varlink("CreateContainer", input, false)
- if top.ExitCode() != 0 {
- ginkgo.Fail("failed to start top container")
- }
- start := p.Varlink("StartContainer", fmt.Sprintf("{\"name\":\"%s\"}", name), false)
- if start.ExitCode() != 0 {
- ginkgo.Fail("failed to start top container")
- }
- return start.OutputToString()
-}
diff --git a/test/endpoint/version_test.go b/test/endpoint/version_test.go
deleted file mode 100644
index b1c8ad867..000000000
--- a/test/endpoint/version_test.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// +build varlink
-
-package endpoint
-
-import (
- "os"
-
- . "github.com/containers/podman/v2/test/utils"
- "github.com/containers/podman/v2/version"
- . "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
-)
-
-var _ = Describe("Podman version", func() {
- var (
- tempdir string
- err error
- endpointTest *EndpointTestIntegration
- )
-
- BeforeEach(func() {
- tempdir, err = CreateTempDirInTempDir()
- if err != nil {
- os.Exit(1)
- }
- endpointTest = Setup(tempdir)
- endpointTest.StartVarlink()
- })
-
- AfterEach(func() {
- endpointTest.Cleanup()
- //f := CurrentGinkgoTestDescription()
- //processTestResult(f)
-
- })
-
- It("podman version", func() {
- session := endpointTest.Varlink("GetVersion", "", false)
- result := session.OutputToStringMap()
- Expect(result["version"]).To(Equal(version.Version))
- Expect(session.ExitCode()).To(Equal(0))
- })
-})
diff --git a/test/python/docker/__init__.py b/test/python/docker/__init__.py
index 316b102f4..351834316 100644
--- a/test/python/docker/__init__.py
+++ b/test/python/docker/__init__.py
@@ -39,9 +39,7 @@ class Podman(object):
self.cmd.append("--root=" + os.path.join(self.anchor_directory, "crio"))
self.cmd.append("--runroot=" + os.path.join(self.anchor_directory, "crio-run"))
- os.environ["REGISTRIES_CONFIG_PATH"] = os.path.join(
- self.anchor_directory, "registry.conf"
- )
+ os.environ["REGISTRIES_CONFIG_PATH"] = os.path.join(self.anchor_directory, "registry.conf")
p = configparser.ConfigParser()
p.read_dict(
{
@@ -53,20 +51,16 @@ class Podman(object):
with open(os.environ["REGISTRIES_CONFIG_PATH"], "w") as w:
p.write(w)
- os.environ["CNI_CONFIG_PATH"] = os.path.join(
- self.anchor_directory, "cni", "net.d"
- )
+ os.environ["CNI_CONFIG_PATH"] = os.path.join(self.anchor_directory, "cni", "net.d")
os.makedirs(os.environ["CNI_CONFIG_PATH"], exist_ok=True)
self.cmd.append("--cni-config-dir=" + os.environ["CNI_CONFIG_PATH"])
- cni_cfg = os.path.join(
- os.environ["CNI_CONFIG_PATH"], "87-podman-bridge.conflist"
- )
+ cni_cfg = os.path.join(os.environ["CNI_CONFIG_PATH"], "87-podman-bridge.conflist")
# json decoded and encoded to ensure legal json
buf = json.loads(
"""
{
"cniVersion": "0.3.0",
- "name": "podman",
+ "name": "default",
"plugins": [{
"type": "bridge",
"bridge": "cni0",
diff --git a/test/python/docker/common.py b/test/python/docker/common.py
index e79d64a9b..11f512495 100644
--- a/test/python/docker/common.py
+++ b/test/python/docker/common.py
@@ -4,9 +4,7 @@ from test.python.docker import constant
def run_top_container(client: DockerClient):
- c = client.containers.create(
- constant.ALPINE, command="top", detach=True, tty=True, name="top"
- )
+ c = client.containers.create(constant.ALPINE, command="top", detach=True, tty=True, name="top")
c.start()
return c.id
diff --git a/test/python/docker/test_containers.py b/test/python/docker/test_containers.py
index 0fd419d9d..20d8417c3 100644
--- a/test/python/docker/test_containers.py
+++ b/test/python/docker/test_containers.py
@@ -87,7 +87,7 @@ class TestContainers(unittest.TestCase):
self.assertEqual(len(containers), 2)
def test_stop_container(self):
- top = self.client.containers.get("top")
+ top = self.client.containers.get(TestContainers.topContainerId)
self.assertEqual(top.status, "running")
# Stop a running container and validate the state
diff --git a/test/python/docker/test_images.py b/test/python/docker/test_images.py
index 7ef3d708b..1fa4aade9 100644
--- a/test/python/docker/test_images.py
+++ b/test/python/docker/test_images.py
@@ -78,9 +78,7 @@ class TestImages(unittest.TestCase):
self.assertEqual(len(self.client.images.list()), 2)
# List images with filter
- self.assertEqual(
- len(self.client.images.list(filters={"reference": "alpine"})), 1
- )
+ self.assertEqual(len(self.client.images.list(filters={"reference": "alpine"})), 1)
def test_search_image(self):
"""Search for image"""
diff --git a/test/system/010-images.bats b/test/system/010-images.bats
index 98bb0cc57..ee6da30ec 100644
--- a/test/system/010-images.bats
+++ b/test/system/010-images.bats
@@ -59,7 +59,8 @@ Labels.created_at | 20[0-9-]\\\+T[0-9:]\\\+Z
@test "podman images - history output" {
# podman history is persistent: it permanently alters our base image.
# Create a dummy image here so we leave our setup as we found it.
- run_podman run --name my-container $IMAGE true
+ # Multiple --name options confirm command-line override (last one wins)
+ run_podman run --name ignore-me --name my-container $IMAGE true
run_podman commit my-container my-test-image
run_podman images my-test-image --format '{{ .History }}'
@@ -87,7 +88,8 @@ Labels.created_at | 20[0-9-]\\\+T[0-9:]\\\+Z
}
@test "podman images - filter" {
- run_podman inspect --format '{{.ID}}' $IMAGE
+ # Multiple --format options confirm command-line override (last one wins)
+ run_podman inspect --format '{{.XYZ}}' --format '{{.ID}}' $IMAGE
iid=$output
run_podman images --noheading --filter=after=$iid
diff --git a/test/system/030-run.bats b/test/system/030-run.bats
index 12df966e2..37695f205 100644
--- a/test/system/030-run.bats
+++ b/test/system/030-run.bats
@@ -449,7 +449,9 @@ json-file | f
msg=$(random_string 20)
pidfile="${PODMAN_TMPDIR}/$(random_string 20)"
- run_podman run --name myctr --log-driver journald --conmon-pidfile $pidfile $IMAGE echo $msg
+ # Multiple --log-driver options to confirm that last one wins
+ run_podman run --name myctr --log-driver=none --log-driver journald \
+ --conmon-pidfile $pidfile $IMAGE echo $msg
journalctl --output cat _PID=$(cat $pidfile)
is "$output" "$msg" "check that journalctl output equals the container output"
@@ -464,7 +466,9 @@ json-file | f
run_podman run --rm $IMAGE date -r $testfile
is "$output" "Sun Sep 13 12:26:40 UTC 2020" "podman run with no TZ"
- run_podman run --rm --tz=MST7MDT $IMAGE date -r $testfile
+ # Multiple --tz options; confirm that the last one wins
+ run_podman run --rm --tz=US/Eastern --tz=Iceland --tz=MST7MDT \
+ $IMAGE date -r $testfile
is "$output" "Sun Sep 13 06:26:40 MDT 2020" "podman run with --tz=MST7MDT"
# --tz=local pays attention to /etc/localtime, not $TZ. We set TZ anyway,
@@ -532,4 +536,16 @@ json-file | f
run_podman untag $IMAGE $newtag $newtag2
}
+@test "podman run with --net=host and --port prints warning" {
+ rand=$(random_string 10)
+
+ # Please keep the duplicate "--net" options; this tests against #8507,
+ # a regression in which subsequent --net options did not override earlier.
+ run_podman run --rm -p 8080 --net=none --net=host $IMAGE echo $rand
+ is "${lines[0]}" \
+ "Port mappings have been discarded as one of the Host, Container, Pod, and None network modes are in use" \
+ "Warning is emitted before container output"
+ is "${lines[1]}" "$rand" "Container runs successfully despite warning"
+}
+
# vim: filetype=sh
diff --git a/test/system/040-ps.bats b/test/system/040-ps.bats
index dec2df4d5..1ed2779b2 100644
--- a/test/system/040-ps.bats
+++ b/test/system/040-ps.bats
@@ -35,4 +35,51 @@ load helpers
run_podman rm $cid
}
+@test "podman ps --filter" {
+ run_podman run -d --name runner $IMAGE top
+ cid_runner=$output
+
+ run_podman run -d --name stopped $IMAGE true
+ cid_stopped=$output
+ run_podman wait stopped
+
+ run_podman run -d --name failed $IMAGE false
+ cid_failed=$output
+ run_podman wait failed
+
+ run_podman create --name created $IMAGE echo hi
+ cid_created=$output
+
+ run_podman ps --filter name=runner --format '{{.ID}}'
+ is "$output" "${cid_runner:0:12}" "filter: name=runner"
+
+ # Stopped container should not appear (because we're not using -a)
+ run_podman ps --filter name=stopped --format '{{.ID}}'
+ is "$output" "" "filter: name=stopped (without -a)"
+
+ # Again, but with -a
+ run_podman ps -a --filter name=stopped --format '{{.ID}}'
+ is "$output" "${cid_stopped:0:12}" "filter: name=stopped (with -a)"
+
+ run_podman ps --filter status=stopped --format '{{.Names}}' --sort names
+ is "${lines[0]}" "failed" "status=stopped: 1 of 2"
+ is "${lines[1]}" "stopped" "status=stopped: 2 of 2"
+
+ run_podman ps --filter status=exited --filter exited=0 --format '{{.Names}}'
+ is "$output" "stopped" "exited=0"
+
+ run_podman ps --filter status=exited --filter exited=1 --format '{{.Names}}'
+ is "$output" "failed" "exited=1"
+
+ # Multiple statuses allowed; and test sort=created
+ run_podman ps -a --filter status=exited --filter status=running \
+ --format '{{.Names}}' --sort created
+ is "${lines[0]}" "runner" "status=stopped: 1 of 3"
+ is "${lines[1]}" "stopped" "status=stopped: 2 of 3"
+ is "${lines[2]}" "failed" "status=stopped: 3 of 3"
+
+ run_podman stop -t 1 runner
+ run_podman rm -a
+}
+
# vim: filetype=sh
diff --git a/test/system/070-build.bats b/test/system/070-build.bats
index 83bcd13eb..59da503a6 100644
--- a/test/system/070-build.bats
+++ b/test/system/070-build.bats
@@ -135,10 +135,13 @@ echo "\$1"
printenv | grep MYENV | sort | sed -e 's/^MYENV.=//'
EOF
- # For overriding with --env-file
- cat >$PODMAN_TMPDIR/env-file <<EOF
+ # For overriding with --env-file; using multiple files confirms that
+ # the --env-file option is cumulative, not last-one-wins.
+ cat >$PODMAN_TMPDIR/env-file1 <<EOF
MYENV3=$s_env3
http_proxy=http-proxy-in-env-file
+EOF
+ cat >$PODMAN_TMPDIR/env-file2 <<EOF
https_proxy=https-proxy-in-env-file
EOF
@@ -185,7 +188,8 @@ EOF
export MYENV2="$s_env2"
export MYENV3="env-file-should-override-env-host!"
run_podman run --rm \
- --env-file=$PODMAN_TMPDIR/env-file \
+ --env-file=$PODMAN_TMPDIR/env-file1 \
+ --env-file=$PODMAN_TMPDIR/env-file2 \
${ENVHOST} \
-e MYENV4="$s_env4" \
build_test
@@ -205,7 +209,9 @@ EOF
# Proxies - environment should override container, but not env-file
http_proxy=http-proxy-from-env ftp_proxy=ftp-proxy-from-env \
- run_podman run --rm --env-file=$PODMAN_TMPDIR/env-file \
+ run_podman run --rm \
+ --env-file=$PODMAN_TMPDIR/env-file1 \
+ --env-file=$PODMAN_TMPDIR/env-file2 \
build_test \
printenv http_proxy https_proxy ftp_proxy
is "${lines[0]}" "http-proxy-in-env-file" "env-file overrides env"
@@ -222,7 +228,8 @@ EOF
is "$output" "$workdir" "pwd command in container"
# Determine buildah version, so we can confirm it gets into Labels
- run_podman info --format '{{ .Host.BuildahVersion }}'
+ # Multiple --format options confirm command-line override (last one wins)
+ run_podman info --format '{{.Ignore}}' --format '{{ .Host.BuildahVersion }}'
is "$output" "[1-9][0-9.-]\+" ".Host.BuildahVersion is reasonable"
buildah_version=$output
diff --git a/test/system/075-exec.bats b/test/system/075-exec.bats
index edd7dedc4..c028e16c9 100644
--- a/test/system/075-exec.bats
+++ b/test/system/075-exec.bats
@@ -91,7 +91,8 @@ load helpers
# #6829 : add username to /etc/passwd inside container if --userns=keep-id
@test "podman exec - with keep-id" {
- run_podman run -d --userns=keep-id $IMAGE sh -c \
+ # Multiple --userns options confirm command-line override (last one wins)
+ run_podman run -d --userns=private --userns=keep-id $IMAGE sh -c \
"echo READY;while [ ! -f /tmp/stop ]; do sleep 1; done"
cid="$output"
wait_for_ready $cid
diff --git a/test/system/200-pod.bats b/test/system/200-pod.bats
index b0f645c53..51835e4a3 100644
--- a/test/system/200-pod.bats
+++ b/test/system/200-pod.bats
@@ -286,6 +286,10 @@ EOF
is "$output" "nc: bind: Address in use" \
"two containers cannot bind to same port"
+ # make sure we can ping; failure here might mean that capabilities are wrong
+ run_podman run --rm --pod mypod $IMAGE ping -c1 127.0.0.1
+ run_podman run --rm --pod mypod $IMAGE ping -c1 $hostname
+
# While the container is still running, run 'podman ps' (no --format)
# and confirm that the output includes the published port
run_podman ps --filter id=$cid