github.com/mheon/docker@v0.11.2-0.20150922122814-44f47903a831/daemon/rename.go (about)

     1  package daemon
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  // ContainerRename changes the name of a container, using the oldName
     8  // to find the container. An error is returned if newName is already
     9  // reserved.
    10  func (daemon *Daemon) ContainerRename(oldName, newName string) error {
    11  	if oldName == "" || newName == "" {
    12  		return fmt.Errorf("Neither old nor new names may be empty")
    13  	}
    14  
    15  	container, err := daemon.Get(oldName)
    16  	if err != nil {
    17  		return err
    18  	}
    19  
    20  	oldName = container.Name
    21  
    22  	container.Lock()
    23  	defer container.Unlock()
    24  	if newName, err = daemon.reserveName(container.ID, newName); err != nil {
    25  		return fmt.Errorf("Error when allocating new name: %s", err)
    26  	}
    27  
    28  	container.Name = newName
    29  
    30  	undo := func() {
    31  		container.Name = oldName
    32  		daemon.reserveName(container.ID, oldName)
    33  		daemon.containerGraphDB.Delete(newName)
    34  	}
    35  
    36  	if err := daemon.containerGraphDB.Delete(oldName); err != nil {
    37  		undo()
    38  		return fmt.Errorf("Failed to delete container %q: %v", oldName, err)
    39  	}
    40  
    41  	if err := container.toDisk(); err != nil {
    42  		undo()
    43  		return err
    44  	}
    45  
    46  	container.logEvent("rename")
    47  	return nil
    48  }