Skip to content
This repository was archived by the owner on Jun 16, 2021. It is now read-only.

Commit bb2919c

Browse files
committed
Enforce that provider run inside k8s cluster
Also set appropriate version dependencies.
1 parent ca8c176 commit bb2919c

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed
Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,48 @@
11
"""Provides support for launching and managing kernels within a Kubernetes cluster."""
2-
2+
import os
3+
from datetime import datetime
4+
from kubernetes import config
5+
from kubernetes.config.config_exception import ConfigException
36
from remote_kernel_provider import RemoteKernelProviderBase
47

58

9+
LOGGED_WARNING_INTERVAL = int(os.getenv("K8SKP_LOGGED_WARNING_INTERVAL_SECS", "600")) # log no more than every 10 min
10+
last_logged_warning = datetime.min
11+
first_time = True
12+
in_cluster = False
13+
14+
615
class KubernetesKernelProvider(RemoteKernelProviderBase):
716
id = 'k8skp'
817
kernel_file = 'k8skp_kernel.json'
918
lifecycle_manager_classes = ['kubernetes_kernel_provider.k8s.KubernetesKernelLifecycleManager']
19+
20+
def find_kernels(self):
21+
""" Ensures the provider is running within a Kubernetes cluster. If not, it will
22+
log a warning message and no kernelspecs will be returned. Since find_kernels()
23+
is frequently called, it will only log the warning periodically (10 minutes by default).
24+
"""
25+
global first_time, in_cluster, last_logged_warning
26+
27+
# Only check the cluster config once since the results can't change unless restarted.
28+
if first_time:
29+
try:
30+
config.load_incluster_config()
31+
in_cluster = True
32+
except ConfigException as ce:
33+
# Check to see if we're in-cluster via env. If in-cluster, periodically
34+
# log a warning
35+
if os.getenv('KUBERNETES_SERVICE_HOST') is not None:
36+
raise ce # Got an exception in-cluster - let it be known
37+
first_time = False
38+
39+
if not in_cluster:
40+
current_time = datetime.now()
41+
delta = current_time - last_logged_warning
42+
if delta.days > 0 or delta.seconds > LOGGED_WARNING_INTERVAL:
43+
self.log.warning("KubernetesKernelProvider must be run from within a Kubernetes "
44+
"cluster. No Kubernetes kernels will be available.")
45+
last_logged_warning = current_time
46+
return {}
47+
48+
return super(KubernetesKernelProvider, self).find_kernels()

setup.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ def run(self):
6161
'Programming Language :: Python :: 3',
6262
],
6363
install_requires = [
64-
'remote_kernel_provider',
65-
'jupyter_kernel_mgmt',
6664
'entrypoints',
67-
'kubernetes>=4.0.0',
65+
'kubernetes>=4.0.0',
66+
'jupyter_kernel_mgmt>=0.4.0',
67+
'remote_kernel_provider>=0.2.0',
6868
],
6969
extras_require = {
7070
'test': ['mock', 'pytest'],

0 commit comments

Comments
 (0)