"git.curoverse.com/arvados.git/sdk/go/arvados"
"git.curoverse.com/arvados.git/sdk/go/arvadostest"
+ "github.com/prometheus/client_golang/prometheus"
)
+var testCluster = &arvados.Cluster{
+ ClusterID: "zzzzz",
+}
+
// A RequestTester represents the parameters for an HTTP request to
// be issued on behalf of a unit test.
type RequestTester struct {
// - permissions on, authenticated request, unsigned locator
// - permissions on, unauthenticated request, signed locator
// - permissions on, authenticated request, expired locator
+// - permissions on, authenticated request, signed locator, transient error from backend
//
func TestGetHandler(t *testing.T) {
defer teardown()
ExpectStatusCode(t,
"Authenticated request, expired locator",
ExpiredError.HTTPCode, response)
+
+ // Authenticated request, signed locator
+ // => 503 Server busy (transient error)
+
+ // Set up the block owning volume to respond with errors
+ vols[0].(*MockVolume).Bad = true
+ vols[0].(*MockVolume).BadVolumeError = VolumeBusyError
+ response = IssueRequest(&RequestTester{
+ method: "GET",
+ uri: signedLocator,
+ apiToken: knownToken,
+ })
+ // A transient error from one volume while the other doesn't find the block
+ // should make the service return a 503 so that clients can retry.
+ ExpectStatusCode(t,
+ "Volume backend busy",
+ 503, response)
}
// Test PutBlockHandler on the following situations:
if rt.apiToken != "" {
req.Header.Set("Authorization", "OAuth2 "+rt.apiToken)
}
- loggingRouter := MakeRESTRouter()
+ loggingRouter := MakeRESTRouter(testCluster, prometheus.NewRegistry())
loggingRouter.ServeHTTP(response, req)
return response
}
if rt.apiToken != "" {
req.Header.Set("Authorization", "Bearer "+rt.apiToken)
}
- loggingRouter := MakeRESTRouter()
+ loggingRouter := MakeRESTRouter(testCluster, prometheus.NewRegistry())
loggingRouter.ServeHTTP(response, req)
return response
}
ok := make(chan struct{})
go func() {
req, _ := http.NewRequest("GET", fmt.Sprintf("/%s+%d", TestHash, len(TestBlock)), nil)
- (&LoggingRESTRouter{router: MakeRESTRouter()}).ServeHTTP(resp, req)
+ MakeRESTRouter(testCluster, prometheus.NewRegistry()).ServeHTTP(resp, req)
ok <- struct{}{}
}()
response = IssueRequest(datamanagerWrongMethodReq)
ExpectStatusCode(t,
"Only PUT method is supported for untrash",
- http.StatusBadRequest,
+ http.StatusMethodNotAllowed,
response)
// datamanagerReq => StatusOK
}
func TestHealthCheckPing(t *testing.T) {
- defer teardown()
-
- KeepVM = MakeTestVolumeManager(2)
- defer KeepVM.Close()
-
- // ping when disabled
- theConfig.ManagementToken = ""
- pingReq := &RequestTester{
- method: "GET",
- uri: "/_health/ping",
- }
- response := IssueHealthCheckRequest(pingReq)
- ExpectStatusCode(t,
- "disabled",
- http.StatusNotFound,
- response)
-
- // ping with no token
theConfig.ManagementToken = arvadostest.ManagementToken
- pingReq = &RequestTester{
- method: "GET",
- uri: "/_health/ping",
- }
- response = IssueHealthCheckRequest(pingReq)
- ExpectStatusCode(t,
- "authorization required",
- http.StatusUnauthorized,
- response)
-
- // ping with wrong token
- pingReq = &RequestTester{
- method: "GET",
- uri: "/_health/ping",
- apiToken: "youarenotwelcomehere",
- }
- response = IssueHealthCheckRequest(pingReq)
- ExpectStatusCode(t,
- "authorization error",
- http.StatusForbidden,
- response)
-
- // ping with management token
- pingReq = &RequestTester{
+ pingReq := &RequestTester{
method: "GET",
uri: "/_health/ping",
apiToken: arvadostest.ManagementToken,
}
- response = IssueHealthCheckRequest(pingReq)
+ response := IssueHealthCheckRequest(pingReq)
ExpectStatusCode(t,
"",
http.StatusOK,
response)
- if !strings.Contains(response.Body.String(), `{"health":"OK"}`) {
- t.Errorf("expected response to include %s: got %s", `{"health":"OK"}`, response.Body.String())
+ want := `{"health":"OK"}`
+ if !strings.Contains(response.Body.String(), want) {
+ t.Errorf("expected response to include %s: got %s", want, response.Body.String())
}
}