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
} |