Skip to content

Commit 0b9c459

Browse files
committed
Move some remaining generic endpoints
1 parent e4d2dd7 commit 0b9c459

File tree

2 files changed

+128
-152
lines changed

2 files changed

+128
-152
lines changed

src/murfey/server/api/__init__.py

Lines changed: 3 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,19 @@
44
from pathlib import Path
55
from typing import List, Optional
66

7-
from fastapi import APIRouter, Depends, Request
8-
from fastapi.responses import FileResponse, HTMLResponse
7+
from fastapi import APIRouter, Depends
98
from prometheus_client import Counter, Gauge
10-
from pydantic import BaseModel
119
from sqlmodel import select
12-
from werkzeug.utils import secure_filename
1310

14-
import murfey.server.ispyb
1511
import murfey.server.prometheus as prom
16-
import murfey.server.websocket as ws
17-
from murfey.server import (
18-
_transport_object,
19-
get_hostname,
20-
get_machine_config,
21-
get_microscope,
22-
sanitise,
23-
templates,
24-
)
25-
from murfey.server.api.auth import MurfeySessionID, validate_token
12+
from murfey.server import sanitise
13+
from murfey.server.api.auth import validate_token
2614
from murfey.server.murfey_db import murfey_db
2715
from murfey.util.db import (
2816
ClientEnvironment,
29-
DataCollection,
30-
DataCollectionGroup,
3117
MagnificationLookup,
32-
ProcessingJob,
3318
RsyncInstance,
3419
Session,
35-
SPAFeedbackParameters,
36-
SPARelionParameters,
3720
)
3821
from murfey.util.models import ClientInfo, RsyncerInfo, RsyncerSource
3922

@@ -42,35 +25,6 @@
4225
router = APIRouter(dependencies=[Depends(validate_token)])
4326

4427

45-
# This will be the homepage for a given microscope.
46-
@router.get("/", response_class=HTMLResponse)
47-
async def root(request: Request):
48-
return templates.TemplateResponse(
49-
request=request,
50-
name="home.html",
51-
context={
52-
"hostname": get_hostname(),
53-
"microscope": get_microscope(),
54-
"version": murfey.__version__,
55-
},
56-
)
57-
58-
59-
@router.get("/health/")
60-
def health_check(db=murfey.server.ispyb.DB):
61-
conn = db.connection()
62-
conn.close()
63-
return {
64-
"ispyb_connection": True,
65-
"rabbitmq_connection": _transport_object.transport.is_connected(),
66-
}
67-
68-
69-
@router.get("/connections/")
70-
def connections_check():
71-
return {"connections": list(ws.manager.active_connections.keys())}
72-
73-
7428
@router.get("/mag_table/")
7529
def get_mag_table(db=murfey_db) -> List[MagnificationLookup]:
7630
return db.exec(select(MagnificationLookup)).all()
@@ -214,97 +168,12 @@ def increment_rsync_transferred_files_prometheus(
214168
).inc(rsyncer_info.data_bytes)
215169

216170

217-
class ProcessingDetails(BaseModel):
218-
data_collection_group: DataCollectionGroup
219-
data_collections: List[DataCollection]
220-
processing_jobs: List[ProcessingJob]
221-
relion_params: SPARelionParameters
222-
feedback_params: SPAFeedbackParameters
223-
224-
225171
@router.post("/visits/{visit_name}/monitoring/{on}")
226172
def change_monitoring_status(visit_name: str, on: int):
227173
prom.monitoring_switch.labels(visit=visit_name)
228174
prom.monitoring_switch.labels(visit=visit_name).set(on)
229175

230176

231-
@router.get("/sessions/{session_id}/upstream_visits")
232-
async def find_upstream_visits(session_id: MurfeySessionID, db=murfey_db):
233-
murfey_session = db.exec(select(Session).where(Session.id == session_id)).one()
234-
visit_name = murfey_session.visit
235-
instrument_name = murfey_session.instrument_name
236-
machine_config = get_machine_config(instrument_name=instrument_name)[
237-
instrument_name
238-
]
239-
upstream_visits = {}
240-
# Iterates through provided upstream directories
241-
for p in machine_config.upstream_data_directories:
242-
# Looks for visit name in file path
243-
for v in Path(p).glob(f"{visit_name.split('-')[0]}-*"):
244-
upstream_visits[v.name] = v / machine_config.processed_directory_name
245-
return upstream_visits
246-
247-
248-
def _get_upstream_tiff_dirs(visit_name: str, instrument_name: str) -> List[Path]:
249-
tiff_dirs = []
250-
machine_config = get_machine_config(instrument_name=instrument_name)[
251-
instrument_name
252-
]
253-
for directory_name in machine_config.upstream_data_tiff_locations:
254-
for p in machine_config.upstream_data_directories:
255-
if (Path(p) / secure_filename(visit_name)).is_dir():
256-
processed_dir = Path(p) / secure_filename(visit_name) / directory_name
257-
tiff_dirs.append(processed_dir)
258-
break
259-
if not tiff_dirs:
260-
log.warning(
261-
f"No candidate directory found for upstream download from visit {sanitise(visit_name)}"
262-
)
263-
return tiff_dirs
264-
265-
266-
@router.get("/visits/{visit_name}/{session_id}/upstream_tiff_paths")
267-
async def gather_upstream_tiffs(visit_name: str, session_id: int, db=murfey_db):
268-
"""
269-
Looks for TIFF files associated with the current session in the permitted storage
270-
servers, and returns their relative file paths as a list.
271-
"""
272-
instrument_name = (
273-
db.exec(select(Session).where(Session.id == session_id)).one().instrument_name
274-
)
275-
upstream_tiff_paths = []
276-
tiff_dirs = _get_upstream_tiff_dirs(visit_name, instrument_name)
277-
if not tiff_dirs:
278-
return None
279-
for tiff_dir in tiff_dirs:
280-
for f in tiff_dir.glob("**/*.tiff"):
281-
upstream_tiff_paths.append(str(f.relative_to(tiff_dir)))
282-
for f in tiff_dir.glob("**/*.tif"):
283-
upstream_tiff_paths.append(str(f.relative_to(tiff_dir)))
284-
return upstream_tiff_paths
285-
286-
287-
@router.get("/visits/{visit_name}/{session_id}/upstream_tiff/{tiff_path:path}")
288-
async def get_tiff(visit_name: str, session_id: int, tiff_path: str, db=murfey_db):
289-
instrument_name = (
290-
db.exec(select(Session).where(Session.id == session_id)).one().instrument_name
291-
)
292-
tiff_dirs = _get_upstream_tiff_dirs(visit_name, instrument_name)
293-
if not tiff_dirs:
294-
return None
295-
296-
tiff_path = "/".join(secure_filename(p) for p in tiff_path.split("/"))
297-
for tiff_dir in tiff_dirs:
298-
test_path = tiff_dir / tiff_path
299-
if test_path.is_file():
300-
break
301-
else:
302-
log.warning(f"TIFF {tiff_path} not found")
303-
return None
304-
305-
return FileResponse(path=test_path)
306-
307-
308177
@router.get("/prometheus/{metric_name}")
309178
def inspect_prometheus_metrics(
310179
metric_name: str,

src/murfey/server/api/session_info.py

Lines changed: 125 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,21 @@
44
from typing import Dict, List, Optional
55

66
from fastapi import APIRouter, Depends, Request
7+
from fastapi.responses import FileResponse, HTMLResponse
78
from pydantic import BaseModel
89
from sqlalchemy import func
910
from sqlmodel import select
11+
from werkzeug.utils import secure_filename
1012

1113
import murfey.server.ispyb
12-
from murfey.server import sanitise, templates
14+
import murfey.server.websocket as ws
15+
from murfey.server import (
16+
_transport_object,
17+
get_hostname,
18+
get_microscope,
19+
sanitise,
20+
templates,
21+
)
1322
from murfey.server.api.auth import MurfeySessionID, validate_token
1423
from murfey.server.api.shared import get_foil_hole as _get_foil_hole
1524
from murfey.server.api.shared import (
@@ -51,6 +60,35 @@
5160
)
5261

5362

63+
# This will be the homepage for a given microscope.
64+
@router.get("/", response_class=HTMLResponse)
65+
async def root(request: Request):
66+
return templates.TemplateResponse(
67+
request=request,
68+
name="home.html",
69+
context={
70+
"hostname": get_hostname(),
71+
"microscope": get_microscope(),
72+
"version": murfey.__version__,
73+
},
74+
)
75+
76+
77+
@router.get("/health/")
78+
def health_check(db=murfey.server.ispyb.DB):
79+
conn = db.connection()
80+
conn.close()
81+
return {
82+
"ispyb_connection": True,
83+
"rabbitmq_connection": _transport_object.transport.is_connected(),
84+
}
85+
86+
87+
@router.get("/connections/")
88+
def connections_check():
89+
return {"connections": list(ws.manager.active_connections.keys())}
90+
91+
5492
@router.get("/instruments/{instrument_name}/machine")
5593
def machine_info_by_instrument(instrument_name: str) -> Optional[MachineConfig]:
5694
return get_machine_config_for_instrument(instrument_name)
@@ -153,23 +191,6 @@ def remove_session(session_id: MurfeySessionID, db=murfey_db):
153191
remove_session_by_id(session_id, db)
154192

155193

156-
@router.get("/sessions/{session_id}/upstream_visits")
157-
async def find_upstream_visits(session_id: MurfeySessionID, db=murfey_db):
158-
murfey_session = db.exec(select(Session).where(Session.id == session_id)).one()
159-
visit_name = murfey_session.visit
160-
instrument_name = murfey_session.instrument_name
161-
machine_config = get_machine_config(instrument_name=instrument_name)[
162-
instrument_name
163-
]
164-
upstream_visits = {}
165-
# Iterates through provided upstream directories
166-
for p in machine_config.upstream_data_directories:
167-
# Looks for visit name in file path
168-
for v in Path(p).glob(f"{visit_name.split('-')[0]}-*"):
169-
upstream_visits[v.name] = v / machine_config.processed_directory_name
170-
return upstream_visits
171-
172-
173194
@router.get("/instruments/{instrument_name}/visits/{visit_name}/sessions")
174195
def get_sessions_with_visit(
175196
instrument_name: str, visit_name: str, db=murfey_db
@@ -373,3 +394,89 @@ def get_tilts(
373394
else:
374395
tilts[el[1].rsync_source] = [el[2].movie_path]
375396
return tilts
397+
398+
399+
correlative_router = APIRouter(
400+
prefix="/session_info/correlative",
401+
dependencies=[Depends(validate_token)],
402+
tags=["session info for correlative imaging"],
403+
)
404+
405+
406+
@correlative_router.get("/sessions/{session_id}/upstream_visits")
407+
async def find_upstream_visits(session_id: MurfeySessionID, db=murfey_db):
408+
murfey_session = db.exec(select(Session).where(Session.id == session_id)).one()
409+
visit_name = murfey_session.visit
410+
instrument_name = murfey_session.instrument_name
411+
machine_config = get_machine_config(instrument_name=instrument_name)[
412+
instrument_name
413+
]
414+
upstream_visits = {}
415+
# Iterates through provided upstream directories
416+
for p in machine_config.upstream_data_directories:
417+
# Looks for visit name in file path
418+
for v in Path(p).glob(f"{visit_name.split('-')[0]}-*"):
419+
upstream_visits[v.name] = v / machine_config.processed_directory_name
420+
return upstream_visits
421+
422+
423+
def _get_upstream_tiff_dirs(visit_name: str, instrument_name: str) -> List[Path]:
424+
tiff_dirs = []
425+
machine_config = get_machine_config(instrument_name=instrument_name)[
426+
instrument_name
427+
]
428+
for directory_name in machine_config.upstream_data_tiff_locations:
429+
for p in machine_config.upstream_data_directories:
430+
if (Path(p) / secure_filename(visit_name)).is_dir():
431+
processed_dir = Path(p) / secure_filename(visit_name) / directory_name
432+
tiff_dirs.append(processed_dir)
433+
break
434+
if not tiff_dirs:
435+
logger.warning(
436+
f"No candidate directory found for upstream download from visit {sanitise(visit_name)}"
437+
)
438+
return tiff_dirs
439+
440+
441+
@correlative_router.get("/visits/{visit_name}/{session_id}/upstream_tiff_paths")
442+
async def gather_upstream_tiffs(visit_name: str, session_id: int, db=murfey_db):
443+
"""
444+
Looks for TIFF files associated with the current session in the permitted storage
445+
servers, and returns their relative file paths as a list.
446+
"""
447+
instrument_name = (
448+
db.exec(select(Session).where(Session.id == session_id)).one().instrument_name
449+
)
450+
upstream_tiff_paths = []
451+
tiff_dirs = _get_upstream_tiff_dirs(visit_name, instrument_name)
452+
if not tiff_dirs:
453+
return None
454+
for tiff_dir in tiff_dirs:
455+
for f in tiff_dir.glob("**/*.tiff"):
456+
upstream_tiff_paths.append(str(f.relative_to(tiff_dir)))
457+
for f in tiff_dir.glob("**/*.tif"):
458+
upstream_tiff_paths.append(str(f.relative_to(tiff_dir)))
459+
return upstream_tiff_paths
460+
461+
462+
@correlative_router.get(
463+
"/visits/{visit_name}/{session_id}/upstream_tiff/{tiff_path:path}"
464+
)
465+
async def get_tiff(visit_name: str, session_id: int, tiff_path: str, db=murfey_db):
466+
instrument_name = (
467+
db.exec(select(Session).where(Session.id == session_id)).one().instrument_name
468+
)
469+
tiff_dirs = _get_upstream_tiff_dirs(visit_name, instrument_name)
470+
if not tiff_dirs:
471+
return None
472+
473+
tiff_path = "/".join(secure_filename(p) for p in tiff_path.split("/"))
474+
for tiff_dir in tiff_dirs:
475+
test_path = tiff_dir / tiff_path
476+
if test_path.is_file():
477+
break
478+
else:
479+
logger.warning(f"TIFF {tiff_path} not found")
480+
return None
481+
482+
return FileResponse(path=test_path)

0 commit comments

Comments
 (0)