diff --git a/src/hyperion/device_setup_plans/setup_panda.py b/src/hyperion/device_setup_plans/setup_panda.py index 1bd344885..85ba392c7 100644 --- a/src/hyperion/device_setup_plans/setup_panda.py +++ b/src/hyperion/device_setup_plans/setup_panda.py @@ -1,4 +1,4 @@ -import os +from datetime import datetime from enum import Enum from importlib import resources from pathlib import Path @@ -209,18 +209,12 @@ def disarm_panda_for_gridscan(panda, group="disarm_panda_gridscan") -> MsgGenera yield from bps.wait(group=group, timeout=GENERAL_TIMEOUT) -def set_and_create_panda_directory(panda_directory: Path) -> MsgGenerator: - """Updates and creates the panda subdirectory which is used by the PandA's PCAP. - See https://github.com/DiamondLightSource/hyperion/issues/1385 for a better long - term solution. - """ +def set_panda_directory(panda_directory: Path) -> MsgGenerator: + """Updates the root folder which is used by the PandA's PCAP.""" - if not os.path.isdir(panda_directory): - LOGGER.debug(f"Creating PandA PCAP subdirectory at {panda_directory}") - # Assumes we have permissions, which should be true on Hyperion for now - os.makedirs(panda_directory) + suffix = datetime.now().strftime("_%Y%m%d%H%M%S") async def set_panda_dir(): - await get_directory_provider().update(directory=panda_directory) + await get_directory_provider().update(directory=panda_directory, suffix=suffix) yield from bps.wait_for([set_panda_dir]) diff --git a/src/hyperion/experiment_plans/flyscan_xray_centre_plan.py b/src/hyperion/experiment_plans/flyscan_xray_centre_plan.py index 3153f4377..5250049de 100755 --- a/src/hyperion/experiment_plans/flyscan_xray_centre_plan.py +++ b/src/hyperion/experiment_plans/flyscan_xray_centre_plan.py @@ -56,7 +56,7 @@ ) from hyperion.device_setup_plans.setup_panda import ( disarm_panda_for_gridscan, - set_and_create_panda_directory, + set_panda_directory, setup_panda_for_flyscan, ) from hyperion.device_setup_plans.setup_zebra import ( @@ -521,8 +521,7 @@ def _panda_triggering_setup( ) directory_provider_root = Path(parameters.storage_directory) - - yield from set_and_create_panda_directory(directory_provider_root) + yield from set_panda_directory(directory_provider_root) yield from setup_panda_for_flyscan( fgs_composite.panda, diff --git a/tests/unit_tests/device_setup_plans/test_setup_panda.py b/tests/unit_tests/device_setup_plans/test_setup_panda.py index 9d65efe24..6f3593134 100644 --- a/tests/unit_tests/device_setup_plans/test_setup_panda.py +++ b/tests/unit_tests/device_setup_plans/test_setup_panda.py @@ -1,4 +1,4 @@ -from pathlib import Path +from datetime import datetime from typing import NamedTuple from unittest.mock import MagicMock, patch @@ -7,13 +7,14 @@ from bluesky.plan_stubs import null from bluesky.run_engine import RunEngine from bluesky.simulators import RunEngineSimulator +from dodal.common.types import UpdatingDirectoryProvider from dodal.devices.fast_grid_scan import PandAGridScanParams from ophyd_async.panda import SeqTrigger from hyperion.device_setup_plans.setup_panda import ( MM_TO_ENCODER_COUNTS, disarm_panda_for_gridscan, - set_and_create_panda_directory, + set_panda_directory, setup_panda_for_flyscan, ) @@ -220,15 +221,18 @@ def test_disarm_panda_disables_correct_blocks(sim_run_engine): assert num_of_waits == 1 -def test_set_and_create_panda_directory(tmp_path, RE): - with patch( - "hyperion.device_setup_plans.setup_panda.os.path.isdir", return_value=False - ), patch("hyperion.device_setup_plans.setup_panda.os.makedirs") as mock_makedir: - RE(set_and_create_panda_directory(Path(tmp_path))) - mock_makedir.assert_called_once() +@patch("hyperion.device_setup_plans.setup_panda.get_directory_provider") +@patch("hyperion.device_setup_plans.setup_panda.datetime", spec=datetime) +def test_set_panda_directory( + mock_datetime, mock_get_directory_provider: MagicMock, tmp_path, RE +): + mock_directory_provider = MagicMock(spec=UpdatingDirectoryProvider) + mock_datetime.now = MagicMock( + return_value=datetime.fromisoformat("2024-08-11T15:59:23") + ) + mock_get_directory_provider.return_value = mock_directory_provider - with patch( - "hyperion.device_setup_plans.setup_panda.os.path.isdir", return_value=True - ), patch("hyperion.device_setup_plans.setup_panda.os.makedirs") as mock_makedir: - RE(set_and_create_panda_directory(Path(tmp_path))) - mock_makedir.assert_not_called() + RE(set_panda_directory(tmp_path)) + mock_directory_provider.update.assert_called_with( + directory=tmp_path, suffix="_20240811155923" + ) diff --git a/tests/unit_tests/experiment_plans/test_flyscan_xray_centre_plan.py b/tests/unit_tests/experiment_plans/test_flyscan_xray_centre_plan.py index e74dc624b..a75a508c4 100644 --- a/tests/unit_tests/experiment_plans/test_flyscan_xray_centre_plan.py +++ b/tests/unit_tests/experiment_plans/test_flyscan_xray_centre_plan.py @@ -895,7 +895,7 @@ def test_when_grid_scan_ran_then_eiger_disarmed_before_zocalo_end( mock_parent.assert_has_calls([call.disarm(), call.run_end(0), call.run_end(0)]) @patch( - "hyperion.experiment_plans.flyscan_xray_centre_plan.set_and_create_panda_directory", + "hyperion.experiment_plans.flyscan_xray_centre_plan.set_panda_directory", side_effect=_custom_msg("set_panda_directory"), ) @patch( @@ -912,7 +912,7 @@ def test_when_grid_scan_ran_then_eiger_disarmed_before_zocalo_end( ) def test_flyscan_xray_centre_sets_directory_stages_arms_disarms_unstages_the_panda( self, - mock_set_and_create_panda_directory: MagicMock, + mock_set_panda_directory: MagicMock, done_status: Status, fgs_composite_with_panda_pcap: FlyScanXRayCentreComposite, fgs_params_use_panda: ThreeDGridScan, @@ -927,7 +927,7 @@ def test_flyscan_xray_centre_sets_directory_stages_arms_disarms_unstages_the_pan flyscan_xray_centre(fgs_composite_with_panda_pcap, fgs_params_use_panda) ) - mock_set_and_create_panda_directory.assert_called_with( + mock_set_panda_directory.assert_called_with( Path("/tmp/dls/i03/data/2024/cm31105-4/xraycentring/123456") )