diff --git a/authorizer/src/asapo_authorizer/server/folder_token.go b/authorizer/src/asapo_authorizer/server/folder_token.go index f29a5b318b87042c040ddbe950927ca778b20a1c..0e81cebc4c44bc05d8e3b8fb08d24af552a895cb 100644 --- a/authorizer/src/asapo_authorizer/server/folder_token.go +++ b/authorizer/src/asapo_authorizer/server/folder_token.go @@ -3,6 +3,7 @@ package server import ( "asapo_common/structs" "asapo_common/utils" + "asapo_common/version" "net/http" "time" log "asapo_common/logger" @@ -11,20 +12,20 @@ import ( ) type folderTokenRequest struct { - Folder string + Folder string BeamtimeId string Token string } type folderToken struct { - Token string + Token string } /*func routeFolderToken(w http.ResponseWriter, r *http.Request) { utils.ProcessJWTAuth(processFolderTokenRequest,settings.secret)(w,r) }*/ -func prepareJWTToken(request folderTokenRequest) (string,error) { +func prepareJWTToken(request folderTokenRequest) (string, error) { var claims utils.CustomClaims var extraClaim structs.FolderTokenTokenExtraClaim @@ -35,40 +36,39 @@ func prepareJWTToken(request folderTokenRequest) (string,error) { } -func folderTokenResponce(token string) []byte{ +func folderTokenResponce(token string) []byte { return []byte(token) } func checkBeamtimeToken(request folderTokenRequest) error { - _,err := checkToken(request.Token,utils.SubjectFromBeamtime(request.BeamtimeId)) + _, err := checkToken(request.Token, utils.SubjectFromBeamtime(request.BeamtimeId)) return err } - -func extractFolderTokenrequest(r *http.Request) (folderTokenRequest,error) { +func extractFolderTokenrequest(r *http.Request) (folderTokenRequest, error) { var request folderTokenRequest - err := utils.ExtractRequest(r,&request) + err := utils.ExtractRequest(r, &request) if err != nil { - return folderTokenRequest{},err + return folderTokenRequest{}, err } - if len(request.Folder)==0 ||len(request.BeamtimeId)==0 || len(request.Token) == 0 { - return folderTokenRequest{},errors.New("some request fields are empty") + if len(request.Folder) == 0 || len(request.BeamtimeId) == 0 || len(request.Token) == 0 { + return folderTokenRequest{}, errors.New("some request fields are empty") } - return request,nil + return request, nil } func checkBeamtimeFolder(request folderTokenRequest) error { - beamtimeMeta, err := findMeta(SourceCredentials{request.BeamtimeId,"auto","","",""}) + beamtimeMeta, err := findMeta(SourceCredentials{request.BeamtimeId, "auto", "", "", ""}) if err != nil { - log.Error("cannot get beamtime meta"+err.Error()) + log.Error("cannot get beamtime meta" + err.Error()) return err } folder := filepath.Clean(request.Folder) - if (folder != filepath.Clean(beamtimeMeta.OnlinePath) && folder != filepath.Clean(beamtimeMeta.OfflinePath)) { - err_string := folder + " does not match beamtime folders "+beamtimeMeta.OnlinePath+" or " +beamtimeMeta.OfflinePath + if folder != filepath.Clean(beamtimeMeta.OnlinePath) && folder != filepath.Clean(beamtimeMeta.OfflinePath) { + err_string := folder + " does not match beamtime folders " + beamtimeMeta.OnlinePath + " or " + beamtimeMeta.OfflinePath log.Error(err_string) return errors.New(err_string) } @@ -76,28 +76,37 @@ func checkBeamtimeFolder(request folderTokenRequest) error { return nil } +func checkAuthorizerApiVersion(w http.ResponseWriter, r *http.Request) bool { + _, ok := utils.PrecheckApiVersion(w, r, version.GetConsumerProtocolVersion()) + return ok +} + func routeFolderToken(w http.ResponseWriter, r *http.Request) { + if ok := checkAuthorizerApiVersion(w, r); !ok { + return + } + request, err := extractFolderTokenrequest(r) if err != nil { - utils.WriteServerError(w,err,http.StatusBadRequest) + utils.WriteServerError(w, err, http.StatusBadRequest) return } err = checkBeamtimeToken(request) if err != nil { - utils.WriteServerError(w,err,http.StatusUnauthorized) + utils.WriteServerError(w, err, http.StatusUnauthorized) return } err = checkBeamtimeFolder(request) if err != nil { - utils.WriteServerError(w,err,http.StatusUnauthorized) + utils.WriteServerError(w, err, http.StatusUnauthorized) return } token, err := prepareJWTToken(request) if err != nil { - utils.WriteServerError(w,err,http.StatusInternalServerError) + utils.WriteServerError(w, err, http.StatusInternalServerError) return } diff --git a/authorizer/src/asapo_authorizer/server/folder_token_test.go b/authorizer/src/asapo_authorizer/server/folder_token_test.go index 5b89f3b39ccf62e353b7feb622e214ad9d3de04c..ee9ab2f5088474e753e811c6440196bfa6f2d0ba 100644 --- a/authorizer/src/asapo_authorizer/server/folder_token_test.go +++ b/authorizer/src/asapo_authorizer/server/folder_token_test.go @@ -50,7 +50,7 @@ func TestFolderToken(t *testing.T) { if test.status == http.StatusBadRequest { request =makeRequest(authorizationRequest{}) } - w := doPostRequest("/folder",request,"") + w := doPostRequest("/v0.1/folder",request,"") if w.Code == http.StatusOK { body, _ := ioutil.ReadAll(w.Body) claims,_ := utils.CheckJWTToken(string(body),"secret_folder") @@ -66,3 +66,11 @@ func TestFolderToken(t *testing.T) { } } +func TestFolderTokenWrongProtocol(t *testing.T) { + request := makeRequest(folderTokenRequest{"abs_path","beamtime_id","token"}) + w := doPostRequest("/v0.2/folder",request,"") + assert.Equal(t, http.StatusUnsupportedMediaType, w.Code, "wrong protocol") +} + + + diff --git a/authorizer/src/asapo_authorizer/server/listroutes.go b/authorizer/src/asapo_authorizer/server/listroutes.go index 370dd9dfa5b9cc40fd8f9db92ca4cd4449e06d21..09b695091ffc4ecf686715a5b7a4f10434280cbb 100644 --- a/authorizer/src/asapo_authorizer/server/listroutes.go +++ b/authorizer/src/asapo_authorizer/server/listroutes.go @@ -26,7 +26,7 @@ var listRoutes = utils.Routes{ utils.Route{ "Folder Token", "POST", - "/folder", + "/{apiver}/folder", routeFolderToken, }, utils.Route{ diff --git a/broker/src/asapo_broker/server/get_commands_test.go b/broker/src/asapo_broker/server/get_commands_test.go index 0fc547da341cf9fdc04312a0480c6f05046929f2..c472ddb4c3948004c412ea6267da70a582a72084 100644 --- a/broker/src/asapo_broker/server/get_commands_test.go +++ b/broker/src/asapo_broker/server/get_commands_test.go @@ -58,7 +58,7 @@ func (suite *GetCommandsTestSuite) TestGetCommandsCallsCorrectRoutine() { for _, test := range testsGetCommand { suite.mock_db.On("ProcessRequest", database.Request{DbName: expectedDBName, DbCollectionName: test.stream, GroupId: test.groupid, Op: test.command, ExtraParam: test.externalParam}).Return([]byte("Hello"), nil) logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request "+test.command))) - w := doRequest("/database/" + expectedBeamtimeId + "/" + expectedSource + "/" + test.reqString+correctTokenSuffix+test.queryParams) + w := doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + test.reqString+correctTokenSuffix+test.queryParams) suite.Equal(http.StatusOK, w.Code, test.command+ " OK") suite.Equal("Hello", string(w.Body.Bytes()), test.command+" sends data") } diff --git a/broker/src/asapo_broker/server/get_health.go b/broker/src/asapo_broker/server/get_health.go index ce5f45ee531005cb5817410052b89b3449761028..c4ff315d16533e967019c3e4bbf60cc8404e775d 100644 --- a/broker/src/asapo_broker/server/get_health.go +++ b/broker/src/asapo_broker/server/get_health.go @@ -9,6 +9,5 @@ func routeGetHealth(w http.ResponseWriter, r *http.Request) { if err != nil { ReconnectDb() } - r.Header.Set("Content-type", "application/json") w.WriteHeader(http.StatusNoContent) } diff --git a/broker/src/asapo_broker/server/get_health_test.go b/broker/src/asapo_broker/server/get_health_test.go index a318c8d953d8ce3abc179f7fbdc20076a17b3785..67ade394949cf19882fa0fb0b1cf8ea5a3132ef3 100644 --- a/broker/src/asapo_broker/server/get_health_test.go +++ b/broker/src/asapo_broker/server/get_health_test.go @@ -34,7 +34,7 @@ func TestGetHealthTestSuite(t *testing.T) { func (suite *GetHealthTestSuite) TestGetHealthOk() { suite.mock_db.On("Ping").Return(nil) - w := doRequest("/health") + w := doRequest("/health","GET","","") suite.Equal(http.StatusNoContent, w.Code) } @@ -44,6 +44,6 @@ func (suite *GetHealthTestSuite) TestGetHealthTriesToReconnectsToDataBase() { ExpectReconnect(suite.mock_db) - w := doRequest("/health") + w := doRequest("/health","GET","","") suite.Equal(http.StatusNoContent, w.Code) } diff --git a/broker/src/asapo_broker/server/get_meta_test.go b/broker/src/asapo_broker/server/get_meta_test.go index 4eb0e16547b60e7abb07a60f8667d7aadf9ef1bd..550efb653178533801ed305926cedd2ae1609cbf 100644 --- a/broker/src/asapo_broker/server/get_meta_test.go +++ b/broker/src/asapo_broker/server/get_meta_test.go @@ -35,7 +35,7 @@ func TestGetMetaTestSuite(t *testing.T) { func (suite *GetMetaTestSuite) TestGetMetaOK() { suite.mock_db.On("ProcessRequest", database.Request{DbName: expectedDBName, DbCollectionName: expectedStream, Op: "meta", ExtraParam: "1"}).Return([]byte(""), nil) logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request meta"))) - w := doRequest("/database/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/0/meta" + "/1" + correctTokenSuffix,"GET") + w := doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/0/meta" + "/1" + correctTokenSuffix,"GET") suite.Equal(http.StatusOK, w.Code, "meta OK") } diff --git a/broker/src/asapo_broker/server/listroutes.go b/broker/src/asapo_broker/server/listroutes.go index 8d782f58ec83f4351f898c71d7979be495cdc695..b2d87ccf2d9a1d2f1bad08ba88c567658676c6ef 100644 --- a/broker/src/asapo_broker/server/listroutes.go +++ b/broker/src/asapo_broker/server/listroutes.go @@ -8,73 +8,73 @@ var listRoutes = utils.Routes{ utils.Route{ "GetNext", "Get", - "/database/{dbname}/{datasource}/{stream}/{groupid}/next", + "/{apiver}/beamtime/{beamtime}/{datasource}/{stream}/{groupid}/next", routeGetNext, }, utils.Route{ "GetSize", "Get", - "/database/{dbname}/{datasource}/{stream}/size", + "/{apiver}/beamtime/{beamtime}/{datasource}/{stream}/size", routeGetSize, }, utils.Route{ "GetStreams", "Get", - "/database/{dbname}/{datasource}/{stream}/streams", + "/{apiver}/beamtime/{beamtime}/{datasource}/{stream}/streams", routeGetStreams, }, utils.Route{ "GetLast", "Get", - "/database/{dbname}/{datasource}/{stream}/0/last", + "/{apiver}/beamtime/{beamtime}/{datasource}/{stream}/0/last", routeGetLast, }, utils.Route{ "GetLastAck", "Get", - "/database/{dbname}/{datasource}/{stream}/{groupid}/lastack", + "/{apiver}/beamtime/{beamtime}/{datasource}/{stream}/{groupid}/lastack", routeGetLastAck, }, utils.Route{ "GetNacks", "Get", - "/database/{dbname}/{datasource}/{stream}/{groupid}/nacks", + "/{apiver}/beamtime/{beamtime}/{datasource}/{stream}/{groupid}/nacks", routeGetNacks, }, utils.Route{ "GetID", "Get", - "/database/{dbname}/{datasource}/{stream}/0/{id}", + "/{apiver}/beamtime/{beamtime}/{datasource}/{stream}/0/{id}", routeGetByID, }, utils.Route{ "GetMeta", "Get", - "/database/{dbname}/{datasource}/{stream}/0/meta/{id}", + "/{apiver}/beamtime/{beamtime}/{datasource}/{stream}/0/meta/{id}", routeGetMeta, }, utils.Route{ "CreateGroup", "Post", - "/creategroup", + "/{apiver}/creategroup", routeCreateGroupID, }, utils.Route{ "QueryMessages", "Post", - "/database/{dbname}/{datasource}/{stream}/0/querymessages", + "/{apiver}/beamtime/{beamtime}/{datasource}/{stream}/0/querymessages", routeQueryMessages, }, utils.Route{ "ResetConter", "Post", - "/database/{dbname}/{datasource}/{stream}/{groupid}/resetcounter", + "/{apiver}/beamtime/{beamtime}/{datasource}/{stream}/{groupid}/resetcounter", routeResetCounter, }, utils.Route{ "MessageOp", "Post", - "/database/{dbname}/{datasource}/{stream}/{groupid}/{id}", + "/{apiver}/beamtime/{beamtime}/{datasource}/{stream}/{groupid}/{id}", routeMessageOp, }, utils.Route{ diff --git a/broker/src/asapo_broker/server/post_create_group.go b/broker/src/asapo_broker/server/post_create_group.go index b9cfb51f7d10ef99083ffa9a28ec937efff816da..7166fb246b8f8f12694601dd07c1d7558b9899e6 100644 --- a/broker/src/asapo_broker/server/post_create_group.go +++ b/broker/src/asapo_broker/server/post_create_group.go @@ -7,6 +7,11 @@ import ( ) func routeCreateGroupID(w http.ResponseWriter, r *http.Request) { + if ok := checkAuthorizerApiVersion(w, r); !ok { + return + } + + guid := xid.New() w.Write([]byte(guid.String())) logger.Debug("generated new group: " + guid.String()) diff --git a/broker/src/asapo_broker/server/post_create_group_test.go b/broker/src/asapo_broker/server/post_create_group_test.go index 5f19da351eedf60bc8992a3b7827982d659be194..46f6fb09edd9241e5f54aad5dc7e89192db03152 100644 --- a/broker/src/asapo_broker/server/post_create_group_test.go +++ b/broker/src/asapo_broker/server/post_create_group_test.go @@ -32,3 +32,8 @@ func TestGetNewGroup(t *testing.T) { logger.UnsetMockLog() } + +func TestGetNewGroupWrongProtocol(t *testing.T) { + w := doRequest("/creategroup", "POST","","/v0.2") + assert.Equal(t, http.StatusUnsupportedMediaType, w.Code, "wrong request") +} diff --git a/broker/src/asapo_broker/server/post_op_image_test.go b/broker/src/asapo_broker/server/post_op_image_test.go index 259787e41bc9fc41140daf8bdfb844c55f3939d2..fc1a2d4e72499983f88da4eab17786ffd95f6871 100644 --- a/broker/src/asapo_broker/server/post_op_image_test.go +++ b/broker/src/asapo_broker/server/post_op_image_test.go @@ -36,19 +36,19 @@ func (suite *MessageOpTestSuite) TestAckMessageOpOK() { query_str := "{\"Id\":1,\"Op\":\"ackmessage\"}" suite.mock_db.On("ProcessRequest", database.Request{DbName: expectedDBName, DbCollectionName: expectedStream, GroupId: expectedGroupID, Op: "ackmessage", ExtraParam: query_str}).Return([]byte(""), nil) logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request ackmessage"))) - w := doRequest("/database/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/1" + correctTokenSuffix,"POST",query_str) + w := doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/1" + correctTokenSuffix,"POST",query_str) suite.Equal(http.StatusOK, w.Code, "ackmessage OK") } func (suite *MessageOpTestSuite) TestAckMessageOpErrorWrongOp() { query_str := "\"Id\":1,\"Op\":\"ackmessage\"}" - w := doRequest("/database/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/1" + correctTokenSuffix,"POST",query_str) + w := doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/1" + correctTokenSuffix,"POST",query_str) suite.Equal(http.StatusBadRequest, w.Code, "ackmessage wrong") } func (suite *MessageOpTestSuite) TestAckMessageOpErrorWrongID() { query_str := "{\"Id\":1,\"Op\":\"ackmessage\"}" - w := doRequest("/database/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/bla" + correctTokenSuffix,"POST",query_str) + w := doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/bla" + correctTokenSuffix,"POST",query_str) suite.Equal(http.StatusBadRequest, w.Code, "ackmessage wrong") } diff --git a/broker/src/asapo_broker/server/post_query_images_test.go b/broker/src/asapo_broker/server/post_query_images_test.go index 0f2b55c1477c4f27747b3b6ce9effccd9c213a2a..16aca9242eebd867c58f90e5860f3bd9c665cca1 100644 --- a/broker/src/asapo_broker/server/post_query_images_test.go +++ b/broker/src/asapo_broker/server/post_query_images_test.go @@ -38,7 +38,7 @@ func (suite *QueryTestSuite) TestQueryOK() { suite.mock_db.On("ProcessRequest", database.Request{DbName: expectedDBName, DbCollectionName: expectedStream,Op: "querymessages", ExtraParam: query_str}).Return([]byte("{}"), nil) logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request querymessages"))) - w := doRequest("/database/"+expectedBeamtimeId+"/"+expectedSource+"/"+expectedStream+"/0/querymessages"+correctTokenSuffix, "POST", query_str) + w := doRequest("/beamtime/"+expectedBeamtimeId+"/"+expectedSource+"/"+expectedStream+"/0/querymessages"+correctTokenSuffix, "POST", query_str) suite.Equal(http.StatusOK, w.Code, "Query OK") } diff --git a/broker/src/asapo_broker/server/post_reset_counter_test.go b/broker/src/asapo_broker/server/post_reset_counter_test.go index 37f70e2725294ac6aee3ae440000cb24374b16a4..10fb4e1b0a360707df952060f633cb99041d1cfc 100644 --- a/broker/src/asapo_broker/server/post_reset_counter_test.go +++ b/broker/src/asapo_broker/server/post_reset_counter_test.go @@ -38,6 +38,6 @@ func (suite *ResetCounterTestSuite) TestResetCounterOK() { logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request resetcounter"))) - w := doRequest("/database/"+expectedBeamtimeId+"/"+expectedSource+"/"+expectedStream+"/"+expectedGroupID+"/resetcounter"+correctTokenSuffix+"&value=10", "POST") + w := doRequest("/beamtime/"+expectedBeamtimeId+"/"+expectedSource+"/"+expectedStream+"/"+expectedGroupID+"/resetcounter"+correctTokenSuffix+"&value=10", "POST") suite.Equal(http.StatusOK, w.Code, "ResetCounter OK") } diff --git a/broker/src/asapo_broker/server/process_request.go b/broker/src/asapo_broker/server/process_request.go index b5b8e7dd602486fc14292c383b77ec52c15fd609..ac2a32f40bc2945725e6528373854d12ee0ce498 100644 --- a/broker/src/asapo_broker/server/process_request.go +++ b/broker/src/asapo_broker/server/process_request.go @@ -5,13 +5,14 @@ import ( "asapo_common/logger" log "asapo_common/logger" "asapo_common/utils" + "asapo_common/version" "github.com/gorilla/mux" "net/http" ) func extractRequestParameters(r *http.Request, needGroupID bool) (string, string, string, string, bool) { vars := mux.Vars(r) - db_name, ok1 := vars["dbname"] + db_name, ok1 := vars["beamtime"] datasource, ok3 := vars["datasource"] stream, ok4 := vars["stream"] @@ -49,8 +50,17 @@ func checkGroupID(w http.ResponseWriter, needGroupID bool, group_id string, db_n return false } +func checkAuthorizerApiVersion(w http.ResponseWriter, r *http.Request) bool { + _, ok := utils.PrecheckApiVersion(w, r, version.GetConsumerProtocolVersion()) + return ok +} + func processRequest(w http.ResponseWriter, r *http.Request, op string, extra_param string, needGroupID bool) { - r.Header.Set("Content-type", "application/json") + if ok := checkAuthorizerApiVersion(w, r); !ok { + return + } + + w.Header().Set("Access-Control-Allow-Origin", "*") db_name, datasource, stream, group_id, ok := extractRequestParameters(r, needGroupID) if !ok { diff --git a/broker/src/asapo_broker/server/process_request_test.go b/broker/src/asapo_broker/server/process_request_test.go index f84907035beb7627df65ef55556eec9863ea96cb..5ce3aa70bb26c91c332a0733d11d17c5b64fc1dd 100644 --- a/broker/src/asapo_broker/server/process_request_test.go +++ b/broker/src/asapo_broker/server/process_request_test.go @@ -78,16 +78,20 @@ func doRequest(path string, extra_params ...string) *httptest.ResponseRecorder { if len(extra_params) > 1 { body = strings.NewReader(extra_params[1]) } + ver := "/v0.1" + if len(extra_params) > 2 { + ver = extra_params[2] + } mux := utils.NewRouter(listRoutes) - req, _ := http.NewRequest(m, path, body) + req, _ := http.NewRequest(m, ver+path, body) w := httptest.NewRecorder() mux.ServeHTTP(w, req) return w } func TestProcessRequestWithoutDatabaseName(t *testing.T) { - w := doRequest("/database/next") + w := doRequest("/beamtime/next") assert.Equal(t, http.StatusNotFound, w.Code, "no database name") } @@ -124,7 +128,7 @@ func TestProcessRequestTestSuite(t *testing.T) { func (suite *ProcessRequestTestSuite) TestProcessRequestWithWrongToken() { logger.MockLog.On("Error", mock.MatchedBy(containsMatcher("wrong JWT token"))) - w := doRequest("/database/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + suffixWithWrongToken) + w := doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + suffixWithWrongToken) suite.Equal(http.StatusUnauthorized, w.Code, "wrong token") } @@ -132,7 +136,7 @@ func (suite *ProcessRequestTestSuite) TestProcessRequestWithWrongToken() { func (suite *ProcessRequestTestSuite) TestProcessRequestWithNoToken() { logger.MockLog.On("Error", mock.MatchedBy(containsMatcher("cannot extract"))) - w := doRequest("/database/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + wrongTokenSuffix) + w := doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + wrongTokenSuffix) suite.Equal(http.StatusUnauthorized, w.Code, "no token") } @@ -146,7 +150,7 @@ func (suite *ProcessRequestTestSuite) TestProcessRequestWithWrongDatabaseName() logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request next"))) - w := doRequest("/database/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + correctTokenSuffix) + w := doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + correctTokenSuffix) suite.Equal(http.StatusConflict, w.Code, "wrong database name") } @@ -162,7 +166,7 @@ func (suite *ProcessRequestTestSuite) TestProcessRequestWithConnectionError() { ExpectReconnect(suite.mock_db) logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("reconnected"))) - w := doRequest("/database/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + correctTokenSuffix) + w := doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + correctTokenSuffix) time.Sleep(time.Second) suite.Equal(http.StatusNotFound, w.Code, "data not found") } @@ -177,7 +181,7 @@ func (suite *ProcessRequestTestSuite) TestProcessRequestWithInternalDBError() { logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("reconnected"))) ExpectReconnect(suite.mock_db) - w := doRequest("/database/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + correctTokenSuffix) + w := doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + correctTokenSuffix) time.Sleep(time.Second) suite.Equal(http.StatusNotFound, w.Code, "internal error") @@ -191,13 +195,13 @@ func (suite *ProcessRequestTestSuite) TestProcessRequestAddsCounter() { logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request next in "+expectedDBName))) - doRequest("/database/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + correctTokenSuffix) + doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + correctTokenSuffix) suite.Equal(1, statistics.GetCounter(), "ProcessRequest increases counter") } func (suite *ProcessRequestTestSuite) TestProcessRequestWrongGroupID() { logger.MockLog.On("Error", mock.MatchedBy(containsMatcher("wrong groupid"))) - w := doRequest("/database/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + wrongGroupID + "/next" + correctTokenSuffix) + w := doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + wrongGroupID + "/next" + correctTokenSuffix) suite.Equal(http.StatusBadRequest, w.Code, "wrong group id") } @@ -208,5 +212,11 @@ func (suite *ProcessRequestTestSuite) TestProcessRequestAddsDataset() { logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request next in "+expectedDBName))) - doRequest("/database/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + correctTokenSuffix + "&dataset=true") + doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + correctTokenSuffix + "&dataset=true") +} + + +func (suite *ProcessRequestTestSuite) TestProcessRequestErrorOnWrongProtocol() { + w := doRequest("/beamtime/" + expectedBeamtimeId + "/" + expectedSource + "/" + expectedStream + "/" + expectedGroupID + "/next" + correctTokenSuffix,"GET","","/v0.2") + suite.Equal(http.StatusUnsupportedMediaType, w.Code, "wrong protocol") } diff --git a/common/cpp/include/asapo/common/version.h.in b/common/cpp/include/asapo/common/version.h.in index 6747f8eb5fbb180d958d7f9eb55b3c94bc0cc652..3bc786b15c5c89f38faa9df03f912e4e39f12ad6 100644 --- a/common/cpp/include/asapo/common/version.h.in +++ b/common/cpp/include/asapo/common/version.h.in @@ -2,7 +2,7 @@ #define ASAPO_VERSION_H #include <iostream> -#include <string> +#include "string.h" #include "data_structs.h" diff --git a/common/go/src/asapo_common/utils/http.go b/common/go/src/asapo_common/utils/http.go index 4e6f9736e6ff015ba66a5b56a6b32b9e3a1e4982..4a6ce7daef8084c202bebc439676e4fee071665b 100644 --- a/common/go/src/asapo_common/utils/http.go +++ b/common/go/src/asapo_common/utils/http.go @@ -10,7 +10,8 @@ func ExtractRequest(r *http.Request, request interface{}) error { return decoder.Decode(request) } -func WriteServerError(w http.ResponseWriter, err error,code int) { +func WriteServerError(w http.ResponseWriter, err error, code int) { w.WriteHeader(code) w.Write([]byte(err.Error())) -} \ No newline at end of file +} + diff --git a/common/go/src/asapo_common/utils/version.go b/common/go/src/asapo_common/utils/version.go new file mode 100644 index 0000000000000000000000000000000000000000..5e8e03a9dff6ade41f5df8bf421d03bc2ff91987 --- /dev/null +++ b/common/go/src/asapo_common/utils/version.go @@ -0,0 +1,46 @@ +package utils + +import ( + "errors" + "github.com/gorilla/mux" + "net/http" + "strconv" + "strings" +) + + +func VersionToNumber(ver string) int { + ver = strings.TrimPrefix(ver,"v") + floatNum, err := strconv.ParseFloat(ver, 64) + if err!=nil { + return 0 + } + return int(floatNum*1000) +} + + +func ExtractVersion(r *http.Request) (int, error) { + vars := mux.Vars(r) + ver_str, ok := vars["apiver"] + if !ok { + return 0, errors.New("cannot extract version") + } + ver := VersionToNumber(ver_str) + if ver == 0 { + return 0, errors.New("cannot extract version") + } + return ver, nil +} + +func PrecheckApiVersion(w http.ResponseWriter, r *http.Request, currentVersion string) (apiVer int, ok bool) { + apiVer, err := ExtractVersion(r) + if err != nil { + WriteServerError(w, err, http.StatusBadRequest) + return 0, false + } + if apiVer > VersionToNumber(currentVersion) { + WriteServerError(w, errors.New("version not supported"), http.StatusUnsupportedMediaType) + return 0, false + } + return apiVer, true +} diff --git a/common/go/src/asapo_common/version/version.go b/common/go/src/asapo_common/version/version.go index d4674f37bddf4e84eaaec6cde2686ed6e68f306a..8ac8945f1c9b313fe7dfb84405fac6e43386430c 100644 --- a/common/go/src/asapo_common/version/version.go +++ b/common/go/src/asapo_common/version/version.go @@ -7,6 +7,17 @@ import ( ) var version string +var consumerProtocolVersion string +var producerProtocolVersion string + +func GetProducerProtocolVersion() string { + return producerProtocolVersion +} + +func GetConsumerProtocolVersion() string { + return consumerProtocolVersion +} + func GetVersion() string { return version diff --git a/common/go/src/asapo_common/version/version_lib.go.in b/common/go/src/asapo_common/version/version_lib.go.in index 5fc343fe161f109a008ddad671ee7ba3eabd14d1..edba595a1410f28e07a83ca42aaddab2b14abc5e 100644 --- a/common/go/src/asapo_common/version/version_lib.go.in +++ b/common/go/src/asapo_common/version/version_lib.go.in @@ -4,4 +4,6 @@ package version // This file is overridden on build with build-time informations. func init(){ version = "@ASAPO_VERSION@@ASAPO_VERSION_COMMIT@" + consumerProtocolVersion = "@ASAPO_CONSUMER_PROTOCOL@" + producerProtocolVersion = "@ASAPO_PRODUCER_PROTOCOL@" } diff --git a/config/nomad/discovery.nmd.in b/config/nomad/discovery.nmd.in index 760aed3c700405ec289b47de69c0dd37c4ba4730..e3c36befc01f51fcbd7478342fe6fb6006d7b916 100644 --- a/config/nomad/discovery.nmd.in +++ b/config/nomad/discovery.nmd.in @@ -30,7 +30,7 @@ job "discovery" { check { name = "alive" type = "http" - path = "/asapo-receiver" + path = "/health" interval = "10s" timeout = "2s" initial_status = "passing" diff --git a/consumer/api/cpp/src/consumer_impl.cpp b/consumer/api/cpp/src/consumer_impl.cpp index 67cba089b5a88fc3aab370615f59b0eda9cca01f..90ae245487920b853b6d65534d81a9d10a59d729 100644 --- a/consumer/api/cpp/src/consumer_impl.cpp +++ b/consumer/api/cpp/src/consumer_impl.cpp @@ -12,6 +12,8 @@ #include "fabric_consumer_client.h" #include "rds_response_error.h" +#include "asapo/common/version.h" + using std::chrono::system_clock; namespace asapo { @@ -183,15 +185,14 @@ RequestInfo ConsumerImpl::GetDiscoveryRequest(const std::string &service_name) c RequestInfo ri; ri.host = endpoint_; ri.api = "/asapo-discovery/v0.1/" + service_name; - ri.extra_params="&protocol=" + kConsumerProtocol.GetVersion(); + ri.extra_params = "&protocol=" + kConsumerProtocol.GetVersion(); return ri; } - Error ConsumerImpl::ProcessDiscoverServiceResult(Error err, std::string* uri_to_set) { if (err != nullptr || uri_to_set->empty()) { uri_to_set->clear(); - if (err==ConsumerErrorTemplates::kUnsupportedClient) { + if (err == ConsumerErrorTemplates::kUnsupportedClient) { return err; } return ConsumerErrorTemplates::kUnavailableService.Generate(" on " + endpoint_ @@ -209,7 +210,7 @@ Error ConsumerImpl::DiscoverService(const std::string &service_name, std::string RequestOutput output; auto err = ProcessRequest(&output, ri, nullptr); *uri_to_set = std::move(output.string_output); - return ProcessDiscoverServiceResult(std::move(err),uri_to_set); + return ProcessDiscoverServiceResult(std::move(err), uri_to_set); } bool ConsumerImpl::SwitchToGetByIdIfPartialData(Error* err, @@ -268,7 +269,8 @@ Error ConsumerImpl::GetRecordFromServer(std::string* response, std::string group interrupt_flag_ = false; std::string request_suffix = OpToUriCmd(op); std::string request_group = OpToUriCmd(op); - std::string request_api = "/database/" + source_credentials_.beamtime_id + "/" + source_credentials_.data_source + std::string request_api = "/" + kConsumerProtocol.GetVersion() + "/beamtime/" + source_credentials_.beamtime_id + "/" + + source_credentials_.data_source + "/" + std::move(stream); uint64_t elapsed_ms = 0; Error no_data_error; @@ -454,7 +456,7 @@ Error ConsumerImpl::TryGetDataFromBuffer(const MessageMeta* info, MessageData* d std::string ConsumerImpl::GenerateNewGroupId(Error* err) { RequestInfo ri; - ri.api = "/creategroup"; + ri.api = "/" + kConsumerProtocol.GetVersion() + "/creategroup"; ri.post = true; return BrokerRequestWithTimeout(ri, err); } @@ -535,7 +537,8 @@ Error ConsumerImpl::ResetLastReadMarker(std::string group_id, std::string stream Error ConsumerImpl::SetLastReadMarker(std::string group_id, uint64_t value, std::string stream) { RequestInfo ri; - ri.api = "/database/" + source_credentials_.beamtime_id + "/" + source_credentials_.data_source + "/" + ri.api = "/" + kConsumerProtocol.GetVersion() + "/beamtime/" + source_credentials_.beamtime_id + "/" + + source_credentials_.data_source + "/" + std::move(stream) + "/" + std::move(group_id) + "/resetcounter"; ri.extra_params = "&value=" + std::to_string(value); ri.post = true; @@ -565,7 +568,8 @@ Error ConsumerImpl::GetRecordFromServerById(uint64_t id, std::string* response, } RequestInfo ri; - ri.api = "/database/" + source_credentials_.beamtime_id + "/" + source_credentials_.data_source + + ri.api = "/" + kConsumerProtocol.GetVersion() + "/beamtime/" + source_credentials_.beamtime_id + "/" + + source_credentials_.data_source + +"/" + std::move(stream) + "/" + std::move( group_id) + "/" + std::to_string(id); @@ -582,7 +586,8 @@ Error ConsumerImpl::GetRecordFromServerById(uint64_t id, std::string* response, std::string ConsumerImpl::GetBeamtimeMeta(Error* err) { RequestInfo ri; ri.api = - "/database/" + source_credentials_.beamtime_id + "/" + source_credentials_.data_source + "/default/0/meta/0"; + "/" + kConsumerProtocol.GetVersion() + "/beamtime/" + source_credentials_.beamtime_id + "/" + + source_credentials_.data_source + "/default/0/meta/0"; return BrokerRequestWithTimeout(ri, err); } @@ -604,7 +609,8 @@ MessageMetas ConsumerImpl::QueryMessages(std::string query, std::string stream, } RequestInfo ri; - ri.api = "/database/" + source_credentials_.beamtime_id + "/" + source_credentials_.data_source + + ri.api = "/" + kConsumerProtocol.GetVersion() + "/beamtime/" + source_credentials_.beamtime_id + "/" + + source_credentials_.data_source + "/" + std::move(stream) + "/0/querymessages"; ri.post = true; ri.body = std::move(query); @@ -698,7 +704,8 @@ StreamInfos ConsumerImpl::GetStreamList(std::string from, StreamFilter filter, E RequestInfo ConsumerImpl::GetStreamListRequest(const std::string &from, const StreamFilter &filter) const { RequestInfo ri; - ri.api = "/database/" + source_credentials_.beamtime_id + "/" + source_credentials_.data_source + "/0/streams"; + ri.api = "/" + kConsumerProtocol.GetVersion() + "/beamtime/" + source_credentials_.beamtime_id + "/" + + source_credentials_.data_source + "/0/streams"; ri.post = false; if (!from.empty()) { ri.extra_params = "&from=" + from; @@ -726,7 +733,7 @@ Error ConsumerImpl::UpdateFolderTokenIfNeeded(bool ignore_existing) { RequestInfo ConsumerImpl::CreateFolderTokenRequest() const { RequestInfo ri; ri.host = endpoint_; - ri.api = "/asapo-authorizer/folder"; + ri.api = "/asapo-authorizer/v0.1/folder"; ri.post = true; ri.body = "{\"Folder\":\"" + source_path_ + "\",\"BeamtimeId\":\"" + source_credentials_.beamtime_id + "\",\"Token\":\"" @@ -766,7 +773,8 @@ Error ConsumerImpl::Acknowledge(std::string group_id, uint64_t id, std::string s return ConsumerErrorTemplates::kWrongInput.Generate("empty stream"); } RequestInfo ri; - ri.api = "/database/" + source_credentials_.beamtime_id + "/" + source_credentials_.data_source + + ri.api = "/" + kConsumerProtocol.GetVersion() + "/beamtime/" + source_credentials_.beamtime_id + "/" + + source_credentials_.data_source + +"/" + std::move(stream) + "/" + std::move(group_id) + "/" + std::to_string(id); ri.post = true; @@ -787,7 +795,8 @@ IdList ConsumerImpl::GetUnacknowledgedMessages(std::string group_id, return {}; } RequestInfo ri; - ri.api = "/database/" + source_credentials_.beamtime_id + "/" + source_credentials_.data_source + + ri.api = "/" + kConsumerProtocol.GetVersion() + "/beamtime/" + source_credentials_.beamtime_id + "/" + + source_credentials_.data_source + +"/" + std::move(stream) + "/" + std::move(group_id) + "/nacks"; ri.extra_params = "&from=" + std::to_string(from_id) + "&to=" + std::to_string(to_id); @@ -812,7 +821,8 @@ uint64_t ConsumerImpl::GetLastAcknowledgedMessage(std::string group_id, std::str return 0; } RequestInfo ri; - ri.api = "/database/" + source_credentials_.beamtime_id + "/" + source_credentials_.data_source + + ri.api = "/" + kConsumerProtocol.GetVersion() + "/beamtime/" + source_credentials_.beamtime_id + "/" + + source_credentials_.data_source + +"/" + std::move(stream) + "/" + std::move(group_id) + "/lastack"; @@ -847,7 +857,8 @@ Error ConsumerImpl::NegativeAcknowledge(std::string group_id, return ConsumerErrorTemplates::kWrongInput.Generate("empty stream"); } RequestInfo ri; - ri.api = "/database/" + source_credentials_.beamtime_id + "/" + source_credentials_.data_source + + ri.api = "/" + kConsumerProtocol.GetVersion() + "/beamtime/" + source_credentials_.beamtime_id + "/" + + source_credentials_.data_source + +"/" + std::move(stream) + "/" + std::move(group_id) + "/" + std::to_string(id); ri.post = true; @@ -891,7 +902,8 @@ uint64_t ConsumerImpl::ParseGetCurrentCountResponce(Error* err, const std::strin RequestInfo ConsumerImpl::GetSizeRequestForSingleMessagesStream(std::string &stream) const { RequestInfo ri; - ri.api = "/database/" + source_credentials_.beamtime_id + "/" + source_credentials_.data_source + + ri.api = "/" + kConsumerProtocol.GetVersion() + "/beamtime/" + source_credentials_.beamtime_id + "/" + + source_credentials_.data_source + +"/" + std::move(stream) + "/size"; return ri; } diff --git a/consumer/api/cpp/unittests/test_consumer_impl.cpp b/consumer/api/cpp/unittests/test_consumer_impl.cpp index bf0aa0324aa16c0ff88b4fe590e316afe2f0df55..ad4bb4bb4edbd2eff30a2410817818d4650ac9bd 100644 --- a/consumer/api/cpp/unittests/test_consumer_impl.cpp +++ b/consumer/api/cpp/unittests/test_consumer_impl.cpp @@ -66,6 +66,8 @@ class ConsumerImplTests : public Test { MessageMeta info; std::string expected_server_uri = "test:8400"; std::string expected_broker_uri = "asapo-broker:5005"; + std::string expected_consumer_protocol = "v0.1"; + std::string expected_broker_api = expected_broker_uri + "/" + expected_consumer_protocol; std::string expected_fts_uri = "asapo-file-transfer:5008"; std::string expected_token = "token"; std::string expected_path = "/tmp/beamline/beamtime"; @@ -120,7 +122,7 @@ class ConsumerImplTests : public Test { } void MockGet(const std::string &response, asapo::HttpCode return_code = HttpCode::OK) { - EXPECT_CALL(mock_http_client, Get_t(HasSubstr(expected_broker_uri), _, _)).WillOnce(DoAll( + EXPECT_CALL(mock_http_client, Get_t(HasSubstr(expected_broker_api), _, _)).WillOnce(DoAll( SetArgPointee<1>(return_code), SetArgPointee<2>(nullptr), Return(response) @@ -128,7 +130,7 @@ class ConsumerImplTests : public Test { } void MockGetError() { - EXPECT_CALL(mock_http_client, Get_t(HasSubstr(expected_broker_uri), _, _)).WillOnce(DoAll( + EXPECT_CALL(mock_http_client, Get_t(HasSubstr(expected_broker_api), _, _)).WillOnce(DoAll( SetArgPointee<1>(HttpCode::NotFound), SetArgPointee<2>(asapo::IOErrorTemplates::kUnknownIOError.Generate().release()), Return("") @@ -201,7 +203,7 @@ TEST_F(ConsumerImplTests, DefaultStreamIsDetector) { MockGetBrokerUri(); EXPECT_CALL(mock_http_client, - Get_t(expected_broker_uri + "/database/beamtime_id/detector/stream/" + expected_group_id + Get_t(expected_broker_api + "/beamtime/beamtime_id/detector/stream/" + expected_group_id + "/next?token=" + expected_token, _, @@ -216,7 +218,7 @@ TEST_F(ConsumerImplTests, DefaultStreamIsDetector) { TEST_F(ConsumerImplTests, GetNextUsesCorrectUriWithStream) { MockGetBrokerUri(); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/" + + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/" + expected_stream + "/" + expected_group_id + "/next?token=" + expected_token, _, _)).WillOnce(DoAll( @@ -230,7 +232,7 @@ TEST_F(ConsumerImplTests, GetLastUsesCorrectUri) { MockGetBrokerUri(); EXPECT_CALL(mock_http_client, - Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/"+ expected_stream+"/0/last?token=" + Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/"+ expected_stream+"/0/last?token=" + expected_token, _, _)).WillOnce(DoAll( SetArgPointee<1>(HttpCode::OK), @@ -413,7 +415,7 @@ TEST_F(ConsumerImplTests, GetMessageReturnsNoDataAfterTimeoutEvenIfOtherErrorOcc Return("{\"op\":\"get_record_by_id\",\"id\":" + std::to_string(expected_dataset_id) + ",\"id_max\":2,\"next_stream\":\"""\"}"))); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/stream/0/" + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/stream/0/" + std::to_string(expected_dataset_id) + "?token=" + expected_token, _, _)).Times(AtLeast(1)).WillRepeatedly(DoAll( SetArgPointee<1>(HttpCode::NotFound), @@ -579,7 +581,7 @@ TEST_F(ConsumerImplTests, GenerateNewGroupIdReturnsErrorCreateGroup) { TEST_F(ConsumerImplTests, GenerateNewGroupIdReturnsGroupID) { MockGetBrokerUri(); - EXPECT_CALL(mock_http_client, Post_t(expected_broker_uri + "/creategroup?token=" + expected_token, _, "", _, + EXPECT_CALL(mock_http_client, Post_t(expected_broker_api + "/creategroup?token=" + expected_token, _, "", _, _)).WillOnce(DoAll( SetArgPointee<3>(HttpCode::OK), SetArgPointee<4>(nullptr), @@ -597,7 +599,7 @@ TEST_F(ConsumerImplTests, ResetCounterByDefaultUsesCorrectUri) { consumer->SetTimeout(100); EXPECT_CALL(mock_http_client, - Post_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/stream/" + + Post_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/stream/" + expected_group_id + "/resetcounter?token=" + expected_token + "&value=0", _, _, _, _)).WillOnce(DoAll( SetArgPointee<3>(HttpCode::OK), @@ -611,7 +613,7 @@ TEST_F(ConsumerImplTests, ResetCounterUsesCorrectUri) { MockGetBrokerUri(); consumer->SetTimeout(100); - EXPECT_CALL(mock_http_client, Post_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/" + + EXPECT_CALL(mock_http_client, Post_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/" + expected_stream + "/" + expected_group_id + "/resetcounter?token=" + expected_token + "&value=10", _, _, _, _)).WillOnce(DoAll( @@ -626,7 +628,7 @@ TEST_F(ConsumerImplTests, GetCurrentSizeUsesCorrectUri) { MockGetBrokerUri(); consumer->SetTimeout(100); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/" + + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/" + expected_stream + "/size?token=" + expected_token, _, _)).WillOnce(DoAll( SetArgPointee<1>(HttpCode::OK), @@ -642,7 +644,7 @@ TEST_F(ConsumerImplTests, GetCurrentSizeErrorOnWrongResponce) { MockGetBrokerUri(); consumer->SetTimeout(100); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/"+expected_stream+"/size?token=" + expected_token, _, _)).WillRepeatedly(DoAll( SetArgPointee<1>(HttpCode::Unauthorized), @@ -658,7 +660,7 @@ TEST_F(ConsumerImplTests, GetNDataErrorOnWrongParse) { MockGetBrokerUri(); consumer->SetTimeout(100); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/stream/size?token=" + expected_token, _, _)).WillOnce(DoAll( SetArgPointee<1>(HttpCode::OK), @@ -676,7 +678,7 @@ TEST_F(ConsumerImplTests, GetByIdUsesCorrectUri) { auto to_send = CreateFI(); auto json = to_send.Json(); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/stream/0/" + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/stream/0/" + std::to_string( expected_dataset_id) + "?token=" + expected_token, _, @@ -695,7 +697,7 @@ TEST_F(ConsumerImplTests, GetByIdTimeouts) { MockGetBrokerUri(); consumer->SetTimeout(10); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/stream/0/" + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/stream/0/" + std::to_string(expected_dataset_id) + "?token=" + expected_token, _, _)).WillOnce(DoAll( SetArgPointee<1>(HttpCode::Conflict), @@ -711,7 +713,7 @@ TEST_F(ConsumerImplTests, GetByIdReturnsEndOfStream) { MockGetBrokerUri(); consumer->SetTimeout(10); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/stream/0/" + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/stream/0/" + std::to_string(expected_dataset_id) + "?token=" + expected_token, _, _)).WillOnce(DoAll( SetArgPointee<1>(HttpCode::Conflict), @@ -727,7 +729,7 @@ TEST_F(ConsumerImplTests, GetByIdReturnsEndOfStreamWhenIdTooLarge) { MockGetBrokerUri(); consumer->SetTimeout(10); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/stream/0/" + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/stream/0/" + std::to_string(expected_dataset_id) + "?token=" + expected_token, _, _)).WillOnce(DoAll( SetArgPointee<1>(HttpCode::Conflict), @@ -743,7 +745,7 @@ TEST_F(ConsumerImplTests, GetMetaDataOK) { MockGetBrokerUri(); consumer->SetTimeout(100); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/default/0/meta/0?token=" + expected_token, _, _)).WillOnce(DoAll( @@ -849,7 +851,7 @@ TEST_F(ConsumerImplTests, QueryMessagesReturnRecords) { auto responce_string = "[" + json1 + "," + json2 + "]"; EXPECT_CALL(mock_http_client, - Post_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/stream/0" + + Post_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/stream/0" + "/querymessages?token=" + expected_token, _, expected_query_string, _, _)).WillOnce(DoAll( SetArgPointee<3>(HttpCode::OK), SetArgPointee<4>(nullptr), @@ -869,7 +871,7 @@ TEST_F(ConsumerImplTests, QueryMessagesReturnRecords) { TEST_F(ConsumerImplTests, GetNextDatasetUsesCorrectUri) { MockGetBrokerUri(); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/stream/" + + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/stream/" + expected_group_id + "/next?token=" + expected_token + "&dataset=true&minsize=0", _, _)).WillOnce(DoAll( @@ -1004,7 +1006,7 @@ TEST_F(ConsumerImplTests, GetDataSetReturnsParseError) { TEST_F(ConsumerImplTests, GetLastDatasetUsesCorrectUri) { MockGetBrokerUri(); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/" + + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/" + expected_stream + "/0/last?token=" + expected_token + "&dataset=true&minsize=1", _, _)).WillOnce(DoAll( @@ -1018,7 +1020,7 @@ TEST_F(ConsumerImplTests, GetLastDatasetUsesCorrectUri) { TEST_F(ConsumerImplTests, GetDatasetByIdUsesCorrectUri) { MockGetBrokerUri(); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/stream/0/" + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/stream/0/" + std::to_string(expected_dataset_id) + "?token=" + expected_token + "&dataset=true" + "&minsize=0", _, _)).WillOnce(DoAll( @@ -1035,7 +1037,7 @@ TEST_F(ConsumerImplTests, GetStreamListUsesCorrectUri) { std::string(R"({"streams":[{"lastId":123,"name":"test","timestampCreated":1000000,"timestampLast":1000,"finished":false,"nextStream":""},)")+ R"({"lastId":124,"name":"test1","timestampCreated":2000000,"timestampLast":2000,"finished":true,"nextStream":"next"}]})"; EXPECT_CALL(mock_http_client, - Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/0/streams" + Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/0/streams" + "?token=" + expected_token + "&from=stream_from&filter=all", _, _)).WillOnce(DoAll( SetArgPointee<1>(HttpCode::OK), @@ -1054,7 +1056,7 @@ TEST_F(ConsumerImplTests, GetStreamListUsesCorrectUri) { TEST_F(ConsumerImplTests, GetStreamListUsesCorrectUriWithoutFrom) { MockGetBrokerUri(); EXPECT_CALL(mock_http_client, - Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/0/streams" + Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/0/streams" + "?token=" + expected_token+"&filter=finished", _, _)).WillOnce(DoAll( SetArgPointee<1>(HttpCode::OK), @@ -1079,7 +1081,7 @@ void ConsumerImplTests::ExpectFolderToken() { expected_beamtime_id + "\",\"Token\":\"" + expected_token + "\"}"; - EXPECT_CALL(mock_http_client, Post_t(HasSubstr(expected_server_uri + "/asapo-authorizer/folder"), _, + EXPECT_CALL(mock_http_client, Post_t(HasSubstr(expected_server_uri + "/asapo-authorizer/v0.1/folder"), _, expected_folder_query_string, _, _)).WillOnce(DoAll( SetArgPointee<3>(HttpCode::OK), SetArgPointee<4>(nullptr), @@ -1196,7 +1198,7 @@ TEST_F(ConsumerImplTests, GetMessageTriesToGetTokenAgainIfTransferFailed) { TEST_F(ConsumerImplTests, AcknowledgeUsesCorrectUri) { MockGetBrokerUri(); auto expected_acknowledge_command = "{\"Op\":\"ackmessage\"}"; - EXPECT_CALL(mock_http_client, Post_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/" + + EXPECT_CALL(mock_http_client, Post_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/" + expected_stream + "/" + expected_group_id + "/" + std::to_string(expected_dataset_id) + "?token=" @@ -1212,7 +1214,7 @@ TEST_F(ConsumerImplTests, AcknowledgeUsesCorrectUri) { void ConsumerImplTests::ExpectIdList(bool error) { MockGetBrokerUri(); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/" + + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/" + expected_stream + "/" + expected_group_id + "/nacks?token=" + expected_token + "&from=1&to=0", _, _)).WillOnce(DoAll( SetArgPointee<1>(HttpCode::OK), @@ -1230,7 +1232,7 @@ TEST_F(ConsumerImplTests, GetUnAcknowledgedListReturnsIds) { } void ConsumerImplTests::ExpectLastAckId(bool empty_response) { - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/" + + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/" + expected_stream + "/" + expected_group_id + "/lastack?token=" + expected_token, _, _)).WillOnce(DoAll( SetArgPointee<1>(HttpCode::OK), @@ -1268,7 +1270,7 @@ TEST_F(ConsumerImplTests, GetByIdErrorsForId0) { TEST_F(ConsumerImplTests, ResendNacks) { MockGetBrokerUri(); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/stream/" + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/stream/" + expected_group_id + "/next?token=" + expected_token + "&resend_nacks=true&delay_ms=10000&resend_attempts=3", _, _)).WillOnce(DoAll( @@ -1283,7 +1285,7 @@ TEST_F(ConsumerImplTests, ResendNacks) { TEST_F(ConsumerImplTests, NegativeAcknowledgeUsesCorrectUri) { MockGetBrokerUri(); auto expected_neg_acknowledge_command = R"({"Op":"negackmessage","Params":{"DelayMs":10000}})"; - EXPECT_CALL(mock_http_client, Post_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/" + + EXPECT_CALL(mock_http_client, Post_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/" + expected_stream + "/" + expected_group_id + "/" + std::to_string(expected_dataset_id) + "?token=" @@ -1328,7 +1330,7 @@ TEST_F(ConsumerImplTests, GetCurrentDataSetCounteUsesCorrectUri) { MockGetBrokerUri(); consumer->SetTimeout(100); - EXPECT_CALL(mock_http_client, Get_t(expected_broker_uri + "/database/beamtime_id/" + expected_data_source + "/" + + EXPECT_CALL(mock_http_client, Get_t(expected_broker_api + "/beamtime/beamtime_id/" + expected_data_source + "/" + expected_stream + "/size?token=" + expected_token+"&incomplete=true", _, _)).WillOnce(DoAll( SetArgPointee<1>(HttpCode::OK), diff --git a/deploy/asapo_services/scripts/asapo-services.nmd.tpl b/deploy/asapo_services/scripts/asapo-services.nmd.tpl index 6220ae11d82341f7b997f0b11aa872908f5bbfe1..e12469f2b701ad6bc7ed3553d7cc683b3a0f28b0 100644 --- a/deploy/asapo_services/scripts/asapo-services.nmd.tpl +++ b/deploy/asapo_services/scripts/asapo-services.nmd.tpl @@ -125,7 +125,7 @@ job "asapo-services" { check { name = "alive" type = "http" - path = "/asapo-receiver" + path = "/health" interval = "10s" timeout = "2s" initial_status = "passing" diff --git a/discovery/src/asapo_discovery/common/consts.go b/discovery/src/asapo_discovery/common/consts.go index b7ac221acbbac4d4ee6a7a9010084ff75e066b33..d940e060a91654269eb6f1e7b4eb2c0aa851b8c0 100644 --- a/discovery/src/asapo_discovery/common/consts.go +++ b/discovery/src/asapo_discovery/common/consts.go @@ -1,10 +1,5 @@ package common -import ( - "strconv" - "strings" -) - const ( NameMongoService = "asapo-mongodb" NameFtsService = "asapo-file-transfer" @@ -13,12 +8,3 @@ const ( ) const ApiVersion = "v0.1" - -func VersionToNumber(ver string) int { - ver = strings.TrimPrefix(ver,"v") - floatNum, err := strconv.ParseFloat(ver, 64) - if err!=nil { - return 0 - } - return int(floatNum*1000) -} diff --git a/discovery/src/asapo_discovery/server/get_health.go b/discovery/src/asapo_discovery/server/get_health.go new file mode 100644 index 0000000000000000000000000000000000000000..fdc697baf435f6bd7077bad2bdd7aa25284789fb --- /dev/null +++ b/discovery/src/asapo_discovery/server/get_health.go @@ -0,0 +1,9 @@ +package server + +import ( + "net/http" +) + +func routeGetHealth(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNoContent) +} diff --git a/discovery/src/asapo_discovery/server/get_health_test.go b/discovery/src/asapo_discovery/server/get_health_test.go new file mode 100644 index 0000000000000000000000000000000000000000..4d455e086fb8e9aede4d1fb6a4c1738ac244f442 --- /dev/null +++ b/discovery/src/asapo_discovery/server/get_health_test.go @@ -0,0 +1,12 @@ +package server + +import ( + "github.com/stretchr/testify/assert" + "net/http" + "testing" +) + +func TestHealth(t *testing.T) { + w := doRequest("/health") + assert.Equal(t, http.StatusNoContent, w.Code, "ok") +} diff --git a/discovery/src/asapo_discovery/server/get_version.go b/discovery/src/asapo_discovery/server/get_version.go index a378a40937f37af61fbc42be0e90ce3213cb8889..21e5e14e45ac60988f512ce8d586ae42c37aed5a 100644 --- a/discovery/src/asapo_discovery/server/get_version.go +++ b/discovery/src/asapo_discovery/server/get_version.go @@ -2,12 +2,12 @@ package server import ( "asapo_common/logger" + "asapo_common/utils" "asapo_common/version" "asapo_discovery/common" "asapo_discovery/protocols" "encoding/json" "errors" - "github.com/gorilla/mux" "net/http" ) @@ -29,21 +29,6 @@ func extractProtocol(r *http.Request) (string, error) { return protocol, nil } - -func extractVersion(r *http.Request) (int, error) { - vars := mux.Vars(r) - ver_str, ok := vars["apiver"] - if !ok { - return 0, errors.New("cannot extract version") - } - - ver := common.VersionToNumber(ver_str) - if ver == 0 { - return 0, errors.New("cannot extract version") - } - return ver, nil -} - func routeGetVersion(w http.ResponseWriter, r *http.Request) { log_str := "processing get version" logger.Debug(log_str) @@ -66,18 +51,8 @@ func routeGetVersion(w http.ResponseWriter, r *http.Request) { } func checkDiscoveryApiVersion(w http.ResponseWriter, r *http.Request) bool { - apiVer, err := extractVersion(r) - if err != nil { - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte(err.Error())) - return false - } - if apiVer > common.VersionToNumber(common.ApiVersion) { - w.WriteHeader(http.StatusUnsupportedMediaType) - w.Write([]byte("version not supported")) - return false - } - return true + _, ok := utils.PrecheckApiVersion(w,r,common.ApiVersion) + return ok } func getVersionInfo(client string, ver string) (versionInfo, error) { diff --git a/discovery/src/asapo_discovery/server/listroutes.go b/discovery/src/asapo_discovery/server/listroutes.go index 32a5c36a2b6f072c48ccfc5a632dd2ad4eef395d..88c566d79e480a08e97a6470cb554ef6a0aa3fdc 100644 --- a/discovery/src/asapo_discovery/server/listroutes.go +++ b/discovery/src/asapo_discovery/server/listroutes.go @@ -36,4 +36,11 @@ var listRoutes = utils.Routes{ "/{apiver}/" + common.NameFtsService, routeGetFileTransferService, }, + utils.Route{ + "Health", + "Get", + "/health", + routeGetHealth, + }, + } diff --git a/discovery/src/asapo_discovery/server/routes.go b/discovery/src/asapo_discovery/server/routes.go index db9728439601e18fa8131c97b389471d23cd2579..d918a8adb6db7208fe001f2bb4df96e94ea7bd06 100644 --- a/discovery/src/asapo_discovery/server/routes.go +++ b/discovery/src/asapo_discovery/server/routes.go @@ -44,11 +44,11 @@ func validateProtocol(w http.ResponseWriter, r *http.Request, client string) boo } func routeGetReceivers(w http.ResponseWriter, r *http.Request) { - if ok := checkDiscoveryApiVersion(w, r);!ok{ + if ok := checkDiscoveryApiVersion(w, r); !ok { return } - if !validateProtocol(w,r,"producer") { + if !validateProtocol(w, r, "producer") { return } answer, code := getService(common.NameReceiverService) @@ -57,11 +57,11 @@ func routeGetReceivers(w http.ResponseWriter, r *http.Request) { } func routeGetBroker(w http.ResponseWriter, r *http.Request) { - if ok := checkDiscoveryApiVersion(w, r);!ok{ + if ok := checkDiscoveryApiVersion(w, r); !ok { return } - if !validateProtocol(w,r,"consumer") { + if !validateProtocol(w, r, "consumer") { return } @@ -77,10 +77,10 @@ func routeGetMongo(w http.ResponseWriter, r *http.Request) { } func routeGetFileTransferService(w http.ResponseWriter, r *http.Request) { - if ok := checkDiscoveryApiVersion(w, r);!ok{ + if ok := checkDiscoveryApiVersion(w, r); !ok { return } - if !validateProtocol(w,r,"consumer") { + if !validateProtocol(w, r, "consumer") { return } diff --git a/examples/consumer/getnext/check_linux.sh b/examples/consumer/getnext/check_linux.sh index a8c0ec75089eeff7ab9ca5049ea4dbbc530abd27..2c853792cf60bc9a171c6664a2a695ca71c0791f 100644 --- a/examples/consumer/getnext/check_linux.sh +++ b/examples/consumer/getnext/check_linux.sh @@ -17,7 +17,7 @@ Cleanup() { nomad stop discovery nomad stop authorizer nomad stop broker - echo "db.dropDatabase()" | mongo ${database_name} + echo "db.dropDatabase()" | mongo ${database_name} } nomad run nginx.nmd diff --git a/examples/consumer/getnext/getnext.cpp b/examples/consumer/getnext/getnext.cpp index 5e90a3885be448262e12bbd099278deb62eb6f8b..495c137fde1039c384b5496a553052c66172e508 100644 --- a/examples/consumer/getnext/getnext.cpp +++ b/examples/consumer/getnext/getnext.cpp @@ -119,6 +119,7 @@ StartThreads(const Args& params, std::vector<int>* nfiles, std::vector<int>* err if (err) { (*errors)[i] += ProcessError(err); lock.unlock(); + exit(EXIT_FAILURE); return; } } diff --git a/producer/api/cpp/unittests/test_receiver_discovery_service.cpp b/producer/api/cpp/unittests/test_receiver_discovery_service.cpp index 7000da7d4c01930c3906a9460405e7623140d766..014be20c89dd3d247a2e3d7134c9c43fb5131792 100644 --- a/producer/api/cpp/unittests/test_receiver_discovery_service.cpp +++ b/producer/api/cpp/unittests/test_receiver_discovery_service.cpp @@ -48,7 +48,7 @@ class ReceiversStatusTests : public Test { NiceMock<asapo::MockLogger> mock_logger; NiceMock<MockHttpClient>* mock_http_client; - std::string expected_endpoint{"endpoint/asapo-discovery/asapo-receiver"}; + std::string expected_endpoint{"endpoint/asapo-discovery/v0.1/asapo-receiver?protocol=v0.1"}; ReceiverDiscoveryService status{"endpoint", 20}; void SetUp() override { diff --git a/tests/automatic/broker/check_monitoring/check_linux.sh b/tests/automatic/broker/check_monitoring/check_linux.sh index a9c64328bb00c0de187b3ffed01009a7bf3f0c1b..36501554b1b67515bb8bfa190fd1625a094ee8b5 100644 --- a/tests/automatic/broker/check_monitoring/check_linux.sh +++ b/tests/automatic/broker/check_monitoring/check_linux.sh @@ -38,7 +38,7 @@ groupid=`curl -d '' --silent 127.0.0.1:5005/creategroup` for i in `seq 1 50`; do - curl --silent 127.0.0.1:5005/database/data/source/stream/${groupid}/next?token=$token >/dev/null 2>&1 & + curl --silent 127.0.0.1:5005/beamtime/data/source/stream/${groupid}/next?token=$token >/dev/null 2>&1 & done diff --git a/tests/automatic/broker/get_last/check_linux.sh b/tests/automatic/broker/get_last/check_linux.sh index b40aad08881ca2b7ee0c34b53716deec9e30f06b..f75dea0d473de0c95d4afb6907a42282e2221bcf 100644 --- a/tests/automatic/broker/get_last/check_linux.sh +++ b/tests/automatic/broker/get_last/check_linux.sh @@ -33,21 +33,21 @@ brokerid=`echo $!` groupid=`curl -d '' --silent 127.0.0.1:5005/creategroup` -curl -v --silent 127.0.0.1:5005/database/data/detector/${stream}/0/last?token=$token --stderr - +curl -v --silent 127.0.0.1:5005/beamtime/data/detector/${stream}/0/last?token=$token --stderr - -curl -v --silent 127.0.0.1:5005/database/data/detector/${stream}/0/last?token=$token --stderr - | grep '"_id":2' -curl -v --silent 127.0.0.1:5005/database/data/detector/${stream}/0/last?token=$token --stderr - | grep '"_id":2' +curl -v --silent 127.0.0.1:5005/beamtime/data/detector/${stream}/0/last?token=$token --stderr - | grep '"_id":2' +curl -v --silent 127.0.0.1:5005/beamtime/data/detector/${stream}/0/last?token=$token --stderr - | grep '"_id":2' echo "db.data_${stream}.insert({"_id":3})" | mongo ${database_name} -curl -v --silent 127.0.0.1:5005/database/data/detector/${stream}/0/last?token=$token --stderr - | grep '"_id":3' +curl -v --silent 127.0.0.1:5005/beamtime/data/detector/${stream}/0/last?token=$token --stderr - | grep '"_id":3' echo "db.data_${stream}.insert({"_id":4})" | mongo ${database_name} -curl -v --silent 127.0.0.1:5005/database/data/detector/${stream}/${groupid}/next?token=$token --stderr - | grep '"_id":1' -curl -v --silent 127.0.0.1:5005/database/data/detector/${stream}/0/last?token=$token --stderr - | grep '"_id":4' +curl -v --silent 127.0.0.1:5005/beamtime/data/detector/${stream}/${groupid}/next?token=$token --stderr - | grep '"_id":1' +curl -v --silent 127.0.0.1:5005/beamtime/data/detector/${stream}/0/last?token=$token --stderr - | grep '"_id":4' #with a new group groupid=`curl -d '' --silent 127.0.0.1:5005/creategroup` -curl -v --silent 127.0.0.1:5005/database/data/detector/${stream}/${groupid}/next?token=$token --stderr - | grep '"_id":1' -curl -v --silent 127.0.0.1:5005/database/data/detector/${stream}/0/last?token=$token --stderr - | grep '"_id":4' \ No newline at end of file +curl -v --silent 127.0.0.1:5005/beamtime/data/detector/${stream}/${groupid}/next?token=$token --stderr - | grep '"_id":1' +curl -v --silent 127.0.0.1:5005/beamtime/data/detector/${stream}/0/last?token=$token --stderr - | grep '"_id":4' \ No newline at end of file diff --git a/tests/automatic/broker/get_last/check_windows.bat b/tests/automatic/broker/get_last/check_windows.bat index 580140b410aec1549d06fe16bd19a499a706a980..9c284be25b7701e236a114509854f168215d4577 100644 --- a/tests/automatic/broker/get_last/check_windows.bat +++ b/tests/automatic/broker/get_last/check_windows.bat @@ -21,22 +21,22 @@ C:\Curl\curl.exe -d '' --silent 127.0.0.1:5005/creategroup > groupid set /P groupid=< groupid -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/detector/default/0/last?token=%token% --stderr - | findstr /c:\"_id\":2 || goto :error -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/detector/default/0/last?token=%token% --stderr - | findstr /c:\"_id\":2 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/beamtime/data/detector/default/0/last?token=%token% --stderr - | findstr /c:\"_id\":2 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/beamtime/data/detector/default/0/last?token=%token% --stderr - | findstr /c:\"_id\":2 || goto :error echo db.data_default.insert({"_id":3}) | %mongo_exe% %database_name% || goto :error -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/detector/default/0/last?token=%token% --stderr - | findstr /c:\"_id\":3 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/beamtime/data/detector/default/0/last?token=%token% --stderr - | findstr /c:\"_id\":3 || goto :error echo db.data_default.insert({"_id":4}) | %mongo_exe% %database_name% || goto :error -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/detector/default/%groupid%/next?token=%token% --stderr - | findstr /c:\"_id\":1 || goto :error -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/detector/default/0/last?token=%token% --stderr - | findstr /c:\"_id\":4 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/beamtime/data/detector/default/%groupid%/next?token=%token% --stderr - | findstr /c:\"_id\":1 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/beamtime/data/detector/default/0/last?token=%token% --stderr - | findstr /c:\"_id\":4 || goto :error C:\Curl\curl.exe -d '' --silent 127.0.0.1:5005/creategroup > groupid set /P groupid=< groupid -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/detector/default/%groupid%/next?token=%token% --stderr - | findstr /c:\"_id\":1 || goto :error -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/detector/default/0/last?token=%token% --stderr - | findstr /c:\"_id\":4 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/beamtime/data/detector/default/%groupid%/next?token=%token% --stderr - | findstr /c:\"_id\":1 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/beamtime/data/detector/default/0/last?token=%token% --stderr - | findstr /c:\"_id\":4 || goto :error goto :clean diff --git a/tests/automatic/broker/get_meta/check_linux.sh b/tests/automatic/broker/get_meta/check_linux.sh index 2130592555500717d6b207f57817636455a0bd8a..e5d3bd2db365d13d814e9a3ac0688ef8127e2031 100644 --- a/tests/automatic/broker/get_meta/check_linux.sh +++ b/tests/automatic/broker/get_meta/check_linux.sh @@ -29,6 +29,6 @@ $1 -config settings.json & sleep 0.3 brokerid=`echo $!` -curl -v --silent 127.0.0.1:5005/database/test/detector/default/0/meta/0?token=$token --stderr - | tee /dev/stderr | grep '"data":"test"' -curl -v --silent 127.0.0.1:5005/database/test/detector/default/0/meta/1?token=$token --stderr - | tee /dev/stderr | grep 'no documents' +curl -v --silent 127.0.0.1:5005/beamtime/test/detector/default/0/meta/0?token=$token --stderr - | tee /dev/stderr | grep '"data":"test"' +curl -v --silent 127.0.0.1:5005/beamtime/test/detector/default/0/meta/1?token=$token --stderr - | tee /dev/stderr | grep 'no documents' diff --git a/tests/automatic/broker/get_meta/check_windows.bat b/tests/automatic/broker/get_meta/check_windows.bat index cf16f3d18a6100657038480b92667f63c932c5ea..6f31d7b12edb14fa0efb84914dbaebc2307771c8 100644 --- a/tests/automatic/broker/get_meta/check_windows.bat +++ b/tests/automatic/broker/get_meta/check_windows.bat @@ -17,8 +17,8 @@ start /B "" "%full_name%" -config settings.json ping 192.0.2.1 -n 1 -w 1000 > nul -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/detector/default/0/meta/0?token=%token% --stderr - | findstr /c:\"_id\":0 || goto :error -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/detector/default/0/meta/1?token=%token% --stderr - | findstr /c:"no documents" || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/beamtime/data/detector/default/0/meta/0?token=%token% --stderr - | findstr /c:\"_id\":0 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/beamtime/data/detector/default/0/meta/1?token=%token% --stderr - | findstr /c:"no documents" || goto :error goto :clean diff --git a/tests/automatic/broker/get_next/check_linux.sh b/tests/automatic/broker/get_next/check_linux.sh index cd204d7248a21956e8dec317e7dfd7435823b4d8..6e96c7127c19e8069bea7243750116e1e6ae766e 100644 --- a/tests/automatic/broker/get_next/check_linux.sh +++ b/tests/automatic/broker/get_next/check_linux.sh @@ -32,10 +32,10 @@ sleep 0.3 brokerid=`echo $!` groupid=`curl -d '' --silent 127.0.0.1:5005/creategroup` -curl -v --silent 127.0.0.1:5005/database/data/source/${stream}/${groupid}/next?token=$token --stderr - | tee /dev/stderr | grep '"_id":1' -curl -v --silent 127.0.0.1:5005/database/data/source/${stream}/${groupid}/next?token=$token --stderr - | tee /dev/stderr | grep '"_id":2' -curl -v --silent 127.0.0.1:5005/database/data/source/${stream}/${groupid}/next?token=$token --stderr - | tee /dev/stderr | grep '"id_max":2' +curl -v --silent 127.0.0.1:5005/beamtime/data/source/${stream}/${groupid}/next?token=$token --stderr - | tee /dev/stderr | grep '"_id":1' +curl -v --silent 127.0.0.1:5005/beamtime/data/source/${stream}/${groupid}/next?token=$token --stderr - | tee /dev/stderr | grep '"_id":2' +curl -v --silent 127.0.0.1:5005/beamtime/data/source/${stream}/${groupid}/next?token=$token --stderr - | tee /dev/stderr | grep '"id_max":2' # with a new group groupid=`curl -d '' --silent 127.0.0.1:5005/creategroup` -curl -v --silent 127.0.0.1:5005/database/data/source/${stream}/${groupid}/next?token=$token --stderr - | tee /dev/stderr | grep '"_id":1' \ No newline at end of file +curl -v --silent 127.0.0.1:5005/beamtime/data/source/${stream}/${groupid}/next?token=$token --stderr - | tee /dev/stderr | grep '"_id":1' \ No newline at end of file diff --git a/tests/automatic/broker/get_next/check_windows.bat b/tests/automatic/broker/get_next/check_windows.bat index 4d5ed42b65ed9ff318e72739621176c975b50832..76a0b86e657d0450bd85203ace43b930f72d71a6 100644 --- a/tests/automatic/broker/get_next/check_windows.bat +++ b/tests/automatic/broker/get_next/check_windows.bat @@ -20,13 +20,13 @@ ping 192.0.2.1 -n 1 -w 1000 > nul C:\Curl\curl.exe -d '' --silent 127.0.0.1:5005/creategroup > groupid set /P groupid=< groupid -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/source/default/%groupid%/next?token=%token% --stderr - | findstr /c:\"_id\":1 || goto :error -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/source/default/%groupid%/next?token=%token% --stderr - | findstr /c:\"_id\":2 || goto :error -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/source/default/%groupid%/next?token=%token% --stderr - | findstr /c:\"id_max\":2 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/beamtime/data/source/default/%groupid%/next?token=%token% --stderr - | findstr /c:\"_id\":1 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/beamtime/data/source/default/%groupid%/next?token=%token% --stderr - | findstr /c:\"_id\":2 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/beamtime/data/source/default/%groupid%/next?token=%token% --stderr - | findstr /c:\"id_max\":2 || goto :error C:\Curl\curl.exe -d '' --silent 127.0.0.1:5005/creategroup > groupid set /P groupid=< groupid -C:\Curl\curl.exe -v --silent 127.0.0.1:5005/database/data/source/default/%groupid%/next?token=%token% --stderr - | findstr /c:\"_id\":1 || goto :error +C:\Curl\curl.exe -v --silent 127.0.0.1:5005/beamtime/data/source/default/%groupid%/next?token=%token% --stderr - | findstr /c:\"_id\":1 || goto :error goto :clean