diff --git a/jupyter_server/services/sessions/handlers.py b/jupyter_server/services/sessions/handlers.py index 3e013c0335..7aec4a6159 100644 --- a/jupyter_server/services/sessions/handlers.py +++ b/jupyter_server/services/sessions/handlers.py @@ -77,6 +77,7 @@ async def post(self): kernel = model.get("kernel", {}) kernel_name = kernel.get("name", None) kernel_id = kernel.get("id", None) + custom_kernel_specs = kernel.get("custom_kernel_specs", {}) if not kernel_id and not kernel_name: self.log.debug("No kernel specified, using default kernel") @@ -93,6 +94,7 @@ async def post(self): kernel_id=kernel_id, name=name, type=mtype, + custom_kernel_specs=custom_kernel_specs ) except NoSuchKernel: msg = ( @@ -152,6 +154,9 @@ async def patch(self, session_id): changes["name"] = model["name"] if "type" in model: changes["type"] = model["type"] + if "custom_kernel_specs" in model: + changes["custom_kernel_specs"] = model["custom_kernel_specs"] + if "kernel" in model: # Kernel id takes precedence over name. if model["kernel"].get("id") is not None: @@ -160,6 +165,10 @@ async def patch(self, session_id): raise web.HTTPError(400, "No such kernel: %s" % kernel_id) changes["kernel_id"] = kernel_id elif model["kernel"].get("name") is not None: + if "custom_kernel_specs" in model["kernel"]: + custom_kernel_specs = model["kernel"]["custom_kernel_specs"] + else: + custom_kernel_specs = None kernel_name = model["kernel"]["name"] kernel_id = await sm.start_kernel_for_session( session_id, @@ -167,6 +176,7 @@ async def patch(self, session_id): name=before["name"], path=before["path"], type=before["type"], + custom_kernel_specs = custom_kernel_specs ) changes["kernel_id"] = kernel_id diff --git a/jupyter_server/services/sessions/sessionmanager.py b/jupyter_server/services/sessions/sessionmanager.py index 5f3a19c71d..db58fe57a8 100644 --- a/jupyter_server/services/sessions/sessionmanager.py +++ b/jupyter_server/services/sessions/sessionmanager.py @@ -267,6 +267,7 @@ async def create_session( type: Optional[str] = None, kernel_name: Optional[KernelName] = None, kernel_id: Optional[str] = None, + custom_kernel_specs: Optional[Dict[str, Any]] = None ) -> Dict[str, Any]: """Creates a session and returns its model @@ -282,8 +283,9 @@ async def create_session( if kernel_id is not None and kernel_id in self.kernel_manager: pass else: + # kernel_id = await self.start_kernel_for_session( - session_id, path, name, type, kernel_name + session_id, path, name, type, kernel_name, custom_kernel_specs ) record.kernel_id = kernel_id self._pending_sessions.update(record) @@ -306,6 +308,7 @@ def get_kernel_env( Here the name is likely to be the name of the associated file with the current kernel at startup time. """ + # if name is not None: cwd = self.kernel_manager.cwd_for_path(path) path = os.path.join(cwd, name) @@ -319,6 +322,7 @@ async def start_kernel_for_session( name: Optional[ModelName], type: Optional[str], kernel_name: Optional[KernelName], + custom_kernel_specs: Optional[Dict[str, Any]] = None ) -> str: """Start a new kernel for a given session. @@ -335,6 +339,8 @@ async def start_kernel_for_session( the type of the session kernel_name : str the name of the kernel specification to use. The default kernel name will be used if not provided. + custom_kernel_specs: dict + dictionary of kernek custom specifications """ # allow contents manager to specify kernels cwd kernel_path = await ensure_async(self.contents_manager.get_kernel_path(path=path))