From c54816dfc39b00824b9d4902ed2e533b3c6c07a7 Mon Sep 17 00:00:00 2001 From: Daniel J Walsh Date: Sat, 17 Mar 2018 20:08:27 -0400 Subject: Check for duplicate names when generating new container and pod names. This fixes the situation where we fail to create a container when a name already exists. Signed-off-by: Daniel J Walsh Closes: #517 Approved by: baude --- libpod/boltdb_state.go | 2 +- libpod/container_internal.go | 2 -- libpod/pod.go | 2 -- libpod/runtime.go | 26 ++++++++++++++++++++++++++ libpod/runtime_ctr.go | 9 +++++++++ libpod/runtime_pod.go | 8 ++++++++ 6 files changed, 44 insertions(+), 5 deletions(-) diff --git a/libpod/boltdb_state.go b/libpod/boltdb_state.go index aeda94e50..e1f29b16a 100644 --- a/libpod/boltdb_state.go +++ b/libpod/boltdb_state.go @@ -706,7 +706,7 @@ func (s *BoltState) LookupPod(idOrName string) (*Pod, error) { if err != nil { return err } else if !exists { - return errors.Wrapf(ErrNoSuchCtr, "no pod with name or ID %s found", idOrName) + return errors.Wrapf(ErrNoSuchPod, "no pod with name or ID %s found", idOrName) } } diff --git a/libpod/container_internal.go b/libpod/container_internal.go index 28f7dfe45..a338a1776 100644 --- a/libpod/container_internal.go +++ b/libpod/container_internal.go @@ -15,7 +15,6 @@ import ( "github.com/containers/storage/pkg/archive" "github.com/containers/storage/pkg/chrootarchive" "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/namesgenerator" "github.com/docker/docker/pkg/stringid" spec "github.com/opencontainers/runtime-spec/specs-go" "github.com/opencontainers/runtime-tools/generate" @@ -150,7 +149,6 @@ func newContainer(rspec *spec.Spec, lockDir string) (*Container, error) { ctr.state = new(containerState) ctr.config.ID = stringid.GenerateNonCryptoID() - ctr.config.Name = namesgenerator.GetRandomName(0) ctr.config.Spec = new(spec.Spec) deepcopier.Copy(rspec).To(ctr.config.Spec) diff --git a/libpod/pod.go b/libpod/pod.go index 16b590a1c..f769ad2ed 100644 --- a/libpod/pod.go +++ b/libpod/pod.go @@ -4,7 +4,6 @@ import ( "path/filepath" "github.com/containers/storage" - "github.com/docker/docker/pkg/namesgenerator" "github.com/docker/docker/pkg/stringid" "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -52,7 +51,6 @@ func newPod(lockDir string, runtime *Runtime) (*Pod, error) { pod := new(Pod) pod.config = new(PodConfig) pod.config.ID = stringid.GenerateNonCryptoID() - pod.config.Name = namesgenerator.GetRandomName(0) pod.config.Labels = make(map[string]string) pod.runtime = runtime diff --git a/libpod/runtime.go b/libpod/runtime.go index 39c65548b..869727f38 100644 --- a/libpod/runtime.go +++ b/libpod/runtime.go @@ -12,6 +12,7 @@ import ( "github.com/containers/image/types" "github.com/containers/storage" "github.com/cri-o/ocicni/pkg/ocicni" + "github.com/docker/docker/pkg/namesgenerator" "github.com/pkg/errors" "github.com/projectatomic/libpod/libpod/image" "github.com/sirupsen/logrus" @@ -562,6 +563,31 @@ func (r *Runtime) Info() ([]InfoData, error) { return info, nil } +// generateName generates a unigue name for a container or pod. +func (r *Runtime) generateName() (string, error) { + for { + name := namesgenerator.GetRandomName(0) + // Make sure container with this name does not exist + if _, err := r.state.LookupContainer(name); err == nil { + continue + } else { + if errors.Cause(err) != ErrNoSuchCtr { + return "", err + } + } + // Make sure pod with this name does not exist + if _, err := r.state.LookupPod(name); err == nil { + continue + } else { + if errors.Cause(err) != ErrNoSuchPod { + return "", err + } + } + return name, nil + } + // The code should never reach here. +} + // SaveDefaultConfig saves a copy of the default config at the given path func SaveDefaultConfig(path string) error { var w bytes.Buffer diff --git a/libpod/runtime_ctr.go b/libpod/runtime_ctr.go index 51c2001d0..3b4710d96 100644 --- a/libpod/runtime_ctr.go +++ b/libpod/runtime_ctr.go @@ -50,6 +50,15 @@ func (r *Runtime) NewContainer(rSpec *spec.Spec, options ...CtrCreateOption) (c ctr.state.State = ContainerStateConfigured ctr.runtime = r + if ctr.config.Name == "" { + name, err := r.generateName() + if err != nil { + return nil, err + } + + ctr.config.Name = name + } + // Set up storage for the container if err := ctr.setupStorage(); err != nil { return nil, errors.Wrapf(err, "error configuring storage for container") diff --git a/libpod/runtime_pod.go b/libpod/runtime_pod.go index 3619a7a82..44910b180 100644 --- a/libpod/runtime_pod.go +++ b/libpod/runtime_pod.go @@ -35,6 +35,14 @@ func (r *Runtime) NewPod(options ...PodCreateOption) (*Pod, error) { } } + if pod.config.Name == "" { + name, err := r.generateName() + if err != nil { + return nil, err + } + pod.config.Name = name + } + pod.valid = true if err := r.state.AddPod(pod); err != nil { -- cgit v1.2.3-54-g00ecf