ping_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package system // import "github.com/docker/docker/integration/system"
  2. import (
  3. "net/http"
  4. "os"
  5. "path/filepath"
  6. "runtime"
  7. "strings"
  8. "testing"
  9. "github.com/docker/docker/api/types"
  10. "github.com/docker/docker/api/types/swarm"
  11. "github.com/docker/docker/testutil"
  12. "github.com/docker/docker/testutil/daemon"
  13. "github.com/docker/docker/testutil/request"
  14. "gotest.tools/v3/assert"
  15. "gotest.tools/v3/skip"
  16. )
  17. func TestPingCacheHeaders(t *testing.T) {
  18. ctx := setupTest(t)
  19. res, _, err := request.Get(ctx, "/_ping")
  20. assert.NilError(t, err)
  21. assert.Equal(t, res.StatusCode, http.StatusOK)
  22. assert.Equal(t, hdr(res, "Cache-Control"), "no-cache, no-store, must-revalidate")
  23. assert.Equal(t, hdr(res, "Pragma"), "no-cache")
  24. }
  25. func TestPingGet(t *testing.T) {
  26. ctx := setupTest(t)
  27. res, body, err := request.Get(ctx, "/_ping")
  28. assert.NilError(t, err)
  29. b, err := request.ReadBody(body)
  30. assert.NilError(t, err)
  31. assert.Equal(t, string(b), "OK")
  32. assert.Equal(t, res.StatusCode, http.StatusOK)
  33. assert.Check(t, hdr(res, "API-Version") != "")
  34. }
  35. func TestPingHead(t *testing.T) {
  36. ctx := setupTest(t)
  37. res, body, err := request.Head(ctx, "/_ping")
  38. assert.NilError(t, err)
  39. b, err := request.ReadBody(body)
  40. assert.NilError(t, err)
  41. assert.Equal(t, 0, len(b))
  42. assert.Equal(t, res.StatusCode, http.StatusOK)
  43. assert.Check(t, hdr(res, "API-Version") != "")
  44. }
  45. func TestPingSwarmHeader(t *testing.T) {
  46. skip.If(t, testEnv.IsRemoteDaemon)
  47. skip.If(t, testEnv.DaemonInfo.OSType == "windows")
  48. ctx := setupTest(t)
  49. d := daemon.New(t)
  50. d.Start(t)
  51. defer d.Stop(t)
  52. client := d.NewClientT(t)
  53. defer client.Close()
  54. t.Run("before swarm init", func(t *testing.T) {
  55. ctx := testutil.StartSpan(ctx, t)
  56. p, err := client.Ping(ctx)
  57. assert.NilError(t, err)
  58. assert.Equal(t, p.SwarmStatus.NodeState, swarm.LocalNodeStateInactive)
  59. assert.Equal(t, p.SwarmStatus.ControlAvailable, false)
  60. })
  61. _, err := client.SwarmInit(ctx, swarm.InitRequest{ListenAddr: "127.0.0.1", AdvertiseAddr: "127.0.0.1:2377"})
  62. assert.NilError(t, err)
  63. t.Run("after swarm init", func(t *testing.T) {
  64. ctx := testutil.StartSpan(ctx, t)
  65. p, err := client.Ping(ctx)
  66. assert.NilError(t, err)
  67. assert.Equal(t, p.SwarmStatus.NodeState, swarm.LocalNodeStateActive)
  68. assert.Equal(t, p.SwarmStatus.ControlAvailable, true)
  69. })
  70. err = client.SwarmLeave(ctx, true)
  71. assert.NilError(t, err)
  72. t.Run("after swarm leave", func(t *testing.T) {
  73. ctx := testutil.StartSpan(ctx, t)
  74. p, err := client.Ping(ctx)
  75. assert.NilError(t, err)
  76. assert.Equal(t, p.SwarmStatus.NodeState, swarm.LocalNodeStateInactive)
  77. assert.Equal(t, p.SwarmStatus.ControlAvailable, false)
  78. })
  79. }
  80. func TestPingBuilderHeader(t *testing.T) {
  81. skip.If(t, testEnv.IsRemoteDaemon)
  82. skip.If(t, testEnv.DaemonInfo.OSType == "windows", "cannot spin up additional daemons on windows")
  83. ctx := setupTest(t)
  84. d := daemon.New(t)
  85. client := d.NewClientT(t)
  86. defer client.Close()
  87. t.Run("default config", func(t *testing.T) {
  88. testutil.StartSpan(ctx, t)
  89. d.Start(t)
  90. defer d.Stop(t)
  91. expected := types.BuilderBuildKit
  92. if runtime.GOOS == "windows" {
  93. expected = types.BuilderV1
  94. }
  95. p, err := client.Ping(ctx)
  96. assert.NilError(t, err)
  97. assert.Equal(t, p.BuilderVersion, expected)
  98. })
  99. t.Run("buildkit disabled", func(t *testing.T) {
  100. testutil.StartSpan(ctx, t)
  101. cfg := filepath.Join(d.RootDir(), "daemon.json")
  102. err := os.WriteFile(cfg, []byte(`{"features": { "buildkit": false }}`), 0o644)
  103. assert.NilError(t, err)
  104. d.Start(t, "--config-file", cfg)
  105. defer d.Stop(t)
  106. expected := types.BuilderV1
  107. p, err := client.Ping(ctx)
  108. assert.NilError(t, err)
  109. assert.Equal(t, p.BuilderVersion, expected)
  110. })
  111. }
  112. func hdr(res *http.Response, name string) string {
  113. val, ok := res.Header[http.CanonicalHeaderKey(name)]
  114. if !ok || len(val) == 0 {
  115. return ""
  116. }
  117. return strings.Join(val, ", ")
  118. }