Merge pull request #13978 from hashicorp/f-nsd-check-headers

nsd: add support for setting headers on nomad service http checks
This commit is contained in:
Seth Hoenig
2022-08-04 07:21:07 -05:00
committed by GitHub
5 changed files with 35 additions and 22 deletions

View File

@@ -162,6 +162,7 @@ func (c *checker) checkHTTP(ctx context.Context, qc *QueryContext, q *Query) *st
qr.Status = structs.CheckFailure
return qr
}
request.Header = q.Headers
request = request.WithContext(ctx)
result, err := c.httpClient.Do(request)

View File

@@ -261,6 +261,14 @@ func TestChecker_Do_HTTP_extras(t *testing.T) {
method: "HEAD",
headers: makeHeaders(agent),
},
{
name: "extra headers",
method: "GET",
headers: makeHeaders(encoding, agent,
[2]string{"X-My-Header", "hello"},
[2]string{"Authorization", "Basic ZWxhc3RpYzpjaGFuZ2VtZQ=="},
),
},
}
for _, tc := range cases {
@@ -286,19 +294,22 @@ func TestChecker_Do_HTTP_extras(t *testing.T) {
Protocol: "http",
Path: "/",
Method: tc.method,
Headers: tc.headers,
}
logger := testlog.HCLogger(t)
c := New(logger)
ctx := context.Background()
result := c.Do(ctx, qc, q)
must.Eq(t, http.StatusOK, result.StatusCode,
must.Sprintf("test.URL: %s", ts.URL),
must.Sprintf("headers: %v", tc.headers),
)
must.Eq(t, tc.method, method)
must.Eq(t, tc.body, string(body))
must.Eq(t, tc.headers, headers)
t.Run(tc.name, func(t *testing.T) {
logger := testlog.HCLogger(t)
c := New(logger)
ctx := context.Background()
result := c.Do(ctx, qc, q)
must.Eq(t, http.StatusOK, result.StatusCode,
must.Sprintf("test.URL: %s", ts.URL),
must.Sprintf("headers: %v", tc.headers),
)
must.Eq(t, tc.method, method)
must.Eq(t, tc.body, string(body))
must.Eq(t, tc.headers, headers)
})
}
}

View File

@@ -1,8 +1,10 @@
package checks
import (
"net/http"
"time"
"github.com/hashicorp/nomad/helper"
"github.com/hashicorp/nomad/nomad/structs"
)
@@ -18,9 +20,10 @@ func GetCheckQuery(c *structs.ServiceCheck) *Query {
Timeout: c.Timeout,
AddressMode: c.AddressMode,
PortLabel: c.PortLabel,
Protocol: protocol,
Path: c.Path,
Method: c.Method,
Protocol: protocol,
Headers: helper.CopyMap(c.Header),
}
}
@@ -35,9 +38,10 @@ type Query struct {
AddressMode string // host, driver, or alloc
PortLabel string // label or value
Protocol string // http checks only (http or https)
Path string // http checks only
Method string // http checks only
Protocol string // http checks only (http or https)
Path string // http checks only
Method string // http checks only
Headers http.Header // http checks only
}
// A QueryContext contains allocation and service parameters necessary for

View File

@@ -351,11 +351,6 @@ func (sc *ServiceCheck) validateNomad() error {
return fmt.Errorf("method type %q not supported in Nomad http check", sc.Method)
}
// todo(shoenig) support headers
if len(sc.Header) > 0 {
return fmt.Errorf("http checks may not set headers in Nomad services")
}
// todo(shoenig) support body
if len(sc.Body) > 0 {
return fmt.Errorf("http checks may not set Body in Nomad services")

View File

@@ -323,9 +323,11 @@ func TestServiceCheck_validateNomad(t *testing.T) {
Timeout: 1 * time.Second,
Path: "/health",
Method: "GET",
Header: map[string][]string{"foo": {"bar"}},
Header: map[string][]string{
"foo": {"bar"},
"baz": nil,
},
},
exp: `http checks may not set headers in Nomad services`,
},
{
name: "http with body",