Skip to content

Commit a097f5a

Browse files
committed
fixes to allow valueFrom for env. variables
1 parent 69e7fcc commit a097f5a

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

kubespawner/objects.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def make_pod(
6363
supplemental_gids=None,
6464
run_privileged=False,
6565
allow_privilege_escalation=True,
66+
env=None,
6667
env_from=None,
6768
working_dir=None,
6869
volumes=None,
@@ -341,6 +342,7 @@ def make_pod(
341342
image=image,
342343
working_dir=working_dir,
343344
ports=[V1ContainerPort(name='notebook-port', container_port=port)],
345+
env=env,
344346
env_from=[V1EnvFromSource(secret_ref=V1SecretEnvSource(env_from))],
345347
args=cmd,
346348
image_pull_policy=image_pull_policy,
@@ -671,10 +673,6 @@ def make_secret(
671673
going to be created in.
672674
username:
673675
The name of the user notebook.
674-
cert_paths:
675-
JupyterHub spawners cert_paths dictionary container certificate path references
676-
hub_ca:
677-
Path to the hub certificate authority
678676
labels:
679677
Labels to add to the secret.
680678
annotations:

kubespawner/spawner.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
from jupyterhub.spawner import Spawner
2929
from jupyterhub.traitlets import Command
3030
from jupyterhub.utils import exponential_backoff
31+
from kubespawner.utils import get_k8s_model
32+
from kubernetes.client.models import V1EnvVar
3133
from kubernetes import client
3234
from kubernetes.client.rest import ApiException
3335
from slugify import slugify
@@ -1625,6 +1627,7 @@ async def get_pod_manifest(self):
16251627
supplemental_gids=supplemental_gids,
16261628
run_privileged=self.privileged,
16271629
allow_privilege_escalation=self.allow_privilege_escalation,
1630+
env=self.get_env()[1],
16281631
env_from=self.secret_name,
16291632
volumes=self._expand_all(self.volumes),
16301633
volume_mounts=self._expand_all(self.volume_mounts),
@@ -1669,7 +1672,7 @@ def get_secret_manifest(self, owner_reference):
16691672

16701673
return make_secret(
16711674
name=self.secret_name,
1672-
str_data=self.get_env(),
1675+
str_data=self.get_env()[0],
16731676
username=self.user.name,
16741677
owner_references=[owner_reference],
16751678
labels=labels,
@@ -1768,10 +1771,33 @@ def get_env(self):
17681771
"""
17691772

17701773
env = super(KubeSpawner, self).get_env()
1774+
1775+
"""Separate env. variables into two dicts
1776+
- Dict containing only "valueFrom" env. variables, these are passed as-is.
1777+
- replace existing env dict with only "value" env. varaibles, these are passed into secret.
1778+
"""
1779+
prepared_env = []
1780+
# create a separate dict for all "valueFrom" environment variables
1781+
extra_env = {k: v for k, v in (env or {}).items() if type(v) == dict}
1782+
# Replace existing env dict without "valueFrom" env. variables and pass it to secret
1783+
env = {k: v for k, v in (env or {}).items() if type(v) != dict}
1784+
for k, v in (extra_env or {}).items():
1785+
if not "name" in v:
1786+
v["name"] = k
1787+
extra_env[k] = v
1788+
prepared_env.append(get_k8s_model(V1EnvVar, v))
1789+
17711790
# deprecate image
17721791
env['JUPYTER_IMAGE_SPEC'] = self.image
17731792
env['JUPYTER_IMAGE'] = self.image
1793+
17741794
if self.internal_ssl:
1795+
"""
1796+
cert_paths:
1797+
certificate path references
1798+
hub_ca:
1799+
Path to the hub certificate authority
1800+
"""
17751801
with open(self.cert_paths['keyfile'], 'r') as file:
17761802
env['ssl.key'] = file.read()
17771803

@@ -1782,15 +1808,14 @@ def get_env(self):
17821808
env["notebooks-ca_trust.crt"] = file.read()
17831809

17841810
with open(self.internal_trust_bundles['hub-ca'], 'r') as file:
1785-
encoded = base64.b64encode(file.read().encode("utf-8"))
17861811
env["notebooks-ca_trust.crt"] = env[
17871812
"notebooks-ca_trust.crt"
17881813
] + file.read()
17891814
env['JUPYTERHUB_SSL_KEYFILE'] = self.secret_mount_path + "ssl.key"
17901815
env['JUPYTERHUB_SSL_CERTFILE'] = self.secret_mount_path + "ssl.crt"
17911816
env['JUPYTERHUB_SSL_CLIENT_CA'] = (self.secret_mount_path + "notebooks-ca_trust.crt")
17921817

1793-
return env
1818+
return env, prepared_env
17941819

17951820
def load_state(self, state):
17961821
"""

0 commit comments

Comments
 (0)