Skip to content

Commit 976798d

Browse files
authored
Use config server for undulator config (#1768)
* Use server deployed on i03 beamline cluster for i03 config * Reset cache between tests * Fix lint * Use config server in undulator device * Use specific lut models for each undulator lut * Use config server deployed on i04 cluster * Improve patching of BEAMLINE env variable in tests * Pass config client into undulator * Push interaction with config client into devices where possible * Read config at device instantiation
1 parent 789df0a commit 976798d

29 files changed

+460
-229
lines changed

src/dodal/beamlines/i03.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
from functools import cache
22

3+
from daq_config_server import ConfigClient
34
from ophyd_async.core import PathProvider, Reference
45
from ophyd_async.fastcs.eiger import EigerDetector as FastEiger
56
from ophyd_async.fastcs.panda import HDFPanda
67
from yarl import URL
78

89
from dodal.common.beamlines.beamline_parameters import get_beamline_parameters
910
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
10-
from dodal.common.beamlines.beamline_utils import set_path_provider
11+
from dodal.common.beamlines.beamline_utils import set_config_client, set_path_provider
1112
from dodal.common.beamlines.commissioning_mode import set_commissioning_signal
1213
from dodal.common.udc_directory_provider import PandASubpathProvider
1314
from dodal.device_manager import DeviceManager
@@ -69,6 +70,7 @@
6970
)
7071
DISPLAY_CONFIG = "/dls_sw/i03/software/gda_versions/var/display.configuration"
7172
DAQ_CONFIGURATION_PATH = "/dls_sw/i03/software/daq_configuration"
73+
I03_CONFIG_SERVER_ENDPOINT = "https://i03-daq-config.diamond.ac.uk"
7274

7375
BL = get_beamline_name("i03")
7476
set_log_beamline(BL)
@@ -92,6 +94,14 @@ def path_provider() -> PathProvider:
9294
return provider
9395

9496

97+
@devices.fixture
98+
@cache
99+
def config_client() -> ConfigClient:
100+
client = ConfigClient(I03_CONFIG_SERVER_ENDPOINT)
101+
set_config_client(client)
102+
return client
103+
104+
95105
@devices.fixture
96106
def daq_configuration_path() -> str:
97107
return DAQ_CONFIGURATION_PATH
@@ -141,10 +151,11 @@ def vfm() -> FocusingMirrorWithStripes:
141151

142152

143153
@devices.factory()
144-
def mirror_voltages() -> MirrorVoltages:
154+
def mirror_voltages(config_client: ConfigClient) -> MirrorVoltages:
145155
return MirrorVoltages(
146156
prefix=f"{PREFIX.beamline_prefix}-MO-PSU-01:",
147157
daq_configuration_path=DAQ_CONFIGURATION_PATH,
158+
config_client=config_client,
148159
)
149160

150161

@@ -223,22 +234,29 @@ def synchrotron() -> Synchrotron:
223234

224235

225236
@devices.factory()
226-
def undulator(baton: Baton, daq_configuration_path: str) -> UndulatorInKeV:
237+
def undulator(
238+
baton: Baton, daq_configuration_path: str, config_client: ConfigClient
239+
) -> UndulatorInKeV:
227240
return UndulatorInKeV(
228241
f"{BeamlinePrefix(BL).insertion_prefix}-MO-SERVC-01:",
242+
config_client=config_client,
229243
id_gap_lookup_table_path=f"{daq_configuration_path}/lookup/BeamLine_Undulator_toGap.txt",
230244
baton=baton,
231245
)
232246

233247

234248
@devices.factory()
235249
def undulator_dcm(
236-
undulator: UndulatorInKeV, dcm: DCM, daq_configuration_path: str
250+
undulator: UndulatorInKeV,
251+
dcm: DCM,
252+
daq_configuration_path: str,
253+
config_client: ConfigClient,
237254
) -> UndulatorDCM:
238255
return UndulatorDCM(
239256
undulator=undulator,
240257
dcm=dcm,
241258
daq_configuration_path=daq_configuration_path,
259+
config_client=config_client,
242260
)
243261

244262

src/dodal/beamlines/i04.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
from functools import cache
2+
3+
from daq_config_server import ConfigClient
14
from ophyd_async.core import Reference
25

36
from dodal.common.beamlines.beamline_parameters import get_beamline_parameters
47
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
8+
from dodal.common.beamlines.beamline_utils import set_config_client
59
from dodal.device_manager import DeviceManager
610
from dodal.devices.aperturescatterguard import (
711
AperturePosition,
@@ -57,7 +61,7 @@
5761
ZOOM_PARAMS_FILE = "/dls_sw/i04/software/bluesky/scratch/jCameraManZoomLevels.xml"
5862
DISPLAY_CONFIG = "/dls_sw/i04/software/bluesky/scratch/display.configuration"
5963
DAQ_CONFIGURATION_PATH = "/dls_sw/i04/software/daq_configuration"
60-
64+
I04_CONFIG_SERVER_ENDPOINT = "https://i04-daq-config.diamond.ac.uk"
6165

6266
BL = get_beamline_name("i04")
6367
set_log_beamline(BL)
@@ -72,6 +76,14 @@
7276
devices = DeviceManager()
7377

7478

79+
@devices.fixture
80+
@cache
81+
def config_client() -> ConfigClient:
82+
client = ConfigClient(I04_CONFIG_SERVER_ENDPOINT)
83+
set_config_client(client)
84+
return client
85+
86+
7587
@devices.factory(use_factory_name=False)
7688
def smargon() -> Smargon:
7789
return Smargon(f"{PREFIX.beamline_prefix}-MO-SGON-01:", name="gonio")
@@ -179,9 +191,12 @@ def daq_configuration_path() -> str:
179191

180192

181193
@devices.factory()
182-
def undulator(baton: Baton, daq_configuration_path: str) -> UndulatorInKeV:
194+
def undulator(
195+
baton: Baton, daq_configuration_path: str, config_client: ConfigClient
196+
) -> UndulatorInKeV:
183197
return UndulatorInKeV(
184198
prefix=f"{PREFIX.insertion_prefix}-MO-SERVC-01:",
199+
config_client=config_client,
185200
id_gap_lookup_table_path=f"{daq_configuration_path}/lookup/BeamLine_Undulator_toGap.txt",
186201
baton=baton,
187202
)

src/dodal/beamlines/i07.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1+
from functools import cache
2+
3+
from daq_config_server import ConfigClient
4+
15
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
6+
from dodal.common.beamlines.beamline_utils import set_config_client
27
from dodal.device_manager import DeviceManager
38
from dodal.devices.beamlines.i07.dcm import DCM
49
from dodal.devices.beamlines.i07.id import InsertionDevice
@@ -14,6 +19,14 @@
1419
devices = DeviceManager()
1520

1621

22+
@devices.fixture
23+
@cache
24+
def config_client() -> ConfigClient:
25+
client = ConfigClient()
26+
set_config_client(client)
27+
return client
28+
29+
1730
@devices.factory()
1831
def dcm() -> DCM:
1932
"""Instantiate DCM using two PV bases."""
@@ -28,12 +41,13 @@ def harmonic() -> UndulatorOrder:
2841

2942

3043
@devices.factory()
31-
def id(harmonic: UndulatorOrder) -> InsertionDevice:
44+
def id(harmonic: UndulatorOrder, config_client: ConfigClient) -> InsertionDevice:
3245
"""Get the i07 undulator device, instantiate it if it hasn't already been.
3346
If this is called when already instantiated it will return the existing object.
3447
"""
3548
return InsertionDevice(
3649
f"{PREFIX.insertion_prefix}-MO-SERVC-01:",
3750
harmonic,
51+
config_client,
3852
id_gap_lookup_table_path="/dls_sw/i07/software/gda/config/lookupTables/IIDCalibrationTable.txt",
3953
)

src/dodal/beamlines/i18.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
from pathlib import Path
22

3+
from daq_config_server import ConfigClient
34
from ophyd_async.fastcs.panda import HDFPanda
45

56
from dodal.common.beamlines.beamline_utils import (
67
device_factory,
8+
get_config_client,
79
get_path_provider,
10+
set_config_client,
811
set_path_provider,
912
)
1013
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
@@ -46,6 +49,8 @@
4649
)
4750
)
4851

52+
set_config_client(ConfigClient())
53+
4954

5055
@device_factory()
5156
def synchrotron() -> Synchrotron:
@@ -54,7 +59,9 @@ def synchrotron() -> Synchrotron:
5459

5560
@device_factory()
5661
def undulator() -> UndulatorInKeV:
57-
return UndulatorInKeV(f"{PREFIX.insertion_prefix}-MO-SERVC-01:")
62+
return UndulatorInKeV(
63+
f"{PREFIX.insertion_prefix}-MO-SERVC-01:", get_config_client()
64+
)
5865

5966

6067
# See https://github.com/DiamondLightSource/dodal/issues/1180

src/dodal/beamlines/i22.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from functools import cache
22
from pathlib import Path
33

4+
from daq_config_server import ConfigClient
45
from ophyd_async.core import (
56
PathProvider,
67
StaticPathProvider,
@@ -12,6 +13,7 @@
1213
from ophyd_async.fastcs.panda import HDFPanda
1314

1415
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
16+
from dodal.common.beamlines.beamline_utils import set_config_client
1517
from dodal.common.beamlines.device_helpers import CAM_SUFFIX, DET_SUFFIX, HDF5_SUFFIX
1618
from dodal.common.crystal_metadata import (
1719
MaterialsEnum,
@@ -52,6 +54,14 @@ def path_provider() -> PathProvider:
5254
return StaticPathProvider(UUIDFilenameProvider(), Path("/tmp"))
5355

5456

57+
@devices.fixture
58+
@cache
59+
def config_client() -> ConfigClient:
60+
client = ConfigClient()
61+
set_config_client(client)
62+
return client
63+
64+
5565
@devices.factory()
5666
def saxs(path_provider: PathProvider) -> PilatusDetector:
5767
metadata_holder = NXSasMetadataHolder(
@@ -178,9 +188,10 @@ def dcm() -> DCM:
178188

179189

180190
@devices.factory()
181-
def undulator() -> UndulatorInKeV:
191+
def undulator(config_client: ConfigClient) -> UndulatorInKeV:
182192
return UndulatorInKeV(
183193
prefix=f"{PREFIX.insertion_prefix}-MO-SERVC-01:",
194+
config_client=config_client,
184195
id_gap_lookup_table_path="/dls_sw/i22/software/daq_configuration/lookup/BeamLine_Undulator_toGap.txt",
185196
poles=80,
186197
length=2.0,

src/dodal/beamlines/p38.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
from pathlib import Path
22

3+
from daq_config_server import ConfigClient
34
from ophyd_async.epics.adaravis import AravisDetector
45
from ophyd_async.fastcs.panda import HDFPanda
56

67
from dodal.common.beamlines.beamline_utils import (
78
device_factory,
9+
get_config_client,
810
get_path_provider,
11+
set_config_client,
912
set_path_provider,
1013
)
1114
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
@@ -45,6 +48,8 @@
4548
)
4649
)
4750

51+
set_config_client(ConfigClient())
52+
4853

4954
@device_factory()
5055
def d3() -> AravisDetector:
@@ -160,6 +165,7 @@ def dcm() -> DCM:
160165
def undulator() -> UndulatorInKeV:
161166
return UndulatorInKeV(
162167
f"{PREFIX.insertion_prefix}-MO-SERVC-01:",
168+
get_config_client(),
163169
poles=80,
164170
length=2.0,
165171
)

src/dodal/common/beamlines/beamline_parameters.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import Any
22

3-
from dodal.common.beamlines.config_client import get_config_client
3+
from dodal.common.beamlines.beamline_utils import get_config_client
44

55
BEAMLINE_PARAMETER_PATHS = {
66
"i03": "/dls_sw/i03/software/daq_configuration/domain/beamlineParameters",
@@ -22,5 +22,5 @@ def get_beamline_parameters(beamline: str) -> dict[str, Any]:
2222
raise KeyError(
2323
"No beamline parameter path found, maybe 'BEAMLINE' environment variable is not set!"
2424
)
25-
config_client = get_config_client(beamline)
25+
config_client = get_config_client()
2626
return config_client.get_file_contents(beamline_param_path, dict)

src/dodal/common/beamlines/beamline_utils.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import Annotated, Final, TypeVar, cast
44

55
from bluesky.run_engine import call_in_bluesky_event_loop
6+
from daq_config_server import ConfigClient
67
from ophyd import Device as OphydV1Device
78
from ophyd.sim import make_fake_device
89
from ophyd_async.core import (
@@ -183,3 +184,26 @@ def clear_path_provider() -> None:
183184
except NameError:
184185
# In this case the path provider was never set so we can do nothing
185186
pass
187+
188+
189+
def set_config_client(config_client: ConfigClient):
190+
global CONFIG_CLIENT
191+
192+
LOGGER.info(
193+
f"Setting global config client to {config_client} (previously {globals().get('CONFIG_CLIENT')})",
194+
)
195+
CONFIG_CLIENT = config_client
196+
197+
198+
def get_config_client() -> ConfigClient:
199+
return CONFIG_CLIENT
200+
201+
202+
def clear_config_client() -> None:
203+
global CONFIG_CLIENT
204+
LOGGER.info(f"Clearing global config client: {globals().get('CONFIG_CLIENT')}")
205+
try:
206+
del CONFIG_CLIENT
207+
except NameError:
208+
# In this case the config client was never set so we can do nothing
209+
pass

src/dodal/common/beamlines/config_client.py

Lines changed: 0 additions & 16 deletions
This file was deleted.

0 commit comments

Comments
 (0)