rename_test.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package container // import "github.com/docker/docker/integration/container"
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/docker/docker/api/types"
  6. containertypes "github.com/docker/docker/api/types/container"
  7. "github.com/docker/docker/api/types/network"
  8. "github.com/docker/docker/integration/internal/container"
  9. "github.com/docker/docker/pkg/stringid"
  10. "gotest.tools/v3/assert"
  11. is "gotest.tools/v3/assert/cmp"
  12. "gotest.tools/v3/poll"
  13. "gotest.tools/v3/skip"
  14. )
  15. // This test simulates the scenario mentioned in #31392:
  16. // Having two linked container, renaming the target and bringing a replacement
  17. // and then deleting and recreating the source container linked to the new target.
  18. // This checks that "rename" updates source container correctly and doesn't set it to null.
  19. func TestRenameLinkedContainer(t *testing.T) {
  20. skip.If(t, testEnv.DaemonInfo.OSType == "windows", "FIXME")
  21. ctx := setupTest(t)
  22. apiClient := testEnv.APIClient()
  23. aName := "a0" + t.Name()
  24. bName := "b0" + t.Name()
  25. aID := container.Run(ctx, t, apiClient, container.WithName(aName))
  26. bID := container.Run(ctx, t, apiClient, container.WithName(bName), container.WithLinks(aName))
  27. err := apiClient.ContainerRename(ctx, aID, "a1"+t.Name())
  28. assert.NilError(t, err)
  29. container.Run(ctx, t, apiClient, container.WithName(aName))
  30. err = apiClient.ContainerRemove(ctx, bID, containertypes.RemoveOptions{Force: true})
  31. assert.NilError(t, err)
  32. bID = container.Run(ctx, t, apiClient, container.WithName(bName), container.WithLinks(aName))
  33. inspect, err := apiClient.ContainerInspect(ctx, bID)
  34. assert.NilError(t, err)
  35. assert.Check(t, is.DeepEqual([]string{"/" + aName + ":/" + bName + "/" + aName}, inspect.HostConfig.Links))
  36. }
  37. func TestRenameStoppedContainer(t *testing.T) {
  38. ctx := setupTest(t)
  39. apiClient := testEnv.APIClient()
  40. oldName := "first_name" + t.Name()
  41. cID := container.Run(ctx, t, apiClient, container.WithName(oldName), container.WithCmd("sh"))
  42. inspect, err := apiClient.ContainerInspect(ctx, cID)
  43. assert.NilError(t, err)
  44. assert.Check(t, is.Equal("/"+oldName, inspect.Name))
  45. newName := "new_name" + stringid.GenerateRandomID()
  46. err = apiClient.ContainerRename(ctx, oldName, newName)
  47. assert.NilError(t, err)
  48. inspect, err = apiClient.ContainerInspect(ctx, cID)
  49. assert.NilError(t, err)
  50. assert.Check(t, is.Equal("/"+newName, inspect.Name))
  51. }
  52. func TestRenameRunningContainerAndReuse(t *testing.T) {
  53. ctx := setupTest(t)
  54. apiClient := testEnv.APIClient()
  55. oldName := "first_name" + t.Name()
  56. cID := container.Run(ctx, t, apiClient, container.WithName(oldName))
  57. newName := "new_name" + stringid.GenerateRandomID()
  58. err := apiClient.ContainerRename(ctx, oldName, newName)
  59. assert.NilError(t, err)
  60. inspect, err := apiClient.ContainerInspect(ctx, cID)
  61. assert.NilError(t, err)
  62. assert.Check(t, is.Equal("/"+newName, inspect.Name))
  63. _, err = apiClient.ContainerInspect(ctx, oldName)
  64. assert.Check(t, is.ErrorContains(err, "No such container: "+oldName))
  65. cID = container.Run(ctx, t, apiClient, container.WithName(oldName))
  66. inspect, err = apiClient.ContainerInspect(ctx, cID)
  67. assert.NilError(t, err)
  68. assert.Check(t, is.Equal("/"+oldName, inspect.Name))
  69. }
  70. func TestRenameInvalidName(t *testing.T) {
  71. ctx := setupTest(t)
  72. apiClient := testEnv.APIClient()
  73. oldName := "first_name" + t.Name()
  74. cID := container.Run(ctx, t, apiClient, container.WithName(oldName))
  75. err := apiClient.ContainerRename(ctx, oldName, "new:invalid")
  76. assert.Check(t, is.ErrorContains(err, "Invalid container name"))
  77. inspect, err := apiClient.ContainerInspect(ctx, oldName)
  78. assert.NilError(t, err)
  79. assert.Check(t, is.Equal(cID, inspect.ID))
  80. }
  81. // Test case for GitHub issue 22466
  82. // Docker's service discovery works for named containers so
  83. // ping to a named container should work, and an anonymous
  84. // container without a name does not work with service discovery.
  85. // However, an anonymous could be renamed to a named container.
  86. // This test is to make sure once the container has been renamed,
  87. // the service discovery for the (re)named container works.
  88. func TestRenameAnonymousContainer(t *testing.T) {
  89. ctx := setupTest(t)
  90. apiClient := testEnv.APIClient()
  91. networkName := "network1" + t.Name()
  92. _, err := apiClient.NetworkCreate(ctx, networkName, types.NetworkCreate{})
  93. assert.NilError(t, err)
  94. cID := container.Run(ctx, t, apiClient, func(c *container.TestContainerConfig) {
  95. c.NetworkingConfig.EndpointsConfig = map[string]*network.EndpointSettings{
  96. networkName: {},
  97. }
  98. c.HostConfig.NetworkMode = containertypes.NetworkMode(networkName)
  99. })
  100. container1Name := "container1" + t.Name()
  101. err = apiClient.ContainerRename(ctx, cID, container1Name)
  102. assert.NilError(t, err)
  103. // Stop/Start the container to get registered
  104. // FIXME(vdemeester) this is a really weird behavior as it fails otherwise
  105. err = apiClient.ContainerStop(ctx, container1Name, containertypes.StopOptions{})
  106. assert.NilError(t, err)
  107. err = apiClient.ContainerStart(ctx, container1Name, containertypes.StartOptions{})
  108. assert.NilError(t, err)
  109. count := "-c"
  110. if testEnv.DaemonInfo.OSType == "windows" {
  111. count = "-n"
  112. }
  113. cID = container.Run(ctx, t, apiClient, func(c *container.TestContainerConfig) {
  114. c.NetworkingConfig.EndpointsConfig = map[string]*network.EndpointSettings{
  115. networkName: {},
  116. }
  117. c.HostConfig.NetworkMode = containertypes.NetworkMode(networkName)
  118. }, container.WithCmd("ping", count, "1", container1Name))
  119. poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "exited"), poll.WithDelay(100*time.Millisecond))
  120. inspect, err := apiClient.ContainerInspect(ctx, cID)
  121. assert.NilError(t, err)
  122. assert.Check(t, is.Equal(0, inspect.State.ExitCode), "container %s exited with the wrong exitcode: %s", cID, inspect.State.Error)
  123. }
  124. // TODO: should be a unit test
  125. func TestRenameContainerWithSameName(t *testing.T) {
  126. ctx := setupTest(t)
  127. apiClient := testEnv.APIClient()
  128. oldName := "old" + t.Name()
  129. cID := container.Run(ctx, t, apiClient, container.WithName(oldName))
  130. err := apiClient.ContainerRename(ctx, oldName, oldName)
  131. assert.Check(t, is.ErrorContains(err, "Renaming a container with the same name"))
  132. err = apiClient.ContainerRename(ctx, cID, oldName)
  133. assert.Check(t, is.ErrorContains(err, "Renaming a container with the same name"))
  134. }
  135. // Test case for GitHub issue 23973
  136. // When a container is being renamed, the container might
  137. // be linked to another container. In that case, the meta data
  138. // of the linked container should be updated so that the other
  139. // container could still reference to the container that is renamed.
  140. func TestRenameContainerWithLinkedContainer(t *testing.T) {
  141. skip.If(t, testEnv.IsRemoteDaemon)
  142. skip.If(t, testEnv.DaemonInfo.OSType == "windows", "FIXME")
  143. ctx := setupTest(t)
  144. apiClient := testEnv.APIClient()
  145. db1Name := "db1" + t.Name()
  146. db1ID := container.Run(ctx, t, apiClient, container.WithName(db1Name))
  147. app1Name := "app1" + t.Name()
  148. app2Name := "app2" + t.Name()
  149. container.Run(ctx, t, apiClient, container.WithName(app1Name), container.WithLinks(db1Name+":/mysql"))
  150. err := apiClient.ContainerRename(ctx, app1Name, app2Name)
  151. assert.NilError(t, err)
  152. inspect, err := apiClient.ContainerInspect(ctx, app2Name+"/mysql")
  153. assert.NilError(t, err)
  154. assert.Check(t, is.Equal(db1ID, inspect.ID))
  155. }