From 261bc30b2f79c9623291bf3b1c632540b9dce8d4 Mon Sep 17 00:00:00 2001 From: Anastasiia Sliusar Date: Mon, 6 May 2024 17:00:41 +0200 Subject: [PATCH 01/14] Add parameter for configuring kernel specs (#87) --- jupyter_server/services/sessions/handlers.py | 10 ++++++++++ jupyter_server/services/sessions/sessionmanager.py | 9 ++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) 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..f1f7ae9ef3 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)) @@ -344,6 +350,7 @@ async def start_kernel_for_session( path=kernel_path, kernel_name=kernel_name, env=kernel_env, + custom_kernel_specs=custom_kernel_specs, ) return cast(str, kernel_id) From de64ec05e6c97c677861da147f6019b7d1e2868d Mon Sep 17 00:00:00 2001 From: Anastasiia Sliusar Date: Wed, 12 Jun 2024 18:10:00 +0200 Subject: [PATCH 02/14] fix a typo --- jupyter_server/services/sessions/sessionmanager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyter_server/services/sessions/sessionmanager.py b/jupyter_server/services/sessions/sessionmanager.py index d3cbe5c653..fff306ab86 100644 --- a/jupyter_server/services/sessions/sessionmanager.py +++ b/jupyter_server/services/sessions/sessionmanager.py @@ -340,7 +340,7 @@ async def start_kernel_for_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 + dictionary of kernel custom specifications """ # allow contents manager to specify kernels cwd kernel_path = await ensure_async(self.contents_manager.get_kernel_path(path=path)) From 726d90c146df56e29876af900b48c51b94b04469 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Jun 2024 16:35:21 +0000 Subject: [PATCH 03/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- jupyter_server/services/sessions/handlers.py | 6 +++--- jupyter_server/services/sessions/sessionmanager.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/jupyter_server/services/sessions/handlers.py b/jupyter_server/services/sessions/handlers.py index 7aec4a6159..0e9181f41a 100644 --- a/jupyter_server/services/sessions/handlers.py +++ b/jupyter_server/services/sessions/handlers.py @@ -94,7 +94,7 @@ async def post(self): kernel_id=kernel_id, name=name, type=mtype, - custom_kernel_specs=custom_kernel_specs + custom_kernel_specs=custom_kernel_specs, ) except NoSuchKernel: msg = ( @@ -156,7 +156,7 @@ async def patch(self, session_id): 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: @@ -176,7 +176,7 @@ async def patch(self, session_id): name=before["name"], path=before["path"], type=before["type"], - custom_kernel_specs = custom_kernel_specs + 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 fff306ab86..39627de45d 100644 --- a/jupyter_server/services/sessions/sessionmanager.py +++ b/jupyter_server/services/sessions/sessionmanager.py @@ -267,7 +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 + custom_kernel_specs: Optional[Dict[str, Any]] = None, ) -> Dict[str, Any]: """Creates a session and returns its model @@ -322,7 +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 + custom_kernel_specs: Optional[Dict[str, Any]] = None, ) -> str: """Start a new kernel for a given session. From 79e2953f36a5247e8f8068c812d9564a733fc2bf Mon Sep 17 00:00:00 2001 From: Anastasiia Sliusar Date: Mon, 24 Jun 2024 18:06:11 +0200 Subject: [PATCH 04/14] Add switching parameter --- jupyter_server/serverapp.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index ed0738976a..73f30779fa 100644 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -1426,6 +1426,13 @@ def _default_allow_remote(self) -> bool: """, ) + parameterized_kernels = Bool( + False, + config=True, + help="""Allows to switch to Parameterized kernel mode""", + ) + + browser = Unicode( "", config=True, @@ -2179,6 +2186,8 @@ def init_event_logger(self) -> None: self.event_logger.register_event_schema(schema_path) def init_webapp(self) -> None: + + # """initialize tornado webapp""" self.tornado_settings["allow_origin"] = self.allow_origin self.tornado_settings["websocket_compression_options"] = self.websocket_compression_options @@ -2986,7 +2995,7 @@ def target(): def start_app(self) -> None: """Start the Jupyter Server application.""" super().start() - +# if not self.allow_root: # check if we are running as root, and abort if it's not allowed try: @@ -3025,6 +3034,8 @@ def start_app(self) -> None: # Handle the browser opening. if self.open_browser and not self.sock: self.launch_browser() + if self.parameterized_kernels: + self.kernel_spec_manager.allow_parameterized_kernels(True) if self.identity_provider.token and self.identity_provider.token_generated: # log full URL with generated token, so there's a copy/pasteable link From 6ff701a520ea6e34da5384cee746b26646a22cad Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 16:06:28 +0000 Subject: [PATCH 05/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- jupyter_server/serverapp.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index 73f30779fa..5233da0199 100644 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -1432,7 +1432,6 @@ def _default_allow_remote(self) -> bool: help="""Allows to switch to Parameterized kernel mode""", ) - browser = Unicode( "", config=True, @@ -2186,7 +2185,6 @@ def init_event_logger(self) -> None: self.event_logger.register_event_schema(schema_path) def init_webapp(self) -> None: - # """initialize tornado webapp""" self.tornado_settings["allow_origin"] = self.allow_origin @@ -2995,7 +2993,7 @@ def target(): def start_app(self) -> None: """Start the Jupyter Server application.""" super().start() -# + # if not self.allow_root: # check if we are running as root, and abort if it's not allowed try: From 52d9da62dad28aade85f66b9231940055f0d2fb4 Mon Sep 17 00:00:00 2001 From: Anastasiia Sliusar Date: Wed, 26 Jun 2024 16:30:04 +0200 Subject: [PATCH 06/14] Update a parameter --- jupyter_server/serverapp.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index 73f30779fa..030ce13def 100644 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -1426,10 +1426,10 @@ def _default_allow_remote(self) -> bool: """, ) - parameterized_kernels = Bool( + allow_insecure_kernelspec_params = Bool( False, config=True, - help="""Allows to switch to Parameterized kernel mode""", + help="""Allow to use insecure kernelspec parameters""", ) @@ -3034,8 +3034,10 @@ def start_app(self) -> None: # Handle the browser opening. if self.open_browser and not self.sock: self.launch_browser() - if self.parameterized_kernels: - self.kernel_spec_manager.allow_parameterized_kernels(True) + if self.allow_insecure_kernelspec_params: + print('yesssssssssssssssss') + print(self.allow_insecure_kernelspec_params) + self.kernel_spec_manager.allow_insecure_kernelspec_params(self.allow_insecure_kernelspec_params) if self.identity_provider.token and self.identity_provider.token_generated: # log full URL with generated token, so there's a copy/pasteable link From 42314da941d7d0ac4b334bf2562ad3c9ac57be2c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 14:31:07 +0000 Subject: [PATCH 07/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- jupyter_server/serverapp.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index ebe4981347..5a9846a7a5 100644 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -3033,9 +3033,11 @@ def start_app(self) -> None: if self.open_browser and not self.sock: self.launch_browser() if self.allow_insecure_kernelspec_params: - print('yesssssssssssssssss') + print("yesssssssssssssssss") print(self.allow_insecure_kernelspec_params) - self.kernel_spec_manager.allow_insecure_kernelspec_params(self.allow_insecure_kernelspec_params) + self.kernel_spec_manager.allow_insecure_kernelspec_params( + self.allow_insecure_kernelspec_params + ) if self.identity_provider.token and self.identity_provider.token_generated: # log full URL with generated token, so there's a copy/pasteable link From 6dcee704a722d5a7cedd5f2eb674132003d14ad7 Mon Sep 17 00:00:00 2001 From: Anastasiia Sliusar Date: Fri, 28 Jun 2024 13:57:07 +0200 Subject: [PATCH 08/14] Update page config --- jupyter_server/serverapp.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index ebe4981347..3123eb4e47 100644 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -401,6 +401,8 @@ def init_settings( # collapse $HOME to ~ root_dir = "~" + root_dir[len(home) :] + self.allow_insecure_kernelspec_params = jupyter_app.allow_insecure_kernelspec_params + settings = { # basics "log_function": log_request, @@ -460,6 +462,7 @@ def init_settings( "server_root_dir": root_dir, "jinja2_env": env, "serverapp": jupyter_app, + "page_config_hook": (self.page_config_hook), } # allow custom overrides for the tornado web app. @@ -470,6 +473,10 @@ def init_settings( settings["xsrf_cookie_kwargs"] = {"path": base_url} return settings + def page_config_hook(self, handler, page_config): + page_config["allow_insecure_kernelspec_params "] = self.allow_insecure_kernelspec_params + return page_config + def init_handlers(self, default_services, settings): """Load the (URL pattern, handler) tuples for each component.""" # Order matters. The first handler to match the URL will handle the request. From f1fc8c087825125e23a7d0af825ba7276fca0a6e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 11:58:18 +0000 Subject: [PATCH 09/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- jupyter_server/serverapp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index ba108b75df..b47d006fe7 100644 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -474,7 +474,7 @@ def init_settings( return settings def page_config_hook(self, handler, page_config): - page_config["allow_insecure_kernelspec_params "] = self.allow_insecure_kernelspec_params + page_config["allow_insecure_kernelspec_params "] = self.allow_insecure_kernelspec_params return page_config def init_handlers(self, default_services, settings): From 1c888563d9ccf64d3de4f6ab9b5c95f4329859e8 Mon Sep 17 00:00:00 2001 From: Anastasiia Sliusar Date: Fri, 28 Jun 2024 14:35:21 +0200 Subject: [PATCH 10/14] Remove fail space --- jupyter_server/serverapp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index ba108b75df..4bb5ca35a6 100644 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -474,7 +474,7 @@ def init_settings( return settings def page_config_hook(self, handler, page_config): - page_config["allow_insecure_kernelspec_params "] = self.allow_insecure_kernelspec_params + page_config["allow_insecure_kernelspec_params"] = self.allow_insecure_kernelspec_params return page_config def init_handlers(self, default_services, settings): From d057fc8427f49c666cd6906905ba3ae853cdde56 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 12:36:50 +0000 Subject: [PATCH 11/14] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- jupyter_server/serverapp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index 4bb5ca35a6..4b3e959ecb 100644 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -474,7 +474,7 @@ def init_settings( return settings def page_config_hook(self, handler, page_config): - page_config["allow_insecure_kernelspec_params"] = self.allow_insecure_kernelspec_params + page_config["allow_insecure_kernelspec_params"] = self.allow_insecure_kernelspec_params return page_config def init_handlers(self, default_services, settings): From 41a3a77e24d474168f401aabe50207789373a0a7 Mon Sep 17 00:00:00 2001 From: Anastasiia Sliusar Date: Thu, 1 Aug 2024 18:11:52 +0200 Subject: [PATCH 12/14] Clean code --- jupyter_server/serverapp.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index 4bb5ca35a6..af4da69127 100644 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -3040,8 +3040,6 @@ def start_app(self) -> None: if self.open_browser and not self.sock: self.launch_browser() if self.allow_insecure_kernelspec_params: - print("yesssssssssssssssss") - print(self.allow_insecure_kernelspec_params) self.kernel_spec_manager.allow_insecure_kernelspec_params( self.allow_insecure_kernelspec_params ) From 89e0bfa327dcd5aae4b07d26b87a85c2188ee95b Mon Sep 17 00:00:00 2001 From: Anastasiia Sliusar Date: Thu, 1 Aug 2024 18:15:00 +0200 Subject: [PATCH 13/14] Clean code --- jupyter_server/serverapp.py | 1 - jupyter_server/services/sessions/sessionmanager.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index 2602c5c74a..f761748d44 100644 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -3000,7 +3000,6 @@ def target(): def start_app(self) -> None: """Start the Jupyter Server application.""" super().start() - # if not self.allow_root: # check if we are running as root, and abort if it's not allowed try: diff --git a/jupyter_server/services/sessions/sessionmanager.py b/jupyter_server/services/sessions/sessionmanager.py index 39627de45d..db889c942b 100644 --- a/jupyter_server/services/sessions/sessionmanager.py +++ b/jupyter_server/services/sessions/sessionmanager.py @@ -283,7 +283,6 @@ 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, custom_kernel_specs ) @@ -308,7 +307,6 @@ 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) From 56b18aab91da5bcc98b2f1f2c00d5099037515f1 Mon Sep 17 00:00:00 2001 From: Anastasiia Sliusar Date: Mon, 12 Aug 2024 12:42:00 +0200 Subject: [PATCH 14/14] Remove custom page config handler --- jupyter_server/serverapp.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index e781a73860..f257d11498 100644 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -401,8 +401,6 @@ def init_settings( # collapse $HOME to ~ root_dir = "~" + root_dir[len(home) :] - self.allow_insecure_kernelspec_params = jupyter_app.allow_insecure_kernelspec_params - settings = { # basics "log_function": log_request, @@ -462,7 +460,6 @@ def init_settings( "server_root_dir": root_dir, "jinja2_env": env, "serverapp": jupyter_app, - "page_config_hook": (self.page_config_hook), } # allow custom overrides for the tornado web app. @@ -473,10 +470,6 @@ def init_settings( settings["xsrf_cookie_kwargs"] = {"path": base_url} return settings - def page_config_hook(self, handler, page_config): - page_config["allow_insecure_kernelspec_params"] = self.allow_insecure_kernelspec_params - return page_config - def init_handlers(self, default_services, settings): """Load the (URL pattern, handler) tuples for each component.""" # Order matters. The first handler to match the URL will handle the request.