def test_check_readiness(self): """Test check_readiness method.""" init_config(build_options={'validate': False}) # check that check_readiness step works (adding dependencies, etc.) ec_file = 'OpenMPI-1.6.4-GCC-4.6.4.eb' ec_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'easyconfigs', ec_file) ec = EasyConfig(ec_path) eb = EasyBlock(ec) eb.check_readiness_step() # a proper error should be thrown for dependencies that can't be resolved (module should be there) tmpdir = tempfile.mkdtemp() shutil.copy2(ec_path, tmpdir) ec_path = os.path.join(tmpdir, ec_file) f = open(ec_path, 'a') f.write("\ndependencies += [('nosuchsoftware', '1.2.3')]\n") f.close() ec = EasyConfig(ec_path) eb = EasyBlock(ec) try: eb.check_readiness_step() except EasyBuildError, err: err_regex = re.compile( "Missing modules for one or more dependencies: nosuchsoftware/1.2.3-GCC-4.6.4" ) self.assertTrue( err_regex.search(str(err)), "Pattern '%s' found in '%s'" % (err_regex.pattern, err))
def test_check_readiness(self): """Test check_readiness method.""" init_config(build_options={'validate': False}) # check that check_readiness step works (adding dependencies, etc.) ec_file = 'OpenMPI-1.6.4-GCC-4.6.4.eb' topdir = os.path.dirname(os.path.abspath(__file__)) ec_path = os.path.join(topdir, 'easyconfigs', 'test_ecs', 'o', 'OpenMPI', ec_file) ec = EasyConfig(ec_path) eb = EasyBlock(ec) eb.check_readiness_step() # a proper error should be thrown for dependencies that can't be resolved (module should be there) tmpdir = tempfile.mkdtemp() shutil.copy2(ec_path, tmpdir) ec_path = os.path.join(tmpdir, ec_file) f = open(ec_path, 'a') f.write("\ndependencies += [('nosuchsoftware', '1.2.3')]\n") f.close() ec = EasyConfig(ec_path) eb = EasyBlock(ec) try: eb.check_readiness_step() except EasyBuildError, err: err_regex = re.compile("Missing modules for one or more dependencies: nosuchsoftware/1.2.3-GCC-4.6.4") self.assertTrue(err_regex.search(str(err)), "Pattern '%s' found in '%s'" % (err_regex.pattern, err))
def test_make_module_step(self): """Test the make_module_step""" name = "pi" version = "3.14" deps = [("GCC", "4.6.4")] hiddendeps = [("toy", "0.0-deps")] alldeps = deps + hiddendeps # hidden deps must be included in list of deps modextravars = {"PI": "3.1415", "FOO": "bar"} modextrapaths = {"PATH": "pibin", "CPATH": "pi/include"} self.contents = "\n".join( [ 'name = "%s"' % name, 'version = "%s"' % version, 'homepage = "http://example.com"', 'description = "test easyconfig"', "toolchain = {'name': 'dummy', 'version': 'dummy'}", "dependencies = %s" % str(alldeps), "hiddendependencies = %s" % str(hiddendeps), "builddependencies = [('OpenMPI', '1.6.4-GCC-4.6.4')]", "modextravars = %s" % str(modextravars), "modextrapaths = %s" % str(modextrapaths), ] ) test_dir = os.path.dirname(os.path.abspath(__file__)) os.environ["MODULEPATH"] = os.path.join(test_dir, "modules") # test if module is generated correctly self.writeEC() ec = EasyConfig(self.eb_file) eb = EasyBlock(ec) # eb.builddir = self.test_buildpath eb.installdir = os.path.join(config.install_path(), "pi", "3.14") eb.check_readiness_step() modpath = os.path.join(eb.make_module_step(), name, version) self.assertTrue(os.path.exists(modpath), "%s exists" % modpath) # verify contents of module f = open(modpath, "r") txt = f.read() f.close() self.assertTrue(re.search("^#%Module", txt.split("\n")[0])) self.assertTrue(re.search("^conflict\s+%s$" % name, txt, re.M)) self.assertTrue(re.search("^set\s+root\s+%s$" % eb.installdir, txt, re.M)) self.assertTrue(re.search('^setenv\s+EBROOT%s\s+".root"\s*$' % name.upper(), txt, re.M)) self.assertTrue(re.search('^setenv\s+EBVERSION%s\s+"%s"$' % (name.upper(), version), txt, re.M)) for (key, val) in modextravars.items(): regex = re.compile('^setenv\s+%s\s+"%s"$' % (key, val), re.M) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (key, val) in modextrapaths.items(): regex = re.compile("^prepend-path\s+%s\s+\$root/%s$" % (key, val), re.M) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (name, ver) in deps: regex = re.compile("^\s*module load %s\s*$" % os.path.join(name, ver), re.M) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (name, ver) in hiddendeps: regex = re.compile("^\s*module load %s/.%s\s*$" % (name, ver), re.M) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt))
def test_make_module_step(self): """Test the make_module_step""" name = "pi" version = "3.14" deps = [('GCC', '4.6.4')] hiddendeps = [('toy', '0.0-deps')] alldeps = deps + hiddendeps # hidden deps must be included in list of deps modextravars = {'PI': '3.1415', 'FOO': 'bar'} modextrapaths = {'PATH': 'pibin', 'CPATH': 'pi/include'} self.contents = '\n'.join([ 'easyblock = "ConfigureMake"', 'name = "%s"' % name, 'version = "%s"' % version, 'homepage = "http://example.com"', 'description = "test easyconfig"', "toolchain = {'name': 'dummy', 'version': 'dummy'}", "dependencies = %s" % str(alldeps), "hiddendependencies = %s" % str(hiddendeps), "builddependencies = [('OpenMPI', '1.6.4-GCC-4.6.4')]", "modextravars = %s" % str(modextravars), "modextrapaths = %s" % str(modextrapaths), ]) test_dir = os.path.dirname(os.path.abspath(__file__)) os.environ['MODULEPATH'] = os.path.join(test_dir, 'modules') # test if module is generated correctly self.writeEC() ec = EasyConfig(self.eb_file) eb = EasyBlock(ec) eb.installdir = os.path.join(config.install_path(), 'pi', '3.14') eb.check_readiness_step() modpath = os.path.join(eb.make_module_step(), name, version) self.assertTrue(os.path.exists(modpath), "%s exists" % modpath) # verify contents of module f = open(modpath, 'r') txt = f.read() f.close() self.assertTrue(re.search("^#%Module", txt.split('\n')[0])) self.assertTrue(re.search("^conflict\s+%s$" % name, txt, re.M)) self.assertTrue(re.search("^set\s+root\s+%s$" % eb.installdir, txt, re.M)) self.assertTrue(re.search('^setenv\s+EBROOT%s\s+".root"\s*$' % name.upper(), txt, re.M)) self.assertTrue(re.search('^setenv\s+EBVERSION%s\s+"%s"$' % (name.upper(), version), txt, re.M)) for (key, val) in modextravars.items(): regex = re.compile('^setenv\s+%s\s+"%s"$' % (key, val), re.M) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (key, val) in modextrapaths.items(): regex = re.compile('^prepend-path\s+%s\s+\$root/%s$' % (key, val), re.M) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (name, ver) in deps: regex = re.compile('^\s*module load %s\s*$' % os.path.join(name, ver), re.M) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (name, ver) in hiddendeps: regex = re.compile('^\s*module load %s/.%s\s*$' % (name, ver), re.M) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt))
def test_make_module_dep_hmns(self): """Test for make_module_dep under HMNS""" test_ecs_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), 'easyconfigs', 'test_ecs') all_stops = [x[0] for x in EasyBlock.get_steps()] build_options = { 'check_osdeps': False, 'robot_path': [test_ecs_path], 'valid_stops': all_stops, 'validate': False, } os.environ['EASYBUILD_MODULE_NAMING_SCHEME'] = 'HierarchicalMNS' init_config(build_options=build_options) self.setup_hierarchical_modules() self.contents = '\n'.join([ 'easyblock = "ConfigureMake"', 'name = "pi"', 'version = "3.14"', 'homepage = "http://example.com"', 'description = "test easyconfig"', "toolchain = {'name': 'gompi', 'version': '1.4.10'}", 'dependencies = [', " ('FFTW', '3.3.3'),", ']', ]) self.writeEC() eb = EasyBlock(EasyConfig(self.eb_file)) eb.installdir = os.path.join(config.install_path(), 'pi', '3.14') eb.check_readiness_step() eb.make_builddir() eb.prepare_step() # GCC, OpenMPI and hwloc modules should *not* be included in loads for dependencies mod_dep_txt = eb.make_module_dep() for mod in ['GCC/4.7.2', 'OpenMPI/1.6.4']: regex = re.compile('load.*%s' % mod) self.assertFalse( regex.search(mod_dep_txt), "Pattern '%s' found in: %s" % (regex.pattern, mod_dep_txt)) regex = re.compile('load.*FFTW/3.3.3') self.assertTrue( regex.search(mod_dep_txt), "Pattern '%s' found in: %s" % (regex.pattern, mod_dep_txt))
def test_make_module_dep_hmns(self): """Test for make_module_dep under HMNS""" test_ecs_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'easyconfigs', 'test_ecs') all_stops = [x[0] for x in EasyBlock.get_steps()] build_options = { 'check_osdeps': False, 'robot_path': [test_ecs_path], 'valid_stops': all_stops, 'validate': False, } os.environ['EASYBUILD_MODULE_NAMING_SCHEME'] = 'HierarchicalMNS' init_config(build_options=build_options) self.setup_hierarchical_modules() self.contents = '\n'.join([ 'easyblock = "ConfigureMake"', 'name = "pi"', 'version = "3.14"', 'homepage = "http://example.com"', 'description = "test easyconfig"', "toolchain = {'name': 'gompi', 'version': '1.4.10'}", 'dependencies = [', " ('FFTW', '3.3.3'),", ']', ]) self.writeEC() eb = EasyBlock(EasyConfig(self.eb_file)) eb.installdir = os.path.join(config.install_path(), 'pi', '3.14') eb.check_readiness_step() eb.make_builddir() eb.prepare_step() # GCC, OpenMPI and hwloc modules should *not* be included in loads for dependencies mod_dep_txt = eb.make_module_dep() for mod in ['GCC/4.7.2', 'OpenMPI/1.6.4']: regex = re.compile('load.*%s' % mod) self.assertFalse(regex.search(mod_dep_txt), "Pattern '%s' found in: %s" % (regex.pattern, mod_dep_txt)) regex = re.compile('load.*FFTW/3.3.3') self.assertTrue(regex.search(mod_dep_txt), "Pattern '%s' found in: %s" % (regex.pattern, mod_dep_txt))
def test_parallel(self): """Test defining of parallellism.""" topdir = os.path.abspath(os.path.dirname(__file__)) toy_ec = os.path.join(topdir, 'easyconfigs', 'test_ecs', 't', 'toy', 'toy-0.0.eb') toytxt = read_file(toy_ec) handle, toy_ec1 = tempfile.mkstemp(prefix='easyblock_test_file_', suffix='.eb') os.close(handle) write_file(toy_ec1, toytxt + "\nparallel = 123") handle, toy_ec2 = tempfile.mkstemp(prefix='easyblock_test_file_', suffix='.eb') os.close(handle) write_file(toy_ec2, toytxt + "\nparallel = 123\nmaxparallel = 67") # default: parallellism is derived from # available cores + ulimit test_eb = EasyBlock(EasyConfig(toy_ec)) test_eb.check_readiness_step() self.assertTrue(isinstance(test_eb.cfg['parallel'], int) and test_eb.cfg['parallel'] > 0) # only 'parallel' easyconfig parameter specified (no 'parallel' build option) test_eb = EasyBlock(EasyConfig(toy_ec1)) test_eb.check_readiness_step() self.assertEqual(test_eb.cfg['parallel'], 123) # both 'parallel' and 'maxparallel' easyconfig parameters specified (no 'parallel' build option) test_eb = EasyBlock(EasyConfig(toy_ec2)) test_eb.check_readiness_step() self.assertEqual(test_eb.cfg['parallel'], 67) # only 'parallel' build option specified init_config(build_options={'parallel': '97', 'validate': False}) test_eb = EasyBlock(EasyConfig(toy_ec)) test_eb.check_readiness_step() self.assertEqual(test_eb.cfg['parallel'], 97) # both 'parallel' build option and easyconfig parameter specified (no 'maxparallel') test_eb = EasyBlock(EasyConfig(toy_ec1)) test_eb.check_readiness_step() self.assertEqual(test_eb.cfg['parallel'], 97) # both 'parallel' and 'maxparallel' easyconfig parameters specified + 'parallel' build option test_eb = EasyBlock(EasyConfig(toy_ec2)) test_eb.check_readiness_step() self.assertEqual(test_eb.cfg['parallel'], 67)
def test_make_module_step(self): """Test the make_module_step""" name = "pi" version = "3.14" deps = [('GCC', '4.6.4')] modextravars = {'PI': '3.1415', 'FOO': 'bar'} modextrapaths = {'PATH': 'pibin', 'CPATH': 'pi/include'} self.contents = '\n'.join([ 'easyblock = "ConfigureMake"', 'name = "%s"' % name, 'version = "%s"' % version, 'homepage = "http://example.com"', 'description = "test easyconfig"', "toolchain = {'name': 'dummy', 'version': 'dummy'}", "dependencies = [('GCC', '4.6.4'), ('toy', '0.0-deps')]", "builddependencies = [('OpenMPI', '1.6.4-GCC-4.6.4')]", # hidden deps must be included in list of (build)deps "hiddendependencies = [('toy', '0.0-deps'), ('OpenMPI', '1.6.4-GCC-4.6.4')]", "modextravars = %s" % str(modextravars), "modextrapaths = %s" % str(modextrapaths), ]) test_dir = os.path.dirname(os.path.abspath(__file__)) os.environ['MODULEPATH'] = os.path.join(test_dir, 'modules') # test if module is generated correctly self.writeEC() ec = EasyConfig(self.eb_file) eb = EasyBlock(ec) eb.installdir = os.path.join(config.install_path(), 'pi', '3.14') eb.check_readiness_step() modpath = os.path.join(eb.make_module_step(), name, version) if get_module_syntax() == 'Lua': modpath += '.lua' self.assertTrue(os.path.exists(modpath), "%s exists" % modpath) # verify contents of module txt = read_file(modpath) if get_module_syntax() == 'Tcl': self.assertTrue(re.search(r"^#%Module", txt.split('\n')[0])) self.assertTrue(re.search(r"^conflict\s+%s$" % name, txt, re.M)) self.assertTrue(re.search(r"^set\s+root\s+%s$" % eb.installdir, txt, re.M)) ebroot_regex = re.compile(r'^setenv\s+EBROOT%s\s+"\$root"\s*$' % name.upper(), re.M) self.assertTrue(ebroot_regex.search(txt), "%s in %s" % (ebroot_regex.pattern, txt)) self.assertTrue(re.search(r'^setenv\s+EBVERSION%s\s+"%s"$' % (name.upper(), version), txt, re.M)) elif get_module_syntax() == 'Lua': ebroot_regex = re.compile(r'^setenv\("EBROOT%s", root\)$' % name.upper(), re.M) self.assertTrue(ebroot_regex.search(txt), "%s in %s" % (ebroot_regex.pattern, txt)) self.assertTrue(re.search(r'^setenv\("EBVERSION%s", "%s"\)$' % (name.upper(), version), txt, re.M)) else: self.assertTrue(False, "Unknown module syntax: %s" % get_module_syntax()) for (key, val) in modextravars.items(): if get_module_syntax() == 'Tcl': regex = re.compile(r'^setenv\s+%s\s+"%s"$' % (key, val), re.M) elif get_module_syntax() == 'Lua': regex = re.compile(r'^setenv\("%s", "%s"\)$' % (key, val), re.M) else: self.assertTrue(False, "Unknown module syntax: %s" % get_module_syntax()) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (key, val) in modextrapaths.items(): if get_module_syntax() == 'Tcl': regex = re.compile(r'^prepend-path\s+%s\s+\$root/%s$' % (key, val), re.M) elif get_module_syntax() == 'Lua': regex = re.compile(r'^prepend_path\("%s", pathJoin\(root, "%s"\)\)$' % (key, val), re.M) else: self.assertTrue(False, "Unknown module syntax: %s" % get_module_syntax()) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (name, ver) in [('GCC', '4.6.4')]: if get_module_syntax() == 'Tcl': regex = re.compile(r'^\s*module load %s\s*$' % os.path.join(name, ver), re.M) elif get_module_syntax() == 'Lua': regex = re.compile(r'^\s*load\("%s"\)$' % os.path.join(name, ver), re.M) else: self.assertTrue(False, "Unknown module syntax: %s" % get_module_syntax()) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (name, ver) in [('toy', '0.0-deps')]: if get_module_syntax() == 'Tcl': regex = re.compile(r'^\s*module load %s/.%s\s*$' % (name, ver), re.M) elif get_module_syntax() == 'Lua': regex = re.compile(r'^\s*load\("%s/.%s"\)$' % (name, ver), re.M) else: self.assertTrue(False, "Unknown module syntax: %s" % get_module_syntax()) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (name, ver) in [('OpenMPI', '1.6.4-GCC-4.6.4')]: if get_module_syntax() == 'Tcl': regex = re.compile(r'^\s*module load %s/.?%s\s*$' % (name, ver), re.M) elif get_module_syntax() == 'Lua': regex = re.compile(r'^\s*load\("%s/.?%s"\)$' % (name, ver), re.M) else: self.assertTrue(False, "Unknown module syntax: %s" % get_module_syntax()) self.assertFalse(regex.search(txt), "Pattern '%s' *not* found in %s" % (regex.pattern, txt))
def test_make_module_dep(self): """Test for make_module_dep""" self.contents = '\n'.join([ 'easyblock = "ConfigureMake"', 'name = "pi"', 'version = "3.14"', 'homepage = "http://example.com"', 'description = "test easyconfig"', "toolchain = {'name': 'gompi', 'version': '1.1.0-no-OFED'}", 'dependencies = [', " ('FFTW', '3.3.1'),", " ('LAPACK', '3.4.0'),", ']', ]) self.writeEC() eb = EasyBlock(EasyConfig(self.eb_file)) eb.installdir = os.path.join(config.install_path(), 'pi', '3.14') eb.check_readiness_step() if get_module_syntax() == 'Tcl': tc_load = '\n'.join([ "if { ![ is-loaded gompi/1.1.0-no-OFED ] } {", " module load gompi/1.1.0-no-OFED", "}", ]) fftw_load = '\n'.join([ "if { ![ is-loaded FFTW/3.3.1-gompi-1.1.0-no-OFED ] } {", " module load FFTW/3.3.1-gompi-1.1.0-no-OFED", "}", ]) lapack_load = '\n'.join([ "if { ![ is-loaded LAPACK/3.4.0-gompi-1.1.0-no-OFED ] } {", " module load LAPACK/3.4.0-gompi-1.1.0-no-OFED", "}", ]) elif get_module_syntax() == 'Lua': tc_load = '\n'.join([ 'if not isloaded("gompi/1.1.0-no-OFED") then', ' load("gompi/1.1.0-no-OFED")', 'end', ]) fftw_load = '\n'.join([ 'if not isloaded("FFTW/3.3.1-gompi-1.1.0-no-OFED") then', ' load("FFTW/3.3.1-gompi-1.1.0-no-OFED")', 'end', ]) lapack_load = '\n'.join([ 'if not isloaded("LAPACK/3.4.0-gompi-1.1.0-no-OFED") then', ' load("LAPACK/3.4.0-gompi-1.1.0-no-OFED")', 'end', ]) else: self.assertTrue(False, "Unknown module syntax: %s" % get_module_syntax()) expected = tc_load + '\n\n' + fftw_load + '\n\n' + lapack_load self.assertEqual(eb.make_module_dep().strip(), expected) # provide swap info for FFTW to trigger an extra 'unload FFTW' unload_info = { 'FFTW/3.3.1-gompi-1.1.0-no-OFED': 'FFTW', } if get_module_syntax() == 'Tcl': fftw_load = '\n'.join([ "if { ![ is-loaded FFTW/3.3.1-gompi-1.1.0-no-OFED ] } {", " module unload FFTW", " module load FFTW/3.3.1-gompi-1.1.0-no-OFED", "}", ]) elif get_module_syntax() == 'Lua': fftw_load = '\n'.join([ 'if not isloaded("FFTW/3.3.1-gompi-1.1.0-no-OFED") then', ' unload("FFTW")', ' load("FFTW/3.3.1-gompi-1.1.0-no-OFED")', 'end', ]) else: self.assertTrue(False, "Unknown module syntax: %s" % get_module_syntax()) expected = tc_load + '\n\n' + fftw_load + '\n\n' + lapack_load self.assertEqual(eb.make_module_dep(unload_info=unload_info).strip(), expected)
def test_parallel(self): """Test defining of parallellism.""" toy_ec = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'easyconfigs', 'toy-0.0.eb') toytxt = read_file(toy_ec) handle, toy_ec1 = tempfile.mkstemp(prefix='easyblock_test_file_', suffix='.eb') os.close(handle) write_file(toy_ec1, toytxt + "\nparallel = 123") handle, toy_ec2 = tempfile.mkstemp(prefix='easyblock_test_file_', suffix='.eb') os.close(handle) write_file(toy_ec2, toytxt + "\nparallel = 123\nmaxparallel = 67") # default: parallellism is derived from # available cores + ulimit test_eb = EasyBlock(EasyConfig(toy_ec)) test_eb.check_readiness_step() self.assertTrue( isinstance(test_eb.cfg['parallel'], int) and test_eb.cfg['parallel'] > 0) # only 'parallel' easyconfig parameter specified (no 'parallel' build option) test_eb = EasyBlock(EasyConfig(toy_ec1)) test_eb.check_readiness_step() self.assertEqual(test_eb.cfg['parallel'], 123) # both 'parallel' and 'maxparallel' easyconfig parameters specified (no 'parallel' build option) test_eb = EasyBlock(EasyConfig(toy_ec2)) test_eb.check_readiness_step() self.assertEqual(test_eb.cfg['parallel'], 67) # only 'parallel' build option specified init_config(build_options={'parallel': '97', 'validate': False}) test_eb = EasyBlock(EasyConfig(toy_ec)) test_eb.check_readiness_step() self.assertEqual(test_eb.cfg['parallel'], 97) # both 'parallel' build option and easyconfig parameter specified (no 'maxparallel') test_eb = EasyBlock(EasyConfig(toy_ec1)) test_eb.check_readiness_step() self.assertEqual(test_eb.cfg['parallel'], 97) # both 'parallel' and 'maxparallel' easyconfig parameters specified + 'parallel' build option test_eb = EasyBlock(EasyConfig(toy_ec2)) test_eb.check_readiness_step() self.assertEqual(test_eb.cfg['parallel'], 67)
def test_make_module_dep(self): """Test for make_module_dep""" self.contents = '\n'.join([ 'easyblock = "ConfigureMake"', 'name = "pi"', 'version = "3.14"', 'homepage = "http://example.com"', 'description = "test easyconfig"', "toolchain = {'name': 'gompi', 'version': '1.1.0-no-OFED'}", 'dependencies = [', " ('FFTW', '3.3.1'),", " ('LAPACK', '3.4.0'),", ']', ]) self.writeEC() eb = EasyBlock(EasyConfig(self.eb_file)) eb.installdir = os.path.join(config.install_path(), 'pi', '3.14') eb.check_readiness_step() if get_module_syntax() == 'Tcl': tc_load = '\n'.join([ "if { ![ is-loaded gompi/1.1.0-no-OFED ] } {", " module load gompi/1.1.0-no-OFED", "}", ]) fftw_load = '\n'.join([ "if { ![ is-loaded FFTW/3.3.1-gompi-1.1.0-no-OFED ] } {", " module load FFTW/3.3.1-gompi-1.1.0-no-OFED", "}", ]) lapack_load = '\n'.join([ "if { ![ is-loaded LAPACK/3.4.0-gompi-1.1.0-no-OFED ] } {", " module load LAPACK/3.4.0-gompi-1.1.0-no-OFED", "}", ]) elif get_module_syntax() == 'Lua': tc_load = '\n'.join([ 'if not isloaded("gompi/1.1.0-no-OFED") then', ' load("gompi/1.1.0-no-OFED")', 'end', ]) fftw_load = '\n'.join([ 'if not isloaded("FFTW/3.3.1-gompi-1.1.0-no-OFED") then', ' load("FFTW/3.3.1-gompi-1.1.0-no-OFED")', 'end', ]) lapack_load = '\n'.join([ 'if not isloaded("LAPACK/3.4.0-gompi-1.1.0-no-OFED") then', ' load("LAPACK/3.4.0-gompi-1.1.0-no-OFED")', 'end', ]) else: self.assertTrue(False, "Unknown module syntax: %s" % get_module_syntax()) expected = tc_load + '\n\n' + fftw_load + '\n\n' + lapack_load self.assertEqual(eb.make_module_dep().strip(), expected) # provide swap info for FFTW to trigger an extra 'unload FFTW' unload_info = { 'FFTW/3.3.1-gompi-1.1.0-no-OFED': 'FFTW', } if get_module_syntax() == 'Tcl': fftw_load = '\n'.join([ "if { ![ is-loaded FFTW/3.3.1-gompi-1.1.0-no-OFED ] } {", " module unload FFTW", " module load FFTW/3.3.1-gompi-1.1.0-no-OFED", "}", ]) elif get_module_syntax() == 'Lua': fftw_load = '\n'.join([ 'if not isloaded("FFTW/3.3.1-gompi-1.1.0-no-OFED") then', ' unload("FFTW")', ' load("FFTW/3.3.1-gompi-1.1.0-no-OFED")', 'end', ]) else: self.assertTrue(False, "Unknown module syntax: %s" % get_module_syntax()) expected = tc_load + '\n\n' + fftw_load + '\n\n' + lapack_load self.assertEqual( eb.make_module_dep(unload_info=unload_info).strip(), expected)
def test_make_module_step(self): """Test the make_module_step""" name = "pi" version = "3.14" deps = [('GCC', '4.6.4')] modextravars = {'PI': '3.1415', 'FOO': 'bar'} modextrapaths = {'PATH': 'pibin', 'CPATH': 'pi/include'} self.contents = '\n'.join([ 'easyblock = "ConfigureMake"', 'name = "%s"' % name, 'version = "%s"' % version, 'homepage = "http://example.com"', 'description = "test easyconfig"', "toolchain = {'name': 'dummy', 'version': 'dummy'}", "dependencies = [('GCC', '4.6.4'), ('toy', '0.0-deps')]", "builddependencies = [('OpenMPI', '1.6.4-GCC-4.6.4')]", # hidden deps must be included in list of (build)deps "hiddendependencies = [('toy', '0.0-deps'), ('OpenMPI', '1.6.4-GCC-4.6.4')]", "modextravars = %s" % str(modextravars), "modextrapaths = %s" % str(modextrapaths), ]) test_dir = os.path.dirname(os.path.abspath(__file__)) os.environ['MODULEPATH'] = os.path.join(test_dir, 'modules') # test if module is generated correctly self.writeEC() ec = EasyConfig(self.eb_file) eb = EasyBlock(ec) eb.installdir = os.path.join(config.install_path(), 'pi', '3.14') eb.check_readiness_step() modpath = os.path.join(eb.make_module_step(), name, version) if get_module_syntax() == 'Lua': modpath += '.lua' self.assertTrue(os.path.exists(modpath), "%s exists" % modpath) # verify contents of module txt = read_file(modpath) if get_module_syntax() == 'Tcl': self.assertTrue(re.search(r"^#%Module", txt.split('\n')[0])) self.assertTrue(re.search(r"^conflict\s+%s$" % name, txt, re.M)) self.assertTrue( re.search(r"^set\s+root\s+%s$" % eb.installdir, txt, re.M)) ebroot_regex = re.compile( r'^setenv\s+EBROOT%s\s+"\$root"\s*$' % name.upper(), re.M) self.assertTrue(ebroot_regex.search(txt), "%s in %s" % (ebroot_regex.pattern, txt)) self.assertTrue( re.search( r'^setenv\s+EBVERSION%s\s+"%s"$' % (name.upper(), version), txt, re.M)) elif get_module_syntax() == 'Lua': ebroot_regex = re.compile( r'^setenv\("EBROOT%s", root\)$' % name.upper(), re.M) self.assertTrue(ebroot_regex.search(txt), "%s in %s" % (ebroot_regex.pattern, txt)) self.assertTrue( re.search( r'^setenv\("EBVERSION%s", "%s"\)$' % (name.upper(), version), txt, re.M)) else: self.assertTrue(False, "Unknown module syntax: %s" % get_module_syntax()) for (key, val) in modextravars.items(): if get_module_syntax() == 'Tcl': regex = re.compile(r'^setenv\s+%s\s+"%s"$' % (key, val), re.M) elif get_module_syntax() == 'Lua': regex = re.compile(r'^setenv\("%s", "%s"\)$' % (key, val), re.M) else: self.assertTrue( False, "Unknown module syntax: %s" % get_module_syntax()) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (key, val) in modextrapaths.items(): if get_module_syntax() == 'Tcl': regex = re.compile( r'^prepend-path\s+%s\s+\$root/%s$' % (key, val), re.M) elif get_module_syntax() == 'Lua': regex = re.compile( r'^prepend_path\("%s", pathJoin\(root, "%s"\)\)$' % (key, val), re.M) else: self.assertTrue( False, "Unknown module syntax: %s" % get_module_syntax()) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (name, ver) in [('GCC', '4.6.4')]: if get_module_syntax() == 'Tcl': regex = re.compile( r'^\s*module load %s\s*$' % os.path.join(name, ver), re.M) elif get_module_syntax() == 'Lua': regex = re.compile( r'^\s*load\("%s"\)$' % os.path.join(name, ver), re.M) else: self.assertTrue( False, "Unknown module syntax: %s" % get_module_syntax()) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (name, ver) in [('toy', '0.0-deps')]: if get_module_syntax() == 'Tcl': regex = re.compile(r'^\s*module load %s/.%s\s*$' % (name, ver), re.M) elif get_module_syntax() == 'Lua': regex = re.compile(r'^\s*load\("%s/.%s"\)$' % (name, ver), re.M) else: self.assertTrue( False, "Unknown module syntax: %s" % get_module_syntax()) self.assertTrue(regex.search(txt), "Pattern %s found in %s" % (regex.pattern, txt)) for (name, ver) in [('OpenMPI', '1.6.4-GCC-4.6.4')]: if get_module_syntax() == 'Tcl': regex = re.compile( r'^\s*module load %s/.?%s\s*$' % (name, ver), re.M) elif get_module_syntax() == 'Lua': regex = re.compile(r'^\s*load\("%s/.?%s"\)$' % (name, ver), re.M) else: self.assertTrue( False, "Unknown module syntax: %s" % get_module_syntax()) self.assertFalse( regex.search(txt), "Pattern '%s' *not* found in %s" % (regex.pattern, txt))