github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/test/e2e/exec_test.go (about) 1 package integration 2 3 import ( 4 "fmt" 5 "os" 6 "strings" 7 8 . "github.com/containers/libpod/test/utils" 9 . "github.com/onsi/ginkgo" 10 . "github.com/onsi/gomega" 11 ) 12 13 var _ = Describe("Podman exec", func() { 14 var ( 15 tempdir string 16 err error 17 podmanTest *PodmanTestIntegration 18 ) 19 20 BeforeEach(func() { 21 tempdir, err = CreateTempDirInTempDir() 22 if err != nil { 23 os.Exit(1) 24 } 25 podmanTest = PodmanTestCreate(tempdir) 26 podmanTest.Setup() 27 podmanTest.SeedImages() 28 }) 29 30 AfterEach(func() { 31 podmanTest.Cleanup() 32 f := CurrentGinkgoTestDescription() 33 processTestResult(f) 34 35 }) 36 37 It("podman exec into bogus container", func() { 38 session := podmanTest.Podman([]string{"exec", "foobar", "ls"}) 39 session.WaitWithDefaultTimeout() 40 Expect(session.ExitCode()).To(Equal(125)) 41 }) 42 43 It("podman exec without command", func() { 44 session := podmanTest.Podman([]string{"exec", "foobar"}) 45 session.WaitWithDefaultTimeout() 46 Expect(session.ExitCode()).To(Equal(125)) 47 }) 48 49 It("podman exec simple command", func() { 50 setup := podmanTest.RunTopContainer("test1") 51 setup.WaitWithDefaultTimeout() 52 Expect(setup.ExitCode()).To(Equal(0)) 53 54 session := podmanTest.Podman([]string{"exec", "test1", "ls"}) 55 session.WaitWithDefaultTimeout() 56 Expect(session.ExitCode()).To(Equal(0)) 57 }) 58 59 It("podman container exec simple command", func() { 60 setup := podmanTest.RunTopContainer("test1") 61 setup.WaitWithDefaultTimeout() 62 Expect(setup.ExitCode()).To(Equal(0)) 63 64 session := podmanTest.Podman([]string{"container", "exec", "test1", "ls"}) 65 session.WaitWithDefaultTimeout() 66 Expect(session.ExitCode()).To(Equal(0)) 67 }) 68 69 It("podman exec simple command using latest", func() { 70 // the remote client doesn't use latest 71 SkipIfRemote() 72 setup := podmanTest.RunTopContainer("test1") 73 setup.WaitWithDefaultTimeout() 74 Expect(setup.ExitCode()).To(Equal(0)) 75 76 session := podmanTest.Podman([]string{"exec", "-l", "ls"}) 77 session.WaitWithDefaultTimeout() 78 Expect(session.ExitCode()).To(Equal(0)) 79 }) 80 81 It("podman exec environment test", func() { 82 setup := podmanTest.RunTopContainer("test1") 83 setup.WaitWithDefaultTimeout() 84 Expect(setup.ExitCode()).To(Equal(0)) 85 86 session := podmanTest.Podman([]string{"exec", "--env", "FOO=BAR", "test1", "printenv", "FOO"}) 87 session.WaitWithDefaultTimeout() 88 Expect(session.ExitCode()).To(Equal(0)) 89 match, _ := session.GrepString("BAR") 90 Expect(match).Should(BeTrue()) 91 92 session = podmanTest.Podman([]string{"exec", "--env", "PATH=/bin", "test1", "printenv", "PATH"}) 93 session.WaitWithDefaultTimeout() 94 Expect(session.ExitCode()).To(Equal(0)) 95 match, _ = session.GrepString("/bin") 96 Expect(match).Should(BeTrue()) 97 }) 98 99 It("podman exec os.Setenv env", func() { 100 // remote doesn't properly interpret os.Setenv 101 SkipIfRemote() 102 setup := podmanTest.RunTopContainer("test1") 103 setup.WaitWithDefaultTimeout() 104 Expect(setup.ExitCode()).To(Equal(0)) 105 106 os.Setenv("FOO", "BAR") 107 session := podmanTest.Podman([]string{"exec", "--env", "FOO", "test1", "printenv", "FOO"}) 108 session.WaitWithDefaultTimeout() 109 Expect(session.ExitCode()).To(Equal(0)) 110 match, _ := session.GrepString("BAR") 111 Expect(match).Should(BeTrue()) 112 os.Unsetenv("FOO") 113 }) 114 115 It("podman exec exit code", func() { 116 setup := podmanTest.RunTopContainer("test1") 117 setup.WaitWithDefaultTimeout() 118 Expect(setup.ExitCode()).To(Equal(0)) 119 120 session := podmanTest.Podman([]string{"exec", "test1", "sh", "-c", "exit 100"}) 121 session.WaitWithDefaultTimeout() 122 Expect(session.ExitCode()).To(Equal(100)) 123 }) 124 125 It("podman exec terminal doesn't hang", func() { 126 setup := podmanTest.Podman([]string{"run", "-dti", fedoraMinimal, "sleep", "+Inf"}) 127 setup.WaitWithDefaultTimeout() 128 Expect(setup.ExitCode()).To(Equal(0)) 129 130 for i := 0; i < 5; i++ { 131 session := podmanTest.Podman([]string{"exec", "-lti", "true"}) 132 session.WaitWithDefaultTimeout() 133 Expect(session.ExitCode()).To(Equal(0)) 134 } 135 }) 136 137 It("podman exec pseudo-terminal sanity check", func() { 138 setup := podmanTest.Podman([]string{"run", "--detach", "--name", "test1", fedoraMinimal, "sleep", "+Inf"}) 139 setup.WaitWithDefaultTimeout() 140 Expect(setup.ExitCode()).To(Equal(0)) 141 142 session := podmanTest.Podman([]string{"exec", "--interactive", "--tty", "test1", "/usr/bin/stty", "--all"}) 143 session.WaitWithDefaultTimeout() 144 Expect(session.ExitCode()).To(Equal(0)) 145 match, _ := session.GrepString(" onlcr") 146 Expect(match).Should(BeTrue()) 147 }) 148 149 It("podman exec simple command with user", func() { 150 setup := podmanTest.RunTopContainer("test1") 151 setup.WaitWithDefaultTimeout() 152 Expect(setup.ExitCode()).To(Equal(0)) 153 154 session := podmanTest.Podman([]string{"exec", "--user", "root", "test1", "ls"}) 155 session.WaitWithDefaultTimeout() 156 Expect(session.ExitCode()).To(Equal(0)) 157 }) 158 159 It("podman exec with user only in container", func() { 160 testUser := "test123" 161 setup := podmanTest.Podman([]string{"run", "--name", "test1", "-d", fedoraMinimal, "sleep", "60"}) 162 setup.WaitWithDefaultTimeout() 163 Expect(setup.ExitCode()).To(Equal(0)) 164 165 session := podmanTest.Podman([]string{"exec", "test1", "useradd", testUser}) 166 session.WaitWithDefaultTimeout() 167 Expect(session.ExitCode()).To(Equal(0)) 168 169 session2 := podmanTest.Podman([]string{"exec", "--user", testUser, "test1", "whoami"}) 170 session2.WaitWithDefaultTimeout() 171 Expect(session2.ExitCode()).To(Equal(0)) 172 Expect(session2.OutputToString()).To(Equal(testUser)) 173 }) 174 175 It("podman exec with user from run", func() { 176 testUser := "guest" 177 setup := podmanTest.Podman([]string{"run", "--user", testUser, "-d", ALPINE, "top"}) 178 setup.WaitWithDefaultTimeout() 179 Expect(setup.ExitCode()).To(Equal(0)) 180 ctrID := setup.OutputToString() 181 182 session := podmanTest.Podman([]string{"exec", ctrID, "whoami"}) 183 session.WaitWithDefaultTimeout() 184 Expect(session.ExitCode()).To(Equal(0)) 185 Expect(session.OutputToString()).To(ContainSubstring(testUser)) 186 187 overrideUser := "root" 188 session = podmanTest.Podman([]string{"exec", "--user", overrideUser, ctrID, "whoami"}) 189 session.WaitWithDefaultTimeout() 190 Expect(session.ExitCode()).To(Equal(0)) 191 Expect(session.OutputToString()).To(ContainSubstring(overrideUser)) 192 }) 193 194 It("podman exec simple working directory test", func() { 195 setup := podmanTest.RunTopContainer("test1") 196 setup.WaitWithDefaultTimeout() 197 Expect(setup.ExitCode()).To(Equal(0)) 198 199 session := podmanTest.Podman([]string{"exec", "--workdir", "/tmp", "test1", "pwd"}) 200 session.WaitWithDefaultTimeout() 201 Expect(session.ExitCode()).To(Equal(0)) 202 match, _ := session.GrepString("/tmp") 203 Expect(match).Should(BeTrue()) 204 205 session = podmanTest.Podman([]string{"exec", "-w", "/tmp", "test1", "pwd"}) 206 session.WaitWithDefaultTimeout() 207 Expect(session.ExitCode()).To(Equal(0)) 208 match, _ = session.GrepString("/tmp") 209 Expect(match).Should(BeTrue()) 210 }) 211 212 It("podman exec missing working directory test", func() { 213 setup := podmanTest.RunTopContainer("test1") 214 setup.WaitWithDefaultTimeout() 215 Expect(setup.ExitCode()).To(Equal(0)) 216 217 session := podmanTest.Podman([]string{"exec", "--workdir", "/missing", "test1", "pwd"}) 218 session.WaitWithDefaultTimeout() 219 Expect(session).To(ExitWithError()) 220 221 session = podmanTest.Podman([]string{"exec", "-w", "/missing", "test1", "pwd"}) 222 session.WaitWithDefaultTimeout() 223 Expect(session).To(ExitWithError()) 224 }) 225 226 It("podman exec cannot be invoked", func() { 227 setup := podmanTest.RunTopContainer("test1") 228 setup.WaitWithDefaultTimeout() 229 Expect(setup.ExitCode()).To(Equal(0)) 230 231 session := podmanTest.Podman([]string{"exec", "test1", "/etc"}) 232 session.WaitWithDefaultTimeout() 233 Expect(session.ExitCode()).To(Equal(126)) 234 }) 235 236 It("podman exec command not found", func() { 237 setup := podmanTest.RunTopContainer("test1") 238 setup.WaitWithDefaultTimeout() 239 Expect(setup.ExitCode()).To(Equal(0)) 240 241 session := podmanTest.Podman([]string{"exec", "test1", "notthere"}) 242 session.WaitWithDefaultTimeout() 243 Expect(session.ExitCode()).To(Equal(127)) 244 }) 245 246 It("podman exec preserve fds sanity check", func() { 247 setup := podmanTest.RunTopContainer("test1") 248 setup.WaitWithDefaultTimeout() 249 Expect(setup.ExitCode()).To(Equal(0)) 250 251 devNull, err := os.Open("/dev/null") 252 Expect(err).To(BeNil()) 253 defer devNull.Close() 254 files := []*os.File{ 255 devNull, 256 } 257 session := podmanTest.PodmanExtraFiles([]string{"exec", "--preserve-fds", "1", "test1", "ls"}, files) 258 session.WaitWithDefaultTimeout() 259 Expect(session.ExitCode()).To(Equal(0)) 260 }) 261 262 It("podman exec preserves --group-add groups", func() { 263 groupName := "group1" 264 gid := "4444" 265 ctrName1 := "ctr1" 266 ctr1 := podmanTest.Podman([]string{"run", "-ti", "--name", ctrName1, fedoraMinimal, "groupadd", "-g", gid, groupName}) 267 ctr1.WaitWithDefaultTimeout() 268 Expect(ctr1.ExitCode()).To(Equal(0)) 269 270 imgName := "img1" 271 commit := podmanTest.Podman([]string{"commit", ctrName1, imgName}) 272 commit.WaitWithDefaultTimeout() 273 Expect(commit.ExitCode()).To(Equal(0)) 274 275 ctrName2 := "ctr2" 276 ctr2 := podmanTest.Podman([]string{"run", "-d", "--name", ctrName2, "--group-add", groupName, imgName, "sleep", "300"}) 277 ctr2.WaitWithDefaultTimeout() 278 Expect(ctr2.ExitCode()).To(Equal(0)) 279 280 exec := podmanTest.Podman([]string{"exec", "-ti", ctrName2, "id"}) 281 exec.WaitWithDefaultTimeout() 282 Expect(exec.ExitCode()).To(Equal(0)) 283 Expect(strings.Contains(exec.OutputToString(), fmt.Sprintf("%s(%s)", gid, groupName))).To(BeTrue()) 284 }) 285 })