}
func (s *HandlerSuite) TestLogoutGoogle(c *check.C) {
+ s.cluster.Services.Workbench2.ExternalURL = arvados.URL{Scheme: "https", Host: "wb2.example", Path: "/"}
s.cluster.Login.Google.Enable = true
s.cluster.Login.Google.ClientID = "test"
- req := httptest.NewRequest("GET", "https://0.0.0.0:1/logout?return_to=https://example.com/foo", nil)
+ req := httptest.NewRequest("GET", "https://0.0.0.0:1/logout?return_to=https://wb2.example/", nil)
resp := httptest.NewRecorder()
s.handler.ServeHTTP(resp, req)
if !c.Check(resp.Code, check.Equals, http.StatusFound) {
c.Log(resp.Body.String())
}
- c.Check(resp.Header().Get("Location"), check.Equals, "https://example.com/foo")
+ c.Check(resp.Header().Get("Location"), check.Equals, "https://wb2.example/")
}
func (s *HandlerSuite) TestValidateV1APIToken(c *check.C) {
+ c.Assert(s.handler.CheckHealth(), check.IsNil)
req := httptest.NewRequest("GET", "/arvados/v1/users/current", nil)
user, ok, err := s.handler.validateAPItoken(req, arvadostest.ActiveToken)
c.Assert(err, check.IsNil)
}
func (s *HandlerSuite) TestValidateV2APIToken(c *check.C) {
+ c.Assert(s.handler.CheckHealth(), check.IsNil)
req := httptest.NewRequest("GET", "/arvados/v1/users/current", nil)
user, ok, err := s.handler.validateAPItoken(req, arvadostest.ActiveTokenV2)
c.Assert(err, check.IsNil)
}
func (s *HandlerSuite) TestCreateAPIToken(c *check.C) {
+ c.Assert(s.handler.CheckHealth(), check.IsNil)
req := httptest.NewRequest("GET", "/arvados/v1/users/current", nil)
auth, err := s.handler.createAPItoken(req, arvadostest.ActiveUserUUID, nil)
c.Assert(err, check.IsNil)
coll, err := s.handler.federation.CollectionCreate(ctx, arvados.CreateOptions{Attrs: map[string]interface{}{"name": "test trash sweep"}, EnsureUniqueName: true})
c.Assert(err, check.IsNil)
defer s.handler.federation.CollectionDelete(ctx, arvados.DeleteOptions{UUID: coll.UUID})
- db, err := s.handler.db(s.ctx)
+ db, err := s.handler.dbConnector.GetDB(s.ctx)
c.Assert(err, check.IsNil)
_, err = db.ExecContext(s.ctx, `update collections set trash_at = $1, delete_at = $2 where uuid = $3`, time.Now().UTC().Add(time.Second/10), time.Now().UTC().Add(time.Hour), coll.UUID)
c.Assert(err, check.IsNil)
c.Assert(err, check.IsNil)
}
}
- db, err := s.handler.db(s.ctx)
+ db, err := s.handler.dbConnector.GetDB(s.ctx)
c.Assert(err, check.IsNil)
for _, userUUID := range []string{arvadostest.ActiveUserUUID, arvadostest.SpectatorUserUUID} {
var rows int
c.Check(rows, check.Equals, 1, check.Commentf("expect 1 row for user uuid %s", userUUID))
}
}
+
+func (s *HandlerSuite) TestLogLimiting(c *check.C) {
+ s.handler.Cluster.API.MaxConcurrentRequests = 2
+ s.handler.Cluster.API.LogCreateRequestFraction = 0.5
+
+ logreq := httptest.NewRequest("POST", "/arvados/v1/logs", strings.NewReader(`{
+ "log": {
+ "event_type": "test"
+ }
+ }`))
+ logreq.Header.Set("Authorization", "Bearer "+arvadostest.ActiveToken)
+
+ // Log create succeeds
+ for i := 0; i < 2; i++ {
+ resp := httptest.NewRecorder()
+ s.handler.ServeHTTP(resp, logreq)
+ c.Check(resp.Code, check.Equals, http.StatusOK)
+ var lg arvados.Log
+ err := json.Unmarshal(resp.Body.Bytes(), &lg)
+ c.Check(err, check.IsNil)
+ c.Check(lg.UUID, check.Matches, "zzzzz-57u5n-.*")
+ }
+
+ // Pretend there's a log create in flight
+ s.handler.limitLogCreate <- struct{}{}
+
+ // Log create should be rejected now
+ resp := httptest.NewRecorder()
+ s.handler.ServeHTTP(resp, logreq)
+ c.Check(resp.Code, check.Equals, http.StatusServiceUnavailable)
+
+ // Other requests still succeed
+ req := httptest.NewRequest("GET", "/arvados/v1/users/current", nil)
+ req.Header.Set("Authorization", "Bearer "+arvadostest.ActiveToken)
+ resp = httptest.NewRecorder()
+ s.handler.ServeHTTP(resp, req)
+ c.Check(resp.Code, check.Equals, http.StatusOK)
+ var u arvados.User
+ err := json.Unmarshal(resp.Body.Bytes(), &u)
+ c.Check(err, check.IsNil)
+ c.Check(u.UUID, check.Equals, arvadostest.ActiveUserUUID)
+
+ // log create still fails
+ resp = httptest.NewRecorder()
+ s.handler.ServeHTTP(resp, logreq)
+ c.Check(resp.Code, check.Equals, http.StatusServiceUnavailable)
+
+ // Pretend in-flight log is done
+ <-s.handler.limitLogCreate
+
+ // log create succeeds again
+ resp = httptest.NewRecorder()
+ s.handler.ServeHTTP(resp, logreq)
+ c.Check(resp.Code, check.Equals, http.StatusOK)
+
+}