Skip to content

Commit

Permalink
Merge pull request jupyter-server#341 from kevin-bates/notebook-gatew…
Browse files Browse the repository at this point in the history
…ay-updates

Port gateway updates from notebook (PRs 5317 and 5484)
  • Loading branch information
Zsailer committed Nov 17, 2020
2 parents 8d22a05 + 629fb96 commit c1bb307
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 13 deletions.
31 changes: 21 additions & 10 deletions jupyter_server/gateway/managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ def _kernelspecs_endpoint_default(self):
def _kernelspecs_resource_endpoint_default(self):
return os.environ.get(self.kernelspecs_resource_endpoint_env, self.kernelspecs_resource_endpoint_default_value)

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

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

# Ensure KERNEL_LAUNCH_TIMEOUT has a default value.
KERNEL_LAUNCH_TIMEOUT = int(os.environ.get('KERNEL_LAUNCH_TIMEOUT', 40))
os.environ['KERNEL_LAUNCH_TIMEOUT'] = str(KERNEL_LAUNCH_TIMEOUT)

LAUNCH_TIMEOUT_PAD = int(os.environ.get('LAUNCH_TIMEOUT_PAD', 2))

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

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

def __init__(self, **kwargs):
super(GatewayKernelSpecManager, self).__init__(**kwargs)
self.base_endpoint = url_path_join(GatewayClient.instance().url,
GatewayClient.instance().kernelspecs_endpoint)
base_endpoint = url_path_join(GatewayClient.instance().url,
GatewayClient.instance().kernelspecs_endpoint)

self.base_endpoint = GatewayKernelSpecManager._get_endpoint_for_user_filter(base_endpoint)
self.base_resource_endpoint = url_path_join(GatewayClient.instance().url,
GatewayClient.instance().kernelspecs_resource_endpoint)

@staticmethod
def _get_endpoint_for_user_filter(default_endpoint):
kernel_user = os.environ.get('KERNEL_USERNAME')
if kernel_user:
return '?user='.join([default_endpoint, kernel_user])
return default_endpoint

def _get_kernelspecs_endpoint_url(self, kernel_name=None):
"""Builds a url for the kernels endpoint
Expand Down
10 changes: 7 additions & 3 deletions tests/test_gateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,24 +152,28 @@ async def test_gateway_env_options(init_gateway, jp_serverapp):
assert jp_serverapp.gateway_config.connect_timeout == jp_serverapp.gateway_config.request_timeout
assert jp_serverapp.gateway_config.connect_timeout == 44.4

GatewayClient.instance().init_static_args()
assert GatewayClient.instance().KERNEL_LAUNCH_TIMEOUT == int(jp_serverapp.gateway_config.request_timeout)


async def test_gateway_cli_options(jp_configurable_serverapp):
argv = [
'--gateway-url=' + mock_gateway_url,
'--GatewayClient.http_user=' + mock_http_user,
'--GatewayClient.connect_timeout=44.4',
'--GatewayClient.request_timeout=44.4'
'--GatewayClient.request_timeout=96.0'
]


GatewayClient.clear_instance()
app = jp_configurable_serverapp(argv=argv)

assert app.gateway_config.gateway_enabled is True
assert app.gateway_config.url == mock_gateway_url
assert app.gateway_config.http_user == mock_http_user
assert app.gateway_config.connect_timeout == app.gateway_config.request_timeout
assert app.gateway_config.connect_timeout == 44.4
assert app.gateway_config.request_timeout == 96.0
GatewayClient.instance().init_static_args()
assert GatewayClient.instance().KERNEL_LAUNCH_TIMEOUT == 96 # Ensure KLT gets set from request-timeout
GatewayClient.clear_instance()


Expand Down

0 comments on commit c1bb307

Please sign in to comment.