Skip to content

Commit 8fb8f68

Browse files
authored
Merge pull request #100 from Point72/tkp/consis
Add consistency for web routes
2 parents ee3ae63 + 72bc0f1 commit 8fb8f68

File tree

14 files changed

+226
-130
lines changed

14 files changed

+226
-130
lines changed

csp_gateway/server/modules/controls/controls.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import csp
88
import psutil
99
from csp import ts
10-
from fastapi import FastAPI
1110

1211
from csp_gateway.server import GatewayChannels, GatewayModule
1312

@@ -20,16 +19,27 @@
2019

2120

2221
class MountControls(GatewayModule):
23-
app: GatewayWebApp = None
24-
fastapi: FastAPI = None
22+
mount_heartbeat: bool = True
23+
mount_stats: bool = True
24+
mount_shutdown: bool = True
2525

2626
def connect(self, channels: GatewayChannels) -> None:
2727
self.subscribe(channels.get_channel("controls"))
2828
channels.add_send_channel("controls")
2929

3030
def rest(self, app: GatewayWebApp) -> None:
31-
self.app = app
32-
self.fastapi = app.get_fastapi()
31+
available = []
32+
if self.mount_heartbeat:
33+
app.add_controls_api(field="heartbeat")
34+
available.append("heartbeat")
35+
if self.mount_stats:
36+
app.add_controls_api(field="stats")
37+
available.append("stats")
38+
if self.mount_shutdown:
39+
app.add_controls_api(field="shutdown")
40+
available.append("shutdown")
41+
42+
app.add_controls_available_channels(fields=set(available))
3343

3444
@csp.node
3545
def manage_controls(self, data: ts[Controls]):

csp_gateway/server/modules/web/mount.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ class MountRestRoutes(GatewayModule):
1616
description="For debugging, will mount all rest routes for every channel, including state and send routes, even if not added by any modules",
1717
)
1818

19-
mount_last: ChannelSelection = ChannelSelection()
20-
mount_next: ChannelSelection = ChannelSelection()
21-
mount_send: ChannelSelection = ChannelSelection()
22-
mount_state: ChannelSelection = ChannelSelection()
23-
mount_lookup: ChannelSelection = ChannelSelection()
19+
mount_last: ChannelSelection = Field(default_factory=ChannelSelection, description="Channels to mount for last operations. Defaults to all")
20+
mount_next: ChannelSelection = Field(default_factory=ChannelSelection, description="Channels to mount for next operations. Defaults to all")
21+
mount_send: ChannelSelection = Field(default_factory=ChannelSelection, description="Channels to mount for send operations. Defaults to all")
22+
mount_state: ChannelSelection = Field(default_factory=ChannelSelection, description="Channels to mount for state operations. Defaults to all")
23+
mount_lookup: ChannelSelection = Field(default_factory=ChannelSelection, description="Channels to mount for lookup operations. Defaults to all")
2424

2525
@model_validator(mode="before")
2626
@classmethod
@@ -51,7 +51,7 @@ def _mount_last(self, app: GatewayWebApp) -> None:
5151
# Install on router
5252
app.add_last_api(name)
5353

54-
app.add_last_api_available_channels(channels_set)
54+
app.add_last_available_channels(channels_set)
5555

5656
def _mount_next(self, app: GatewayWebApp) -> None:
5757
selection = ChannelSelection() if self.force_mount_all else self.mount_next
@@ -62,7 +62,7 @@ def _mount_next(self, app: GatewayWebApp) -> None:
6262
# Install on router
6363
app.add_next_api(name)
6464

65-
app.add_next_api_available_channels(channels_set)
65+
app.add_next_available_channels(channels_set)
6666

6767
def _mount_send(self, app: GatewayWebApp) -> None:
6868
selection = ChannelSelection() if self.force_mount_all else self.mount_send
@@ -87,7 +87,7 @@ def _mount_send(self, app: GatewayWebApp) -> None:
8787
if missing_channels:
8888
log.info(f"Requested channels missing send routes are: {list(missing_channels)}")
8989

90-
app.add_send_api_available_channels(seen_channels)
90+
app.add_send_available_channels(seen_channels)
9191

9292
def _mount_state(self, app: GatewayWebApp) -> None:
9393
selection = ChannelSelection() if self.force_mount_all else self.mount_state
@@ -112,11 +112,15 @@ def _mount_state(self, app: GatewayWebApp) -> None:
112112
if missing_channels:
113113
log.info(f"Requested channels missing state routes: {list(channel[2:] for channel in missing_channels)}")
114114

115-
app.add_state_api_available_channels(seen_channels)
115+
app.add_state_available_channels(seen_channels)
116116

117117
def _mount_lookup(self, app: GatewayWebApp) -> None:
118118
selection = ChannelSelection() if self.force_mount_all else self.mount_lookup
119+
channels_set = set(selection.select_from(app.gateway.channels_model))
120+
119121
# Bind every wire
120122
for name in selection.select_from(app.gateway.channels_model):
121123
# Install on router
122124
app.add_lookup_api(name)
125+
126+
app.add_lookup_available_channels(channels_set)

csp_gateway/server/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class Settings(BaseSettings):
1717

1818
model_config = dict(case_sensitive=True)
1919

20-
API_V1_STR: str = "/api/v1"
20+
API_STR: str = "/api/v1"
2121
BACKEND_CORS_ORIGINS: List[AnyHttpUrl] = []
2222

2323
TITLE: str = "Gateway"

csp_gateway/server/web/app.py

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,17 @@
2828
)
2929

3030
from .routes import (
31+
add_controls_available_channels,
3132
add_controls_routes,
32-
add_last_api_available_channels,
33+
add_last_available_channels,
3334
add_last_routes,
35+
add_lookup_available_channels,
3436
add_lookup_routes,
35-
add_next_api_available_channels,
37+
add_next_available_channels,
3638
add_next_routes,
37-
add_send_api_available_channels,
39+
add_send_available_channels,
3840
add_send_routes,
39-
add_state_api_available_channels,
41+
add_state_available_channels,
4042
add_state_routes,
4143
)
4244
from .static import CacheControlledStaticFiles
@@ -285,7 +287,7 @@ def add_api(self) -> None:
285287

286288
self.app.include_router(
287289
api_router,
288-
prefix=self.settings.API_V1_STR,
290+
prefix=self.settings.API_STR,
289291
dependencies=self._middlewares,
290292
)
291293

@@ -326,9 +328,9 @@ def add_last_api(self, field: str) -> None:
326328

327329
add_last_routes(api_router=api_router, field=field, model=model, subroute_key=subroute_key)
328330

329-
def add_last_api_available_channels(self, fields: Optional[Set[str]] = None) -> None:
331+
def add_last_available_channels(self, fields: Optional[Set[str]] = None) -> None:
330332
api_router = self.get_router("last")
331-
add_last_api_available_channels(api_router=api_router, fields=fields)
333+
add_last_available_channels(api_router=api_router, fields=fields)
332334

333335
def add_next_api(self, field: str) -> None:
334336
api_router = self.get_router("next")
@@ -342,9 +344,9 @@ def add_next_api(self, field: str) -> None:
342344

343345
add_next_routes(api_router=api_router, field=field, model=model, subroute_key=subroute_key)
344346

345-
def add_next_api_available_channels(self, fields: Optional[Set[str]] = None) -> None:
347+
def add_next_available_channels(self, fields: Optional[Set[str]] = None) -> None:
346348
api_router = self.get_router("next")
347-
add_next_api_available_channels(api_router=api_router, fields=fields)
349+
add_next_available_channels(api_router=api_router, fields=fields)
348350

349351
def add_lookup_api(self, field: str) -> None:
350352
api_router = self.get_router("lookup")
@@ -357,6 +359,10 @@ def add_lookup_api(self, field: str) -> None:
357359

358360
add_lookup_routes(api_router=api_router, field=field, model=model)
359361

362+
def add_lookup_available_channels(self, fields: Optional[Set[str]] = None) -> None:
363+
api_router = self.get_router("lookup")
364+
add_lookup_available_channels(api_router=api_router, fields=fields)
365+
360366
def add_send_api(self, field: str) -> None:
361367
api_router = self.get_router("send")
362368
dict_basket = self._is_dict_basket_field(field=field)
@@ -370,9 +376,9 @@ def add_send_api(self, field: str) -> None:
370376

371377
add_send_routes(api_router=api_router, field=field, model=model, subroute_key=subroute_key)
372378

373-
def add_send_api_available_channels(self, fields: Optional[Set[str]] = None) -> None:
379+
def add_send_available_channels(self, fields: Optional[Set[str]] = None) -> None:
374380
api_router = self.get_router("send")
375-
add_send_api_available_channels(api_router=api_router, fields=fields)
381+
add_send_available_channels(api_router=api_router, fields=fields)
376382

377383
def add_state_api(self, field: str) -> None:
378384
api_router = self.get_router("state")
@@ -391,18 +397,19 @@ def add_state_api(self, field: str) -> None:
391397

392398
add_state_routes(api_router=api_router, field=field, model=model, subroute_key=subroute_key)
393399

394-
def add_state_api_available_channels(self, fields: Optional[Set[str]] = None) -> None:
400+
def add_state_available_channels(self, fields: Optional[Set[str]] = None) -> None:
395401
api_router = self.get_router("state")
396-
add_state_api_available_channels(api_router=api_router, fields=fields)
402+
add_state_available_channels(api_router=api_router, fields=fields)
397403

398-
def add_controls_api(self) -> None:
404+
def add_controls_api(self, field: str) -> None:
399405
api_router = self.get_router("controls")
400-
add_controls_routes(api_router)
406+
add_controls_routes(api_router, field=field)
401407

402-
def _finalize(self) -> None:
403-
# Add control APIs
404-
self.add_controls_api()
408+
def add_controls_available_channels(self, fields: Optional[Set[str]] = None) -> None:
409+
api_router = self.get_router("controls")
410+
add_controls_available_channels(api_router=api_router, fields=fields)
405411

412+
def _finalize(self) -> None:
406413
# Mount API routes
407414
self.add_api()
408415

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from .controls import add_controls_routes
2-
from .last import add_last_api_available_channels, add_last_routes
3-
from .lookup import add_lookup_routes
4-
from .next import add_next_api_available_channels, add_next_routes
5-
from .send import add_send_api_available_channels, add_send_routes
6-
from .shared import prepare_response
7-
from .state import add_state_api_available_channels, add_state_routes
1+
from .controls import *
2+
from .last import *
3+
from .lookup import *
4+
from .next import *
5+
from .send import *
6+
from .shared import *
7+
from .state import *

csp_gateway/server/web/routes/common.py

Whitespace-only changes.

0 commit comments

Comments
 (0)