diff options
author | Daniel J Walsh <dwalsh@redhat.com> | 2018-03-17 20:08:27 -0400 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-03-29 01:55:20 +0000 |
commit | c54816dfc39b00824b9d4902ed2e533b3c6c07a7 (patch) | |
tree | b810d6625d3f095a7d7e8561bde651062ab9f44d /libpod | |
parent | f936b745b66de3cbbdf924a26bb35766afe5acba (diff) | |
download | podman-c54816dfc39b00824b9d4902ed2e533b3c6c07a7.tar.gz podman-c54816dfc39b00824b9d4902ed2e533b3c6c07a7.tar.bz2 podman-c54816dfc39b00824b9d4902ed2e533b3c6c07a7.zip |
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 <dwalsh@redhat.com>
Closes: #517
Approved by: baude
Diffstat (limited to 'libpod')
-rw-r--r-- | libpod/boltdb_state.go | 2 | ||||
-rw-r--r-- | libpod/container_internal.go | 2 | ||||
-rw-r--r-- | libpod/pod.go | 2 | ||||
-rw-r--r-- | libpod/runtime.go | 26 | ||||
-rw-r--r-- | libpod/runtime_ctr.go | 9 | ||||
-rw-r--r-- | 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 { |