diff --git a/CHANGELOG.md b/CHANGELOG.md index 49ee836ed839fd6b252289d8ba68e953449a754c..bbbc7b6bc39bf254cde220402470f92b18dc8a28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 21.09.0 (in progress) + +FEATURES +* Producer API: C client + +IMPROVEMENTS +* Allow using ASAPO for commissioning beamtimes + ## 21.06.0 FEATURES diff --git a/PROTOCOL-VERSIONS.md b/PROTOCOL-VERSIONS.md index e96812b7a392a8b81bb04305847b7e011b261e4e..e72696805562d6e3d50eb4b6f713be8b7831b33b 100644 --- a/PROTOCOL-VERSIONS.md +++ b/PROTOCOL-VERSIONS.md @@ -1,15 +1,15 @@ ### Producer Protocol | Release | used by client | Supported by server | Status | | ------------ | ------------------- | -------------------- | ---------------- | -| v0.3 | 21.06.0 - 21.06.0 | 21.06.0 - 21.06.0 | Current version | -| v0.2 | 21.03.2 - 21.03.2 | 21.03.2 - 21.06.0 | Deprecates from 01.07.2022 | -| v0.1 | 21.03.0 - 21.03.1 | 21.03.0 - 21.06.0 | Deprecates from 01.06.2022 | +| v0.3 | 21.06.0 - 21.06.0 | 21.06.0 - 21.09.0 | Current version | +| v0.2 | 21.03.2 - 21.03.2 | 21.03.2 - 21.09.0 | Deprecates from 01.07.2022 | +| v0.1 | 21.03.0 - 21.03.1 | 21.03.0 - 21.09.0 | Deprecates from 01.06.2022 | ### Consumer Protocol | Release | used by client | Supported by server | Status | | ------------ | ------------------- | -------------------- | ---------------- | -| v0.4 | 21.06.0 - 21.06.0 | 21.06.0 - 21.06.0 | Current version | -| v0.3 | 21.03.3 - 21.03.3 | 21.03.3 - 21.06.0 | Deprecates from 01.07.2022 | -| v0.2 | 21.03.2 - 21.03.2 | 21.03.2 - 21.06.0 | Deprecates from 01.06.2022 | -| v0.1 | 21.03.0 - 21.03.1 | 21.03.0 - 21.06.0 | Deprecates from 01.06.2022 | +| v0.4 | 21.06.0 - 21.06.0 | 21.06.0 - 21.09.0 | Current version | +| v0.3 | 21.03.3 - 21.03.3 | 21.03.3 - 21.09.0 | Deprecates from 01.07.2022 | +| v0.2 | 21.03.2 - 21.03.2 | 21.03.2 - 21.09.0 | Deprecates from 01.06.2022 | +| v0.1 | 21.03.0 - 21.03.1 | 21.03.0 - 21.09.0 | Deprecates from 01.06.2022 | diff --git a/VERSIONS.md b/VERSIONS.md index 3196aab3c56a46b9bbca1616925caba94e5e9d23..a52e3d2571f0d5faf4a6646ff2693fc75bfcbf2f 100644 --- a/VERSIONS.md +++ b/VERSIONS.md @@ -2,21 +2,23 @@ | Release | API changed\*\* | Protocol | Supported by server from/to | Status |Comment| | ------------ | ----------- | -------- | ------------------------- | --------------------- | ------- | -| 21.06.0 | Yes | v0.3 | 21.06.0/21.06.0 | current version |arbitrary characters| -| 21.03.3 | No | v0.2 | 21.03.2/21.03.3 | deprecates 01.07.2022 |bugfix in server| -| 21.03.2 | Yes | v0.2 | 21.03.2/21.03.3 | deprecates 01.07.2022 |bugfixes, add delete_stream| -| 21.03.1 | No | v0.1 | 21.03.0/21.03.3 | deprecates 01.06.2022 |bugfix in server| -| 21.03.0 | Yes | v0.1 | 21.03.0/21.03.3 | | | +| 21.09.0 | No | v0.3 | 21.06.0/21.09.0 | current version || +| 21.06.0 | Yes | v0.3 | 21.06.0/21.09.0 | |arbitrary characters| +| 21.03.3 | No | v0.2 | 21.03.2/21.09.0 | deprecates 01.07.2022 |bugfix in server| +| 21.03.2 | Yes | v0.2 | 21.03.2/21.09.0 | deprecates 01.07.2022 |bugfixes, add delete_stream| +| 21.03.1 | No | v0.1 | 21.03.0/21.09.0 | deprecates 01.06.2022 |bugfix in server| +| 21.03.0 | Yes | v0.1 | 21.03.0/21.09.0 | | | ### Consumer API | Release | API changed\*\* | Protocol | Supported by server from/to | Status |Comment| | ------------ | ----------- | --------- | ------------------------- | ---------------- | ------- | -| 21.06.0 | Yes | v0.4 | 21.06.0/21.06.0 | current version |arbitrary characters, bugfixes | -| 21.03.3 | Yes | v0.3 | 21.03.3/21.06.0 | deprecates 01.06.2022 |bugfix in server, error type for dublicated ack| -| 21.03.2 | Yes | v0.2 | 21.03.2/21.06.0 | deprecates 01.06.2022 |bugfixes, add delete_stream| -| 21.03.1 | No | v0.1 | 21.03.0/21.06.0 | deprecates 01.06.2022 |bugfix in server| -| 21.03.0 | Yes | v0.1 | 21.03.0/21.06.0 | | | +| 21.09.0 | No | v0.4 | 21.06.0/21.09.0 | current version | | +| 21.06.0 | Yes | v0.4 | 21.06.0/21.09.0 | |arbitrary characters, bugfixes | +| 21.03.3 | Yes | v0.3 | 21.03.3/21.09.0 | deprecates 01.06.2022 |bugfix in server, error type for dublicated ack| +| 21.03.2 | Yes | v0.2 | 21.03.2/21.09.0 | deprecates 01.06.2022 |bugfixes, add delete_stream| +| 21.03.1 | No | v0.1 | 21.03.0/21.09.0 | deprecates 01.06.2022 |bugfix in server| +| 21.03.0 | Yes | v0.1 | 21.03.0/21.09.0 | | | \* insignificant changes/bugfixes (e.g. in return type, etc), normally do not require client code changes, but formally might break the client diff --git a/authorizer/src/asapo_authorizer/server/authorize.go b/authorizer/src/asapo_authorizer/server/authorize.go index 26f8c92d19d59846303a666ae63b10089e3e01d0..bac5853d8ad5a547c93e7c359fa71319112ed8e5 100644 --- a/authorizer/src/asapo_authorizer/server/authorize.go +++ b/authorizer/src/asapo_authorizer/server/authorize.go @@ -69,6 +69,19 @@ func beamtimeMetaFromJson(fname string) (beamtimeMeta, error) { return meta, nil } +func commissioningMetaFromJson(fname string) (beamtimeMeta, error) { + var meta beamtimeMeta + var comMeta commissioningMeta + err := utils.ReadJsonFromFile(fname, &comMeta) + if err != nil { + return beamtimeMeta{}, err + } + meta.BeamtimeId = comMeta.Id + meta.Beamline = strings.ToLower(comMeta.Beamline) + meta.OfflinePath = comMeta.OfflinePath + return meta, nil +} + func beamtimeMetaFromMatch(match string) (beamtimeMeta, error) { match = strings.TrimPrefix(match, settings.RootBeamtimesFolder) match = strings.TrimPrefix(match, string(filepath.Separator)) @@ -109,23 +122,43 @@ func findBeamtimeInfoFromId(beamtime_id string) (beamtimeMeta, error) { return beamtimeMeta{}, errors.New("Cannot find beamline for "+beamtime_id) } -func findBeamtimeMetaFromBeamline(beamline string) (beamtimeMeta, error) { +func findMetaFileInFolder(beamline string,iscommissioning bool) (string, string, error){ sep := string(filepath.Separator) - pattern := "beamtime-metadata-*.json" - online_path := settings.CurrentBeamlinesFolder + sep + beamline + sep + "current" - + var pattern,folder string + if !iscommissioning { + pattern = "beamtime-metadata-*.json" + folder = "current" + } else { + pattern = "commissioning-metadata-*.json" + folder = "commissioning" + } + online_path := settings.CurrentBeamlinesFolder + sep + beamline + sep + folder matches, err := filepath.Glob(online_path + sep + pattern) if err != nil { - return beamtimeMeta{}, err + return "","", err } if len(matches) != 1 { - return beamtimeMeta{}, errors.New("more than one beamtime-metadata file in folder") + return "","", errors.New("should be one beamtime-metadata file in folder") } + return matches[0],online_path, nil - meta, err := beamtimeMetaFromJson(matches[0]) +} + +func findBeamtimeMetaFromBeamline(beamline string,iscommissioning bool) (meta beamtimeMeta, err error) { + fName,online_path, err := findMetaFileInFolder(beamline,iscommissioning) if (err != nil) { return beamtimeMeta{}, err } + + if iscommissioning { + meta, err = commissioningMetaFromJson(fName) + } else { + meta, err = beamtimeMetaFromJson(fName) + } + if (err != nil) { + return beamtimeMeta{}, err + } + if meta.BeamtimeId == "" || meta.OfflinePath=="" || meta.Beamline == ""{ return beamtimeMeta{}, errors.New("cannot set meta fields from beamtime file") } @@ -193,19 +226,23 @@ func authorizeByToken(creds SourceCredentials) (accessTypes []string, err error) return checkToken(creds.Token,subject_expect) } +func iscommissioning(beamtime string) bool { + return len(beamtime)>0 && beamtime[0]=='c' +} + func findMeta(creds SourceCredentials) (beamtimeMeta, error) { var err error var meta beamtimeMeta if (creds.BeamtimeId != "auto") { meta, err = findBeamtimeInfoFromId(creds.BeamtimeId) if (err == nil ) { - meta_onilne, err_online := findBeamtimeMetaFromBeamline(meta.Beamline) + meta_onilne, err_online := findBeamtimeMetaFromBeamline(meta.Beamline,iscommissioning(creds.BeamtimeId)) if err_online == nil && meta.BeamtimeId == meta_onilne.BeamtimeId { meta.OnlinePath = meta_onilne.OnlinePath } } } else { - meta, err = findBeamtimeMetaFromBeamline(creds.Beamline) + meta, err = findBeamtimeMetaFromBeamline(creds.Beamline,false) } if creds.Type == "processed" { diff --git a/authorizer/src/asapo_authorizer/server/authorize_test.go b/authorizer/src/asapo_authorizer/server/authorize_test.go index 12268d73dd9d476f46e6a2e187ea3a7b6d381a94..f4e97e788fda426fc463b3019d69d1b857f75925 100644 --- a/authorizer/src/asapo_authorizer/server/authorize_test.go +++ b/authorizer/src/asapo_authorizer/server/authorize_test.go @@ -172,6 +172,17 @@ var beamtime_meta =` } ` +var commissioning_meta =` +{ + "beamline": "P04", + "corePath": "/asap3/petra3/gpfs/p04/2021/commissioning/c20210823_000_MAA", + "generated": "2021-08-23 09:39:09", + "id": "c20210823_000_MAA", + "tag": "MAA" +} +` + + var authTests = [] struct { source_type string beamtime_id string @@ -221,6 +232,10 @@ var authTests = [] struct { `{"beamtimeId":"test","beamline":"bl1","dataSource":"dataSource","corePath":"./tf/gpfs/bl1/2019/data/test","beamline-path":"","source-type":"processed","access-types":["read","write"]}`}, {"processed","test","auto","dataSource", "","127.0.0.2",http.StatusUnauthorized,"processed without token, wrong host", ""}, + {"raw","c20210823_000_MAA","auto","dataSource", "","127.0.0.1",http.StatusOK,"raw type commissioning", + `{"beamtimeId":"c20210823_000_MAA","beamline":"p04","dataSource":"dataSource","corePath":"./tf/gpfs/p04/2019/commissioning/c20210823_000_MAA","beamline-path":"./p04/commissioning","source-type":"raw","access-types":["read","write"]}`}, + {"processed","c20210823_000_MAA","auto","dataSource", "","127.0.0.1",http.StatusOK,"processed type commissioning", + `{"beamtimeId":"c20210823_000_MAA","beamline":"p04","dataSource":"dataSource","corePath":"./tf/gpfs/p04/2019/commissioning/c20210823_000_MAA","beamline-path":"","source-type":"processed","access-types":["read","write"]}`}, } func TestAuthorize(t *testing.T) { @@ -238,11 +253,17 @@ func TestAuthorize(t *testing.T) { os.MkdirAll(filepath.Clean("tf/gpfs/bl1/2019/data/test"), os.ModePerm) os.MkdirAll(filepath.Clean("tf/gpfs/bl1/2019/data/test_online"), os.ModePerm) + os.MkdirAll(filepath.Clean("tf/gpfs/p04/2019/commissioning/c20210823_000_MAA"), os.ModePerm) + os.MkdirAll(filepath.Clean("p07/current"), os.ModePerm) + os.MkdirAll(filepath.Clean("p04/commissioning"), os.ModePerm) os.MkdirAll(filepath.Clean("bl1/current"), os.ModePerm) ioutil.WriteFile(filepath.Clean("p07/current/beamtime-metadata-11111111.json"), []byte(beamtime_meta), 0644) ioutil.WriteFile(filepath.Clean("bl1/current/beamtime-metadata-test_online.json"), []byte(beamtime_meta_online), 0644) + ioutil.WriteFile(filepath.Clean("p04/commissioning/commissioning-metadata-c20210823_000_MAA.json"), []byte(commissioning_meta), 0644) + defer os.RemoveAll("p07") + defer os.RemoveAll("p04") defer os.RemoveAll("tf") defer os.RemoveAll("bl1") @@ -251,6 +272,9 @@ func TestAuthorize(t *testing.T) { if test.beamline == "auto" { bl = "bl1" } + if iscommissioning(test.beamtime_id) && test.beamline == "auto" { + bl = "p04" + } expected_filter:="a3"+bl+"-hosts" if test.dataSource == "noldap" { err := &common.ServerError{utils.StatusServiceUnavailable,""} @@ -327,7 +351,7 @@ var extractBtinfoTests = [] struct { {".",filepath.Clean("tf/gpfs/BeamtimeUsers/2019/data/123"), "bl1.01","123",false}, {".",filepath.Clean("tf/gpfs/state/2019/data/123"), "bl1.01","123",false}, {".",filepath.Clean("tf/gpfs/support/2019/data/123"), "bl1.01","123",false}, - {".",filepath.Clean("petra3/gpfs/p01/2019/comissioning/c20180508-000-COM20181"), "p01","c20180508-000-COM20181",true}, + {".",filepath.Clean("petra3/gpfs/p01/2019/commissioning/c20180508-000-COM20181"), "p01","c20180508-000-COM20181",true}, } func TestGetBeamtimeInfo(t *testing.T) { diff --git a/authorizer/src/asapo_authorizer/server/server.go b/authorizer/src/asapo_authorizer/server/server.go index f55f72f2a388a45784ad0ddf054a805fecd9e325..59d43987d7aafface0687500409b7efdcf0ee2be 100644 --- a/authorizer/src/asapo_authorizer/server/server.go +++ b/authorizer/src/asapo_authorizer/server/server.go @@ -15,6 +15,13 @@ type beamtimeMeta struct { AccessTypes []string `json:"access-types"` } +type commissioningMeta struct { + Id string `json:"id"` + Beamline string `json:"beamline"` + OfflinePath string `json:"corePath"` +} + + type serverSettings struct { Port int LogLevel string