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