summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel J Walsh <dwalsh@redhat.com>2018-03-17 20:08:27 -0400
committerAtomic Bot <atomic-devel@projectatomic.io>2018-03-29 01:55:20 +0000
commitc54816dfc39b00824b9d4902ed2e533b3c6c07a7 (patch)
treeb810d6625d3f095a7d7e8561bde651062ab9f44d
parentf936b745b66de3cbbdf924a26bb35766afe5acba (diff)
downloadpodman-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
-rw-r--r--libpod/boltdb_state.go2
-rw-r--r--libpod/container_internal.go2
-rw-r--r--libpod/pod.go2
-rw-r--r--libpod/runtime.go26
-rw-r--r--libpod/runtime_ctr.go9
-rw-r--r--libpod/runtime_pod.go8
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 {