From f58e4f73e85b2d084fc7403fde5cfeb3b538ed2b Mon Sep 17 00:00:00 2001 From: Dan Hatton Date: Wed, 3 Sep 2025 15:21:41 +0100 Subject: [PATCH 1/4] explcitly provide tokens to interactions from the instrument server to the server to avoid confusion --- src/murfey/client/analyser.py | 30 +++++++++++----- src/murfey/client/context.py | 3 +- src/murfey/client/contexts/atlas.py | 5 +-- src/murfey/client/contexts/clem.py | 8 +++-- src/murfey/client/contexts/fib.py | 5 +-- src/murfey/client/contexts/spa.py | 12 +++++-- src/murfey/client/contexts/spa_metadata.py | 9 +++-- src/murfey/client/contexts/tomo.py | 15 ++++++-- src/murfey/client/contexts/tomo_metadata.py | 21 ++++++++---- src/murfey/client/multigrid_control.py | 23 +++++++++++++ src/murfey/client/tui/app.py | 22 ++++++++++++ src/murfey/client/tui/main.py | 5 +++ src/murfey/client/tui/screens.py | 23 +++++++++++++ src/murfey/util/client.py | 38 +++++++++------------ 14 files changed, 170 insertions(+), 49 deletions(-) diff --git a/src/murfey/client/analyser.py b/src/murfey/client/analyser.py index 5fbc4bd26..88846e3c3 100644 --- a/src/murfey/client/analyser.py +++ b/src/murfey/client/analyser.py @@ -34,6 +34,7 @@ class Analyser(Observer): def __init__( self, basepath_local: Path, + token: str, environment: MurfeyInstanceEnvironment | None = None, force_mdoc_metadata: bool = False, limited: bool = False, @@ -49,6 +50,7 @@ def __init__( self._batch_store: dict = {} self._environment = environment self._force_mdoc_metadata = force_mdoc_metadata + self._token = token self.parameters_model: ( Type[ProcessingParametersSPA] | Type[ProcessingParametersTomo] | None ) = None @@ -123,7 +125,7 @@ def _find_context(self, file_path: Path) -> bool: # CLEM workflow checks # Look for LIF and XLIF files if file_path.suffix in (".lif", ".xlif"): - self._context = CLEMContext("leica", self._basepath) + self._context = CLEMContext("leica", self._basepath, self._token) return True # Look for TIFF files associated with CLEM workflow # Leica's autosave mode seems to name the TIFFs in the format @@ -131,16 +133,16 @@ def _find_context(self, file_path: Path) -> bool: if all( pattern in file_path.name for pattern in ("--Z", "--C") ) and file_path.suffix in (".tiff", ".tif"): - self._context = CLEMContext("leica", self._basepath) + self._context = CLEMContext("leica", self._basepath, self._token) return True # Tomography and SPA workflow checks if "atlas" in file_path.parts: - self._context = AtlasContext("epu", self._basepath) + self._context = AtlasContext("epu", self._basepath, self._token) return True if "Metadata" in file_path.parts or file_path.name == "EpuSession.dm": - self._context = SPAMetadataContext("epu", self._basepath) + self._context = SPAMetadataContext("epu", self._basepath, self._token) return True elif ( "Batch" in file_path.parts @@ -148,7 +150,9 @@ def _find_context(self, file_path: Path) -> bool: or "Thumbnails" in file_path.parts or file_path.name == "Session.dm" ): - self._context = TomographyMetadataContext("tomo", self._basepath) + self._context = TomographyMetadataContext( + "tomo", self._basepath, self._token + ) return True split_file_stem = file_path.stem.split("_") @@ -164,7 +168,9 @@ def _find_context(self, file_path: Path) -> bool: ]: if not self._context: logger.info("Acquisition software: EPU") - self._context = SPAModularContext("epu", self._basepath) + self._context = SPAModularContext( + "epu", self._basepath, self._token + ) self.parameters_model = ProcessingParametersSPA return True @@ -178,7 +184,9 @@ def _find_context(self, file_path: Path) -> bool: ): if not self._context: logger.info("Acquisition software: tomo") - self._context = TomographyContext("tomo", self._basepath) + self._context = TomographyContext( + "tomo", self._basepath, self._token + ) self.parameters_model = ProcessingParametersTomo return True return False @@ -213,14 +221,18 @@ def _analyse(self): or transferred_file.name == "EpuSession.dm" and not self._context ): - self._context = SPAMetadataContext("epu", self._basepath) + self._context = SPAMetadataContext( + "epu", self._basepath, self._token + ) elif ( "Batch" in transferred_file.parts or "SearchMaps" in transferred_file.parts or transferred_file.name == "Session.dm" and not self._context ): - self._context = TomographyMetadataContext("tomo", self._basepath) + self._context = TomographyMetadataContext( + "tomo", self._basepath, self._token + ) self.post_transfer(transferred_file) else: dc_metadata = {} diff --git a/src/murfey/client/context.py b/src/murfey/client/context.py index 14ec8553f..51c525b8e 100644 --- a/src/murfey/client/context.py +++ b/src/murfey/client/context.py @@ -36,8 +36,9 @@ class Context: user_params: List[ProcessingParameter] = [] metadata_params: List[ProcessingParameter] = [] - def __init__(self, name: str, acquisition_software: str): + def __init__(self, name: str, acquisition_software: str, token: str): self._acquisition_software = acquisition_software + self._token = token self.name = name self.data_collection_parameters: dict = {} diff --git a/src/murfey/client/contexts/atlas.py b/src/murfey/client/contexts/atlas.py index e0a85d3c9..22bceefc3 100644 --- a/src/murfey/client/contexts/atlas.py +++ b/src/murfey/client/contexts/atlas.py @@ -12,8 +12,8 @@ class AtlasContext(Context): - def __init__(self, acquisition_software: str, basepath: Path): - super().__init__("Atlas", acquisition_software) + def __init__(self, acquisition_software: str, basepath: Path, token: str): + super().__init__("Atlas", acquisition_software, token) self._basepath = basepath def post_transfer( @@ -42,6 +42,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="session_control.spa_router", function_name="make_atlas_jpg", + token=self._token, session_id=environment.murfey_session, data={"path": str(transferred_atlas_name)}, ) diff --git a/src/murfey/client/contexts/clem.py b/src/murfey/client/contexts/clem.py index 7a634c09e..e9908b638 100644 --- a/src/murfey/client/contexts/clem.py +++ b/src/murfey/client/contexts/clem.py @@ -89,8 +89,8 @@ def _find_elements_recursively( class CLEMContext(Context): - def __init__(self, acquisition_software: str, basepath: Path): - super().__init__("CLEM", acquisition_software) + def __init__(self, acquisition_software: str, basepath: Path, token: str): + super().__init__("CLEM", acquisition_software, token) self._basepath = basepath # CLEM contexts for "auto-save" acquisition mode self._tiff_series: Dict[str, List[str]] = {} # {Series name : TIFF path list} @@ -356,6 +356,7 @@ def register_lif_file( base_url=str(environment.url.geturl()), router_name="clem.router", function_name="register_lif_file", + token=self._token, session_id=environment.murfey_session, data={"lif_file": quote(str(lif_file), safe="")}, ) @@ -381,6 +382,7 @@ def process_lif_file( base_url=str(environment.url.geturl()), router_name="clem.router", function_name="process_raw_lifs", + token=self._token, session_id=environment.murfey_session, data={"lif_file": quote(str(lif_file), safe="")}, ) @@ -404,6 +406,7 @@ def register_tiff_file( base_url=str(environment.url.geturl()), router_name="clem.router", function_name="register_tiff_file", + token=self._token, session_id=environment.murfey_session, data={"tiff_file": quote(str(tiff_file), safe="")}, ) @@ -429,6 +432,7 @@ def process_tiff_series( base_url=str(environment.url.geturl()), router_name="clem.router", function_name="process_raw_tiffs", + token=self._token, session_id=environment.murfey_session, data=tiff_dataset, ) diff --git a/src/murfey/client/contexts/fib.py b/src/murfey/client/contexts/fib.py index 3e3d4f4a5..892a32fb8 100644 --- a/src/murfey/client/contexts/fib.py +++ b/src/murfey/client/contexts/fib.py @@ -32,8 +32,8 @@ def _number_from_name(name: str) -> int: class FIBContext(Context): - def __init__(self, acquisition_software: str, basepath: Path): - super().__init__("FIB", acquisition_software) + def __init__(self, acquisition_software: str, basepath: Path, token: str): + super().__init__("FIB", acquisition_software, token) self._basepath = basepath self._milling: Dict[int, List[MillingProgress]] = {} self._lamellae: Dict[int, Lamella] = {} @@ -95,6 +95,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="workflow.correlative_router", function_name="make_gif", + token=self._token, year=datetime.now().year, visit_name=environment.visit, session_id=environment.murfey_session, diff --git a/src/murfey/client/contexts/spa.py b/src/murfey/client/contexts/spa.py index 7b5d52ea4..56ddabbfb 100644 --- a/src/murfey/client/contexts/spa.py +++ b/src/murfey/client/contexts/spa.py @@ -111,8 +111,8 @@ class SPAModularContext(Context): ProcessingParameter("motion_corr_binning", "Motion Correction Binning"), ] - def __init__(self, acquisition_software: str, basepath: Path): - super().__init__("SPA", acquisition_software) + def __init__(self, acquisition_software: str, basepath: Path, token: str): + super().__init__("SPA", acquisition_software, token) self._basepath = basepath self._processing_job_stash: dict = {} self._foil_holes: Dict[int, List[int]] = {} @@ -229,6 +229,7 @@ def gather_metadata( base_url=str(environment.url.geturl()), router_name="session_control.router", function_name="machine_info_by_instrument", + token=self._token, instrument_name=environment.instrument_name, ) if server_config_response is None: @@ -302,6 +303,7 @@ def _position_analysis( base_url=str(environment.url.geturl()), router_name="session_info.router", function_name="get_dc_groups", + token=self._token, session_id=environment.murfey_session, ) .json() @@ -347,6 +349,7 @@ def _position_analysis( base_url=str(environment.url.geturl()), router_name="session_control.spa_router", function_name="register_grid_square", + token=self._token, session_id=environment.murfey_session, gsid=grid_square, data={ @@ -393,6 +396,7 @@ def _position_analysis( base_url=str(environment.url.geturl()), router_name="session_control.spa_router", function_name="register_foil_hole", + token=self._token, session_id=environment.murfey_session, gs_name=grid_square, data={ @@ -416,6 +420,7 @@ def _position_analysis( base_url=str(environment.url.geturl()), router_name="session_control.spa_router", function_name="register_foil_hole", + token=self._token, session_id=environment.murfey_session, gs_name=grid_square, data={ @@ -477,6 +482,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="session_control.router", function_name="count_number_of_movies", + token=self._token, ) if movie_counts_get is not None: environment.movie_counters[str(source)] = count( @@ -493,6 +499,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="file_io_instrument.router", function_name="write_eer_fractionation_file", + token=self._token, visit_name=environment.visit, session_id=environment.murfey_session, data={ @@ -552,6 +559,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="workflow.spa_router", function_name="request_spa_preprocessing", + token=self._token, visit_name=environment.visit, session_id=environment.murfey_session, data={ diff --git a/src/murfey/client/contexts/spa_metadata.py b/src/murfey/client/contexts/spa_metadata.py index 6260bb202..7a3dae02c 100644 --- a/src/murfey/client/contexts/spa_metadata.py +++ b/src/murfey/client/contexts/spa_metadata.py @@ -92,8 +92,8 @@ def _atlas_destination( class SPAMetadataContext(Context): - def __init__(self, acquisition_software: str, basepath: Path): - super().__init__("SPA_metadata", acquisition_software) + def __init__(self, acquisition_software: str, basepath: Path, token: str): + super().__init__("SPA_metadata", acquisition_software, token) self._basepath = basepath def post_transfer( @@ -191,6 +191,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="workflow.router", function_name="register_dc_group", + token=self._token, visit_name=environment.visit, session_id=environment.murfey_session, data=dcg_data, @@ -204,6 +205,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="session_control.spa_router", function_name="register_grid_square", + token=self._token, session_id=environment.murfey_session, gsid=int(gs), data={ @@ -251,6 +253,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="workflow.router", function_name="register_dc_group", + token=self._token, visit_name=environment.visit, session_id=environment.murfey_session, data=dcg_data, @@ -292,6 +295,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="session_control.spa_router", function_name="register_grid_square", + token=self._token, session_id=environment.murfey_session, gsid=gs_name, data={ @@ -310,6 +314,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="session_control.spa_router", function_name="register_foil_hole", + token=self._token, session_id=environment.murfey_session, gs_name=gs_name, data={ diff --git a/src/murfey/client/contexts/tomo.py b/src/murfey/client/contexts/tomo.py index 8a7454ceb..399b3b7d0 100644 --- a/src/murfey/client/contexts/tomo.py +++ b/src/murfey/client/contexts/tomo.py @@ -77,8 +77,8 @@ class TomographyContext(Context): ProcessingParameter("num_eer_frames", "Number of EER Frames"), ] - def __init__(self, acquisition_software: str, basepath: Path): - super().__init__("Tomography", acquisition_software) + def __init__(self, acquisition_software: str, basepath: Path, token: str): + super().__init__("Tomography", acquisition_software, token) self._basepath = basepath self._tilt_series: Dict[str, List[Path]] = {} self._tilt_series_with_pjids: List[str] = [] @@ -112,6 +112,7 @@ def register_tomography_data_collections( base_url=str(environment.url.geturl()), router_name="workflow.router", function_name="register_dc_group", + token=self._token, visit_name=environment.visit, session_id=environment.murfey_session, data=dcg_data, @@ -154,6 +155,7 @@ def register_tomography_data_collections( base_url=str(environment.url.geturl()), router_name="workflow.router", function_name="start_dc", + token=self._token, visit_name=environment.visit, session_id=environment.murfey_session, data=dc_data, @@ -164,6 +166,7 @@ def register_tomography_data_collections( base_url=str(environment.url.geturl()), router_name="workflow.router", function_name="register_proc", + token=self._token, visit_name=environment.visit, session_id=environment.murfey_session, data={ @@ -276,6 +279,7 @@ def _add_tilt( base_url=str(environment.url.geturl()), router_name="workflow.tomo_router", function_name="register_tilt_series_for_rerun", + token=self._token, visit_name=environment.visit, data=rerun_data, ) @@ -295,6 +299,7 @@ def _add_tilt( base_url=str(environment.url.geturl()), router_name="workflow.tomo_router", function_name="register_tilt_series", + token=self._token, visit_name=environment.visit, data=ts_data, ) @@ -329,6 +334,7 @@ def _add_tilt( base_url=str(environment.url.geturl()), router_name="workflow.tomo_router", function_name="register_tilt", + token=self._token, visit_name=environment.visit, session_id=environment.murfey_session, data=tilt_data, @@ -340,6 +346,7 @@ def _add_tilt( base_url=str(environment.url.geturl()), router_name="file_io_instrument.router", function_name="write_eer_fractionation_file", + token=self._token, visit_name=environment.visit, session_id=environment.murfey_session, data={ @@ -375,6 +382,7 @@ def _add_tilt( base_url=str(environment.url.geturl()), router_name="workflow.tomo_router", function_name="request_tomography_preprocessing", + token=self._token, visit_name=environment.visit, session_id=environment.murfey_session, data=preproc_data, @@ -487,6 +495,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="workflow.tomo_router", function_name="register_tilt_series_length", + token=self._token, session_id=environment.murfey_session, data={ "tags": [tilt_series], @@ -506,6 +515,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="workflow.tomo_router", function_name="register_completed_tilt_series", + token=self._token, visit_name=environment.visit, session_id=environment.murfey_session, data={ @@ -592,6 +602,7 @@ def gather_metadata( base_url=str(environment.url.geturl()), router_name="session_control.router", function_name="machine_info_by_instrument", + token=self._token, instrument_name=environment.instrument_name, ).json() if ( diff --git a/src/murfey/client/contexts/tomo_metadata.py b/src/murfey/client/contexts/tomo_metadata.py index 91227e528..9cb3abb83 100644 --- a/src/murfey/client/contexts/tomo_metadata.py +++ b/src/murfey/client/contexts/tomo_metadata.py @@ -13,7 +13,9 @@ logger = logging.getLogger("murfey.client.contexts.tomo_metadata") -def ensure_dcg_exists(transferred_file: Path, environment: MurfeyInstanceEnvironment): +def ensure_dcg_exists( + transferred_file: Path, environment: MurfeyInstanceEnvironment, token: str +): # Make sure we have a data collection group source = _get_source(transferred_file, environment=environment) if not source: @@ -28,6 +30,7 @@ def ensure_dcg_exists(transferred_file: Path, environment: MurfeyInstanceEnviron base_url=str(environment.url.geturl()), router_name="workflow.router", function_name="register_dc_group", + token=token, visit_name=environment.visit, session_id=environment.murfey_session, data=dcg_data, @@ -36,8 +39,8 @@ def ensure_dcg_exists(transferred_file: Path, environment: MurfeyInstanceEnviron class TomographyMetadataContext(Context): - def __init__(self, acquisition_software: str, basepath: Path): - super().__init__("Tomography_metadata", acquisition_software) + def __init__(self, acquisition_software: str, basepath: Path, token: str): + super().__init__("Tomography_metadata", acquisition_software, token) self._basepath = basepath def post_transfer( @@ -119,6 +122,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="workflow.router", function_name="register_dc_group", + token=self._token, visit_name=environment.visit, session_id=environment.murfey_session, data=dcg_data, @@ -126,7 +130,7 @@ def post_transfer( elif transferred_file.name == "SearchMap.xml" and environment: logger.info("Tomography session search map xml found") - dcg_tag = ensure_dcg_exists(transferred_file, environment) + dcg_tag = ensure_dcg_exists(transferred_file, environment, self._token) with open(transferred_file, "r") as sm_xml: sm_data = xmltodict.parse(sm_xml.read()) @@ -207,6 +211,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="session_control.tomo_router", function_name="register_search_map", + token=self._token, session_id=environment.murfey_session, sm_name=transferred_file.parent.name, data={ @@ -224,7 +229,7 @@ def post_transfer( elif transferred_file.name == "SearchMap.dm" and environment: logger.info("Tomography session search map dm found") - dcg_tag = ensure_dcg_exists(transferred_file, environment) + dcg_tag = ensure_dcg_exists(transferred_file, environment, self._token) with open(transferred_file, "r") as sm_xml: sm_data = xmltodict.parse(sm_xml.read()) @@ -258,6 +263,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="session_control.tomo_router", function_name="register_search_map", + token=self._token, session_id=environment.murfey_session, sm_name=transferred_file.parent.name, data={ @@ -269,7 +275,7 @@ def post_transfer( elif transferred_file.name == "BatchPositionsList.xml" and environment: logger.info("Tomography session batch positions list found") - dcg_tag = ensure_dcg_exists(transferred_file, environment) + dcg_tag = ensure_dcg_exists(transferred_file, environment, self._token) with open(transferred_file) as xml: for_parsing = xml.read() batch_xml = xmltodict.parse(for_parsing) @@ -299,6 +305,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="session_control.tomo_router", function_name="register_search_map", + token=self._token, session_id=environment.murfey_session, sm_name=search_map_name, data={ @@ -311,6 +318,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="session_control.tomo_router", function_name="register_batch_position", + token=self._token, session_id=environment.murfey_session, batch_name=batch_name, data={ @@ -340,6 +348,7 @@ def post_transfer( base_url=str(environment.url.geturl()), router_name="session_control.tomo_router", function_name="register_batch_position", + token=self._token, session_id=environment.murfey_session, batch_name=beamshift_name, data={ diff --git a/src/murfey/client/multigrid_control.py b/src/murfey/client/multigrid_control.py index 2b57c26f3..1849d6bf7 100644 --- a/src/murfey/client/multigrid_control.py +++ b/src/murfey/client/multigrid_control.py @@ -59,6 +59,7 @@ def __post_init__(self): base_url=self.murfey_url, router_name="session_control.router", function_name="machine_info_by_instrument", + token=self.token, instrument_name=self.instrument_name, ).json() self.rsync_url = machine_data.get("rsync_url", "") @@ -105,6 +106,7 @@ def __post_init__(self): base_url=self.murfey_url, router_name="session_control.router", function_name="get_current_timestamp", + token=self.token, ).json()["timestamp"] self.server_time_offset = current_time - datetime.fromtimestamp( server_timestamp @@ -164,6 +166,7 @@ def clean_up_once_dormant(self, running_threads: list[threading.Thread]): base_url=str(self._environment.url.geturl()), router_name="session_control.router", function_name="remove_session", + token=self.token, session_id=self.session_id, ) success = response.status_code == 200 if response else False @@ -239,6 +242,7 @@ def _start_rsyncer_multigrid( base_url=str(self._environment.url.geturl()), router_name="session_control.router", function_name="machine_info_by_instrument", + token=self.token, instrument_name=self.instrument_name, ).json() if destination_overrides.get(source): @@ -295,6 +299,7 @@ def _rsyncer_stopped(self, source: Path, explicit_stop: bool = False): base_url=self.murfey_url, router_name="session_control.router", function_name="delete_rsyncer", + token=self.token, session_id=self.session_id, data={"path": str(source)}, ) @@ -303,6 +308,7 @@ def _rsyncer_stopped(self, source: Path, explicit_stop: bool = False): base_url=self.murfey_url, router_name="session_control.router", function_name="register_stopped_rsyncer", + token=self.token, session_id=self.session_id, data={"path": str(source)}, ) @@ -328,6 +334,7 @@ def _restart_rsyncer(self, source: Path): base_url=self.murfey_url, router_name="session_control.router", function_name="register_restarted_rsyncer", + token=self.token, session_id=self.session_id, data={"path": str(source)}, ) @@ -356,6 +363,7 @@ def _start_rsyncer( base_url=self.murfey_url, router_name="file_io_instrument.router", function_name="make_rsyncer_destination", + token=self.token, session_id=self.session_id, data={"destination": destination}, ) @@ -431,6 +439,7 @@ def rsync_result(update: RSyncerUpdate): base_url=self.murfey_url, router_name="session_control.router", function_name="register_restarted_rsyncer", + token=self.token, session_id=self.session_id, data={"path": str(source)}, ) @@ -446,6 +455,7 @@ def rsync_result(update: RSyncerUpdate): base_url=self.murfey_url, router_name="session_control.router", function_name="register_rsyncer", + token=self.token, session_id=self._environment.murfey_session, data=rsyncer_data, ) @@ -455,6 +465,7 @@ def rsync_result(update: RSyncerUpdate): log.info(f"Starting analyser for {source}") self.analysers[source] = Analyser( source, + self.token, environment=self._environment if not self.dummy_dc else None, force_mdoc_metadata=self.force_mdoc_metadata, limited=limited, @@ -556,6 +567,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self._environment.url.geturl()), router_name="file_io_instrument.router", function_name="write_eer_fractionation_file", + token=self.token, visit_name=self._environment.visit, session_id=self._environment.murfey_session, data={ @@ -573,6 +585,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self._environment.url.geturl()), router_name="workflow.tomo_router", function_name="register_tomo_proc_params", + token=self.token, session_id=self._environment.murfey_session, data=metadata_json, ) @@ -580,6 +593,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self._environment.url.geturl()), router_name="workflow.tomo_router", function_name="flush_tomography_processing", + token=self.token, visit_name=self._environment.visit, session_id=self._environment.murfey_session, data={"rsync_source": str(source)}, @@ -606,6 +620,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self._environment.url.geturl()), router_name="workflow.router", function_name="register_dc_group", + token=self.token, visit_name=self._environment.visit, session_id=self.session_id, data=dcg_data, @@ -635,6 +650,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self._environment.url.geturl()), router_name="workflow.router", function_name="start_dc", + token=self.token, visit_name=self._environment.visit, session_id=self.session_id, data=data, @@ -650,6 +666,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self._environment.url.geturl()), router_name="workflow.router", function_name="register_proc", + token=self.token, visit_name=self._environment.visit, session_id=self.session_id, data={ @@ -663,6 +680,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self._environment.url.geturl()), router_name="workflow.spa_router", function_name="register_spa_proc_params", + token=self.token, session_id=self.session_id, data={ **{ @@ -678,6 +696,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self._environment.url.geturl()), router_name="workflow.spa_router", function_name="flush_spa_processing", + token=self.token, visit_name=self._environment.visit, session_id=self.session_id, data={"tag": str(source)}, @@ -705,6 +724,7 @@ def _increment_file_count( base_url=str(self._environment.url.geturl()), router_name="prometheus.router", function_name="increment_rsync_file_count", + token=self.token, visit_name=self._environment.visit, data=data, ) @@ -737,6 +757,7 @@ def _increment_transferred_files_prometheus( base_url=str(self._environment.url.geturl()), router_name="prometheus.router", function_name="increment_rsync_transferred_files_prometheus", + token=self.token, visit_name=self._environment.visit, data=data, ) @@ -752,6 +773,7 @@ def _increment_transferred_files( base_url=str(self._environment.url.geturl()), router_name="prometheus.router", function_name="increment_rsync_skipped_files_prometheus", + token=self.token, visit_name=self._environment.visit, data={ "source": source, @@ -786,6 +808,7 @@ def _increment_transferred_files( base_url=str(self._environment.url.geturl()), router_name="prometheus.router", function_name="increment_rsync_transferred_files", + token=self.token, visit_name=self._environment.visit, data=data, ) diff --git a/src/murfey/client/tui/app.py b/src/murfey/client/tui/app.py index e06d12c21..ad4a7da2f 100644 --- a/src/murfey/client/tui/app.py +++ b/src/murfey/client/tui/app.py @@ -155,6 +155,7 @@ def _start_rsyncer_multigrid( base_url=str(self._environment.url.geturl()), router_name="session_control.router", function_name="machine_info_by_instrument", + token=token, instrument_name=instrument_name, ).json() if destination_overrides.get(source): @@ -211,6 +212,7 @@ def _start_rsyncer( base_url=str(self._url.geturl()), router_name="file_io_instrument.router", function_name="make_rsyncer_destination", + token=token, session_id=self._environment.murfey_session, data={"destination": destination}, ) @@ -288,6 +290,7 @@ def rsync_result(update: RSyncerUpdate): base_url=str(self._url.geturl()), router_name="session_control.router", function_name="register_rsyncer", + token=token, session_id=self._environment.murfey_session, data=rsyncer_data, ) @@ -298,6 +301,7 @@ def rsync_result(update: RSyncerUpdate): log.info(f"Starting analyser for {source}") self.analysers[source] = Analyser( source, + token, environment=self._environment if not self._dummy_dc else None, force_mdoc_metadata=self._force_mdoc_metadata, limited=limited, @@ -372,6 +376,7 @@ def _increment_file_count( base_url=str(self._url.geturl()), router_name="prometheus.router", function_name="increment_rsync_file_count", + token=token, visit_name=self._visit, data=data, ) @@ -404,6 +409,7 @@ def _increment_transferred_files_prometheus( base_url=str(self._url.geturl()), router_name="prometheus.router", function_name="increment_rsync_transferred_files_prometheus", + token=token, visit_name=self._visit, data=data, ) @@ -437,6 +443,7 @@ def _increment_transferred_files( base_url=str(self._url.geturl()), router_name="prometheus.router", function_name="increment_rsync_transferred_files", + token=token, visit_name=self._visit, data=data, ) @@ -518,6 +525,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self.app._environment.url.geturl()), router_name="file_io_instrument.router", function_name="write_eer_fractionation_file", + token=token, visit_name=self.app._environment.visit, session_id=self.app._environment.murfey_session, data={ @@ -535,6 +543,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self.app._environment.url.geturl()), router_name="workflow.tomo_router", function_name="register_tomo_proc_params", + token=token, session_id=self.app._environment.murfey_session, data=metadata_json, ) @@ -542,6 +551,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self.app._environment.url.geturl()), router_name="workflow.tomo_router", function_name="flush_tomography_processing", + token=token, visit_name=self._visit, session_id=self.app._environment.murfey_session, data={"rsync_source": str(source)}, @@ -567,6 +577,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self._url.geturl()), router_name="workflow.router", function_name="register_dc_group", + token=token, visit_name=self._visit, session_id=self._environment.murfey_session, data=dcg_data, @@ -596,6 +607,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self._url.geturl()), router_name="workflow.router", function_name="start_dc", + token=token, visit_name=self._visit, session_id=self._environment.murfey_session, data=data, @@ -611,6 +623,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self._url.geturl()), router_name="workflow.router", function_name="register_proc", + token=token, visit_name=self._visit, session_id=self._environment.murfey_session, data={ @@ -624,6 +637,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self.app._environment.url.geturl()), router_name="workflow.spa_router", function_name="register_spa_proc_params", + token=token, session_id=self.app._environment.murfey_session, data={ **{ @@ -644,6 +658,7 @@ def _start_dc(self, metadata_json, from_form: bool = False): base_url=str(self.app._environment.url.geturl()), router_name="workflow.spa_router", function_name="flush_spa_processing", + token=token, visit_name=self.app._environment.visit, session_id=self.app._environment.murfey_session, data={"tag": str(source)}, @@ -680,6 +695,7 @@ async def on_mount(self) -> None: base_url=str(self._environment.url.geturl()), router_name="session_control.router", function_name="get_sessions", + token=token, ).json() if self.visits: self.install_screen(VisitSelection(self.visits), "visit-select-screen") @@ -709,6 +725,7 @@ async def on_mount(self) -> None: base_url=str(self._environment.url.geturl()), router_name="session_control.router", function_name="link_client_to_session", + token=token, instrument_name=self._environment.instrument_name, client_id=self._environment.client_id, data={"session_id": None, "session_name": session_name}, @@ -732,6 +749,7 @@ async def reset(self): base_url=str(self._environment.url.geturl()), router_name="session_control.router", function_name="get_rsyncers_for_session", + token=token, session_id=self._environment.murfey_session, ).json() prompt += f"Copied {sum(r['files_counted'] for r in rsync_instances)} / {sum(r['files_transferred'] for r in rsync_instances)}" @@ -759,6 +777,7 @@ async def action_remove_session(self) -> None: base_url=str(self._environment.url.geturl()), router_name="session_control.router", function_name="remove_session", + token=token, session_id=self._environment.murfey_session, ) if self.rsync_processes: @@ -776,6 +795,7 @@ def clean_up_quit(self) -> None: base_url=str(self._environment.url.geturl()), router_name="session_control.router", function_name="remove_session", + token=token, session_id=self._environment.murfey_session, ) self.exit() @@ -822,12 +842,14 @@ def _remove_data(self, listener: Callable[..., Awaitable[None] | None], **kwargs base_url=str(self._environment.url.geturl()), router_name="session_control.router", function_name="register_processing_success_in_ispyb", + token=token, session_id=self._environment.murfey_session, ) capture_delete( base_url=str(self._environment.url.geturl()), router_name="session_control.router", function_name="remove_session", + token=token, session_id=self._environment.murfey_session, ) self.exit() diff --git a/src/murfey/client/tui/main.py b/src/murfey/client/tui/main.py index 3bf59f0c8..d5949879c 100644 --- a/src/murfey/client/tui/main.py +++ b/src/murfey/client/tui/main.py @@ -29,6 +29,8 @@ log = logging.getLogger("murfey.client") +token = read_config()["Murfey"].get("token", "") + def _get_visit_list(api_base: ParseResult, instrument_name: str): proxy_path = api_base.path.rstrip("/") @@ -37,6 +39,7 @@ def _get_visit_list(api_base: ParseResult, instrument_name: str): base_url=str(get_visits_url.geturl()), router_name="session_control.router", function_name="get_current_visits", + token=token, instrument_name=instrument_name, ) if server_reply.status_code != 200: @@ -277,6 +280,7 @@ def run(): base_url=str(murfey_url.geturl()), router_name="session_control.router", function_name="new_client_id", + token=token, ) if client_id_response.status_code == 401: exit( @@ -308,6 +312,7 @@ def run(): base_url=str(murfey_url.geturl()), router_name="session_control.router", function_name="machine_info_by_instrument", + token=token, instrument_name=instrument_name, ).json() gain_ref: Path | None = None diff --git a/src/murfey/client/tui/screens.py b/src/murfey/client/tui/screens.py index 888865ae4..8368048b8 100644 --- a/src/murfey/client/tui/screens.py +++ b/src/murfey/client/tui/screens.py @@ -87,6 +87,7 @@ def determine_default_destination( base_url=str(environment.url.geturl()), router_name="session_control.router", function_name="machine_info_by_instrument", + token=token, instrument_name=environment.instrument_name, ).json() _default = "" @@ -115,6 +116,7 @@ def determine_default_destination( base_url=str(environment.url.geturl()), router_name="file_io_instrument.router", function_name="suggest_path", + token=token, visit_name=visit, session_id=environment.murfey_session, data={ @@ -275,6 +277,7 @@ def compose(self): base_url=str(self.app._environment.url.geturl()), router_name="session_control.router", function_name="machine_info_by_instrument", + token=token, instrument_name=instrument_name, ).json() self._dir_tree = _DirectoryTree( @@ -483,6 +486,7 @@ def _write_params( base_url=str(self.app._environment.url.geturl()), router_name="workflow.tomo_router", function_name="register_tomo_proc_params", + token=token, session_id=self.app._environment.murfey_session, data=params, ) @@ -491,6 +495,7 @@ def _write_params( base_url=str(self.app._environment.url.geturl()), router_name="workflow.spa_router", function_name="register_spa_proc_params", + token=token, session_id=self.app._environment.murfey_session, data=params, ) @@ -498,6 +503,7 @@ def _write_params( base_url=str(self.app._environment.url.geturl()), router_name="workflow.spa_router", function_name="flush_spa_processing", + token=token, visit_name=self.app._environment.visit, session_id=self.app._environment.murfey_session, ) @@ -645,6 +651,7 @@ def on_button_pressed(self, event: Button.Pressed): base_url=str(self.app._environment.url.geturl()), router_name="session_control.router", function_name="link_client_to_session", + token=token, instrument_name=self.app._environment.instrument_name, client_id=self.app._environment.client_id, data={"session_id": session_id, "session_name": session_name}, @@ -655,12 +662,14 @@ def _remove_session(self, session_id: int, **kwargs): base_url=str(self.app._environment.url.geturl()), router_name="session_control.router", function_name="remove_session", + token=token, session_id=session_id, ) exisiting_sessions = capture_get( base_url=str(self.app._environment.url.geturl()), router_name="session_control.router", function_name="get_sessions", + token=token, ).json() self.app.uninstall_screen("session-select-screen") if exisiting_sessions: @@ -685,6 +694,7 @@ def _remove_session(self, session_id: int, **kwargs): base_url=str(self.app._environment.url.geturl()), router_name="session_control.router", function_name="link_client_to_session", + token=token, instrument_name=self.app._environment.instrument_name, client_id=self.app._environment.client_id, data={"session_id": None, "session_name": session_name}, @@ -711,6 +721,7 @@ def on_button_pressed(self, event: Button.Pressed): base_url=str(self.app._environment.url.geturl()), router_name="session_control.router", function_name="register_client_to_visit", + token=token, visit_name=text, data={"id": self.app._environment.client_id}, ) @@ -719,6 +730,7 @@ def on_button_pressed(self, event: Button.Pressed): base_url=str(self.app._environment.url.geturl()), router_name="session_control.router", function_name="machine_info_by_instrument", + token=token, instrument_name=instrument_name, ).json() @@ -756,6 +768,7 @@ def on_button_pressed(self, event: Button.Pressed): base_url=str(self.app._environment.url.geturl()), router_name="session_control.correlative_router", function_name="find_upstream_visits", + token=token, session_id=self.app._environment.murfey_session, ).json() self.app.install_screen( @@ -787,6 +800,7 @@ def on_button_pressed(self, event: Button.Pressed): base_url=str(self.app._environment.url.geturl()), router_name="session_control.router", function_name="register_client_to_visit", + token=token, visit_name=text, data={"id": self.app._environment.client_id}, ) @@ -795,6 +809,7 @@ def on_button_pressed(self, event: Button.Pressed): base_url=str(self.app._environment.url.geturl()), router_name="session_control.router", function_name="machine_info_by_instrument", + token=token, instrument_name=instrument_name, ).json() @@ -827,6 +842,7 @@ def on_button_pressed(self, event: Button.Pressed): base_url=str(self.app._environment.url.geturl()), router_name="session_control.correlative_router", function_name="find_upstream_visits", + token=token, session_id=self.app._environment.murfey_session, ).json() self.app.install_screen( @@ -852,6 +868,7 @@ def on_button_pressed(self, event: Button.Pressed): base_url=str(self.app._environment.url.geturl()), router_name="session_control.router", function_name="machine_info_by_instrument", + token=token, instrument_name=instrument_name, ).json() if machine_data.get("upstream_data_download_directory"): @@ -866,6 +883,7 @@ def on_button_pressed(self, event: Button.Pressed): base_url=str(self.app._environment.url.geturl()), router_name="session_control.correlative_router", function_name="gather_upstream_tiffs", + token=token, visit_name=event.button.label, session_id=self.app._environment.murfey_session, ) @@ -879,6 +897,7 @@ def on_button_pressed(self, event: Button.Pressed): base_url=str(self.app._environment.url.geturl()), router_name="session_control.correlative_router", function_name="get_tiff", + token=token, visit_name=event.button.label, session_id=self.app._environment.murfey_session, tiff_path=tp, @@ -947,6 +966,7 @@ def on_button_pressed(self, event): base_url=str(self.app._environment.url.geturl()), router_name="file_io_instrument.router", function_name="process_gain", + token=token, session_id=self.app._environment.murfey_session, data={ "gain_ref": str(self._dir_tree._gain_reference), @@ -1251,12 +1271,14 @@ def file_copied(self, *args, **kwargs): base_url=str(self.app._environment.url.geturl()), router_name="session_control.router", function_name="register_processing_success_in_ispyb", + token=token, session_id=self.app._environment.murfey_session, ) capture_delete( base_url=str(self.app._environment.url.geturl()), router_name="session_control.router", function_name="remove_session", + token=token, session_id=self.app._environment.murfey_session, ) self.app.exit() @@ -1290,6 +1312,7 @@ def on_mount(self, event): base_url=str(self.app._environment.url.geturl()), router_name="prometheus.router", function_name="change_monitoring_status", + token=token, visit_name=self.app._environment.visit, on=1, ) diff --git a/src/murfey/util/client.py b/src/murfey/util/client.py index 2deb2dde5..21ca15536 100644 --- a/src/murfey/util/client.py +++ b/src/murfey/util/client.py @@ -14,7 +14,7 @@ import logging import os import shutil -from functools import lru_cache, partial +from functools import lru_cache from pathlib import Path from typing import Awaitable, Callable, Optional, Union @@ -53,38 +53,33 @@ def read_config() -> configparser.ConfigParser: @lru_cache(maxsize=1) def get_machine_config_client( - url: str, instrument_name: str = "", demo: bool = False + url: str, token: str, instrument_name: str = "", demo: bool = False ) -> dict: _instrument_name: Optional[str] = instrument_name or os.getenv("BEAMLINE") if not _instrument_name: return {} - return requests.get( - f"{url}{url_path_for('session_control.router', 'machine_info_by_instrument', instrument_name=_instrument_name)}" + return capture_get( + url, + "session_control.router", + "machine_info_by_instrument", + token, + instrument_name=_instrument_name, ).json() -def authorised_requests() -> tuple[Callable, Callable, Callable, Callable]: - token = read_config()["Murfey"].get("token", "") - _get = partial(requests.get, headers={"Authorization": f"Bearer {token}"}) - _post = partial(requests.post, headers={"Authorization": f"Bearer {token}"}) - _put = partial(requests.put, headers={"Authorization": f"Bearer {token}"}) - _delete = partial(requests.delete, headers={"Authorization": f"Bearer {token}"}) - return _get, _post, _put, _delete - - -requests.get, requests.post, requests.put, requests.delete = authorised_requests() - - def capture_post( base_url: str, router_name: str, function_name: str, + token: str, data: Optional[dict] = None, **kwargs, ) -> requests.Response: url = f"{base_url}{url_path_for(router_name, function_name, **kwargs)}" try: - response = requests.post(url, json=data) + response = requests.post( + url, json=data, headers={"Authorization": f"Bearer {token}"} + ) except Exception as e: logger.error(f"Exception encountered in post to {url}: {e}") response = requests.Response() @@ -109,6 +104,7 @@ def capture_post( "data": data, "kwargs": kwargs, }, + headers={"Authorization": f"Bearer {token}"}, ) except Exception as e: logger.error(f"Exception encountered in post to {failure_url}: {e}") @@ -122,11 +118,11 @@ def capture_post( def capture_get( - base_url: str, router_name: str, function_name: str, **kwargs + base_url: str, router_name: str, function_name: str, token: str, **kwargs ) -> requests.Response: url = f"{base_url}{url_path_for(router_name, function_name, **kwargs)}" try: - response = requests.get(url) + response = requests.get(url, headers={"Authorization": f"Bearer {token}"}) except Exception as e: logger.error(f"Exception encountered in get from {url}: {e}") response = requests.Response() @@ -139,11 +135,11 @@ def capture_get( def capture_delete( - base_url: str, router_name: str, function_name: str, **kwargs + base_url: str, router_name: str, function_name: str, token: str, **kwargs ) -> requests.Response: url = f"{base_url}{url_path_for(router_name, function_name, **kwargs)}" try: - response = requests.delete(url) + response = requests.delete(url, headers={"Authorization": f"Bearer {token}"}) except Exception as e: logger.error(f"Exception encountered in delete of {url}: {e}") response = requests.Response() From 3041e3b14e7425d51cb4aa45e2f0058efab35cd6 Mon Sep 17 00:00:00 2001 From: Dan Hatton Date: Wed, 3 Sep 2025 15:34:00 +0100 Subject: [PATCH 2/4] test fixing --- tests/client/test_analyser.py | 10 +++++----- tests/client/test_context.py | 10 +++++----- tests/client/tui/test_main.py | 1 + 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/tests/client/test_analyser.py b/tests/client/test_analyser.py index 0e24f0b0d..07f8cbb22 100644 --- a/tests/client/test_analyser.py +++ b/tests/client/test_analyser.py @@ -85,7 +85,7 @@ def test_find_context(file_and_context, tmp_path): file_name, context = file_and_context # Pass the file to the Analyser; add environment as needed - analyser = Analyser(basepath_local=tmp_path) + analyser = Analyser(basepath_local=tmp_path, token="") # Check that the results are as expected assert analyser._find_context(tmp_path / file_name) @@ -115,13 +115,13 @@ def test_find_context(file_and_context, tmp_path): @pytest.mark.parametrize("bad_file", contextless_files) def test_ignore_contextless_files(bad_file, tmp_path): - analyser = Analyser(tmp_path) + analyser = Analyser(tmp_path, "") assert not analyser._find_context(tmp_path / bad_file) assert not analyser._context def test_analyser_setup_and_stopping(tmp_path): - analyser = Analyser(tmp_path) + analyser = Analyser(tmp_path, "") assert analyser.queue.empty() analyser.start() assert analyser.thread.is_alive() @@ -132,7 +132,7 @@ def test_analyser_setup_and_stopping(tmp_path): def test_analyser_tomo_determination(tmp_path): tomo_file = tmp_path / "Position_1_[30.0].tiff" - analyser = Analyser(tmp_path) + analyser = Analyser(tmp_path, "") analyser.start() analyser.queue.put(tomo_file) analyser.stop() @@ -141,7 +141,7 @@ def test_analyser_tomo_determination(tmp_path): def test_analyser_epu_determination(tmp_path): tomo_file = tmp_path / "FoilHole_12345_Data_6789_Fractions.tiff" - analyser = Analyser(tmp_path) + analyser = Analyser(tmp_path, "") analyser.start() analyser.queue.put(tomo_file) analyser.stop() diff --git a/tests/client/test_context.py b/tests/client/test_context.py index d72573560..827662453 100644 --- a/tests/client/test_context.py +++ b/tests/client/test_context.py @@ -28,7 +28,7 @@ def test_tomography_context_add_tomo_tilt(mock_post, mock_get, tmp_path): visit="test", murfey_session=1, ) - context = TomographyContext("tomo", tmp_path) + context = TomographyContext("tomo", tmp_path, "") (tmp_path / "Position_1_001_[30.0]_date_time_fractions.tiff").touch() context.post_transfer( tmp_path / "Position_1_001_[30.0]_date_time_fractions.tiff", @@ -85,7 +85,7 @@ def test_tomography_context_add_tomo_tilt_out_of_order(mock_post, mock_get, tmp_ visit="test", murfey_session=1, ) - context = TomographyContext("tomo", tmp_path) + context = TomographyContext("tomo", tmp_path, "") (tmp_path / "Position_1_001_[30.0]_date_time_fractions.tiff").touch() context.post_transfer( tmp_path / "Position_1_001_[30.0]_date_time_fractions.tiff", @@ -170,7 +170,7 @@ def test_tomography_context_add_tomo_tilt_delayed_tilt(mock_post, mock_get, tmp_ visit="test", murfey_session=1, ) - context = TomographyContext("tomo", tmp_path) + context = TomographyContext("tomo", tmp_path, "") (tmp_path / "Position_1_001_[30.0]_date_time_fractions.tiff").touch() context.post_transfer( tmp_path / "Position_1_001_[30.0]_date_time_fractions.tiff", @@ -214,7 +214,7 @@ def test_tomography_context_add_tomo_tilt_delayed_tilt(mock_post, mock_get, tmp_ def test_tomography_context_initialisation_for_serialem(tmp_path): - context = TomographyContext("serialem", tmp_path) + context = TomographyContext("serialem", tmp_path, "") assert not context._completed_tilt_series assert context._acquisition_software == "serialem" @@ -235,7 +235,7 @@ def test_setting_tilt_series_size_and_completion_from_mdoc_parsing( visit="test", murfey_session=1, ) - context = TomographyContext("tomo", tmp_path) + context = TomographyContext("tomo", tmp_path, "") assert len(context._tilt_series_sizes) == 0 context.post_transfer( Path(__file__).parent.parent / "util" / "test_1.mdoc", diff --git a/tests/client/tui/test_main.py b/tests/client/tui/test_main.py index e0a5c5561..a42801547 100644 --- a/tests/client/tui/test_main.py +++ b/tests/client/tui/test_main.py @@ -60,6 +60,7 @@ def test_get_visit_list( base_url=server_url, router_name="session_control.router", function_name="get_current_visits", + token="", instrument_name=instrument_name, ) From 2a189616a2b7c1ac61040619a823297975a25469 Mon Sep 17 00:00:00 2001 From: Dan Hatton Date: Wed, 3 Sep 2025 15:54:14 +0100 Subject: [PATCH 3/4] pass tokens to more places --- src/murfey/client/analyser.py | 1 + src/murfey/client/contexts/atlas.py | 2 +- src/murfey/client/contexts/clem.py | 5 ++++- src/murfey/client/contexts/spa.py | 14 ++++++++++---- src/murfey/client/contexts/spa_metadata.py | 11 ++++++++--- src/murfey/client/contexts/tomo.py | 2 ++ src/murfey/client/contexts/tomo_metadata.py | 9 +++++++-- src/murfey/client/multigrid_control.py | 1 + src/murfey/client/tui/app.py | 4 ++++ src/murfey/client/tui/screens.py | 4 ++++ 10 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/murfey/client/analyser.py b/src/murfey/client/analyser.py index 88846e3c3..86e5d384b 100644 --- a/src/murfey/client/analyser.py +++ b/src/murfey/client/analyser.py @@ -62,6 +62,7 @@ def __init__( self._murfey_config = ( get_machine_config_client( str(environment.url.geturl()), + self._token, instrument_name=environment.instrument_name, demo=environment.demo, ) diff --git a/src/murfey/client/contexts/atlas.py b/src/murfey/client/contexts/atlas.py index 22bceefc3..85460d8df 100644 --- a/src/murfey/client/contexts/atlas.py +++ b/src/murfey/client/contexts/atlas.py @@ -36,7 +36,7 @@ def post_transfer( source = _get_source(transferred_file, environment) if source: transferred_atlas_name = _atlas_destination( - environment, source, transferred_file + environment, source, transferred_file, self._token ) / transferred_file.relative_to(source.parent) capture_post( base_url=str(environment.url.geturl()), diff --git a/src/murfey/client/contexts/clem.py b/src/murfey/client/contexts/clem.py index e9908b638..c422337e9 100644 --- a/src/murfey/client/contexts/clem.py +++ b/src/murfey/client/contexts/clem.py @@ -20,13 +20,14 @@ def _file_transferred_to( - environment: MurfeyInstanceEnvironment, source: Path, file_path: Path + environment: MurfeyInstanceEnvironment, source: Path, file_path: Path, token: str ) -> Optional[Path]: """ Returns the Path of the transferred file on the DLS file system. """ machine_config = get_machine_config_client( str(environment.url.geturl()), + token, instrument_name=environment.instrument_name, demo=environment.demo, ) @@ -128,6 +129,7 @@ def post_transfer( environment=environment, source=source, file_path=transferred_file, + token=self._token, ) if not destination_file: logger.warning( @@ -320,6 +322,7 @@ def post_transfer( environment=environment, source=source, file_path=transferred_file, + token=self._token, ) if not destination_file: logger.warning( diff --git a/src/murfey/client/contexts/spa.py b/src/murfey/client/contexts/spa.py index 56ddabbfb..d382b1f06 100644 --- a/src/murfey/client/contexts/spa.py +++ b/src/murfey/client/contexts/spa.py @@ -26,10 +26,11 @@ def _file_transferred_to( - environment: MurfeyInstanceEnvironment, source: Path, file_path: Path + environment: MurfeyInstanceEnvironment, source: Path, file_path: Path, token: str ): machine_config = get_machine_config_client( str(environment.url.geturl()), + token, instrument_name=environment.instrument_name, demo=environment.demo, ) @@ -341,7 +342,9 @@ def _position_analysis( else metadata_source_as_str ) image_path = ( - _file_transferred_to(environment, metadata_source, Path(gs.image)) + _file_transferred_to( + environment, metadata_source, Path(gs.image), self._token + ) if gs.image else "" ) @@ -388,7 +391,9 @@ def _position_analysis( else metadata_source_as_str ) image_path = ( - _file_transferred_to(environment, metadata_source, Path(fh.image)) + _file_transferred_to( + environment, metadata_source, Path(fh.image), self._token + ) if fh.image else "" ) @@ -449,6 +454,7 @@ def post_transfer( if environment: machine_config = get_machine_config_client( str(environment.url.geturl()), + self._token, instrument_name=environment.instrument_name, demo=environment.demo, ) @@ -475,7 +481,7 @@ def post_transfer( if environment: file_transferred_to = _file_transferred_to( - environment, source, transferred_file + environment, source, transferred_file, self._token ) if not environment.movie_counters.get(str(source)): movie_counts_get = capture_get( diff --git a/src/murfey/client/contexts/spa_metadata.py b/src/murfey/client/contexts/spa_metadata.py index 7a3dae02c..18fdb5007 100644 --- a/src/murfey/client/contexts/spa_metadata.py +++ b/src/murfey/client/contexts/spa_metadata.py @@ -70,10 +70,11 @@ def _foil_hole_positions(xml_path: Path, grid_square: int) -> Dict[str, FoilHole def _atlas_destination( - environment: MurfeyInstanceEnvironment, source: Path, file_path: Path + environment: MurfeyInstanceEnvironment, source: Path, file_path: Path, token: str ) -> Path: machine_config = get_machine_config_client( str(environment.url.geturl()), + token, instrument_name=environment.instrument_name, demo=environment.demo, ) @@ -180,7 +181,9 @@ def post_transfer( "experiment_type_id": 37, "tag": dcg_tag, "atlas": str( - _atlas_destination(environment, source, transferred_file) + _atlas_destination( + environment, source, transferred_file, self._token + ) / environment.samples[source].atlas.parent / atlas_xml_path.with_suffix(".jpg").name ), @@ -287,7 +290,9 @@ def post_transfer( gs_name, ) image_path = ( - _file_transferred_to(environment, source, Path(gs_info.image)) + _file_transferred_to( + environment, source, Path(gs_info.image), self._token + ) if gs_info.image else "" ) diff --git a/src/murfey/client/contexts/tomo.py b/src/murfey/client/contexts/tomo.py index 399b3b7d0..38e938914 100644 --- a/src/murfey/client/contexts/tomo.py +++ b/src/murfey/client/contexts/tomo.py @@ -190,6 +190,7 @@ def _file_transferred_to( ): machine_config = get_machine_config_client( str(environment.url.geturl()), + self._token, instrument_name=environment.instrument_name, demo=environment.demo, ) @@ -462,6 +463,7 @@ def post_transfer( if environment: machine_config = get_machine_config_client( str(environment.url.geturl()), + self._token, instrument_name=environment.instrument_name, demo=environment.demo, ) diff --git a/src/murfey/client/contexts/tomo_metadata.py b/src/murfey/client/contexts/tomo_metadata.py index 9cb3abb83..dfd180495 100644 --- a/src/murfey/client/contexts/tomo_metadata.py +++ b/src/murfey/client/contexts/tomo_metadata.py @@ -111,7 +111,9 @@ def post_transfer( "experiment_type_id": 36, "tag": dcg_tag, "atlas": str( - _atlas_destination(environment, source, transferred_file) + _atlas_destination( + environment, source, transferred_file, self._token + ) / environment.samples[source].atlas.parent / atlas_xml_path.with_suffix(".jpg").name ), @@ -201,7 +203,10 @@ def post_transfer( source = _get_source(transferred_file, environment=environment) image_path = ( _file_transferred_to( - environment, source, transferred_file.parent / "SearchMap.jpg" + environment, + source, + transferred_file.parent / "SearchMap.jpg", + self._token, ) if source else "" diff --git a/src/murfey/client/multigrid_control.py b/src/murfey/client/multigrid_control.py index 1849d6bf7..65af22485 100644 --- a/src/murfey/client/multigrid_control.py +++ b/src/murfey/client/multigrid_control.py @@ -80,6 +80,7 @@ def __post_init__(self): ) self._machine_config = get_machine_config_client( str(self._environment.url.geturl()), + self.token, instrument_name=self._environment.instrument_name, demo=self._environment.demo, ) diff --git a/src/murfey/client/tui/app.py b/src/murfey/client/tui/app.py index ad4a7da2f..bdf20469c 100644 --- a/src/murfey/client/tui/app.py +++ b/src/murfey/client/tui/app.py @@ -103,6 +103,7 @@ def __init__( self._skip_existing_processing = skip_existing_processing self._machine_config = get_machine_config_client( str(self._environment.url.geturl()), + token, instrument_name=self._environment.instrument_name, demo=self._environment.demo, ) @@ -121,6 +122,7 @@ def _launch_multigrid_watcher( log.info(f"Launching multigrid watcher for source {source}") machine_config = get_machine_config_client( str(self._environment.url.geturl()), + token, instrument_name=self._environment.instrument_name, demo=self._environment.demo, ) @@ -739,6 +741,7 @@ def on_log_book_log(self, message): async def reset(self): machine_config = get_machine_config_client( str(self._environment.url.geturl()), + token, instrument_name=self._environment.instrument_name, demo=self._environment.demo, ) @@ -803,6 +806,7 @@ def clean_up_quit(self) -> None: async def action_clear(self) -> None: machine_config = get_machine_config_client( str(self._environment.url.geturl()), + token, instrument_name=self._environment.instrument_name, demo=self._environment.demo, ) diff --git a/src/murfey/client/tui/screens.py b/src/murfey/client/tui/screens.py index 8368048b8..fc356b0b7 100644 --- a/src/murfey/client/tui/screens.py +++ b/src/murfey/client/tui/screens.py @@ -1010,6 +1010,7 @@ def on_button_pressed(self, event: Button.Pressed): self.app._set_default_acquisition_directories(visit_dir) machine_config = get_machine_config_client( str(self.app._environment.url.geturl()), + token, instrument_name=self.app._environment.instrument_name, demo=self.app._environment.demo, ) @@ -1048,6 +1049,7 @@ def compose(self): if self.app._multigrid: machine_config = get_machine_config_client( str(self.app._environment.url.geturl()), + token, instrument_name=self.app._environment.instrument_name, ) destinations = [] @@ -1104,6 +1106,7 @@ def compose(self): else: machine_config = get_machine_config_client( str(self.app._environment.url.geturl()), + token, instrument_name=self.app._environment.instrument_name, ) for s, d in self._transfer_routes.items(): @@ -1133,6 +1136,7 @@ def compose(self): self._inputs[i] = k.name machine_config = get_machine_config_client( str(self.app._environment.url.geturl()), + token, instrument_name=self.app._environment.instrument_name, demo=self.app._environment.demo, ) From 1c8feb7f9f6164ddf98477e82e055758b7caffeb Mon Sep 17 00:00:00 2001 From: Dan Hatton Date: Wed, 3 Sep 2025 15:57:50 +0100 Subject: [PATCH 4/4] more test fixing --- tests/client/test_context.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/client/test_context.py b/tests/client/test_context.py index 827662453..4c88c9380 100644 --- a/tests/client/test_context.py +++ b/tests/client/test_context.py @@ -9,7 +9,7 @@ def test_tomography_context_initialisation_for_tomo(tmp_path): - context = TomographyContext("tomo", tmp_path) + context = TomographyContext("tomo", tmp_path, "") assert not context._completed_tilt_series assert context._acquisition_software == "tomo"