def test_get_easyblock_instance(self): """Test get_easyblock_instance function.""" # adjust PYTHONPATH such that test easyblocks are found testdir = os.path.abspath(os.path.dirname(__file__)) import easybuild eb_blocks_path = os.path.join(testdir, 'sandbox') if eb_blocks_path not in sys.path: sys.path.append(eb_blocks_path) easybuild = reload(easybuild) import easybuild.easyblocks reload(easybuild.easyblocks) from easybuild.easyblocks.toy import EB_toy ec = process_easyconfig( os.path.join(testdir, 'easyconfigs', 'toy-0.0.eb'))[0] eb = get_easyblock_instance(ec) self.assertTrue(isinstance(eb, EB_toy)) # check whether 'This is easyblock' log message is there tup = ('EB_toy', 'easybuild.easyblocks.toy', '.*test/framework/sandbox/easybuild/easyblocks/t/toy.pyc*') eb_log_msg_re = re.compile( r"INFO This is easyblock %s from module %s (%s)" % tup, re.M) logtxt = read_file(eb.logfile) self.assertTrue( eb_log_msg_re.search(logtxt), "Pattern '%s' found in: %s" % (eb_log_msg_re.pattern, logtxt))
def test_get_easyblock_instance(self): """Test get_easyblock_instance function.""" # adjust PYTHONPATH such that test easyblocks are found testdir = os.path.abspath(os.path.dirname(__file__)) import easybuild eb_blocks_path = os.path.join(testdir, "sandbox") if not eb_blocks_path in sys.path: sys.path.append(eb_blocks_path) easybuild = reload(easybuild) import easybuild.easyblocks reload(easybuild.easyblocks) from easybuild.easyblocks.toy import EB_toy ec = process_easyconfig(os.path.join(testdir, "easyconfigs", "toy-0.0.eb"))[0] eb = get_easyblock_instance(ec) self.assertTrue(isinstance(eb, EB_toy)) # check whether 'This is easyblock' log message is there tup = ("EB_toy", "easybuild.easyblocks.toy", ".*test/framework/sandbox/easybuild/easyblocks/toy.pyc*") eb_log_msg_re = re.compile(r"INFO This is easyblock %s from module %s (%s)" % tup, re.M) logtxt = read_file(eb.logfile) self.assertTrue(eb_log_msg_re.search(logtxt), "Pattern '%s' found in: %s" % (eb_log_msg_re.pattern, logtxt))
def prepare_easyconfig(ec): """ Prepare for building specified easyconfig (fetch sources) @param ec: parsed easyconfig (EasyConfig instance) """ try: easyblock_instance = get_easyblock_instance(ec) easyblock_instance.update_config_template_run_step() easyblock_instance.fetch_step(skip_checksums=True) _log.debug("Cleaning up log file %s..." % easyblock_instance.logfile) easyblock_instance.close_log() os.remove(easyblock_instance.logfile) except (OSError, EasyBuildError), err: _log.error("An error occured while preparing %s: %s" % (ec, err))
def test_get_easyblock_instance(self): """Test get_easyblock_instance function.""" from easybuild.easyblocks.toy import EB_toy testdir = os.path.abspath(os.path.dirname(__file__)) ec = process_easyconfig(os.path.join(testdir, 'easyconfigs', 'test_ecs', 't', 'toy', 'toy-0.0.eb'))[0] eb = get_easyblock_instance(ec) self.assertTrue(isinstance(eb, EB_toy)) # check whether 'This is easyblock' log message is there tup = ('EB_toy', 'easybuild.easyblocks.toy', '.*test/framework/sandbox/easybuild/easyblocks/t/toy.pyc*') eb_log_msg_re = re.compile(r"INFO This is easyblock %s from module %s (%s)" % tup, re.M) logtxt = read_file(eb.logfile) self.assertTrue(eb_log_msg_re.search(logtxt), "Pattern '%s' found in: %s" % (eb_log_msg_re.pattern, logtxt))
def prepare_easyconfig(ec): """ Prepare for building specified easyconfig (fetch sources) :param ec: parsed easyconfig (EasyConfig instance) """ try: easyblock_instance = get_easyblock_instance(ec) easyblock_instance.update_config_template_run_step() easyblock_instance.fetch_step(skip_checksums=True) _log.debug("Cleaning up log file %s..." % easyblock_instance.logfile) easyblock_instance.close_log() os.remove(easyblock_instance.logfile) except (OSError, EasyBuildError), err: raise EasyBuildError("An error occurred while preparing %s: %s", ec, err)
def prepare_easyconfig(ec, build_options=None, build_specs=None): """ Prepare for building specified easyconfig (fetch sources) @param ec: parsed easyconfig @param build_options: dictionary specifying build options (e.g. robot_path, check_osdeps, ...) @param build_specs: dictionary specifying build specifications (e.g. version, toolchain, ...) """ try: easyblock_instance = get_easyblock_instance(ec, build_options=build_options, build_specs=build_specs) easyblock_instance.update_config_template_run_step() easyblock_instance.fetch_step(skip_checksums=True) _log.debug("Cleaning up log file %s..." % easyblock_instance.logfile) easyblock_instance.close_log() os.remove(easyblock_instance.logfile) except (OSError, EasyBuildError), err: _log.error("An error occured while preparing %s: %s" % (ec, err))
def test_get_easyblock_instance(self): """Test get_easyblock_instance function.""" # adjust PYTHONPATH such that test easyblocks are found testdir = os.path.abspath(os.path.dirname(__file__)) import easybuild eb_blocks_path = os.path.join(testdir, 'sandbox') if not eb_blocks_path in sys.path: sys.path.append(eb_blocks_path) easybuild = reload(easybuild) import easybuild.easyblocks reload(easybuild.easyblocks) from easybuild.easyblocks.toy import EB_toy ec = process_easyconfig(os.path.join(testdir, 'easyconfigs', 'toy-0.0.eb'))[0] eb = get_easyblock_instance(ec) self.assertTrue(isinstance(eb, EB_toy))
def test_fetch_patches(self): """Test fetch_patches method.""" # adjust PYTHONPATH such that test easyblocks are found testdir = os.path.abspath(os.path.dirname(__file__)) ec = process_easyconfig( os.path.join(testdir, 'easyconfigs', 'test_ecs', 't', 'toy', 'toy-0.0.eb'))[0] eb = get_easyblock_instance(ec) eb.fetch_patches() self.assertEqual(len(eb.patches), 2) self.assertEqual(eb.patches[0]['name'], 'toy-0.0_typo.patch') self.assertFalse('level' in eb.patches[0]) # reset eb.patches = [] patches = [ ('toy-0.0_typo.patch', 0), # should also be level 0 (not None or something else) ('toy-0.0_typo.patch', 4), # should be level 4 ('toy-0.0_typo.patch', 'foobar'), # sourcepath should be set to 'foobar' ('toy-0.0.tar.gz', 'some/path'), # copy mode (not a .patch file) ] # check if patch levels are parsed correctly eb.fetch_patches(patch_specs=patches) self.assertEqual(len(eb.patches), 4) self.assertEqual(eb.patches[0]['name'], 'toy-0.0_typo.patch') self.assertEqual(eb.patches[0]['level'], 0) self.assertEqual(eb.patches[1]['name'], 'toy-0.0_typo.patch') self.assertEqual(eb.patches[1]['level'], 4) self.assertEqual(eb.patches[2]['name'], 'toy-0.0_typo.patch') self.assertEqual(eb.patches[2]['sourcepath'], 'foobar') self.assertEqual(eb.patches[3]['name'], 'toy-0.0.tar.gz'), self.assertEqual(eb.patches[3]['copy'], 'some/path') patches = [ ('toy-0.0_level4.patch', False ), # should throw an error, only int's an strings allowed here ] self.assertRaises(EasyBuildError, eb.fetch_patches, patch_specs=patches)
def test_fetch_patches(self): """Test fetch_patches method.""" # adjust PYTHONPATH such that test easyblocks are found testdir = os.path.abspath(os.path.dirname(__file__)) ec = process_easyconfig(os.path.join(testdir, 'easyconfigs', 'test_ecs', 't', 'toy', 'toy-0.0.eb'))[0] eb = get_easyblock_instance(ec) eb.fetch_patches() self.assertEqual(len(eb.patches), 2) self.assertEqual(eb.patches[0]['name'], 'toy-0.0_typo.patch') self.assertFalse('level' in eb.patches[0]) # reset eb.patches = [] patches = [ ('toy-0.0_typo.patch', 0), # should also be level 0 (not None or something else) ('toy-0.0_typo.patch', 4), # should be level 4 ('toy-0.0_typo.patch', 'foobar'), # sourcepath should be set to 'foobar' ('toy-0.0.tar.gz', 'some/path'), # copy mode (not a .patch file) ] # check if patch levels are parsed correctly eb.fetch_patches(patch_specs=patches) self.assertEqual(len(eb.patches), 4) self.assertEqual(eb.patches[0]['name'], 'toy-0.0_typo.patch') self.assertEqual(eb.patches[0]['level'], 0) self.assertEqual(eb.patches[1]['name'], 'toy-0.0_typo.patch') self.assertEqual(eb.patches[1]['level'], 4) self.assertEqual(eb.patches[2]['name'], 'toy-0.0_typo.patch') self.assertEqual(eb.patches[2]['sourcepath'], 'foobar') self.assertEqual(eb.patches[3]['name'], 'toy-0.0.tar.gz'), self.assertEqual(eb.patches[3]['copy'], 'some/path') patches = [ ('toy-0.0_level4.patch', False), # should throw an error, only int's an strings allowed here ] self.assertRaises(EasyBuildError, eb.fetch_patches, patch_specs=patches)
def test_toolchain_external_modules(self): """Test use of Toolchain easyblock with external modules.""" external_modules = [ 'gcc/8.3.0', 'openmpi/4.0.2', 'openblas/0.3.7', 'fftw/3.3.8', 'scalapack/2.0.2' ] external_modules_metadata = { # all metadata for gcc/8.3.0 'gcc/8.3.0': { 'name': ['GCC'], 'version': ['8.3.0'], 'prefix': '/software/gcc/8.3.0', }, # only name/version for openmpi/4.0.2 'openmpi/4.0.2': { 'name': ['OpenMPI'], 'version': ['4.0.2'], }, # only name/prefix for openblas/0.3.7 'openblas/0.3.7': { 'name': ['OpenBLAS'], 'prefix': '/software/openblas/0.3.7', }, # only version/prefix for fftw/3.3.8 (no name) 'fftw/3.3.8': { 'version': ['3.3.8'], 'prefix': '/software/fftw/3.3.8', }, # no metadata for scalapack/2.0.2 } # initialize configuration cleanup() eb_go = eboptions.parse_options( args=['--installpath=%s' % self.tmpdir]) config.init(eb_go.options, eb_go.get_options_by_section('config')) build_options = { 'external_modules_metadata': external_modules_metadata, 'valid_module_classes': config.module_classes(), } config.init_build_options(build_options=build_options) set_tmpdir() del eb_go modtool = modules_tool() # make sure no $EBROOT* or $EBVERSION* environment variables are set in current environment for key in os.environ: if any(key.startswith(x) for x in ['EBROOT', 'EBVERSION']): del os.environ[key] # create dummy module file for each of the external modules test_mod_path = os.path.join(self.tmpdir, 'modules', 'all') for mod in external_modules: write_file(os.path.join(test_mod_path, mod), "#%Module") modtool.use(test_mod_path) # test easyconfig file to install toolchain that uses external modules, # and enables set_env_external_modules test_ec_path = os.path.join(self.tmpdir, 'test.eb') test_ec_txt = '\n'.join([ "easyblock = 'Toolchain'", "name = 'test-toolchain'", "version = '1.2.3'", "homepage = 'https://example.com'", "description = 'just a test'", "toolchain = SYSTEM", "dependencies = [", " ('gcc/8.3.0', EXTERNAL_MODULE),", " ('openmpi/4.0.2', EXTERNAL_MODULE),", " ('openblas/0.3.7', EXTERNAL_MODULE),", " ('fftw/3.3.8', EXTERNAL_MODULE),", " ('scalapack/2.0.2', EXTERNAL_MODULE),", "]", "set_env_external_modules = True", "moduleclass = 'toolchain'", ]) write_file(test_ec_path, test_ec_txt) test_ec = process_easyconfig(test_ec_path)[0] # create easyblock & install module via run_all_steps tc_inst = get_easyblock_instance(test_ec) self.assertTrue(isinstance(tc_inst, Toolchain)) self.mock_stdout(True) tc_inst.run_all_steps(False) self.mock_stdout(False) # make sure expected module file exists test_mod = os.path.join(test_mod_path, 'test-toolchain', '1.2.3') if get_module_syntax() == 'Lua': test_mod += '.lua' self.assertTrue(os.path.exists(test_mod)) # load test-toolchain/1.2.3 module to get environment variable to check for defined modtool.load(['test-toolchain/1.2.3']) # check whether expected environment variables are defined self.assertEqual(os.environ.pop('EBROOTGCC'), '/software/gcc/8.3.0') self.assertEqual(os.environ.pop('EBVERSIONGCC'), '8.3.0') self.assertEqual(os.environ.pop('EBVERSIONOPENMPI'), '4.0.2') self.assertEqual(os.environ.pop('EBROOTOPENBLAS'), '/software/openblas/0.3.7') undefined_env_vars = [ 'EBROOTOPENMPI', # no prefix in metadata 'EBVERSIONOPENBLAS' # no version in metadata 'EBROOTFFTW', 'EBVERSIONFFTW', # no name in metadata 'EBROOTSCALAPACK', 'EBVERSIONSCALAPACK', # no metadata ] for env_var in undefined_env_vars: self.assertTrue(os.getenv(env_var) is None) # make sure no unexpected $EBROOT* or $EBVERSION* environment variables were defined del os.environ['EBROOTTESTMINTOOLCHAIN'] del os.environ['EBVERSIONTESTMINTOOLCHAIN'] extra_eb_env_vars = [] for key in os.environ: if any(key.startswith(x) for x in ['EBROOT', 'EBVERSION']): extra_eb_env_vars.append(key) self.assertEqual(extra_eb_env_vars, [])