2020import webbrowser
2121from datetime import datetime
2222from 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
2424from uuid import uuid4
2525
2626import docker
2929from renku .core import errors
3030from renku .core .config import get_value
3131from renku .core .constant import ProviderPriority
32+ from renku .core .login import read_renku_token
3233from renku .core .plugin import hookimpl
34+ from renku .core .session .utils import get_renku_url
3335from renku .core .util import communication
36+ from renku .core .util .jwt import is_token_expired
3437from renku .domain_model .project_context import project_context
3538from 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 :
0 commit comments