Skip to content

Commit 9dead84

Browse files
Merge pull request #407 from SelfhostedPro/develop
v0.0.7-hf1 Release
2 parents 73389df + f15bf48 commit 9dead84

File tree

11 files changed

+13404
-21668
lines changed

11 files changed

+13404
-21668
lines changed

backend/api/actions/apps.py

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from os import stat
12
from fastapi import HTTPException
23
from fastapi.responses import StreamingResponse
34

@@ -30,6 +31,7 @@
3031
import docker
3132
import aiodocker
3233
import asyncio
34+
import aiostream
3335

3436

3537
"""
@@ -283,7 +285,7 @@ def launch_app(
283285
failed_app = dclient.containers.get(name)
284286
failed_app.remove()
285287
raise HTTPException(
286-
status_code=e.status_code, detail=e.explanation.decode("utf-8")
288+
status_code=e.status_code, detail=e.explanation
287289
)
288290

289291
print(
@@ -514,6 +516,18 @@ async def stat_generator(request, app_name):
514516
# so there's no point in checking more often than that
515517
await asyncio.sleep(1)
516518

519+
async def all_stat_generator(request):
520+
async with aiodocker.Docker() as docker:
521+
containers = []
522+
_containers = await docker.containers.list()
523+
for _app in _containers:
524+
if _app._container["State"] == "running":
525+
containers.append(_app)
526+
loops = [stat_generator(request, app._container["Names"][0][1:]) for app in containers]
527+
async with aiostream.stream.merge(*loops).stream() as merged:
528+
async for event in merged:
529+
yield event
530+
517531

518532
async def process_app_stats(line, app_name):
519533
cpu_total = 0.0

backend/api/actions/compose.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,10 @@ def get_compose(name):
228228
volumes = []
229229
services = {}
230230
compose = open(file)
231-
loaded_compose = yaml.load(compose, Loader=yaml.SafeLoader)
231+
try:
232+
loaded_compose = yaml.load(compose, Loader=yaml.SafeLoader)
233+
except yaml.scanner.ScannerError as exc:
234+
raise HTTPException(422, f"{exc.problem_mark.line}:{exc.problem_mark.column} - {exc.problem}")
232235
if loaded_compose.get("volumes"):
233236
for volume in loaded_compose.get("volumes"):
234237
volumes.append(volume)

backend/api/routers/apps.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ def update_container(app_name, Authorize: AuthJWT = Depends()):
3535
auth_check(Authorize)
3636
return actions.app_update(app_name)
3737

38+
@router.get("/stats")
39+
async def all_sse_stats(request: Request, Authorize: AuthJWT = Depends()):
40+
auth_check(Authorize)
41+
stat_generator = actions.all_stat_generator(request)
42+
return EventSourceResponse(stat_generator)
3843

3944
@router.get("/{app_name}")
4045
def get_container_details(app_name, Authorize: AuthJWT = Depends()):
@@ -65,7 +70,6 @@ def deploy_app(template: schemas.DeployForm, Authorize: AuthJWT = Depends()):
6570
auth_check(Authorize)
6671
return actions.deploy_app(template=template)
6772

68-
6973
@router.get("/{app_name}/logs")
7074
async def logs(app_name: str, request: Request, Authorize: AuthJWT = Depends()):
7175
auth_check(Authorize)
@@ -77,4 +81,4 @@ async def logs(app_name: str, request: Request, Authorize: AuthJWT = Depends()):
7781
async def sse_stats(app_name: str, request: Request, Authorize: AuthJWT = Depends()):
7882
auth_check(Authorize)
7983
stat_generator = actions.stat_generator(request, app_name)
80-
return EventSourceResponse(stat_generator)
84+
return EventSourceResponse(stat_generator)

backend/requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
aiodocker==0.19.1
22
aiosqlite==0.15.0
3+
aiostream==0.4.3
34
alembic==1.4.3
45
bcrypt==3.1.7
56
certifi==2020.6.20

0 commit comments

Comments
 (0)