Skip to content

Commit 1e79321

Browse files
committed
Fix open server URL
1 parent 31a8afc commit 1e79321

File tree

9 files changed

+54
-17
lines changed

9 files changed

+54
-17
lines changed

src/servers/OpenServerButton.tsx

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Button } from '@mui/material';
2-
import { Fragment, memo, useCallback } from 'react';
2+
import { Fragment, memo, useCallback, useMemo } from 'react';
33

44
import { useAxios } from '../common/AxiosContext';
55
import { useJupyterhub } from '../common/JupyterhubContext';
@@ -36,10 +36,14 @@ function _OpenServerButton(props: IOpenServerButton) {
3636
}
3737
}, [props, axios, jhData]);
3838

39+
const pendingUrl = useMemo(() => {
40+
const url = props.url.replace('user', 'hub/spawn-pending');
41+
return url.endsWith('/') ? url.slice(0, -1) : url;
42+
}, [props.url]);
3943
return (
4044
<Fragment>
4145
{props.active && (
42-
<Button href={props.url} target="_blank">
46+
<Button href={pendingUrl} target="_blank">
4347
Open Server
4448
</Button>
4549
)}

src/servers/ServersList.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ const columns: GridColDef[] = [
6565
<OpenServerButton
6666
url={params.row.url}
6767
serverName={params.row.name}
68-
imageName={params.row.image}
68+
imageName={params.row.uid ?? params.row.image}
6969
active={params.row.active}
7070
/>
7171
);
@@ -86,7 +86,9 @@ function _ServerList(props: IServerListProps) {
8686
}
8787
const allServers = servers.map((it, id) => {
8888
const newItem: any = { ...it, id };
89-
newItem.image = it.user_options.image ?? '';
89+
newItem.image =
90+
it.user_options?.display_name ?? it.user_options.image ?? '';
91+
newItem.uid = it.user_options?.uid ?? null;
9092
newItem.last_activity = formatTime(newItem.last_activity);
9193
return newItem;
9294
});

src/servers/types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ export interface IServerData {
33
name: string;
44
url: string;
55
last_activity: string;
6-
user_options: { image?: string };
6+
user_options: { image?: string; display_name?: string; uid?: string };
77
active: boolean;
88
}

tljh_repo2docker/binderhub_builder.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from urllib.parse import quote
44
from uuid import UUID, uuid4
55

6-
from aiodocker import Docker, DockerError
6+
from aiodocker import Docker
77
from jupyterhub.utils import url_path_join
88
from tornado import web
99

@@ -44,11 +44,11 @@ async def delete(self):
4444
async with db_context() as db:
4545
image = await image_db_manager.read(db, uid)
4646
if image:
47-
async with Docker() as docker:
48-
try:
47+
try:
48+
async with Docker() as docker:
4949
await docker.images.delete(image.name)
50-
except DockerError:
51-
pass
50+
except Exception:
51+
pass
5252
deleted = await image_db_manager.delete(db, uid)
5353

5454
self.set_header("content-type", "application/json")

tljh_repo2docker/database/manager.py

+20-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import logging
2-
from typing import List, Type, Union
2+
from typing import List, Optional, Type, Union
33

44
import sqlalchemy as sa
55
from pydantic import UUID4
@@ -105,6 +105,25 @@ async def read_all(self, db: AsyncSession) -> List[DockerImageOutSchema]:
105105
resources = (await db.execute(sa.select(self._table))).scalars().all()
106106
return [self._schema_out.model_validate(r) for r in resources]
107107

108+
async def read_by_image_name(
109+
self, db: AsyncSession, image: str
110+
) -> Optional[DockerImageOutSchema]:
111+
"""
112+
Get image by its name.
113+
114+
Args:
115+
db: An asyncio version of SQLAlchemy session.
116+
117+
Returns:
118+
The list of resources retrieved.
119+
"""
120+
statement = sa.select(self._table).where(self._table.name == image)
121+
try:
122+
result = await db.execute(statement)
123+
return self._schema_out.model_validate(result.scalars().first())
124+
except Exception:
125+
return None
126+
108127
async def update(
109128
self, db: AsyncSession, obj_in: DockerImageUpdateSchema, optimistic: bool = True
110129
) -> Union[DockerImageOutSchema, None]:

tljh_repo2docker/servers.py

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from inspect import isawaitable
2+
from typing import Dict, List
23

34
from tornado import web
45

@@ -24,7 +25,22 @@ async def get(self):
2425

2526
user_data = await self.fetch_user()
2627

27-
server_data = user_data.all_spawners()
28+
server_data: List[Dict] = user_data.all_spawners()
29+
30+
db_context, image_db_manager = self.get_db_handlers()
31+
if db_context and image_db_manager:
32+
async with db_context() as db:
33+
for data in server_data:
34+
image_name = data.get("user_options", {}).get("image", None)
35+
if image_name:
36+
db_data = await image_db_manager.read_by_image_name(
37+
db, image_name
38+
)
39+
if db_data:
40+
data["user_options"]["uid"] = str(db_data.uid)
41+
data["user_options"][
42+
"display_name"
43+
] = db_data.image_meta.display_name
2844
named_server_limit = 0
2945
result = self.render_template(
3046
"servers.html",

tljh_repo2docker/tests/binderhub_build/test_logs.py

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import json
2-
31
import pytest
42
from jupyterhub.tests.utils import async_requests
53

tljh_repo2docker/tests/local_build/test_logs.py

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import json
2-
31
import pytest
42
from jupyterhub.tests.utils import async_requests
53

ui-tests/jupyterhub_config_binderhub.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
"-m",
5959
"tljh_repo2docker",
6060
"--ip",
61-
"127.0.0.1",
61+
"0.0.0.0",
6262
"--port",
6363
"6789",
6464
"--config",

0 commit comments

Comments
 (0)