@@ -90,6 +90,16 @@ def _kernels_endpoint_default(self):
9090 def _kernelspecs_endpoint_default (self ):
9191 return os .environ .get (self .kernelspecs_endpoint_env , self .kernelspecs_endpoint_default_value )
9292
93+ kernelspecs_resource_endpoint_default_value = '/kernelspecs'
94+ kernelspecs_resource_endpoint_env = 'JUPYTER_GATEWAY_KERNELSPECS_RESOURCE_ENDPOINT'
95+ kernelspecs_resource_endpoint = Unicode (default_value = kernelspecs_resource_endpoint_default_value , config = True ,
96+ help = """The gateway endpoint for accessing kernelspecs resources
97+ (JUPYTER_GATEWAY_KERNELSPECS_RESOURCE_ENDPOINT env var)""" )
98+
99+ @default ('kernelspecs_resource_endpoint' )
100+ def _kernelspecs_resource_endpoint_default (self ):
101+ return os .environ .get (self .kernelspecs_resource_endpoint_env , self .kernelspecs_resource_endpoint_default_value )
102+
93103 connect_timeout_default_value = 20.0
94104 connect_timeout_env = 'JUPYTER_GATEWAY_CONNECT_TIMEOUT'
95105 connect_timeout = Float (default_value = connect_timeout_default_value , config = True ,
@@ -332,6 +342,11 @@ def start_kernel(self, kernel_id=None, path=None, **kwargs):
332342
333343 kernel_env = {k : v for (k , v ) in dict (os .environ ).items () if k .startswith ('KERNEL_' )
334344 or k in GatewayClient .instance ().env_whitelist .split ("," )}
345+
346+ # Convey the full path to where this notebook file is located.
347+ if path is not None and kernel_env .get ('KERNEL_WORKING_DIR' ) is None :
348+ kernel_env ['KERNEL_WORKING_DIR' ] = kwargs ['cwd' ]
349+
335350 json_body = json_encode ({'name' : kernel_name , 'env' : kernel_env })
336351
337352 response = yield gateway_request (kernel_url , method = 'POST' , body = json_body )
@@ -466,7 +481,10 @@ class GatewayKernelSpecManager(KernelSpecManager):
466481
467482 def __init__ (self , ** kwargs ):
468483 super (GatewayKernelSpecManager , self ).__init__ (** kwargs )
469- self .base_endpoint = url_path_join (GatewayClient .instance ().url , GatewayClient .instance ().kernelspecs_endpoint )
484+ self .base_endpoint = url_path_join (GatewayClient .instance ().url ,
485+ GatewayClient .instance ().kernelspecs_endpoint )
486+ self .base_resource_endpoint = url_path_join (GatewayClient .instance ().url ,
487+ GatewayClient .instance ().kernelspecs_resource_endpoint )
470488
471489 def _get_kernelspecs_endpoint_url (self , kernel_name = None ):
472490 """Builds a url for the kernels endpoint
@@ -497,14 +515,7 @@ def get_all_specs(self):
497515 notebook_default = km .default_kernel_name ))
498516 km .default_kernel_name = remote_default_kernel_name
499517
500- # gateway doesn't support resources (requires transfer for use by NB client)
501- # so add `resource_dir` to each kernelspec and value of 'not supported in gateway mode'
502518 remote_kspecs = fetched_kspecs .get ('kernelspecs' )
503- for kernel_name , kspec_info in remote_kspecs .items ():
504- if not kspec_info .get ('resource_dir' ):
505- kspec_info ['resource_dir' ] = 'not supported in gateway mode'
506- remote_kspecs [kernel_name ].update (kspec_info )
507-
508519 raise gen .Return (remote_kspecs )
509520
510521 @gen .coroutine
@@ -539,9 +550,32 @@ def get_kernel_spec(self, kernel_name, **kwargs):
539550 raise
540551 else :
541552 kernel_spec = json_decode (response .body )
542- # Convert to instance of Kernelspec
543- kspec_instance = self .kernel_spec_class (resource_dir = u'' , ** kernel_spec ['spec' ])
544- raise gen .Return (kspec_instance )
553+
554+ raise gen .Return (kernel_spec )
555+
556+ @gen .coroutine
557+ def get_kernel_spec_resource (self , kernel_name , path ):
558+ """Get kernel spec for kernel_name.
559+
560+ Parameters
561+ ----------
562+ kernel_name : str
563+ The name of the kernel.
564+ path : str
565+ The name of the desired resource
566+ """
567+ kernel_spec_resource_url = url_path_join (self .base_resource_endpoint , str (kernel_name ), str (path ))
568+ self .log .debug ("Request kernel spec resource '{}' at: {}" .format (path , kernel_spec_resource_url ))
569+ try :
570+ response = yield gateway_request (kernel_spec_resource_url , method = 'GET' )
571+ except HTTPError as error :
572+ if error .code == 404 :
573+ kernel_spec_resource = None
574+ else :
575+ raise
576+ else :
577+ kernel_spec_resource = response .body
578+ raise gen .Return (kernel_spec_resource )
545579
546580
547581class GatewaySessionManager (SessionManager ):
0 commit comments