Skip to content

Commit e3de58b

Browse files
authored
Merge pull request #341 from kevin-bates/notebook-gateway-updates
Port gateway updates from notebook (PRs 5317 and 5484)
2 parents 5c31111 + c386729 commit e3de58b

File tree

2 files changed

+28
-13
lines changed

2 files changed

+28
-13
lines changed

jupyter_server/gateway/managers.py

+21-10
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def _kernelspecs_endpoint_default(self):
102102
def _kernelspecs_resource_endpoint_default(self):
103103
return os.environ.get(self.kernelspecs_resource_endpoint_env, self.kernelspecs_resource_endpoint_default_value)
104104

105-
connect_timeout_default_value = 60.0
105+
connect_timeout_default_value = 40.0
106106
connect_timeout_env = 'JUPYTER_GATEWAY_CONNECT_TIMEOUT'
107107
connect_timeout = Float(default_value=connect_timeout_default_value, config=True,
108108
help="""The time allowed for HTTP connection establishment with the Gateway server.
@@ -112,7 +112,7 @@ def _kernelspecs_resource_endpoint_default(self):
112112
def connect_timeout_default(self):
113113
return float(os.environ.get('JUPYTER_GATEWAY_CONNECT_TIMEOUT', self.connect_timeout_default_value))
114114

115-
request_timeout_default_value = 60.0
115+
request_timeout_default_value = 40.0
116116
request_timeout_env = 'JUPYTER_GATEWAY_REQUEST_TIMEOUT'
117117
request_timeout = Float(default_value=request_timeout_default_value, config=True,
118118
help="""The time allowed for HTTP request completion. (JUPYTER_GATEWAY_REQUEST_TIMEOUT env var)""")
@@ -226,18 +226,20 @@ def gateway_enabled(self):
226226

227227
# Ensure KERNEL_LAUNCH_TIMEOUT has a default value.
228228
KERNEL_LAUNCH_TIMEOUT = int(os.environ.get('KERNEL_LAUNCH_TIMEOUT', 40))
229-
os.environ['KERNEL_LAUNCH_TIMEOUT'] = str(KERNEL_LAUNCH_TIMEOUT)
230-
231-
LAUNCH_TIMEOUT_PAD = int(os.environ.get('LAUNCH_TIMEOUT_PAD', 2))
232229

233230
def init_static_args(self):
234231
"""Initialize arguments used on every request. Since these are static values, we'll
235232
perform this operation once.
236233
237234
"""
238-
# Ensure that request timeout is at least "pad" greater than launch timeout.
239-
if self.request_timeout < float(GatewayClient.KERNEL_LAUNCH_TIMEOUT + GatewayClient.LAUNCH_TIMEOUT_PAD):
240-
self.request_timeout = float(GatewayClient.KERNEL_LAUNCH_TIMEOUT + GatewayClient.LAUNCH_TIMEOUT_PAD)
235+
# Ensure that request timeout and KERNEL_LAUNCH_TIMEOUT are the same, taking the
236+
# greater value of the two.
237+
if self.request_timeout < float(GatewayClient.KERNEL_LAUNCH_TIMEOUT):
238+
self.request_timeout = float(GatewayClient.KERNEL_LAUNCH_TIMEOUT)
239+
elif self.request_timeout > float(GatewayClient.KERNEL_LAUNCH_TIMEOUT):
240+
GatewayClient.KERNEL_LAUNCH_TIMEOUT = int(self.request_timeout)
241+
# Ensure any adjustments are reflected in env.
242+
os.environ['KERNEL_LAUNCH_TIMEOUT'] = str(GatewayClient.KERNEL_LAUNCH_TIMEOUT)
241243

242244
self._static_args['headers'] = json.loads(self.headers)
243245
if 'Authorization' not in self._static_args['headers'].keys():
@@ -492,11 +494,20 @@ class GatewayKernelSpecManager(KernelSpecManager):
492494

493495
def __init__(self, **kwargs):
494496
super(GatewayKernelSpecManager, self).__init__(**kwargs)
495-
self.base_endpoint = url_path_join(GatewayClient.instance().url,
496-
GatewayClient.instance().kernelspecs_endpoint)
497+
base_endpoint = url_path_join(GatewayClient.instance().url,
498+
GatewayClient.instance().kernelspecs_endpoint)
499+
500+
self.base_endpoint = GatewayKernelSpecManager._get_endpoint_for_user_filter(base_endpoint)
497501
self.base_resource_endpoint = url_path_join(GatewayClient.instance().url,
498502
GatewayClient.instance().kernelspecs_resource_endpoint)
499503

504+
@staticmethod
505+
def _get_endpoint_for_user_filter(default_endpoint):
506+
kernel_user = os.environ.get('KERNEL_USERNAME')
507+
if kernel_user:
508+
return '?user='.join([default_endpoint, kernel_user])
509+
return default_endpoint
510+
500511
def _get_kernelspecs_endpoint_url(self, kernel_name=None):
501512
"""Builds a url for the kernels endpoint
502513

tests/test_gateway.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -152,24 +152,28 @@ async def test_gateway_env_options(init_gateway, jp_serverapp):
152152
assert jp_serverapp.gateway_config.connect_timeout == jp_serverapp.gateway_config.request_timeout
153153
assert jp_serverapp.gateway_config.connect_timeout == 44.4
154154

155+
GatewayClient.instance().init_static_args()
156+
assert GatewayClient.instance().KERNEL_LAUNCH_TIMEOUT == int(jp_serverapp.gateway_config.request_timeout)
157+
155158

156159
async def test_gateway_cli_options(jp_configurable_serverapp):
157160
argv = [
158161
'--gateway-url=' + mock_gateway_url,
159162
'--GatewayClient.http_user=' + mock_http_user,
160163
'--GatewayClient.connect_timeout=44.4',
161-
'--GatewayClient.request_timeout=44.4'
164+
'--GatewayClient.request_timeout=96.0'
162165
]
163166

164-
165167
GatewayClient.clear_instance()
166168
app = jp_configurable_serverapp(argv=argv)
167169

168170
assert app.gateway_config.gateway_enabled is True
169171
assert app.gateway_config.url == mock_gateway_url
170172
assert app.gateway_config.http_user == mock_http_user
171-
assert app.gateway_config.connect_timeout == app.gateway_config.request_timeout
172173
assert app.gateway_config.connect_timeout == 44.4
174+
assert app.gateway_config.request_timeout == 96.0
175+
GatewayClient.instance().init_static_args()
176+
assert GatewayClient.instance().KERNEL_LAUNCH_TIMEOUT == 96 # Ensure KLT gets set from request-timeout
173177
GatewayClient.clear_instance()
174178

175179

0 commit comments

Comments
 (0)