diff --git a/pkg/specgen/generate/pod_create.go b/pkg/specgen/generate/pod_create.go index 727c24bdbb..1988eeb7ac 100644 --- a/pkg/specgen/generate/pod_create.go +++ b/pkg/specgen/generate/pod_create.go @@ -18,7 +18,15 @@ import ( "github.com/sirupsen/logrus" ) -func MakePod(p *entities.PodSpec, rt *libpod.Runtime) (*libpod.Pod, error) { +func MakePod(p *entities.PodSpec, rt *libpod.Runtime) (_ *libpod.Pod, finalErr error) { + var createdPod *libpod.Pod + defer func() { + if finalErr != nil && createdPod != nil { + if err := rt.RemovePod(context.Background(), createdPod, true, true, nil); err != nil { + logrus.Errorf("Removing pod: %v", err) + } + } + }() if err := p.PodSpecGen.Validate(); err != nil { return nil, err } @@ -69,6 +77,8 @@ func MakePod(p *entities.PodSpec, rt *libpod.Runtime) (*libpod.Pod, error) { if err != nil { return nil, err } + createdPod = pod + if !p.PodSpecGen.NoInfra && p.PodSpecGen.InfraContainerSpec != nil { if p.PodSpecGen.InfraContainerSpec.Name == "" { p.PodSpecGen.InfraContainerSpec.Name = pod.ID()[:12] + "-infra" diff --git a/test/system/200-pod.bats b/test/system/200-pod.bats index 764e5c0887..d831ca1200 100644 --- a/test/system/200-pod.bats +++ b/test/system/200-pod.bats @@ -554,4 +554,17 @@ io.max | $lomajmin rbps=1048576 wbps=1048576 riops=max wiops=max is "$output" "" "Should print no output" } +@test "podman pod create on failure" { + podname=pod$(random_string) + nwname=pod$(random_string) + + run_podman 125 pod create --network $nwname --name $podname + # FIXME: podman and podman-remote do not return the same error message + # but consistency would be nice + is "$output" "Error: .*unable to find network with name or ID $nwname: network not found" + + # Make sure the pod doesn't get created on failure + run_podman 1 pod exists $podname +} + # vim: filetype=sh