rename.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package daemon
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/Sirupsen/logrus"
  6. "github.com/docker/libnetwork"
  7. )
  8. // ContainerRename changes the name of a container, using the oldName
  9. // to find the container. An error is returned if newName is already
  10. // reserved.
  11. func (daemon *Daemon) ContainerRename(oldName, newName string) error {
  12. var (
  13. sid string
  14. sb libnetwork.Sandbox
  15. )
  16. if oldName == "" || newName == "" {
  17. return fmt.Errorf("Neither old nor new names may be empty")
  18. }
  19. if newName[0] != '/' {
  20. newName = "/" + newName
  21. }
  22. container, err := daemon.GetContainer(oldName)
  23. if err != nil {
  24. return err
  25. }
  26. oldName = container.Name
  27. oldIsAnonymousEndpoint := container.NetworkSettings.IsAnonymousEndpoint
  28. container.Lock()
  29. defer container.Unlock()
  30. if oldName == newName {
  31. return fmt.Errorf("Renaming a container with the same name as its current name")
  32. }
  33. if newName, err = daemon.reserveName(container.ID, newName); err != nil {
  34. return fmt.Errorf("Error when allocating new name: %v", err)
  35. }
  36. container.Name = newName
  37. container.NetworkSettings.IsAnonymousEndpoint = false
  38. defer func() {
  39. if err != nil {
  40. container.Name = oldName
  41. container.NetworkSettings.IsAnonymousEndpoint = oldIsAnonymousEndpoint
  42. daemon.reserveName(container.ID, oldName)
  43. daemon.releaseName(newName)
  44. }
  45. }()
  46. daemon.releaseName(oldName)
  47. if err = container.ToDisk(); err != nil {
  48. return err
  49. }
  50. attributes := map[string]string{
  51. "oldName": oldName,
  52. }
  53. if !container.Running {
  54. daemon.LogContainerEventWithAttributes(container, "rename", attributes)
  55. return nil
  56. }
  57. defer func() {
  58. if err != nil {
  59. container.Name = oldName
  60. container.NetworkSettings.IsAnonymousEndpoint = oldIsAnonymousEndpoint
  61. if e := container.ToDisk(); e != nil {
  62. logrus.Errorf("%s: Failed in writing to Disk on rename failure: %v", container.ID, e)
  63. }
  64. }
  65. }()
  66. sid = container.NetworkSettings.SandboxID
  67. if daemon.netController != nil {
  68. sb, err = daemon.netController.SandboxByID(sid)
  69. if err != nil {
  70. return err
  71. }
  72. err = sb.Rename(strings.TrimPrefix(container.Name, "/"))
  73. if err != nil {
  74. return err
  75. }
  76. }
  77. daemon.LogContainerEventWithAttributes(container, "rename", attributes)
  78. return nil
  79. }