def test_init_repository(self): """Test use of init_repository function.""" repo = init_repository('FileRepository', self.path) self.assertEqual(repo.wc, self.path) repo = init_repository('FileRepository', [self.path]) self.assertEqual(repo.wc, self.path) subdir = 'sub/dir' repo = init_repository('FileRepository', [self.path, subdir]) self.assertEqual(repo.wc, self.path) self.assertEqual(repo.subdir, subdir)
def create_job(build_command, easyconfig, output_dir="", conn=None, ppn=None): """ Creates a job, to build a *single* easyconfig build_command is a format string in which a full path to an eb file will be substituted easyconfig should be in the format as processEasyConfig returns them output_dir is an optional path. EASYBUILDTESTOUTPUT will be set inside the job with this variable returns the job """ # create command based on build_command template command = build_command % {'spec': easyconfig['spec']} # capture PYTHONPATH, MODULEPATH and all variables starting with EASYBUILD easybuild_vars = {} for name in os.environ: if name.startswith("EASYBUILD"): easybuild_vars[name] = os.environ[name] others = ["PYTHONPATH", "MODULEPATH"] for env_var in others: if env_var in os.environ: easybuild_vars[env_var] = os.environ[env_var] _log.info("Dictionary of environment variables passed to job: %s" % easybuild_vars) # obtain unique name based on name/easyconfig version tuple ec_tuple = (easyconfig['ec']['name'], det_full_ec_version(easyconfig['ec'])) name = '-'.join(ec_tuple) var = config.oldstyle_environment_variables['test_output_path'] easybuild_vars[var] = os.path.join(os.path.abspath(output_dir), name) # just use latest build stats repo = init_repository(get_repository(), get_repositorypath()) buildstats = repo.get_buildstats(*ec_tuple) resources = {} if buildstats: previous_time = buildstats[-1]['build_time'] resources['hours'] = int(math.ceil(previous_time * 2 / 60)) job = PbsJob(command, name, easybuild_vars, resources=resources, conn=conn, ppn=ppn) job.module = det_full_module_name(easyconfig['ec']) return job
def create_job(build_command, easyconfig, output_dir=None, conn=None, ppn=None): """ Creates a job, to build a *single* easyconfig @param build_command: format string for command, full path to an easyconfig file will be substituted in it @param easyconfig: easyconfig as processed by process_easyconfig @param output_dir: optional output path; $EASYBUILDTESTOUTPUT will be set inside the job with this variable @param conn: open connection to PBS server @param ppn: ppn setting to use (# 'processors' (cores) per node to use) returns the job """ if output_dir is None: output_dir = 'easybuild-build' # create command based on build_command template command = build_command % {'spec': easyconfig['spec']} # capture PYTHONPATH, MODULEPATH and all variables starting with EASYBUILD easybuild_vars = {} for name in os.environ: if name.startswith("EASYBUILD"): easybuild_vars[name] = os.environ[name] others = ["PYTHONPATH", "MODULEPATH"] for env_var in others: if env_var in os.environ: easybuild_vars[env_var] = os.environ[env_var] _log.info("Dictionary of environment variables passed to job: %s" % easybuild_vars) # obtain unique name based on name/easyconfig version tuple ec_tuple = (easyconfig['ec']['name'], det_full_ec_version(easyconfig['ec'])) name = '-'.join(ec_tuple) var = config.OLDSTYLE_ENVIRONMENT_VARIABLES['test_output_path'] easybuild_vars[var] = os.path.join(os.path.abspath(output_dir), name) # just use latest build stats repo = init_repository(get_repository(), get_repositorypath()) buildstats = repo.get_buildstats(*ec_tuple) resources = {} if buildstats: previous_time = buildstats[-1]['build_time'] resources['hours'] = int(math.ceil(previous_time * 2 / 60)) job = PbsJob(command, name, easybuild_vars, resources=resources, conn=conn, ppn=ppn) job.module = det_full_module_name(easyconfig['ec']) return job
sys.exit(0) # build software, will exit when errors occurs (except when regtesting) correct_built_cnt = 0 all_built_cnt = 0 if not testing or (testing and do_build): for ec in ordered_ecs: (success, _) = build_and_install_software(ec, orig_environ) if success: correct_built_cnt += 1 all_built_cnt += 1 print_msg("Build succeeded for %s out of %s" % (correct_built_cnt, all_built_cnt), log=_log, silent=testing) repo = init_repository(get_repository(), get_repositorypath()) repo.cleanup() # cleanup and spec files for ec in easyconfigs: if 'original_spec' in ec and os.path.isfile(ec['spec']): os.remove(ec['spec']) # cleanup tmp log file (all is well, all modules have their own log file) if options.logtostdout: fancylogger.logToScreen(enable=False, stdout=True) else: fancylogger.logToFile(logfile, enable=False) cleanup(logfile, eb_tmpdir, testing)
def test_legacy_config_file(self): """Test finding/using legacy configuration files.""" cfg_fn = self.configure(args=[]) self.assertTrue(cfg_fn.endswith('easybuild/easybuild_config.py')) configtxt = """ build_path = '%(buildpath)s' source_path = '%(sourcepath)s' install_path = '%(installpath)s' repository_path = '%(repopath)s' repository = FileRepository(repository_path) log_format = ('%(logdir)s', '%(logtmpl)s') log_dir = '%(tmplogdir)s' software_install_suffix = '%(softsuffix)s' modules_install_suffix = '%(modsuffix)s' """ buildpath = os.path.join(self.tmpdir, 'my', 'test', 'build', 'path') sourcepath = os.path.join(self.tmpdir, 'my', 'test', 'source', 'path') installpath = os.path.join(self.tmpdir, 'my', 'test', 'install', 'path') repopath = os.path.join(self.tmpdir, 'my', 'test', 'repo', 'path') logdir = 'somedir' logtmpl = 'test-eb-%(name)s%(version)s_date-%(date)s__time-%(time)s.log' tmplogdir = os.path.join(self.tmpdir, 'my', 'test', 'tmplogdir') softsuffix = 'myfavoritesoftware' modsuffix = 'modulesgohere' configdict = { 'buildpath': buildpath, 'sourcepath': sourcepath, 'installpath': installpath, 'repopath': repopath, 'logdir': logdir, 'logtmpl': logtmpl, 'tmplogdir': tmplogdir, 'softsuffix': softsuffix, 'modsuffix': modsuffix } # create user config file on default location myconfigfile = os.path.join(self.tmpdir, '.easybuild', 'config.py') if not os.path.exists(os.path.dirname(myconfigfile)): os.makedirs(os.path.dirname(myconfigfile)) write_file(myconfigfile, configtxt % configdict) # redefine home so we can test user config file on default location home = os.environ.get('HOME', None) os.environ['HOME'] = self.tmpdir config.variables = ConfigurationVariables() cfg_fn = self.configure(args=[]) if home is not None: os.environ['HOME'] = home # check finding and use of config file self.assertEqual(cfg_fn, myconfigfile) self.assertEqual(build_path(), buildpath) self.assertEqual(source_paths()[0], sourcepath) self.assertEqual(install_path(), os.path.join(installpath, softsuffix)) self.assertEqual(install_path(typ='mod'), os.path.join(installpath, modsuffix)) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, repopath) self.assertEqual(log_file_format(return_directory=True), logdir) self.assertEqual(log_file_format(), logtmpl) self.assertEqual(get_build_log_path(), tmplogdir) # redefine config file entries for proper testing below buildpath = os.path.join(self.tmpdir, 'my', 'custom', 'test', 'build', 'path') sourcepath = os.path.join(self.tmpdir, 'my', 'custom', 'test', 'source', 'path') installpath = os.path.join(self.tmpdir, 'my', 'custom', 'test', 'install', 'path') repopath = os.path.join(self.tmpdir, 'my', 'custom', 'test', 'repo', 'path') logdir = 'somedir_custom' logtmpl = 'test-custom-eb-%(name)_%(date)s%(time)s__%(version)s.log' tmplogdir = os.path.join(self.tmpdir, 'my', 'custom', 'test', 'tmplogdir') softsuffix = 'myfavoritesoftware_custom' modsuffix = 'modulesgohere_custom' configdict = { 'buildpath': buildpath, 'sourcepath': sourcepath, 'installpath': installpath, 'repopath': repopath, 'logdir': logdir, 'logtmpl': logtmpl, 'tmplogdir': tmplogdir, 'softsuffix': softsuffix, 'modsuffix': modsuffix } # create custom config file, and point to it mycustomconfigfile = os.path.join(self.tmpdir, 'mycustomconfig.py') if not os.path.exists(os.path.dirname(mycustomconfigfile)): os.makedirs(os.path.dirname(mycustomconfigfile)) write_file(mycustomconfigfile, configtxt % configdict) os.environ['EASYBUILDCONFIG'] = mycustomconfigfile # reconfigure config.variables = ConfigurationVariables() cfg_fn = self.configure(args=[]) # verify configuration self.assertEqual(cfg_fn, mycustomconfigfile) self.assertEqual(build_path(), buildpath) self.assertEqual(source_paths()[0], sourcepath) self.assertEqual(install_path(), os.path.join(installpath, softsuffix)) self.assertEqual(install_path(typ='mod'), os.path.join(installpath, modsuffix)) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, repopath) self.assertEqual(log_file_format(return_directory=True), logdir) self.assertEqual(log_file_format(), logtmpl) self.assertEqual(get_build_log_path(), tmplogdir) del os.environ['EASYBUILDCONFIG']
def test_legacy_env_vars(self): """Test legacy environment variables.""" # build path test_buildpath = os.path.join(self.tmpdir, 'build', 'path') os.environ['EASYBUILDBUILDPATH'] = test_buildpath self.configure(args=[]) self.assertEqual(build_path(), test_buildpath) del os.environ['EASYBUILDBUILDPATH'] # source path(s) test_sourcepaths = [ os.path.join(self.tmpdir, 'source', 'path'), ':'.join([ os.path.join(self.tmpdir, 'source', 'path1'), os.path.join(self.tmpdir, 'source', 'path2'), ]), ':'.join([ os.path.join(self.tmpdir, 'source', 'path1'), os.path.join(self.tmpdir, 'source', 'path2'), os.path.join(self.tmpdir, 'source', 'path3'), ]), ] for test_sourcepath in test_sourcepaths: config.variables = ConfigurationVariables() os.environ['EASYBUILDSOURCEPATH'] = test_sourcepath self.configure(args=[]) self.assertEqual(build_path(), os.path.join(os.path.expanduser('~'), '.local', 'easybuild', DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_paths(), test_sourcepath.split(':')) del os.environ['EASYBUILDSOURCEPATH'] test_sourcepath = os.path.join(self.tmpdir, 'source', 'path') # install path config.variables = ConfigurationVariables() test_installpath = os.path.join(self.tmpdir, 'install', 'path') os.environ['EASYBUILDINSTALLPATH'] = test_installpath self.configure(args=[]) self.assertEqual(source_paths()[0], os.path.join(os.path.expanduser('~'), '.local', 'easybuild', DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual(install_path(), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) del os.environ['EASYBUILDINSTALLPATH'] # prefix: should change build/install/source/repo paths config.variables = ConfigurationVariables() test_prefixpath = os.path.join(self.tmpdir, 'prefix', 'path') os.environ['EASYBUILDPREFIX'] = test_prefixpath self.configure(args=[]) self.assertEqual(build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_paths()[0], os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual(install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) # build/source/install path overrides prefix config.variables = ConfigurationVariables() os.environ['EASYBUILDBUILDPATH'] = test_buildpath self.configure(args=[]) self.assertEqual(build_path(), test_buildpath) self.assertEqual(source_paths()[0], os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual(install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) # also check old style vs new style self.assertEqual(config.variables['build_path'], config.variables['buildpath']) self.assertEqual(config.variables['install_path'], config.variables['installpath']) del os.environ['EASYBUILDBUILDPATH'] config.variables = ConfigurationVariables() os.environ['EASYBUILDSOURCEPATH'] = test_sourcepath self.configure(args=[]) self.assertEqual(build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_paths()[0], test_sourcepath) self.assertEqual(install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) del os.environ['EASYBUILDSOURCEPATH'] config.variables = ConfigurationVariables() os.environ['EASYBUILDINSTALLPATH'] = test_installpath self.configure(args=[]) self.assertEqual(build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_paths()[0], os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual(install_path(), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) del os.environ['EASYBUILDINSTALLPATH'] del os.environ['EASYBUILDPREFIX']
def test_legacy_env_vars(self): """Test legacy environment variables.""" # build path test_buildpath = os.path.join(self.tmpdir, 'build', 'path') os.environ['EASYBUILDBUILDPATH'] = test_buildpath self.configure(args=[]) self.assertEqual(build_path(), test_buildpath) del os.environ['EASYBUILDBUILDPATH'] # source path(s) test_sourcepaths = [ os.path.join(self.tmpdir, 'source', 'path'), ':'.join([ os.path.join(self.tmpdir, 'source', 'path1'), os.path.join(self.tmpdir, 'source', 'path2'), ]), ':'.join([ os.path.join(self.tmpdir, 'source', 'path1'), os.path.join(self.tmpdir, 'source', 'path2'), os.path.join(self.tmpdir, 'source', 'path3'), ]), ] for test_sourcepath in test_sourcepaths: config.variables = ConfigurationVariables() os.environ['EASYBUILDSOURCEPATH'] = test_sourcepath self.configure(args=[]) self.assertEqual( build_path(), os.path.join(os.path.expanduser('~'), '.local', 'easybuild', DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_paths(), test_sourcepath.split(':')) del os.environ['EASYBUILDSOURCEPATH'] test_sourcepath = os.path.join(self.tmpdir, 'source', 'path') # install path config.variables = ConfigurationVariables() test_installpath = os.path.join(self.tmpdir, 'install', 'path') os.environ['EASYBUILDINSTALLPATH'] = test_installpath self.configure(args=[]) self.assertEqual( source_paths()[0], os.path.join(os.path.expanduser('~'), '.local', 'easybuild', DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual( install_path(), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) del os.environ['EASYBUILDINSTALLPATH'] # prefix: should change build/install/source/repo paths config.variables = ConfigurationVariables() test_prefixpath = os.path.join(self.tmpdir, 'prefix', 'path') os.environ['EASYBUILDPREFIX'] = test_prefixpath self.configure(args=[]) self.assertEqual( build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual( source_paths()[0], os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual( install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual( repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) # build/source/install path overrides prefix config.variables = ConfigurationVariables() os.environ['EASYBUILDBUILDPATH'] = test_buildpath self.configure(args=[]) self.assertEqual(build_path(), test_buildpath) self.assertEqual( source_paths()[0], os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual( install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual( repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) # also check old style vs new style self.assertEqual(config.variables['build_path'], config.variables['buildpath']) self.assertEqual(config.variables['install_path'], config.variables['installpath']) del os.environ['EASYBUILDBUILDPATH'] config.variables = ConfigurationVariables() os.environ['EASYBUILDSOURCEPATH'] = test_sourcepath self.configure(args=[]) self.assertEqual( build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_paths()[0], test_sourcepath) self.assertEqual( install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual( repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) del os.environ['EASYBUILDSOURCEPATH'] config.variables = ConfigurationVariables() os.environ['EASYBUILDINSTALLPATH'] = test_installpath self.configure(args=[]) self.assertEqual( build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual( source_paths()[0], os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual( install_path(), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual( repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) del os.environ['EASYBUILDINSTALLPATH'] del os.environ['EASYBUILDPREFIX']
sys.exit(0) # build software, will exit when errors occurs (except when regtesting) correct_built_cnt = 0 all_built_cnt = 0 if not testing: for spec in orderedSpecs: (success, _) = build_and_install_software(spec, options, origEnviron, silent=testing) if success: correct_built_cnt += 1 all_built_cnt += 1 print_msg("Build succeeded for %s out of %s" % (correct_built_cnt, all_built_cnt), log=_log, silent=testing) repo = init_repository(get_repository(), get_repositorypath()) repo.cleanup() # cleanup and spec files for ec in easyconfigs: if 'originalSpec' in ec and os.path.isfile(ec['spec']): os.remove(ec['spec']) # cleanup tmp log file (all is well, all modules have their own log file) if options.logtostdout: fancylogger.logToScreen(enable=False, stdout=True) else: fancylogger.logToFile(logfile, enable=False) cleanup_logfile_and_exit(logfile, testing, False) logfile = None