docker_cli_config_test.go 4.8 KB

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