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
This commit is contained in:
parent
f936b745b6
commit
c54816dfc3
|
|
@ -706,7 +706,7 @@ func (s *BoltState) LookupPod(idOrName string) (*Pod, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
} else if !exists {
|
} 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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,6 @@ import (
|
||||||
"github.com/containers/storage/pkg/archive"
|
"github.com/containers/storage/pkg/archive"
|
||||||
"github.com/containers/storage/pkg/chrootarchive"
|
"github.com/containers/storage/pkg/chrootarchive"
|
||||||
"github.com/docker/docker/pkg/mount"
|
"github.com/docker/docker/pkg/mount"
|
||||||
"github.com/docker/docker/pkg/namesgenerator"
|
|
||||||
"github.com/docker/docker/pkg/stringid"
|
"github.com/docker/docker/pkg/stringid"
|
||||||
spec "github.com/opencontainers/runtime-spec/specs-go"
|
spec "github.com/opencontainers/runtime-spec/specs-go"
|
||||||
"github.com/opencontainers/runtime-tools/generate"
|
"github.com/opencontainers/runtime-tools/generate"
|
||||||
|
|
@ -150,7 +149,6 @@ func newContainer(rspec *spec.Spec, lockDir string) (*Container, error) {
|
||||||
ctr.state = new(containerState)
|
ctr.state = new(containerState)
|
||||||
|
|
||||||
ctr.config.ID = stringid.GenerateNonCryptoID()
|
ctr.config.ID = stringid.GenerateNonCryptoID()
|
||||||
ctr.config.Name = namesgenerator.GetRandomName(0)
|
|
||||||
|
|
||||||
ctr.config.Spec = new(spec.Spec)
|
ctr.config.Spec = new(spec.Spec)
|
||||||
deepcopier.Copy(rspec).To(ctr.config.Spec)
|
deepcopier.Copy(rspec).To(ctr.config.Spec)
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/containers/storage"
|
"github.com/containers/storage"
|
||||||
"github.com/docker/docker/pkg/namesgenerator"
|
|
||||||
"github.com/docker/docker/pkg/stringid"
|
"github.com/docker/docker/pkg/stringid"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
@ -52,7 +51,6 @@ func newPod(lockDir string, runtime *Runtime) (*Pod, error) {
|
||||||
pod := new(Pod)
|
pod := new(Pod)
|
||||||
pod.config = new(PodConfig)
|
pod.config = new(PodConfig)
|
||||||
pod.config.ID = stringid.GenerateNonCryptoID()
|
pod.config.ID = stringid.GenerateNonCryptoID()
|
||||||
pod.config.Name = namesgenerator.GetRandomName(0)
|
|
||||||
pod.config.Labels = make(map[string]string)
|
pod.config.Labels = make(map[string]string)
|
||||||
pod.runtime = runtime
|
pod.runtime = runtime
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"github.com/containers/image/types"
|
"github.com/containers/image/types"
|
||||||
"github.com/containers/storage"
|
"github.com/containers/storage"
|
||||||
"github.com/cri-o/ocicni/pkg/ocicni"
|
"github.com/cri-o/ocicni/pkg/ocicni"
|
||||||
|
"github.com/docker/docker/pkg/namesgenerator"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/projectatomic/libpod/libpod/image"
|
"github.com/projectatomic/libpod/libpod/image"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
@ -562,6 +563,31 @@ func (r *Runtime) Info() ([]InfoData, error) {
|
||||||
return info, nil
|
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
|
// SaveDefaultConfig saves a copy of the default config at the given path
|
||||||
func SaveDefaultConfig(path string) error {
|
func SaveDefaultConfig(path string) error {
|
||||||
var w bytes.Buffer
|
var w bytes.Buffer
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,15 @@ func (r *Runtime) NewContainer(rSpec *spec.Spec, options ...CtrCreateOption) (c
|
||||||
ctr.state.State = ContainerStateConfigured
|
ctr.state.State = ContainerStateConfigured
|
||||||
ctr.runtime = r
|
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
|
// Set up storage for the container
|
||||||
if err := ctr.setupStorage(); err != nil {
|
if err := ctr.setupStorage(); err != nil {
|
||||||
return nil, errors.Wrapf(err, "error configuring storage for container")
|
return nil, errors.Wrapf(err, "error configuring storage for container")
|
||||||
|
|
|
||||||
|
|
@ -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
|
pod.valid = true
|
||||||
|
|
||||||
if err := r.state.AddPod(pod); err != nil {
|
if err := r.state.AddPod(pod); err != nil {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue