Skip to content

Commit e32ea1c

Browse files
authored
272 call be to get kernel (#274)
* Update Kernel class to include get_kernel_by_id method in kernel.py, add test_get_kernel_by_id method in test_kernel_service.py, and update NotebookKernel.js to import KernelModel from the correct path * Update Kernel class to include get_kernel_by_id method, update NotebookKernel.js to import KernelModel from the correct path, and refactor KernelModel to remove basePath parameter in restartKernel method
1 parent 5c22974 commit e32ea1c

File tree

5 files changed

+54
-4
lines changed

5 files changed

+54
-4
lines changed

server/app/routes/kernel.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66

77
logging.basicConfig(level=logging.INFO)
88

9+
@kernel_blueprint.route('/kernel/<path:kernel_id>', methods=['GET'])
10+
def get_kernel_by_id(kernel_id):
11+
logging.info(f"Getting kernel with id: {kernel_id}")
12+
return Kernel.get_kernel_by_id(kernel_id)
13+
914
@kernel_blueprint.route('/kernel/restart/<path:kernel_id>', methods=['POST'])
1015
def restart_kernel(kernel_id):
1116
logging.info(f"Restarting kernel with id: {kernel_id}")

server/app/services/kernel.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,28 @@
1010

1111
class Kernel:
1212

13+
@staticmethod
14+
def get_kernel_by_id(kernel_id):
15+
try:
16+
response = requests.get(app.config['JUPYTER_KERNEL_API_PATH'] + f"/{kernel_id}")
17+
except Exception as e:
18+
logger.error(f"Met exception getting all kernels: {e}")
19+
return Response(
20+
response=json.dumps({'message': 'Error getting all kernels from Jupyter Server: ' + str(e)}),
21+
status=404)
22+
23+
if response.status_code != 200:
24+
logger.error(f"Error getting kernel: {response.content}")
25+
return Response(
26+
response=json.dumps({'message': 'Error getting kernel'}),
27+
status=404)
28+
29+
return Response(
30+
response=response,
31+
status=200,
32+
mimetype='application/json'
33+
)
34+
1335
@staticmethod
1436
def restart_kernel(kernel_id):
1537
path = app.config['JUPYTER_KERNEL_API_PATH'] + f"/{kernel_id}/restart"

server/tests/services/test_kernel_service.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,29 @@ def setUp(self):
1212
self.app = create_app()
1313
self.client = self.app.test_client()
1414

15+
def test_get_kernel_by_id(self):
16+
with self.app.app_context():
17+
# Get non-exist kernel
18+
response_0 = Kernel.get_kernel_by_id('kernel_id')
19+
self.assertEqual(response_0.status_code, 404)
20+
21+
# Create Notebook
22+
response_1 = Notebook.create_notebook_with_init_cells(notebook_name='Notebook_1.ipynb', notebook_path='')
23+
self.assertEqual(response_1.status_code, 200)
24+
25+
notebook_1 = json.loads(response_1.data.decode('utf-8'))
26+
notebook_path_1 = notebook_1['path']
27+
28+
# Create Session
29+
response_2 = Session.create_session(notebook_path_1)
30+
self.assertEqual(response_2.status_code, 200)
31+
session = json.loads(response_2.data.decode('utf-8'))
32+
kernelId = session['kernel']['id']
33+
34+
# Get kernel
35+
response_3 = Kernel.get_kernel_by_id(kernelId)
36+
self.assertEqual(response_3.status_code, 200)
37+
1538
def test_restart_kernel(self):
1639
with self.app.app_context():
1740
# Restart non-exist kernel

webapp/src/components/notebook/header/NotebookKernel.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useState } from 'react';
33
import { JupyterKernelIcon } from '@datalayer/icons-react';
44
import { VscTriangleDown } from "react-icons/vsc";
55
import LoadingButton from '@mui/lab/LoadingButton';
6-
import KernelModel from '../../../models/KernelModel';
6+
import KernelModel from '../../../models/KernelModel'
77
import config from '../../../config';
88

99
const NotebookKernel = ({
@@ -21,7 +21,7 @@ const NotebookKernel = ({
2121
setIsRestarting(true);
2222
setMenuOpen(false);
2323
setSparkAppId(null);
24-
await KernelModel.restartKernel(config.jupyterBaseUrl, kernelId);
24+
await KernelModel.restartKernel(kernelId);
2525
setIsRestarting(false);
2626
} catch (error) {
2727
console.error('Failed to restart kernel:', error);

webapp/src/models/KernelModel.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ class KernelModel {
22
constructor() {
33
}
44

5-
static async restartKernel(basePath = '', kernelId = '') {
5+
static async restartKernel(kernelId = '') {
66
try {
77
// Wait for the kernel to restart
88
await fetch(`http://localhost:5002/kernel/restart/${kernelId}`, {
@@ -14,7 +14,7 @@ class KernelModel {
1414

1515
let status;
1616
do {
17-
const response = await fetch(`${basePath}/api/kernels/${kernelId}`);
17+
const response = await fetch(`http://localhost:5002/kernel/${kernelId}`);
1818
const data = await response.json();
1919
status = data.execution_state;
2020
if (status === 'busy') {

0 commit comments

Comments
 (0)