libpod: do not resuse networking on start

If a container was stopped and we try to start it before we called
cleanup it tried to reuse the network which caused a panic as the pasta
code cannot deal with that. It is also never correct as the netns must
be created by the runtime in case of custom user namespaces used. As
such the proper thing is to clean the netns up first.

Also change a e2e test to report better errors. It is not directly
related to this chnage but it failed on v1 of this patch so we noticed
the ugly error message it produced. Thanks to Ed for the fix.

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
This commit is contained in:
Paul Holzinger 2024-06-05 16:28:26 +02:00
parent 7ff1494c47
commit a9de888a15
No known key found for this signature in database
GPG Key ID: EB145DD938A3CAF2
3 changed files with 15 additions and 2 deletions

View File

@ -71,6 +71,14 @@ func (c *Container) prepare() error {
go func() {
defer wg.Done()
if c.state.State == define.ContainerStateStopped {
// networking should not be reused after a stop
if err := c.cleanupNetwork(); err != nil {
createNetNSErr = err
return
}
}
// Set up network namespace if not already set up
noNetNS := c.state.NetNS == ""
if c.config.CreateNetNS && noNetNS && !c.config.PostConfigureNetNS {

View File

@ -193,12 +193,13 @@ var _ = Describe("Podman restart", func() {
session.WaitWithDefaultTimeout()
Expect(session).Should(ExitCleanly())
testCmd := []string{"exec", "host-restart-test", "sh", "-c", "wc -l < /etc/hosts"}
testCmd := []string{"exec", "host-restart-test", "cat", "/etc/hosts"}
// before restart
beforeRestart := podmanTest.Podman(testCmd)
beforeRestart.WaitWithDefaultTimeout()
Expect(beforeRestart).Should(ExitCleanly())
nHostLines := len(beforeRestart.OutputToStringArray())
session = podmanTest.Podman([]string{"restart", "host-restart-test"})
session.WaitWithDefaultTimeout()
@ -209,7 +210,8 @@ var _ = Describe("Podman restart", func() {
Expect(afterRestart).Should(ExitCleanly())
// line count should be equal
Expect(beforeRestart.OutputToString()).To(Equal(afterRestart.OutputToString()))
Expect(afterRestart.OutputToStringArray()).To(HaveLen(nHostLines),
"number of host lines post-restart == number of lines pre-restart")
})
It("podman restart all stopped containers with --all", func() {

View File

@ -58,6 +58,9 @@ load helpers
is "$output" ".*$c1_id.*" "--filter finds container 1"
is "$output" ".*$c3_id.*" "--filter finds container 3"
# start again, before this fix it could panic
run_podman start --filter restart-policy=always
# Start via filtered names
run_podman start --filter restart-policy=on-failure $c2 $c3
is "$output" "$c2" "--filter finds container 2"