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