2828from jupyterhub .spawner import Spawner
2929from jupyterhub .traitlets import Command
3030from jupyterhub .utils import exponential_backoff
31+ from kubespawner .utils import get_k8s_model
32+ from kubernetes .client .models import V1EnvVar
3133from kubernetes import client
3234from kubernetes .client .rest import ApiException
3335from 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