11"""Test BatchSpawner and subclasses"""
22
3+ import contextlib
34import itertools
5+ import os
46import re
57from unittest import mock
68from .. import BatchSpawnerRegexStates
2022testjob = "12345"
2123testport = 54321
2224
25+ @contextlib .contextmanager
26+ def setenv_context (** kwargs ):
27+ """Context manage which sets and restores environment variables."""
28+ orig = { }
29+ for k , v in kwargs .items ():
30+ orig [k ] = os .environ .get (k , None )
31+ os .environ [k ] = v
32+ yield
33+ for k in kwargs :
34+ if orig [k ] is not None :
35+ os .environ [k ] = orig [k ]
36+ else :
37+ del os .environ [k ]
38+
39+
2340class BatchDummy (BatchSpawnerRegexStates ):
2441 exec_prefix = ''
2542 batch_submit_cmd = Unicode ('cat > /dev/null; echo ' + testjob )
@@ -504,32 +521,50 @@ def test_lfs(db, io_loop):
504521def test_keepvars (db , io_loop ):
505522 """Test of environment handling
506523 """
507- # req_keepvars
524+ environment = {'ABCDE' : 'TEST1' , 'VWXYZ' : 'TEST2' , 'XYZ' : 'TEST3' ,}
525+
526+
527+ # req_keepvars_default - anything NOT here should not be propogated.
508528 spawner_kwargs = {
509529 'req_keepvars_default' : 'ABCDE' ,
510530 }
511531 batch_script_re_list = [
512532 re .compile (r'--export=ABCDE' , re .X | re .M ),
533+ re .compile (r'^((?!JUPYTERHUB_API_TOKEN).)*$' , re .X | re .S ), # *not* in the script
513534 ]
514535 def env_test (env ):
515- assert 'ABCDE' in env
516- run_typical_slurm_spawner (db , io_loop ,
517- spawner_kwargs = spawner_kwargs ,
518- batch_script_re_list = batch_script_re_list ,
519- env_test = env_test )
520-
521- # req_keepvars
536+ # We can't test these - becasue removing these from the environment is
537+ # a job of the batch system itself, which we do *not* run here.
538+ #assert 'ABCDE' in env
539+ #assert 'JUPYTERHUB_API_TOKEN' not in env
540+ pass
541+ with setenv_context (** environment ):
542+ run_typical_slurm_spawner (db , io_loop ,
543+ spawner_kwargs = spawner_kwargs ,
544+ batch_script_re_list = batch_script_re_list ,
545+ env_test = env_test )
546+
547+ # req_keepvars - this should be added to the environment
522548 spawner_kwargs = {
523549 'req_keepvars' : 'ABCDE' ,
524550 }
525551 batch_script_re_list = [
526552 re .compile (r'--export=.*ABCDE' , re .X | re .M ),
553+ re .compile (r'^((?!VWXYZ).)*$' , re .X | re .M ), # *not* in line
554+ re .compile (r'--export=.*JUPYTERHUB_API_TOKEN' , re .X | re .S ),
527555 ]
528- run_typical_slurm_spawner (db , io_loop ,
529- spawner_kwargs = spawner_kwargs ,
530- batch_script_re_list = batch_script_re_list )
531-
532- # req_keepvars
556+ def env_test (env ):
557+ assert 'ABCDE' in env
558+ assert 'VWXYZ' not in env
559+ with setenv_context (** environment ):
560+ run_typical_slurm_spawner (db , io_loop ,
561+ spawner_kwargs = spawner_kwargs ,
562+ batch_script_re_list = batch_script_re_list ,
563+ env_test = env_test )
564+
565+ # admin_environment - this should be in the environment passed to
566+ # run commands but not the --export command which is included in
567+ # the batch scripts
533568 spawner_kwargs = {
534569 'admin_environment' : 'ABCDE' ,
535570 }
@@ -539,13 +574,12 @@ def env_test(env):
539574 def env_test (env ):
540575 assert 'ABCDE' in env
541576 assert 'VWXYZ' not in env
542- os .environ ['ABCDE' ] = 'TEST1'
543- os .environ ['VWXYZ' ] = 'TEST2'
544- run_typical_slurm_spawner (db , io_loop ,
545- spawner_kwargs = spawner_kwargs ,
546- batch_script_re_list = batch_script_re_list ,
547- env_test = env_test )
548- del os .environ ['ABCDE' ], os .environ ['VWXYZ' ]
577+ assert 'JUPYTERHUB_API_TOKEN' in env
578+ with setenv_context (** environment ):
579+ run_typical_slurm_spawner (db , io_loop ,
580+ spawner_kwargs = spawner_kwargs ,
581+ batch_script_re_list = batch_script_re_list ,
582+ env_test = env_test )
549583
550584 # req_keepvars AND req_keepvars together
551585 spawner_kwargs = {
@@ -555,6 +589,7 @@ def env_test(env):
555589 batch_script_re_list = [
556590 re .compile (r'--export=ABCDE,XYZ' , re .X | re .M ),
557591 ]
558- run_typical_slurm_spawner (db , io_loop ,
559- spawner_kwargs = spawner_kwargs ,
560- batch_script_re_list = batch_script_re_list )
592+ with setenv_context (** environment ):
593+ run_typical_slurm_spawner (db , io_loop ,
594+ spawner_kwargs = spawner_kwargs ,
595+ batch_script_re_list = batch_script_re_list )
0 commit comments