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

add authorization for commissioning beamtimes

parent cde2a371
No related branches found
No related tags found
2 merge requests!165add authorization for commissioning beamtimes,!175Develop
## 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