diff --git a/source/python/_config.py b/source/python/_config.py index 88998466e78f96be7c99e1e288e749e93a0a2fd1..3ce4c735631c38e0f089a3f1cc928c3d1e502db3 100644 --- a/source/python/_config.py +++ b/source/python/_config.py @@ -33,8 +33,9 @@ _VERSION_STR = '7.1' FILE_MARS_REQUESTS = 'mars_requests.csv' FORTRAN_EXECUTABLE = 'CONVERT2' +TEMPFILE_USER_ENVVARS = 'ECMWF_ENV.template' FILE_USER_ENVVARS = 'ECMWF_ENV' -TEMPFILE_INSTALL_COMPILEJOB = 'compilejob.temp' +TEMPFILE_INSTALL_COMPILEJOB = 'compilejob.template' FILE_INSTALL_COMPILEJOB = 'compilejob.ksh' TEMPFILE_INSTALL_JOB = 'job.temp.o' TEMPFILE_JOB = 'job.temp' diff --git a/source/python/install.py b/source/python/install.py index b94ae31907dc481c80fccb03f5565ea63dda6674..b624592438cb3fdddb3ea8c6e0a105cdc7299ecf 100755 --- a/source/python/install.py +++ b/source/python/install.py @@ -319,6 +319,7 @@ def mk_env_vars(ecuid, ecgid, gateway, destination): @Description: Creates a file named ECMWF_ENV which contains the necessary environmental variables at ECMWF servers. + It is based on the template ECMWF_ENV.template. @Input: ecuid: string @@ -337,12 +338,21 @@ def mk_env_vars(ecuid, ecgid, gateway, destination): @Return: <nothing> ''' + from genshi.template.text import NewTextTemplate + from genshi.template import TemplateLoader - with open(_config.PATH_REL_ECMWF_ENV, 'w') as fo: - fo.write('ECUID ' + ecuid + '\n') - fo.write('ECGID ' + ecgid + '\n') - fo.write('GATEWAY ' + gateway + '\n') - fo.write('DESTINATION ' + destination + '\n') + loader = TemplateLoader(_config.PATH_TEMPLATES, auto_reload=False) + ecmwfvars_template = loader.load(_config.TEMPFILE_USER_ENVVARS, + cls=NewTextTemplate) + + stream = ecmwfvars_template.generate(user_name = ecuid, + user_group = ecgid, + gateway_name = gateway, + destination_name = destination + ) + + with open(_config.PATH_ECMWF_ENV, 'w') as f: + f.write(stream.render('text')) return @@ -374,36 +384,60 @@ def mk_compilejob(makefile, target, ecuid, ecgid, fp_root): @Return: <nothing> ''' - - template = os.path.join(_config.PATH_REL_TEMPLATES, - _config.TEMPFILE_INSTALL_COMPILEJOB) - with open(template) as f: - fdata = f.read().split('\n') - - compilejob = os.path.join(_config.PATH_REL_JOBSCRIPTS, + from genshi.template.text import NewTextTemplate + from genshi.template import TemplateLoader + + loader = TemplateLoader(_config.PATH_TEMPLATES, auto_reload=False) + compile_template = loader.load(_config.TEMPFILE_INSTALL_COMPILEJOB, + cls=NewTextTemplate) + + if fp_root == '../': + fp_root = '$HOME' + + stream = compile_template.generate( + username = ecuid, + usergroup = ecgid, + version_number = _config._VERSION_STR, + fp_root_scripts = fp_root, + makefile = makefile, + fortran_program = _config.FORTRAN_EXECUTABLE + ) + + compilejob = os.path.join(_config.PATH_JOBSCRIPTS, _config.FILE_INSTALL_COMPILEJOB) - with open(compilejob, 'w') as fo: - for data in fdata: - if 'MAKEFILE=' in data: - data = 'export MAKEFILE=' + makefile - elif 'FLEXPART_ROOT_SCRIPTS=' in data: - if fp_root != '../': - data = 'export FLEXPART_ROOT_SCRIPTS=' + fp_root - else: - data = 'export FLEXPART_ROOT_SCRIPTS=$HOME' - elif target.lower() != 'local': - if '--workdir' in data: - data = '#SBATCH --workdir=/scratch/ms/' + \ - ecgid + '/' + ecuid - elif '##PBS -o' in data: - data = '##PBS -o /scratch/ms/' + ecgid + '/' + ecuid + \ - 'flex_ecmwf.$Jobname.$Job_ID.out' - elif 'FLEXPART_ROOT_SCRIPTS=' in data: - if fp_root != '../': - data = 'export FLEXPART_ROOT_SCRIPTS=' + fp_root - else: - data = 'export FLEXPART_ROOT_SCRIPTS=$HOME' - fo.write(data + '\n') + + with open(compilejob, 'w') as f: + f.write(stream.render('text')) + + + # template = os.path.join(_config.PATH_REL_TEMPLATES, + # _config.TEMPFILE_INSTALL_COMPILEJOB) + # with open(template) as f: + # fdata = f.read().split('\n') + + + # with open(compilejob, 'w') as fo: + # for data in fdata: + # if 'MAKEFILE=' in data: + # data = 'export MAKEFILE=' + makefile + # elif 'FLEXPART_ROOT_SCRIPTS=' in data: + # if fp_root != '../': + # data = 'export FLEXPART_ROOT_SCRIPTS=' + fp_root + # else: + # data = 'export FLEXPART_ROOT_SCRIPTS=$HOME' + # elif target.lower() != 'local': + # if '--workdir' in data: + # data = '#SBATCH --workdir=/scratch/ms/' + \ + # ecgid + '/' + ecuid + # elif '##PBS -o' in data: + # data = '##PBS -o /scratch/ms/' + ecgid + '/' + ecuid + \ + # 'flex_ecmwf.$Jobname.$Job_ID.out' + # elif 'FLEXPART_ROOT_SCRIPTS=' in data: + # if fp_root != '../': + # data = 'export FLEXPART_ROOT_SCRIPTS=' + fp_root + # else: + # data = 'export FLEXPART_ROOT_SCRIPTS=$HOME' + # fo.write(data + '\n') return diff --git a/source/pythontest/TestData/ECMWF_ENV.test b/source/pythontest/TestData/ECMWF_ENV.test new file mode 100644 index 0000000000000000000000000000000000000000..dc258a940b6cacb52706c196b6ea9a5f609cc72c --- /dev/null +++ b/source/pythontest/TestData/ECMWF_ENV.test @@ -0,0 +1,4 @@ +ECUID testuser +ECGID testgroup +GATEWAY gateway.test.ac.at +DESTINATION user@destination diff --git a/source/pythontest/TestData/compilejob.test b/source/pythontest/TestData/compilejob.test new file mode 100644 index 0000000000000000000000000000000000000000..8ae61bff4614182a0efa8c4a8b173f4b96b7e6a6 --- /dev/null +++ b/source/pythontest/TestData/compilejob.test @@ -0,0 +1,68 @@ +#!/bin/ksh + +# ON ECGB: +# start with ecaccess-job-submit -queueName ecgb NAME_OF_THIS_FILE on gateway server +# start with sbatch NAME_OF_THIS_FILE directly on machine + +#SBATCH --workdir=/scratch/ms/testgroup/testuser +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf +#SBATCH --output=flex_ecmwf.%j.out +#SBATCH --error=flex_ecmwf.%j.out +#SBATCH --mail-type=FAIL +#SBATCH --time=12:00:00 + +## CRAY specific batch requests +##PBS -N flex_ecmwf +##PBS -q ns +##PBS -S /usr/bin/ksh +##PBS -o /scratch/ms/testgroup/testuser/flex_ecmwf.$Jobname.$Job_ID.out +# job output is in .ecaccess_DO_NOT_REMOVE +##PBS -j oe +##PBS -V +##PBS -l EC_threads_per_task=1 +##PBS -l EC_memory_per_task=3200MB + +set -x +export VERSION=7.1 +case $HOST in + *ecg*) + module load python + module unload grib_api + module unload emos + module load grib_api/1.14.5 + module load emos/437-r64 + export FLEXPART_ROOT_SCRIPTS=fp_root_test_path + export MAKEFILE=Makefile.TEST + ;; + *cca*) + module switch PrgEnv-cray PrgEnv-intel + module load grib_api + module load emos + module load python + echo ${GROUP} + echo ${HOME} + echo $HOME | awk -F / '{print $1, $2, $3, $4}' + export GROUP=`echo $HOME | awk -F / '{print $4}'` + export SCRATCH=/scratch/ms/${GROUP}/${USER} + export FLEXPART_ROOT_SCRIPTS=p_root_test_path + export MAKEFILE=Makefile.TEST + ;; +esac + +mkdir -p $FLEXPART_ROOT_SCRIPTS/flex_extract_v$VERSION +cd $FLEXPART_ROOT_SCRIPTS/flex_extract_v$VERSION # if FLEXPART_ROOT is not set this means cd to the home directory +tar -xvf $HOME/flex_extract_v$VERSION.tar +cd src +\rm *.o *.mod CONVERT2 +make -f $MAKEFILE >flexcompile 2>flexcompile + +ls -l CONVERT2 >>flexcompile +if [ $? -eq 0 ]; then + echo 'SUCCESS!' >>flexcompile + mail -s flexcompile.$HOST.$$ $USER <flexcompile +else + echo Environment: >>flexcompile + env >> flexcompile + mail -s "ERROR! flexcompile.$HOST.$$" $USER <flexcompile +fi \ No newline at end of file diff --git a/source/pythontest/TestInstall.py b/source/pythontest/TestInstall.py index 6691d0641d74ad09d8d7d15702a1888dea5b5fba..ddb3b2d5ca270037689b68c89ff01dacf6f05067 100644 --- a/source/pythontest/TestInstall.py +++ b/source/pythontest/TestInstall.py @@ -10,7 +10,7 @@ import pytest sys.path.append('../python') import _config import install -from mods.tools import make_dir +from mods.tools import make_dir, silent_remove class TestTools(): @@ -23,7 +23,7 @@ class TestTools(): # - install_via_gateway #! - mk_tarball #! - un_tarball - # - mk_env_vars + #! - mk_env_vars # - mk_compilejob # - mk_job_template # - delete_convert_build @@ -115,3 +115,42 @@ class TestTools(): # clean up temp test dir shutil.rmtree(test_dir) + + def test_mk_env_vars(self): + import filecmp + + # comparison file + testfile = os.path.join(_config.PATH_TEST_DIR,'TestData', + 'ECMWF_ENV.test') + + # create test ECMWF_ENV file + install.mk_env_vars('testuser', + 'testgroup', + 'gateway.test.ac.at', + 'user@destination') + + assert filecmp.cmp(testfile, _config.PATH_ECMWF_ENV, shallow=False) + + # delte test file + silent_remove(_config.PATH_ECMWF_ENV) + + def test_mk_compilejob(self): + import filecmp + + # comparison file + testfile = os.path.join(_config.PATH_TEST_DIR,'TestData', + 'compilejob.test') + + # create + install.mk_compilejob('Makefile.TEST', + '', + 'testuser', + 'testgroup', + 'fp_root_test_path') + + finalfile = os.path.join(_config.PATH_JOBSCRIPTS, + _config.FILE_INSTALL_COMPILEJOB) + assert filecmp.cmp(testfile, finalfile, shallow=False) + + # delete test file + silent_remove(finalfile) diff --git a/templates/ECMWF_ENV.template b/templates/ECMWF_ENV.template new file mode 100644 index 0000000000000000000000000000000000000000..515da08ea1d6cc2190074709f8a5bc6b22b3e3c7 --- /dev/null +++ b/templates/ECMWF_ENV.template @@ -0,0 +1,4 @@ +ECUID $user_name +ECGID $user_group +GATEWAY $gateway_name +DESTINATION $destination_name diff --git a/templates/compilejob.template b/templates/compilejob.template new file mode 100644 index 0000000000000000000000000000000000000000..bb1348ec8b40310369402949a950c121f6c96063 --- /dev/null +++ b/templates/compilejob.template @@ -0,0 +1,68 @@ +#!/bin/ksh + +# ON ECGB: +# start with ecaccess-job-submit -queueName ecgb NAME_OF_THIS_FILE on gateway server +# start with sbatch NAME_OF_THIS_FILE directly on machine + +#SBATCH --workdir=/scratch/ms/$usergroup/$username +#SBATCH --qos=normal +#SBATCH --job-name=flex_ecmwf +#SBATCH --output=flex_ecmwf.%j.out +#SBATCH --error=flex_ecmwf.%j.out +#SBATCH --mail-type=FAIL +#SBATCH --time=12:00:00 + +## CRAY specific batch requests +##PBS -N flex_ecmwf +##PBS -q ns +##PBS -S /usr/bin/ksh +##PBS -o /scratch/ms/$usergroup/$username/flex_ecmwf.$Jobname.$Job_ID.out +# job output is in .ecaccess_DO_NOT_REMOVE +##PBS -j oe +##PBS -V +##PBS -l EC_threads_per_task=1 +##PBS -l EC_memory_per_task=3200MB + +set -x +export VERSION=$version_number +case $HOST in + *ecg*) + module load python + module unload grib_api + module unload emos + module load grib_api/1.14.5 + module load emos/437-r64 + export FLEXPART_ROOT_SCRIPTS=$fp_root_scripts + export MAKEFILE=$makefile + ;; + *cca*) + module switch PrgEnv-cray PrgEnv-intel + module load grib_api + module load emos + module load python + echo ${GROUP} + echo ${HOME} + echo $HOME | awk -F / '{print $1, $2, $3, $4}' + export GROUP=`echo $HOME | awk -F / '{print $4}'` + export SCRATCH=/scratch/ms/${GROUP}/${USER} + export FLEXPART_ROOT_SCRIPTS=$fp_root_scripts + export MAKEFILE=$makefile + ;; +esac + +mkdir -p $FLEXPART_ROOT_SCRIPTS/flex_extract_v$VERSION +cd $FLEXPART_ROOT_SCRIPTS/flex_extract_v$VERSION # if FLEXPART_ROOT is not set this means cd to the home directory +tar -xvf $HOME/flex_extract_v$VERSION.tar +cd src +\rm *.o *.mod $fortran_program +make -f $MAKEFILE >flexcompile 2>flexcompile + +ls -l $fortran_program >>flexcompile +if [ $? -eq 0 ]; then + echo 'SUCCESS!' >>flexcompile + mail -s flexcompile.$HOST.$$ $USER <flexcompile +else + echo Environment: >>flexcompile + env >> flexcompile + mail -s "ERROR! flexcompile.$HOST.$$" $USER <flexcompile +fi \ No newline at end of file