github.com/SamWhited/moby@v1.13.1/integration-cli/docker_cli_config_test.go (about)

     1  package main
     2  
     3  import (
     4  	"io/ioutil"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"os"
     8  	"os/exec"
     9  	"path/filepath"
    10  	"runtime"
    11  
    12  	"github.com/docker/docker/api"
    13  	"github.com/docker/docker/dockerversion"
    14  	"github.com/docker/docker/pkg/homedir"
    15  	"github.com/docker/docker/pkg/integration/checker"
    16  	"github.com/go-check/check"
    17  )
    18  
    19  func (s *DockerSuite) TestConfigHTTPHeader(c *check.C) {
    20  	testRequires(c, UnixCli) // Can't set/unset HOME on windows right now
    21  	// We either need a level of Go that supports Unsetenv (for cases
    22  	// when HOME/USERPROFILE isn't set), or we need to be able to use
    23  	// os/user but user.Current() only works if we aren't statically compiling
    24  
    25  	var headers map[string][]string
    26  
    27  	server := httptest.NewServer(http.HandlerFunc(
    28  		func(w http.ResponseWriter, r *http.Request) {
    29  			w.Header().Set("API-Version", api.DefaultVersion)
    30  			headers = r.Header
    31  		}))
    32  	defer server.Close()
    33  
    34  	homeKey := homedir.Key()
    35  	homeVal := homedir.Get()
    36  	tmpDir, err := ioutil.TempDir("", "fake-home")
    37  	c.Assert(err, checker.IsNil)
    38  	defer os.RemoveAll(tmpDir)
    39  
    40  	dotDocker := filepath.Join(tmpDir, ".docker")
    41  	os.Mkdir(dotDocker, 0600)
    42  	tmpCfg := filepath.Join(dotDocker, "config.json")
    43  
    44  	defer func() { os.Setenv(homeKey, homeVal) }()
    45  	os.Setenv(homeKey, tmpDir)
    46  
    47  	data := `{
    48  		"HttpHeaders": { "MyHeader": "MyValue" }
    49  	}`
    50  
    51  	err = ioutil.WriteFile(tmpCfg, []byte(data), 0600)
    52  	c.Assert(err, checker.IsNil)
    53  
    54  	cmd := exec.Command(dockerBinary, "-H="+server.URL[7:], "ps")
    55  	out, _, _ := runCommandWithOutput(cmd)
    56  
    57  	c.Assert(headers["User-Agent"], checker.NotNil, check.Commentf("Missing User-Agent"))
    58  
    59  	c.Assert(headers["User-Agent"][0], checker.Equals, "Docker-Client/"+dockerversion.Version+" ("+runtime.GOOS+")", check.Commentf("Badly formatted User-Agent,out:%v", out))
    60  
    61  	c.Assert(headers["Myheader"], checker.NotNil)
    62  	c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("Missing/bad header,out:%v", out))
    63  
    64  }
    65  
    66  func (s *DockerSuite) TestConfigDir(c *check.C) {
    67  	cDir, err := ioutil.TempDir("", "fake-home")
    68  	c.Assert(err, checker.IsNil)
    69  	defer os.RemoveAll(cDir)
    70  
    71  	// First make sure pointing to empty dir doesn't generate an error
    72  	dockerCmd(c, "--config", cDir, "ps")
    73  
    74  	// Test with env var too
    75  	cmd := exec.Command(dockerBinary, "ps")
    76  	cmd.Env = appendBaseEnv(true, "DOCKER_CONFIG="+cDir)
    77  	out, _, err := runCommandWithOutput(cmd)
    78  
    79  	c.Assert(err, checker.IsNil, check.Commentf("ps2 didn't work,out:%v", out))
    80  
    81  	// Start a server so we can check to see if the config file was
    82  	// loaded properly
    83  	var headers map[string][]string
    84  
    85  	server := httptest.NewServer(http.HandlerFunc(
    86  		func(w http.ResponseWriter, r *http.Request) {
    87  			headers = r.Header
    88  		}))
    89  	defer server.Close()
    90  
    91  	// Create a dummy config file in our new config dir
    92  	data := `{
    93  		"HttpHeaders": { "MyHeader": "MyValue" }
    94  	}`
    95  
    96  	tmpCfg := filepath.Join(cDir, "config.json")
    97  	err = ioutil.WriteFile(tmpCfg, []byte(data), 0600)
    98  	c.Assert(err, checker.IsNil, check.Commentf("Err creating file"))
    99  
   100  	env := appendBaseEnv(false)
   101  
   102  	cmd = exec.Command(dockerBinary, "--config", cDir, "-H="+server.URL[7:], "ps")
   103  	cmd.Env = env
   104  	out, _, err = runCommandWithOutput(cmd)
   105  
   106  	c.Assert(err, checker.NotNil, check.Commentf("out:%v", out))
   107  	c.Assert(headers["Myheader"], checker.NotNil)
   108  	c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps3 - Missing header,out:%v", out))
   109  
   110  	// Reset headers and try again using env var this time
   111  	headers = map[string][]string{}
   112  	cmd = exec.Command(dockerBinary, "-H="+server.URL[7:], "ps")
   113  	cmd.Env = append(env, "DOCKER_CONFIG="+cDir)
   114  	out, _, err = runCommandWithOutput(cmd)
   115  
   116  	c.Assert(err, checker.NotNil, check.Commentf("%v", out))
   117  	c.Assert(headers["Myheader"], checker.NotNil)
   118  	c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps4 - Missing header,out:%v", out))
   119  
   120  	// Reset headers and make sure flag overrides the env var
   121  	headers = map[string][]string{}
   122  	cmd = exec.Command(dockerBinary, "--config", cDir, "-H="+server.URL[7:], "ps")
   123  	cmd.Env = append(env, "DOCKER_CONFIG=MissingDir")
   124  	out, _, err = runCommandWithOutput(cmd)
   125  
   126  	c.Assert(err, checker.NotNil, check.Commentf("out:%v", out))
   127  	c.Assert(headers["Myheader"], checker.NotNil)
   128  	c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps5 - Missing header,out:%v", out))
   129  
   130  	// Reset headers and make sure flag overrides the env var.
   131  	// Almost same as previous but make sure the "MissingDir" isn't
   132  	// ignore - we don't want to default back to the env var.
   133  	headers = map[string][]string{}
   134  	cmd = exec.Command(dockerBinary, "--config", "MissingDir", "-H="+server.URL[7:], "ps")
   135  	cmd.Env = append(env, "DOCKER_CONFIG="+cDir)
   136  	out, _, err = runCommandWithOutput(cmd)
   137  
   138  	c.Assert(err, checker.NotNil, check.Commentf("out:%v", out))
   139  	c.Assert(headers["Myheader"], checker.IsNil, check.Commentf("ps6 - Headers shouldn't be the expected value,out:%v", out))
   140  }