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  }