github.1git.de/docker/cli@v26.1.3+incompatible/cli/command/context/use_test.go (about)

     1  package context
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"io"
     7  	"os"
     8  	"path/filepath"
     9  	"runtime"
    10  	"testing"
    11  
    12  	"github.com/docker/cli/cli/command"
    13  	"github.com/docker/cli/cli/config"
    14  	"github.com/docker/cli/cli/config/configfile"
    15  	"github.com/docker/cli/cli/flags"
    16  	"github.com/docker/docker/errdefs"
    17  	"gotest.tools/v3/assert"
    18  	is "gotest.tools/v3/assert/cmp"
    19  )
    20  
    21  func TestUse(t *testing.T) {
    22  	configDir := t.TempDir()
    23  	configFilePath := filepath.Join(configDir, "config.json")
    24  	testCfg := configfile.New(configFilePath)
    25  	cli := makeFakeCli(t, withCliConfig(testCfg))
    26  	err := RunCreate(cli, &CreateOptions{
    27  		Name:   "test",
    28  		Docker: map[string]string{},
    29  	})
    30  	assert.NilError(t, err)
    31  	assert.NilError(t, newUseCommand(cli).RunE(nil, []string{"test"}))
    32  	reloadedConfig, err := config.Load(configDir)
    33  	assert.NilError(t, err)
    34  	assert.Equal(t, "test", reloadedConfig.CurrentContext)
    35  
    36  	// switch back to default
    37  	cli.OutBuffer().Reset()
    38  	cli.ErrBuffer().Reset()
    39  	assert.NilError(t, newUseCommand(cli).RunE(nil, []string{"default"}))
    40  	reloadedConfig, err = config.Load(configDir)
    41  	assert.NilError(t, err)
    42  	assert.Equal(t, "", reloadedConfig.CurrentContext)
    43  	assert.Equal(t, "default\n", cli.OutBuffer().String())
    44  	assert.Equal(t, "Current context is now \"default\"\n", cli.ErrBuffer().String())
    45  }
    46  
    47  func TestUseNoExist(t *testing.T) {
    48  	cli := makeFakeCli(t)
    49  	err := newUseCommand(cli).RunE(nil, []string{"test"})
    50  	assert.Check(t, is.ErrorType(err, errdefs.IsNotFound))
    51  }
    52  
    53  // TestUseDefaultWithoutConfigFile verifies that the CLI does not create
    54  // the default config file and directory when using the default context.
    55  func TestUseDefaultWithoutConfigFile(t *testing.T) {
    56  	// We must use a temporary home-directory, because this test covers
    57  	// the _default_ configuration file. If we specify a custom configuration
    58  	// file, the CLI produces an error if the file doesn't exist.
    59  	tmpHomeDir := t.TempDir()
    60  	if runtime.GOOS == "windows" {
    61  		t.Setenv("USERPROFILE", tmpHomeDir)
    62  	} else {
    63  		t.Setenv("HOME", tmpHomeDir)
    64  	}
    65  	configDir := filepath.Join(tmpHomeDir, ".docker")
    66  	configFilePath := filepath.Join(configDir, "config.json")
    67  
    68  	// Verify config-dir and -file don't exist before
    69  	_, err := os.Stat(configDir)
    70  	assert.Check(t, errors.Is(err, os.ErrNotExist))
    71  	_, err = os.Stat(configFilePath)
    72  	assert.Check(t, errors.Is(err, os.ErrNotExist))
    73  
    74  	cli, err := command.NewDockerCli(command.WithCombinedStreams(io.Discard))
    75  	assert.NilError(t, err)
    76  	assert.NilError(t, newUseCommand(cli).RunE(nil, []string{"default"}))
    77  
    78  	// Verify config-dir and -file don't exist after
    79  	_, err = os.Stat(configDir)
    80  	assert.Check(t, errors.Is(err, os.ErrNotExist))
    81  	_, err = os.Stat(configFilePath)
    82  	assert.Check(t, errors.Is(err, os.ErrNotExist))
    83  }
    84  
    85  func TestUseHostOverride(t *testing.T) {
    86  	t.Setenv("DOCKER_HOST", "tcp://ed:2375/")
    87  
    88  	configDir := t.TempDir()
    89  	configFilePath := filepath.Join(configDir, "config.json")
    90  	testCfg := configfile.New(configFilePath)
    91  	cli := makeFakeCli(t, withCliConfig(testCfg))
    92  	err := RunCreate(cli, &CreateOptions{
    93  		Name:   "test",
    94  		Docker: map[string]string{},
    95  	})
    96  	assert.NilError(t, err)
    97  
    98  	cli.ResetOutputBuffers()
    99  	err = newUseCommand(cli).RunE(nil, []string{"test"})
   100  	assert.NilError(t, err)
   101  	assert.Assert(t, is.Contains(
   102  		cli.ErrBuffer().String(),
   103  		`Warning: DOCKER_HOST environment variable overrides the active context.`,
   104  	))
   105  	assert.Assert(t, is.Contains(cli.ErrBuffer().String(), `Current context is now "test"`))
   106  	assert.Equal(t, cli.OutBuffer().String(), "test\n")
   107  
   108  	// setting DOCKER_HOST with the default context should not print a warning
   109  	cli.ResetOutputBuffers()
   110  	err = newUseCommand(cli).RunE(nil, []string{"default"})
   111  	assert.NilError(t, err)
   112  	assert.Assert(t, is.Contains(cli.ErrBuffer().String(), `Current context is now "default"`))
   113  	assert.Equal(t, cli.OutBuffer().String(), "default\n")
   114  }
   115  
   116  // An empty DOCKER_HOST used to break the 'context use' flow.
   117  // So we have a test with fewer fakes that tests this flow holistically.
   118  // https://github.com/docker/cli/issues/3667
   119  func TestUseHostOverrideEmpty(t *testing.T) {
   120  	t.Setenv("DOCKER_HOST", "")
   121  
   122  	configDir := t.TempDir()
   123  	config.SetDir(configDir)
   124  
   125  	socketPath := "unix://" + filepath.Join(configDir, "docker.sock")
   126  
   127  	var out *bytes.Buffer
   128  	var cli *command.DockerCli
   129  
   130  	loadCli := func() {
   131  		out = bytes.NewBuffer(nil)
   132  
   133  		var err error
   134  		cli, err = command.NewDockerCli(command.WithCombinedStreams(out))
   135  		assert.NilError(t, err)
   136  		assert.NilError(t, cli.Initialize(flags.NewClientOptions()))
   137  	}
   138  	loadCli()
   139  	err := RunCreate(cli, &CreateOptions{
   140  		Name:   "test",
   141  		Docker: map[string]string{"host": socketPath},
   142  	})
   143  	assert.NilError(t, err)
   144  
   145  	err = newUseCommand(cli).RunE(nil, []string{"test"})
   146  	assert.NilError(t, err)
   147  	assert.Assert(t, !is.Contains(out.String(), "Warning")().Success())
   148  	assert.Assert(t, is.Contains(out.String(), `Current context is now "test"`))
   149  
   150  	loadCli()
   151  	err = newShowCommand(cli).RunE(nil, nil)
   152  	assert.NilError(t, err)
   153  	assert.Assert(t, is.Contains(out.String(), "test"))
   154  
   155  	apiclient := cli.Client()
   156  	assert.Equal(t, apiclient.DaemonHost(), socketPath)
   157  }