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