bec-server 2.9.4__tar.gz → 2.9.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {bec_server-2.9.4 → bec_server-2.9.6}/PKG-INFO +1 -1
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_queue.py +2 -2
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scibec/scibec_connector.py +8 -12
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scibec/scibec_metadata_handler.py +77 -77
- {bec_server-2.9.4 → bec_server-2.9.6}/pyproject.toml +1 -1
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_scan_server_queue.py +19 -0
- bec_server-2.9.6/tests/tests_scihub/conftest.py +49 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scihub/test_scibec_connector.py +6 -25
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scihub/test_scibec_metadata_handler.py +21 -43
- bec_server-2.9.4/tests/tests_scihub/conftest.py +0 -12
- {bec_server-2.9.4 → bec_server-2.9.6}/.gitignore +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/README.md +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/bec_server_utils/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/bec_server_utils/launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/bec_server_utils/service_handler.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/bec_server_utils/subprocess_launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/bec_server_utils/tmux_launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/cli/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/cli/launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/dap_server.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/dap_service.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/dap_service_manager.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/lmfit1d_service.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/cli/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/cli/launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/device_server.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/devices/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/devices/config_update_handler.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/devices/device_serializer.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/devices/devicemanager.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/rpc_mixin.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/tests/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/tests/utils.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/cli/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/cli/launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/default_writer.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/file_writer.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/file_writer_manager.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/merged_dicts.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer_plugins/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer_plugins/cSAXS.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/bec_emitter.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/bluesky_emitter.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/cli/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/cli/launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/emitter.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/scan_bundler.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/cli/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/cli/launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/device_validation.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/errors.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/path_optimization.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_assembler.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_guard.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_manager.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_plugins/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_plugins/otf_scan.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_server.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_stubs.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_worker.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scans.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/tests/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/tests/fixtures.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/tests/utils.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/cli/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/cli/launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/repeated_timer.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scibec/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scibec/config_handler.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scihub.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scilog/__init__.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scilog/scilog.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_bec_server_utils/test_main.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_bec_server_utils/test_service_handler.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_bec_server_utils/test_tmux_launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_data_processing/conftest.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_data_processing/test_dap_cli_launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_data_processing/test_dap_server.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_data_processing/test_dap_service_manager.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_data_processing/test_lmfit1d_service.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/conftest.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/test_config_handler.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/test_device_manager_ds.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/test_device_serializer.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/test_device_server.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/test_device_server_cli_launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/test_rpc_mixin.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_file_writer/conftest.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_file_writer/test_file_writer.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_file_writer/test_file_writer_cli_launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_file_writer/test_file_writer_manager.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_bundler/conftest.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_bundler/test_bec_emitter.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_bundler/test_bluesky_emitter.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_bundler/test_emitter.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_bundler/test_scan_bundler.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_bundler/test_scan_bundler_cli_launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/conftest.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_path_optimization.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_scan_guard.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_scan_server_cli_launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_scan_stubs.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_scan_worker.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_scans.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scihub/test_repeated_timer.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scihub/test_scibec_config_handler.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scihub/test_scihub_cli_launch.py +0 -0
- {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scihub/test_scilog_connector.py +0 -0
|
@@ -224,8 +224,8 @@ class QueueManager:
|
|
|
224
224
|
return None
|
|
225
225
|
return self.queues[queue].queue[0].active_request_block.scan_id
|
|
226
226
|
|
|
227
|
-
def _wait_for_queue_to_appear_in_history(self, scan_id, queue):
|
|
228
|
-
timeout_time =
|
|
227
|
+
def _wait_for_queue_to_appear_in_history(self, scan_id, queue, timeout=10):
|
|
228
|
+
timeout_time = timeout
|
|
229
229
|
elapsed_time = 0
|
|
230
230
|
while True:
|
|
231
231
|
if elapsed_time > timeout_time:
|
|
@@ -3,6 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import os
|
|
4
4
|
from typing import TYPE_CHECKING
|
|
5
5
|
|
|
6
|
+
import py_scibec
|
|
6
7
|
from dotenv import dotenv_values
|
|
7
8
|
from py_scibec import SciBecCore
|
|
8
9
|
|
|
@@ -176,29 +177,24 @@ class SciBecConnector:
|
|
|
176
177
|
self.scibec.login(username=self.ingestor, password=self.ingestor_secret)
|
|
177
178
|
|
|
178
179
|
def _update_experiment_info(self):
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if not beamline_info.body:
|
|
180
|
+
bl_filter = py_scibec.bec.BeamlineFilterWhere(where={"name": self.target_bl})
|
|
181
|
+
beamline_info = self.scibec.beamline.beamline_controller_find(bl_filter)
|
|
182
|
+
if not beamline_info:
|
|
183
183
|
raise SciBecConnectorError(f"Could not find a beamline with the name {self.target_bl}")
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
experiment_id = beamline_info.get("activeExperiment")
|
|
184
|
+
self.scibec_info["beamline"] = beamline_info[0]
|
|
185
|
+
experiment_id = beamline_info[0].active_experiment
|
|
187
186
|
|
|
188
187
|
if not experiment_id:
|
|
189
188
|
raise SciBecConnectorError(f"Could not find an active experiment on {self.target_bl}")
|
|
190
189
|
|
|
191
|
-
experiment = self.scibec.experiment.experiment_controller_find_by_id(
|
|
192
|
-
path_params={"id": experiment_id}
|
|
193
|
-
)
|
|
190
|
+
experiment = self.scibec.experiment.experiment_controller_find_by_id(experiment_id)
|
|
194
191
|
|
|
195
192
|
if not experiment:
|
|
196
193
|
raise SciBecConnectorError(f"Could not find an experiment with the id {experiment_id}")
|
|
197
|
-
experiment = experiment.body
|
|
198
194
|
self.scibec_info["activeExperiment"] = experiment
|
|
199
195
|
|
|
200
196
|
def _update_eaccount_in_redis(self):
|
|
201
|
-
write_account = self.scibec_info["activeExperiment"]
|
|
197
|
+
write_account = self.scibec_info["activeExperiment"].write_account
|
|
202
198
|
if write_account[0] == "p":
|
|
203
199
|
write_account = write_account.replace("p", "e")
|
|
204
200
|
msg = messages.VariableMessage(value=write_account)
|
|
@@ -5,6 +5,8 @@ import time
|
|
|
5
5
|
from typing import TYPE_CHECKING, Any
|
|
6
6
|
|
|
7
7
|
import numpy as np
|
|
8
|
+
import py_scibec
|
|
9
|
+
import py_scibec_openapi_client.models as py_scibec_models
|
|
8
10
|
|
|
9
11
|
from bec_lib import MessageEndpoints, bec_logger
|
|
10
12
|
from bec_lib.serialization import json_ext
|
|
@@ -67,59 +69,60 @@ class SciBecMetadataHandler:
|
|
|
67
69
|
if not scibec:
|
|
68
70
|
return
|
|
69
71
|
scibec_info = self.scibec_connector.scibec_info
|
|
70
|
-
experiment_id = scibec_info["activeExperiment"]
|
|
72
|
+
experiment_id = scibec_info["activeExperiment"].id
|
|
71
73
|
# session_id = scibec_info["activeSession"][0]["id"]
|
|
72
74
|
# experiment_id = scibec_info["activeSession"][0]["experimentId"]
|
|
73
75
|
logger.debug(f"Received new scan status {msg}")
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
).body
|
|
76
|
+
scan_filter = py_scibec.bec.ScanFilterWhere(where={"scanId": msg.content["scan_id"]})
|
|
77
|
+
scan = scibec.scan.scan_controller_find(scan_filter)
|
|
77
78
|
if not scan:
|
|
78
79
|
info = msg.content["info"]
|
|
79
80
|
dataset_number = info.get("dataset_number")
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
).body
|
|
81
|
+
dataset_filter = py_scibec.bec.DatasetFilterWhere(
|
|
82
|
+
where={"number": dataset_number, "experimentId": experiment_id}
|
|
83
|
+
)
|
|
84
|
+
dataset = scibec.dataset.dataset_controller_find(dataset_filter)
|
|
85
85
|
if dataset:
|
|
86
86
|
dataset = dataset[0]
|
|
87
87
|
else:
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
).body
|
|
88
|
+
new_dataset = py_scibec.bec.NewDataset(
|
|
89
|
+
**{
|
|
90
|
+
"readACL": scibec_info["activeExperiment"].read_acl,
|
|
91
|
+
"writeACL": scibec_info["activeExperiment"].read_acl,
|
|
92
|
+
"owner": scibec_info["activeExperiment"].owner,
|
|
93
|
+
"number": dataset_number,
|
|
94
|
+
"experimentId": experiment_id,
|
|
95
|
+
"name": info.get("dataset_name", ""),
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
dataset = scibec.dataset.dataset_controller_create(new_dataset)
|
|
100
99
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
100
|
+
new_scan = py_scibec.bec.NewScan(
|
|
101
|
+
**{
|
|
102
|
+
"readACL": scibec_info["activeExperiment"].read_acl,
|
|
103
|
+
"writeACL": scibec_info["activeExperiment"].read_acl,
|
|
104
|
+
"owner": scibec_info["activeExperiment"].owner,
|
|
105
|
+
"scanType": info.get("scan_name", ""),
|
|
106
|
+
"scanId": info.get("scan_id", ""),
|
|
107
|
+
"queueId": info.get("queue_id", ""),
|
|
108
|
+
"requestId": info.get("RID", ""),
|
|
109
|
+
"exitStatus": msg.content["status"],
|
|
110
|
+
# "queue": info.get("stream", ""),
|
|
111
|
+
"metadata": info,
|
|
112
|
+
# "sessionId": session_id,
|
|
113
|
+
"datasetId": dataset.id,
|
|
114
|
+
"scanNumber": info.get("scan_number", 0),
|
|
115
|
+
}
|
|
116
|
+
)
|
|
117
|
+
scan = scibec.scan.scan_controller_create(new_scan)
|
|
117
118
|
# scan = scibec.add_scan(scan_data)
|
|
118
119
|
else:
|
|
119
120
|
info = msg.content["info"]
|
|
120
121
|
scan = scibec.scan.scan_controller_update_by_id(
|
|
121
|
-
|
|
122
|
-
|
|
122
|
+
id=scan[0].id,
|
|
123
|
+
scan_partial=py_scibec.bec.ScanPartial(
|
|
124
|
+
metadata=info, exitStatus=msg.content["status"]
|
|
125
|
+
),
|
|
123
126
|
)
|
|
124
127
|
return scan
|
|
125
128
|
|
|
@@ -174,9 +177,8 @@ class SciBecMetadataHandler:
|
|
|
174
177
|
scibec = self.scibec_connector.scibec
|
|
175
178
|
if not scibec:
|
|
176
179
|
return
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
).body
|
|
180
|
+
scan_filter = py_scibec.bec.ScanFilterWhere(where={"scanId": data["metadata"]["scan_id"]})
|
|
181
|
+
scan = scibec.scan.scan_controller_find(scan_filter)
|
|
180
182
|
if not scan:
|
|
181
183
|
logger.warning(
|
|
182
184
|
f"Could not find scan with scan_id {data['metadata']['scan_id']}. Cannot write scan"
|
|
@@ -195,24 +197,24 @@ class SciBecMetadataHandler:
|
|
|
195
197
|
)
|
|
196
198
|
self._write_scan_data_chunks(file_path, data_bec, scan)
|
|
197
199
|
else:
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
"data": data_bec,
|
|
208
|
-
}
|
|
209
|
-
)
|
|
200
|
+
new_scan_data = py_scibec.bec.NewScanData(
|
|
201
|
+
**{
|
|
202
|
+
"readACL": scan.read_acl,
|
|
203
|
+
"writeACL": scan.read_acl,
|
|
204
|
+
"owner": scan.owner,
|
|
205
|
+
"scanId": scan.id,
|
|
206
|
+
"filePath": file_path,
|
|
207
|
+
"data": data_bec,
|
|
208
|
+
}
|
|
210
209
|
)
|
|
210
|
+
scibec.scan_data.scan_data_controller_create_many(new_scan_data)
|
|
211
211
|
logger.info(
|
|
212
212
|
f"Wrote scan data to SciBec for scan_id {data['metadata']['scan_id']} in {time.time() - start} seconds."
|
|
213
213
|
)
|
|
214
214
|
|
|
215
|
-
def _write_scan_data_chunks(
|
|
215
|
+
def _write_scan_data_chunks(
|
|
216
|
+
self, file_path: str, data_bec: dict, scan: py_scibec_models.ScanWithRelations
|
|
217
|
+
):
|
|
216
218
|
"""
|
|
217
219
|
Write the scan data to SciBec in chunks. This method is called if the scan data is larger
|
|
218
220
|
than 1 MB. The method loops through all keys in the data dictionary and creates chunks of
|
|
@@ -234,35 +236,33 @@ class SciBecMetadataHandler:
|
|
|
234
236
|
)
|
|
235
237
|
continue
|
|
236
238
|
if len(json.dumps(chunk)) + len(json.dumps({key: value})) > self.MAX_DATA_SIZE:
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
}
|
|
247
|
-
)
|
|
239
|
+
new_scan_data = py_scibec.bec.NewScanData(
|
|
240
|
+
**{
|
|
241
|
+
"readACL": scan.read_acl,
|
|
242
|
+
"writeACL": scan.read_acl,
|
|
243
|
+
"owner": scan.owner,
|
|
244
|
+
"scanId": scan.id,
|
|
245
|
+
"filePath": file_path,
|
|
246
|
+
"data": chunk,
|
|
247
|
+
}
|
|
248
248
|
)
|
|
249
|
+
scibec.scan_data.scan_data_controller_create_many(new_scan_data)
|
|
249
250
|
chunk = {}
|
|
250
251
|
chunk[key] = value
|
|
251
252
|
|
|
252
253
|
# Write the last chunk
|
|
253
254
|
if chunk:
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
}
|
|
264
|
-
)
|
|
255
|
+
new_scan_data = py_scibec.bec.NewScanData(
|
|
256
|
+
**{
|
|
257
|
+
"readACL": scan.read_acl,
|
|
258
|
+
"writeACL": scan.read_acl,
|
|
259
|
+
"owner": scan.owner,
|
|
260
|
+
"scanId": scan.id,
|
|
261
|
+
"filePath": file_path,
|
|
262
|
+
"data": chunk,
|
|
263
|
+
}
|
|
265
264
|
)
|
|
265
|
+
scibec.scan_data.scan_data_controller_create_many(new_scan_data)
|
|
266
266
|
|
|
267
267
|
def shutdown(self):
|
|
268
268
|
"""
|
|
@@ -397,6 +397,25 @@ def test_scan_queue_next_instruction_queue_does_not_pop(queuemanager_mock):
|
|
|
397
397
|
assert len(queue.queue) == 1
|
|
398
398
|
|
|
399
399
|
|
|
400
|
+
def test_queue_manager_wait_for_queue_to_appear_in_history_raises_timeout(queuemanager_mock):
|
|
401
|
+
queue_manager = queuemanager_mock()
|
|
402
|
+
with pytest.raises(TimeoutError):
|
|
403
|
+
queue_manager._wait_for_queue_to_appear_in_history("scan_id", "primary", timeout=0.5)
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def test_queue_manager_wait_for_queue_to_appear_in_history(queuemanager_mock):
|
|
407
|
+
queue_manager = queuemanager_mock()
|
|
408
|
+
scan_queue = ScanQueue(queue_manager, InstructionQueueMock)
|
|
409
|
+
instruction_queue = InstructionQueueItem(scan_queue, mock.MagicMock(), mock.MagicMock())
|
|
410
|
+
request_queue = RequestBlockQueue(instruction_queue, mock.MagicMock())
|
|
411
|
+
request_block = RequestBlock(mock.MagicMock(), mock.MagicMock(), request_queue)
|
|
412
|
+
request_block.scan_id = "scan_id"
|
|
413
|
+
request_queue.request_blocks.append(request_block)
|
|
414
|
+
instruction_queue.queue = request_queue
|
|
415
|
+
queue_manager.queues["primary"].history_queue.append(instruction_queue)
|
|
416
|
+
queue_manager._wait_for_queue_to_appear_in_history("scan_id", "primary", timeout=0.5)
|
|
417
|
+
|
|
418
|
+
|
|
400
419
|
class RequestBlockMock(RequestBlock):
|
|
401
420
|
def __init__(self, msg, scan_id) -> None:
|
|
402
421
|
self.scan_id = scan_id
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from py_scibec_openapi_client.models.beamline_with_relations import BeamlineWithRelations
|
|
3
|
+
from py_scibec_openapi_client.models.dataset_with_relations import DatasetWithRelations
|
|
4
|
+
from py_scibec_openapi_client.models.experiment_with_relations import ExperimentWithRelations
|
|
5
|
+
from py_scibec_openapi_client.models.scan_with_relations import ScanWithRelations
|
|
6
|
+
|
|
7
|
+
from bec_lib import bec_logger
|
|
8
|
+
|
|
9
|
+
# overwrite threads_check fixture from bec_lib,
|
|
10
|
+
# to have it in autouse
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@pytest.fixture(autouse=True)
|
|
14
|
+
def threads_check(threads_check):
|
|
15
|
+
yield
|
|
16
|
+
bec_logger.logger.remove()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@pytest.fixture()
|
|
20
|
+
def active_experiment():
|
|
21
|
+
return ExperimentWithRelations(
|
|
22
|
+
name="dummy_experiment",
|
|
23
|
+
writeAccount="p12345",
|
|
24
|
+
id="dummy_experiment_id",
|
|
25
|
+
beamlineId="dummy_id",
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@pytest.fixture()
|
|
30
|
+
def beamline_document():
|
|
31
|
+
return BeamlineWithRelations(
|
|
32
|
+
name="dummy_bl", activeExperiment="dummy_experiment", id="dummy_id"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@pytest.fixture()
|
|
37
|
+
def dataset_document():
|
|
38
|
+
return DatasetWithRelations(name="dummy_dataset", id="dummy_id")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@pytest.fixture()
|
|
42
|
+
def scan_document():
|
|
43
|
+
return ScanWithRelations(
|
|
44
|
+
name="dummy_scan",
|
|
45
|
+
id="dummy_id",
|
|
46
|
+
readACL=["readACL"],
|
|
47
|
+
writeACL=["writeACL"],
|
|
48
|
+
owner=["owner"],
|
|
49
|
+
)
|
|
@@ -3,7 +3,6 @@ from unittest import mock
|
|
|
3
3
|
import pytest
|
|
4
4
|
|
|
5
5
|
from bec_lib import MessageEndpoints, ServiceConfig, messages
|
|
6
|
-
from bec_lib.logger import bec_logger
|
|
7
6
|
from bec_lib.messages import BECStatus
|
|
8
7
|
from bec_lib.tests.utils import ConnectorMock
|
|
9
8
|
from bec_server.scihub import SciHub
|
|
@@ -114,36 +113,18 @@ def test_scibec_connect_to_scibec(SciBecMock):
|
|
|
114
113
|
mock_update_eaccount_in_redis.assert_called_once()
|
|
115
114
|
|
|
116
115
|
|
|
117
|
-
|
|
118
|
-
def __init__(self, body):
|
|
119
|
-
self.body = body
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
def test_scibec_update_experiment_info(SciBecMock):
|
|
116
|
+
def test_scibec_update_experiment_info(SciBecMock, active_experiment, beamline_document):
|
|
123
117
|
with mock.patch.object(SciBecMock, "scibec") as mock_scibec:
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
"id": "dummy_id",
|
|
128
|
-
}
|
|
129
|
-
mock_scibec.beamline.beamline_controller_find.return_value = ServerResponseMock(
|
|
130
|
-
(beamline_document,)
|
|
131
|
-
)
|
|
132
|
-
experiment_document = {
|
|
133
|
-
"name": "dummy_experiment",
|
|
134
|
-
"writeAccount": "dummy_write_account",
|
|
135
|
-
"id": "dummy_experiment_id",
|
|
136
|
-
}
|
|
137
|
-
mock_scibec.experiment.experiment_controller_find_by_id.return_value = ServerResponseMock(
|
|
138
|
-
experiment_document
|
|
139
|
-
)
|
|
118
|
+
mock_scibec.beamline.beamline_controller_find.return_value = (beamline_document,)
|
|
119
|
+
experiment_document = active_experiment
|
|
120
|
+
mock_scibec.experiment.experiment_controller_find_by_id.return_value = experiment_document
|
|
140
121
|
SciBecMock._update_experiment_info()
|
|
141
122
|
assert SciBecMock.scibec_info["activeExperiment"] == experiment_document
|
|
142
123
|
assert SciBecMock.scibec_info["beamline"] == beamline_document
|
|
143
124
|
|
|
144
125
|
|
|
145
|
-
def test_update_eaccount_in_redis(SciBecMock):
|
|
146
|
-
SciBecMock.scibec_info = {"activeExperiment":
|
|
126
|
+
def test_update_eaccount_in_redis(SciBecMock, active_experiment):
|
|
127
|
+
SciBecMock.scibec_info = {"activeExperiment": active_experiment}
|
|
147
128
|
with mock.patch.object(SciBecMock, "connector") as mock_connector:
|
|
148
129
|
SciBecMock._update_eaccount_in_redis()
|
|
149
130
|
mock_connector.set.assert_called_once_with(
|
|
@@ -2,6 +2,7 @@ from unittest import mock
|
|
|
2
2
|
|
|
3
3
|
import numpy as np
|
|
4
4
|
import pytest
|
|
5
|
+
from py_scibec_openapi_client.models import NewScanData, ScanPartial
|
|
5
6
|
|
|
6
7
|
from bec_lib import messages
|
|
7
8
|
from bec_lib.redis_connector import MessageObject
|
|
@@ -46,48 +47,33 @@ def test_update_scan_status_returns_without_scibec(md_handler):
|
|
|
46
47
|
md_handler.update_scan_status(msg)
|
|
47
48
|
|
|
48
49
|
|
|
49
|
-
def test_update_scan_status(md_handler):
|
|
50
|
+
def test_update_scan_status(md_handler, active_experiment, dataset_document):
|
|
50
51
|
# pylint: disable=protected-access
|
|
51
52
|
msg = messages.ScanStatusMessage(scan_id="scan_id", status="open", info={"dataset_number": 12})
|
|
52
53
|
scibec = mock.Mock()
|
|
53
54
|
md_handler.scibec_connector.scibec = scibec
|
|
54
|
-
scibec_info = {
|
|
55
|
-
"activeExperiment": {
|
|
56
|
-
"id": "id",
|
|
57
|
-
"readACL": ["readACL"],
|
|
58
|
-
"writeACL": ["writeACL"],
|
|
59
|
-
"owner": "owner",
|
|
60
|
-
}
|
|
61
|
-
}
|
|
55
|
+
scibec_info = {"activeExperiment": active_experiment}
|
|
62
56
|
md_handler.scibec_connector.scibec_info = scibec_info
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return_value={"id": "id"}
|
|
67
|
-
)
|
|
57
|
+
scibec.scan.scan_controller_find = mock.MagicMock(return_value=[])
|
|
58
|
+
scibec.dataset.dataset_controller_find = mock.MagicMock(return_value=[])
|
|
59
|
+
scibec.dataset.dataset_controller_create = mock.MagicMock(return_value=dataset_document)
|
|
68
60
|
md_handler.update_scan_status(msg)
|
|
69
61
|
|
|
70
62
|
|
|
71
|
-
def test_update_scan_status_patch(md_handler):
|
|
63
|
+
def test_update_scan_status_patch(md_handler, active_experiment, scan_document):
|
|
72
64
|
# pylint: disable=protected-access
|
|
73
65
|
msg = messages.ScanStatusMessage(
|
|
74
66
|
scan_id="scan_id", status="closed", info={"dataset_number": 12}
|
|
75
67
|
)
|
|
76
68
|
scibec = mock.Mock()
|
|
77
69
|
md_handler.scibec_connector.scibec = scibec
|
|
78
|
-
scibec_info = {
|
|
79
|
-
"activeExperiment": {
|
|
80
|
-
"id": "id",
|
|
81
|
-
"readACL": ["readACL"],
|
|
82
|
-
"writeACL": ["writeACL"],
|
|
83
|
-
"owner": "owner",
|
|
84
|
-
}
|
|
85
|
-
}
|
|
70
|
+
scibec_info = {"activeExperiment": active_experiment}
|
|
86
71
|
md_handler.scibec_connector.scibec_info = scibec_info
|
|
87
|
-
|
|
72
|
+
scibec.scan.scan_controller_find = mock.MagicMock(return_value=[scan_document])
|
|
88
73
|
md_handler.update_scan_status(msg)
|
|
89
74
|
scibec.scan.scan_controller_update_by_id.assert_called_once_with(
|
|
90
|
-
|
|
75
|
+
id="dummy_id",
|
|
76
|
+
scan_partial=ScanPartial(exit_status="closed", metadata={"dataset_number": 12}),
|
|
91
77
|
)
|
|
92
78
|
|
|
93
79
|
|
|
@@ -124,31 +110,27 @@ def test_update_scan_data_without_scan(md_handler):
|
|
|
124
110
|
# pylint: disable=protected-access
|
|
125
111
|
scibec = mock.Mock()
|
|
126
112
|
md_handler.scibec_connector.scibec = scibec
|
|
127
|
-
|
|
113
|
+
scibec.scan.scan_controller_find = mock.MagicMock(return_value=[])
|
|
128
114
|
md_handler.update_scan_data(
|
|
129
115
|
file_path="my_file.h5", data={"data": {}, "metadata": {"scan_id": "scan_id"}}
|
|
130
116
|
)
|
|
131
117
|
|
|
132
118
|
|
|
133
|
-
def test_update_scan_data(md_handler):
|
|
119
|
+
def test_update_scan_data(md_handler, scan_document):
|
|
134
120
|
# pylint: disable=protected-access
|
|
135
121
|
scibec = mock.Mock()
|
|
136
122
|
md_handler.scibec_connector.scibec = scibec
|
|
137
|
-
|
|
138
|
-
return_value=[
|
|
139
|
-
{"id": "id", "readACL": ["readACL"], "writeACL": ["writeACL"], "owner": "owner"}
|
|
140
|
-
]
|
|
141
|
-
)
|
|
123
|
+
scibec.scan.scan_controller_find = mock.MagicMock(return_value=[scan_document])
|
|
142
124
|
md_handler.update_scan_data(
|
|
143
125
|
file_path="my_file.h5", data={"data": {}, "metadata": {"scan_id": "scan_id"}}
|
|
144
126
|
)
|
|
145
127
|
scibec.scan_data.scan_data_controller_create_many.assert_called_once_with(
|
|
146
|
-
|
|
128
|
+
NewScanData(
|
|
147
129
|
**{
|
|
148
|
-
"readACL": "readACL",
|
|
149
|
-
"writeACL": "readACL",
|
|
150
|
-
"owner": "owner",
|
|
151
|
-
"scanId": "
|
|
130
|
+
"readACL": ["readACL"],
|
|
131
|
+
"writeACL": ["readACL"],
|
|
132
|
+
"owner": ["owner"],
|
|
133
|
+
"scanId": "dummy_id",
|
|
152
134
|
"filePath": "my_file.h5",
|
|
153
135
|
"data": {"data": {}, "metadata": {"scan_id": "scan_id"}},
|
|
154
136
|
}
|
|
@@ -156,16 +138,12 @@ def test_update_scan_data(md_handler):
|
|
|
156
138
|
)
|
|
157
139
|
|
|
158
140
|
|
|
159
|
-
def test_update_scan_data_exceeding_limit(md_handler):
|
|
141
|
+
def test_update_scan_data_exceeding_limit(md_handler, scan_document):
|
|
160
142
|
# pylint: disable=protected-access
|
|
161
143
|
scibec = mock.Mock()
|
|
162
144
|
md_handler.MAX_DATA_SIZE = 1000
|
|
163
145
|
md_handler.scibec_connector.scibec = scibec
|
|
164
|
-
|
|
165
|
-
return_value=[
|
|
166
|
-
{"id": "id", "readACL": ["readACL"], "writeACL": ["writeACL"], "owner": "owner"}
|
|
167
|
-
]
|
|
168
|
-
)
|
|
146
|
+
scibec.scan.scan_controller_find = mock.MagicMock(return_value=[scan_document])
|
|
169
147
|
data_block = {f"key_{i}": {"signal": list(range(100))} for i in range(10)}
|
|
170
148
|
data_block.update({"metadata": {"scan_id": "scan_id"}})
|
|
171
149
|
md_handler.update_scan_data(file_path="my_file.h5", data=data_block)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/devices/config_update_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_data_processing/test_dap_service_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/test_device_server_cli_launch.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_file_writer/test_file_writer_cli_launch.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_bundler/test_scan_bundler_cli_launch.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_scan_server_cli_launch.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|