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