Skip to content

Commit b5cebd6

Browse files
authored
Merge pull request #407 from kevin-bates/track-server-kernels
[Gateway] Track only this server's kernels
2 parents 7f63dde + dc29930 commit b5cebd6

File tree

2 files changed

+34
-31
lines changed

2 files changed

+34
-31
lines changed

jupyter_server/gateway/managers.py

+32-29
Original file line numberDiff line numberDiff line change
@@ -374,14 +374,14 @@ async def start_kernel(self, kernel_id=None, path=None, **kwargs):
374374
The API path (unicode, '/' delimited) for the cwd.
375375
Will be transformed to an OS path relative to root_dir.
376376
"""
377-
self.log.info('Request start kernel: kernel_id=%s, path="%s"', kernel_id, path)
377+
self.log.info(f"Request start kernel: kernel_id={kernel_id}, path='{path}'")
378378

379379
if kernel_id is None:
380380
if path is not None:
381381
kwargs['cwd'] = self.cwd_for_path(path)
382382
kernel_name = kwargs.get('kernel_name', 'python3')
383383
kernel_url = self._get_kernel_endpoint_url()
384-
self.log.debug("Request new kernel at: %s" % kernel_url)
384+
self.log.debug(f"Request new kernel at: {kernel_url}")
385385

386386
# Let KERNEL_USERNAME take precedent over http_user config option.
387387
if os.environ.get('KERNEL_USERNAME') is None and GatewayClient.instance().http_user:
@@ -399,12 +399,12 @@ async def start_kernel(self, kernel_id=None, path=None, **kwargs):
399399
response = await gateway_request(kernel_url, method='POST', body=json_body)
400400
kernel = json_decode(response.body)
401401
kernel_id = kernel['id']
402-
self.log.info("Kernel started: %s" % kernel_id)
403-
self.log.debug("Kernel args: %r" % kwargs)
402+
self.log.info(f"Kernel started: {kernel_id}")
403+
self.log.debug(f"Kernel args: {kwargs}")
404404
else:
405405
kernel = await self.get_kernel(kernel_id)
406406
kernel_id = kernel['id']
407-
self.log.info("Using existing kernel: %s" % kernel_id)
407+
self.log.info(f"Using existing kernel: {kernel_id}")
408408

409409
self._kernels[kernel_id] = kernel
410410
return kernel_id
@@ -418,20 +418,25 @@ async def get_kernel(self, kernel_id=None, **kwargs):
418418
The uuid of the kernel.
419419
"""
420420
kernel_url = self._get_kernel_endpoint_url(kernel_id)
421-
self.log.debug("Request kernel at: %s" % kernel_url)
421+
self.log.debug(f"Request kernel at: {kernel_url}")
422422
try:
423423
response = await gateway_request(kernel_url, method='GET')
424424
except web.HTTPError as error:
425425
if error.status_code == 404:
426-
self.log.warn("Kernel not found at: %s" % kernel_url)
426+
self.log.warn(f"Kernel not found at: {kernel_url}")
427427
self.remove_kernel(kernel_id)
428428
kernel = None
429429
else:
430430
raise
431431
else:
432432
kernel = json_decode(response.body)
433-
self._kernels[kernel_id] = kernel
434-
self.log.debug("Kernel retrieved: %s" % kernel)
433+
# Only update our models if we already know about this kernel
434+
if kernel_id in self._kernels:
435+
self._kernels[kernel_id] = kernel
436+
self.log.debug(f"Kernel retrieved: {kernel}")
437+
else:
438+
self.log.warning(f"Kernel '{kernel_id}' is not managed by this instance.")
439+
kernel = None
435440
return kernel
436441

437442
async def kernel_model(self, kernel_id):
@@ -443,18 +448,18 @@ async def kernel_model(self, kernel_id):
443448
kernel_id : uuid
444449
The uuid of the kernel.
445450
"""
446-
self.log.debug("RemoteKernelManager.kernel_model: %s", kernel_id)
447451
model = await self.get_kernel(kernel_id)
448452
return model
449453

450454
async def list_kernels(self, **kwargs):
451455
"""Get a list of kernels."""
452456
kernel_url = self._get_kernel_endpoint_url()
453-
self.log.debug("Request list kernels: %s", kernel_url)
457+
self.log.debug(f"Request list kernels: {kernel_url}")
454458
response = await gateway_request(kernel_url, method='GET')
455459
kernels = json_decode(response.body)
456-
self._kernels = {x['id']: x for x in kernels}
457-
return kernels
460+
# Only update our models if we already know about the kernels
461+
self._kernels = {x['id']: x for x in kernels if x['id'] in self._kernels}
462+
return list(self._kernels.values())
458463

459464
async def shutdown_kernel(self, kernel_id, now=False, restart=False):
460465
"""Shutdown a kernel by its kernel uuid.
@@ -469,9 +474,9 @@ async def shutdown_kernel(self, kernel_id, now=False, restart=False):
469474
The purpose of this shutdown is to restart the kernel (True)
470475
"""
471476
kernel_url = self._get_kernel_endpoint_url(kernel_id)
472-
self.log.debug("Request shutdown kernel at: %s", kernel_url)
477+
self.log.debug(f"Request shutdown kernel at: {kernel_url}")
473478
response = await gateway_request(kernel_url, method='DELETE')
474-
self.log.debug("Shutdown kernel response: %d %s", response.code, response.reason)
479+
self.log.debug(f"Shutdown kernel response: {response.code} {response.reason}")
475480
self.remove_kernel(kernel_id)
476481

477482
async def restart_kernel(self, kernel_id, now=False, **kwargs):
@@ -483,9 +488,9 @@ async def restart_kernel(self, kernel_id, now=False, **kwargs):
483488
The id of the kernel to restart.
484489
"""
485490
kernel_url = self._get_kernel_endpoint_url(kernel_id) + '/restart'
486-
self.log.debug("Request restart kernel at: %s", kernel_url)
491+
self.log.debug(f"Request restart kernel at: {kernel_url}")
487492
response = await gateway_request(kernel_url, method='POST', body=json_encode({}))
488-
self.log.debug("Restart kernel response: %d %s", response.code, response.reason)
493+
self.log.debug(f"Restart kernel response: {response.code} {response.reason}")
489494

490495
async def interrupt_kernel(self, kernel_id, **kwargs):
491496
"""Interrupt a kernel by its kernel uuid.
@@ -496,9 +501,9 @@ async def interrupt_kernel(self, kernel_id, **kwargs):
496501
The id of the kernel to interrupt.
497502
"""
498503
kernel_url = self._get_kernel_endpoint_url(kernel_id) + '/interrupt'
499-
self.log.debug("Request interrupt kernel at: %s", kernel_url)
504+
self.log.debug(f"Request interrupt kernel at: {kernel_url}")
500505
response = await gateway_request(kernel_url, method='POST', body=json_encode({}))
501-
self.log.debug("Interrupt kernel response: %d %s", response.code, response.reason)
506+
self.log.debug(f"Interrupt kernel response: {response.code} {response.reason}")
502507

503508
def shutdown_all(self, now=False):
504509
"""Shutdown all kernels."""
@@ -507,15 +512,15 @@ def shutdown_all(self, now=False):
507512
kwargs = {'method': 'DELETE'}
508513
kwargs = GatewayClient.instance().load_connection_args(**kwargs)
509514
client = HTTPClient()
510-
for kernel_id in self._kernels.keys():
515+
for kernel_id in self._kernels:
511516
kernel_url = self._get_kernel_endpoint_url(kernel_id)
512-
self.log.debug("Request delete kernel at: %s", kernel_url)
517+
self.log.debug(f"Request delete kernel at: {kernel_url}")
513518
try:
514519
response = client.fetch(kernel_url, **kwargs)
515520
except HTTPError:
516521
pass
517522
else:
518-
self.log.debug("Delete kernel response: %d %s", response.code, response.reason)
523+
self.log.debug(f"Delete kernel response: {response.code} {response.reason}")
519524
shutdown_kernels.append(kernel_id) # avoid changing dict size during iteration
520525
client.close()
521526
for kernel_id in shutdown_kernels:
@@ -562,10 +567,8 @@ async def get_all_specs(self):
562567
km = self.parent.kernel_manager
563568
remote_default_kernel_name = fetched_kspecs.get('default')
564569
if remote_default_kernel_name != km.default_kernel_name:
565-
self.log.info("Default kernel name on Gateway server ({gateway_default}) differs from "
566-
"Notebook server ({notebook_default}). Updating to Gateway server's value.".
567-
format(gateway_default=remote_default_kernel_name,
568-
notebook_default=km.default_kernel_name))
570+
self.log.info(f"Default kernel name on Gateway server ({remote_default_kernel_name}) differs from "
571+
f"Notebook server ({km.default_kernel_name}). Updating to Gateway server's value.")
569572
km.default_kernel_name = remote_default_kernel_name
570573

571574
remote_kspecs = fetched_kspecs.get('kernelspecs')
@@ -574,7 +577,7 @@ async def get_all_specs(self):
574577
async def list_kernel_specs(self):
575578
"""Get a list of kernel specs."""
576579
kernel_spec_url = self._get_kernelspecs_endpoint_url()
577-
self.log.debug("Request list kernel specs at: %s", kernel_spec_url)
580+
self.log.debug(f"Request list kernel specs at: {kernel_spec_url}")
578581
response = await gateway_request(kernel_spec_url, method='GET')
579582
kernel_specs = json_decode(response.body)
580583
return kernel_specs
@@ -588,7 +591,7 @@ async def get_kernel_spec(self, kernel_name, **kwargs):
588591
The name of the kernel.
589592
"""
590593
kernel_spec_url = self._get_kernelspecs_endpoint_url(kernel_name=str(kernel_name))
591-
self.log.debug("Request kernel spec at: %s" % kernel_spec_url)
594+
self.log.debug(f"Request kernel spec at: {kernel_spec_url}")
592595
try:
593596
response = await gateway_request(kernel_spec_url, method='GET')
594597
except web.HTTPError as error:
@@ -617,7 +620,7 @@ async def get_kernel_spec_resource(self, kernel_name, path):
617620
The name of the desired resource
618621
"""
619622
kernel_spec_resource_url = url_path_join(self.base_resource_endpoint, str(kernel_name), str(path))
620-
self.log.debug("Request kernel spec resource '{}' at: {}".format(path, kernel_spec_resource_url))
623+
self.log.debug(f"Request kernel spec resource '{path}' at: {kernel_spec_resource_url}")
621624
try:
622625
response = await gateway_request(kernel_spec_resource_url, method='GET')
623626
except web.HTTPError as error:

jupyter_server/services/kernels/handlers.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ async def post(self):
5555
class KernelHandler(APIHandler):
5656

5757
@web.authenticated
58-
def get(self, kernel_id):
58+
async def get(self, kernel_id):
5959
km = self.kernel_manager
60-
model = km.kernel_model(kernel_id)
60+
model = await ensure_async(km.kernel_model(kernel_id))
6161
self.finish(json.dumps(model, default=date_default))
6262

6363
@web.authenticated

0 commit comments

Comments
 (0)