daemon/names.go
4f0d95fa
 package daemon // import "github.com/docker/docker/daemon"
fb48bf51
 
 import (
 	"fmt"
c90ec051
 	"strings"
fb48bf51
 
 	"github.com/docker/docker/container"
22b24641
 	"github.com/docker/docker/daemon/names"
d453fe35
 	"github.com/docker/docker/errdefs"
fb48bf51
 	"github.com/docker/docker/pkg/namesgenerator"
 	"github.com/docker/docker/pkg/stringid"
ebcb7d6b
 	"github.com/pkg/errors"
1009e6a4
 	"github.com/sirupsen/logrus"
fb48bf51
 )
 
 var (
22b24641
 	validContainerNameChars   = names.RestrictedNameChars
 	validContainerNamePattern = names.RestrictedNamePattern
fb48bf51
 )
 
 func (daemon *Daemon) registerName(container *container.Container) error {
 	if daemon.Exists(container.ID) {
 		return fmt.Errorf("Container is already loaded")
 	}
 	if err := validateID(container.ID); err != nil {
 		return err
 	}
 	if container.Name == "" {
 		name, err := daemon.generateNewName(container.ID)
 		if err != nil {
 			return err
 		}
 		container.Name = name
 	}
1128fc1a
 	return daemon.containersReplica.ReserveName(container.Name, container.ID)
fb48bf51
 }
 
 func (daemon *Daemon) generateIDAndName(name string) (string, string, error) {
 	var (
 		err error
2df693e5
 		id  = stringid.GenerateRandomID()
fb48bf51
 	)
 
 	if name == "" {
 		if name, err = daemon.generateNewName(id); err != nil {
 			return "", "", err
 		}
 		return id, name, nil
 	}
 
 	if name, err = daemon.reserveName(id, name); err != nil {
 		return "", "", err
 	}
 
 	return id, name, nil
 }
 
 func (daemon *Daemon) reserveName(id, name string) (string, error) {
c90ec051
 	if !validContainerNamePattern.MatchString(strings.TrimPrefix(name, "/")) {
87a12421
 		return "", errdefs.InvalidParameter(errors.Errorf("Invalid container name (%s), only %s are allowed", name, validContainerNameChars))
fb48bf51
 	}
 	if name[0] != '/' {
 		name = "/" + name
 	}
 
1128fc1a
 	if err := daemon.containersReplica.ReserveName(name, id); err != nil {
 		if err == container.ErrNameReserved {
 			id, err := daemon.containersReplica.Snapshot().GetID(name)
fb48bf51
 			if err != nil {
 				logrus.Errorf("got unexpected error while looking up reserved name: %v", err)
 				return "", err
 			}
e424343b
 			return "", nameConflictError{id: id, name: name}
fb48bf51
 		}
ebcb7d6b
 		return "", errors.Wrapf(err, "error reserving name: %q", name)
fb48bf51
 	}
 	return name, nil
 }
 
 func (daemon *Daemon) releaseName(name string) {
1128fc1a
 	daemon.containersReplica.ReleaseName(name)
fb48bf51
 }
 
 func (daemon *Daemon) generateNewName(id string) (string, error) {
 	var name string
 	for i := 0; i < 6; i++ {
 		name = namesgenerator.GetRandomName(i)
 		if name[0] != '/' {
 			name = "/" + name
 		}
 
1128fc1a
 		if err := daemon.containersReplica.ReserveName(name, id); err != nil {
 			if err == container.ErrNameReserved {
fb48bf51
 				continue
 			}
 			return "", err
 		}
 		return name, nil
 	}
 
 	name = "/" + stringid.TruncateID(id)
1128fc1a
 	if err := daemon.containersReplica.ReserveName(name, id); err != nil {
fb48bf51
 		return "", err
 	}
 	return name, nil
 }
bfa0885c
 
 func validateID(id string) error {
 	if id == "" {
 		return fmt.Errorf("Invalid empty id")
 	}
 	return nil
 }