Skip to content
Snippets Groups Projects
Commit f58920e7 authored by Sergey Yakubov's avatar Sergey Yakubov
Browse files

Merge pull request #165 in ASAPO/asapo from feature_ASAPO-141-commissioning-beamtimes to develop

* commit '709d4269':
  add authorization for commissioning beamtimes
parents cde2a371 709d4269
No related branches found
No related tags found
No related merge requests found
## 21.09.0 (in progress)
FEATURES
* Producer API: C client
IMPROVEMENTS
* Allow using ASAPO for commissioning beamtimes
## 21.06.0
FEATURES
......
### 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 |
......@@ -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
......
......@@ -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" {
......
......@@ -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) {
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment