Skip to content

Commit 12469f9

Browse files
authored
fix(cli): output proper session link and only check registry if logged in (#3660)
1 parent d74cc72 commit 12469f9

File tree

2 files changed

+41
-6
lines changed

2 files changed

+41
-6
lines changed

renku/core/session/docker.py

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import webbrowser
2121
from datetime import datetime
2222
from pathlib import Path
23-
from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Optional, Tuple, Union, cast
23+
from typing import TYPE_CHECKING, Any, Dict, Iterator, List, Optional, Tuple, Union, cast
2424
from uuid import uuid4
2525

2626
import docker
@@ -29,8 +29,11 @@
2929
from renku.core import errors
3030
from renku.core.config import get_value
3131
from renku.core.constant import ProviderPriority
32+
from renku.core.login import read_renku_token
3233
from renku.core.plugin import hookimpl
34+
from renku.core.session.utils import get_renku_url
3335
from renku.core.util import communication
36+
from renku.core.util.jwt import is_token_expired
3437
from renku.domain_model.project_context import project_context
3538
from renku.domain_model.session import ISessionProvider, Session, SessionStopStatus
3639

@@ -67,11 +70,14 @@ def docker_client(self) -> docker.client.DockerClient:
6770
return self._docker_client
6871

6972
@staticmethod
70-
def _get_jupyter_urls(ports: Dict[str, Any], auth_token: str, jupyter_port: int = 8888) -> Iterable[str]:
73+
def _get_jupyter_urls(ports: Dict[str, Any], auth_token: str, jupyter_port: int = 8888) -> Iterator[str]:
7174
port_key = f"{jupyter_port}/tcp"
7275
if port_key not in ports:
73-
return list()
74-
return map(lambda x: f"http://{x['HostIp']}:{x['HostPort']}/?token={auth_token}", ports[port_key])
76+
return list() # type: ignore
77+
default_url = get_value("interactive", "default_url")
78+
if not default_url:
79+
default_url = "/lab"
80+
return map(lambda x: f"http://{x['HostIp']}:{x['HostPort']}{default_url}?token={auth_token}", ports[port_key])
7581

7682
def _get_docker_containers(self, project_name: str) -> List[docker.models.containers.Container]:
7783
return self.docker_client().containers.list(filters={"label": f"renku_project={project_name}"})
@@ -92,9 +98,22 @@ def build_image(self, image_descriptor: Path, image_name: str, config: Optional[
9298
def find_image(self, image_name: str, config: Optional[Dict[str, Any]]) -> bool:
9399
"""Find the given container image."""
94100
with communication.busy(msg=f"Checking for image {image_name}"):
101+
renku_url = get_renku_url()
102+
103+
# only search remote image if a user is logged in
104+
find_remote = True
105+
if renku_url is None:
106+
find_remote = False
107+
else:
108+
token = read_renku_token(endpoint=renku_url)
109+
if not token or is_token_expired(token):
110+
find_remote = False
111+
95112
try:
96113
self.docker_client().images.get(image_name)
97114
except docker.errors.ImageNotFound:
115+
if not find_remote:
116+
return False
98117
try:
99118
self.docker_client().images.get_registry_data(image_name)
100119
except docker.errors.APIError:
@@ -454,13 +473,23 @@ def session_open(self, project_name: str, session_name: Optional[str], **kwargs)
454473
def session_url(self, session_name: Optional[str]) -> Optional[str]:
455474
"""Get the URL of the interactive session."""
456475
sessions = self.docker_client().containers.list()
476+
default_url = get_value("interactive", "default_url")
477+
if not default_url:
478+
default_url = "/lab"
457479

458480
for c in sessions:
459481
if (
460482
c.short_id == session_name or (not session_name and len(sessions) == 1)
461483
) and f"{DockerSessionProvider.JUPYTER_PORT}/tcp" in c.ports:
462-
host = c.ports[f"{DockerSessionProvider.JUPYTER_PORT}/tcp"][0]
463-
return f'http://{host["HostIp"]}:{host["HostPort"]}/?token={c.labels["jupyter_token"]}'
484+
url = next(
485+
DockerSessionProvider._get_jupyter_urls(
486+
c.ports, c.labels["jupyter_token"], DockerSessionProvider.JUPYTER_PORT
487+
),
488+
None,
489+
)
490+
if not url:
491+
continue
492+
return url
464493
return None
465494

466495
def force_build_image(self, force_build: bool = False, **kwargs) -> bool:

renku/core/session/utils.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
import urllib
1919
from typing import Optional
2020

21+
from renku.core.login import read_renku_token
2122
from renku.core.util.git import get_remote
23+
from renku.core.util.jwt import is_token_expired
2224
from renku.core.util.urls import parse_authentication_endpoint
2325
from renku.domain_model.project_context import project_context
2426

@@ -54,4 +56,8 @@ def get_image_repository_host() -> Optional[str]:
5456
renku_url = get_renku_url()
5557
if not renku_url:
5658
return None
59+
token = read_renku_token(endpoint=renku_url)
60+
if not token or is_token_expired(token):
61+
# only guess host if user is logged in
62+
return None
5763
return "registry." + urllib.parse.urlparse(renku_url).netloc

0 commit comments

Comments
 (0)