Fix podman network rm --force when network is used by a pod

I added a test to prevent a future regression.

Signed-off-by: Paul Holzinger <paul.holzinger@web.de>
This commit is contained in:
Paul Holzinger
2020-09-27 23:11:31 +02:00
parent 03d01abec6
commit 393120c135
2 changed files with 43 additions and 3 deletions

View File

@ -82,12 +82,21 @@ func (ic *ContainerEngine) NetworkRm(ctx context.Context, namesOrIds []string, o
// We need to iterate containers looking to see if they belong to the given network // We need to iterate containers looking to see if they belong to the given network
for _, c := range containers { for _, c := range containers {
if util.StringInSlice(name, c.Config().Networks) { if util.StringInSlice(name, c.Config().Networks) {
// if user passes force, we nuke containers // if user passes force, we nuke containers and pods
if !options.Force { if !options.Force {
// Without the force option, we return an error // Without the force option, we return an error
return reports, errors.Errorf("%q has associated containers with it. Use -f to forcibly delete containers", name) return reports, errors.Errorf("%q has associated containers with it. Use -f to forcibly delete containers and pods", name)
} }
if err := ic.Libpod.RemoveContainer(ctx, c, true, true); err != nil { if c.IsInfra() {
// if we have a infra container we need to remove the pod
pod, err := ic.Libpod.GetPod(c.PodID())
if err != nil {
return reports, err
}
if err := ic.Libpod.RemovePod(ctx, pod, true, true); err != nil {
return reports, err
}
} else if err := ic.Libpod.RemoveContainer(ctx, c, true, true); err != nil {
return reports, err return reports, err
} }
} }

View File

@ -263,4 +263,35 @@ var _ = Describe("Podman network", func() {
rmAll.WaitWithDefaultTimeout() rmAll.WaitWithDefaultTimeout()
Expect(rmAll.ExitCode()).To(BeZero()) Expect(rmAll.ExitCode()).To(BeZero())
}) })
It("podman network remove --force with pod", func() {
netName := "testnet"
session := podmanTest.Podman([]string{"network", "create", netName})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(BeZero())
session = podmanTest.Podman([]string{"pod", "create", "--network", netName})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(BeZero())
podID := session.OutputToString()
session = podmanTest.Podman([]string{"create", "--pod", podID, ALPINE})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(BeZero())
session = podmanTest.Podman([]string{"network", "rm", "--force", netName})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(BeZero())
// check if pod is deleted
session = podmanTest.Podman([]string{"pod", "exists", podID})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(1))
// check if net is deleted
session = podmanTest.Podman([]string{"network", "ls"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(BeZero())
Expect(session.OutputToString()).To(Not(ContainSubstring(netName)))
})
}) })