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  }