def framework_test(code_root, output_dir, cli_config): print("Starting framework test run") abs_out_dir = util.resolve_path(output_dir, root_path=code_root, env=os.environ) try: log_str = shell_command_wrapper('./mdtf -f {input_file}'.format( input_file=os.path.join(code_root, cli_config['config_out'])), cwd=code_root) log_str = util.to_iter(log_str) # write to most recent directory in output_dir runs = [ d for d in glob.glob(os.path.join(abs_out_dir, '*')) if os.path.isdir(d) ] if not runs: raise IOError( "Can't find framework output in {}".format(abs_out_dir)) run_output = max(runs, key=os.path.getmtime) with io.open(os.path.join(run_output, 'mdtf_test.log'), 'w', encoding='utf-8') as f: f.write('\n'.join(log_str)) except Exception as exc: fatal_exception_handler(exc, "ERROR: framework test run failed.") print("Finished framework test run at {}".format(run_output)) return run_output
def _init_path(self, key, d, env=None): if self._unittest: # use in unit testing only return 'TEST_'+key else: # need to check existence in case we're being called directly assert key in d, f"Error: {key} not initialized." return util.resolve_path( util.from_iter(d[key]), root_path=self.CODE_ROOT, env=env )
def _init_path(self, key, d, env=None): if self._unittest: # use in unit testing only return 'TEST_' + key else: # need to check existence in case we're being called directly if not d.get(key, False): _log.fatal(f"Error: {key} not initialized.") util.exit_handler(code=1) return util.resolve_path(util.from_iter(d[key]), root_path=self.CODE_ROOT, env=env, log=_log)
def parse_env_vars(self, cli_obj, config): super(GFDLMDTFFramework, self).parse_env_vars(cli_obj, config) # set temp directory according to where we're running if gfdl.running_on_PPAN(): gfdl_tmp_dir = cli_obj.config.get('GFDL_PPAN_TEMP', '$TMPDIR') else: gfdl_tmp_dir = cli_obj.config.get('GFDL_WS_TEMP', '$TMPDIR') gfdl_tmp_dir = util.resolve_path(gfdl_tmp_dir, root_path=self.code_root, env=config.global_envvars) if not os.path.isdir(gfdl_tmp_dir): gfdl.make_remote_dir(gfdl_tmp_dir) tempfile.tempdir = gfdl_tmp_dir os.environ['MDTF_GFDL_TMPDIR'] = gfdl_tmp_dir config.global_envvars['MDTF_GFDL_TMPDIR'] = gfdl_tmp_dir
def parse_config(self): d = self.config # abbreviation # determine downloads d.downloads_list = ['obs'] if not d.no_cesm: d.downloads_list.append('model_cesm') if not d.no_am4: d.downloads_list.append('model_am4') # determine runtime setup d.pods = 'all' d.conda_envmgr = True if d.env_setup == 'conda-basic': d.conda_envs = [self.settings.conda['framework_env'], 'NCL_base'] d.environment_manager = "Conda" d.pods = [ "Wheeler_Kiladis", "EOF_500hPa", "MJO_suite", "MJO_teleconnection" ] if 'model_am4' in d.downloads_list: d.downloads_list.remove('model_am4') elif d.env_setup == 'conda-full': d.conda_envs = ['all'] d.environment_manager = "Conda" elif d.env_setup == 'no-conda': d.conda_envmgr = False d.conda_envs = [] d.environment_manager = "VirtualEnv" if d.conda_install_dev and not d.conda_envmgr: d.conda_envs.append('dev') # make settings consistent with config ordered_data = collections.OrderedDict() for k in d.downloads_list: ordered_data[k] = self.settings.data[k] self.settings.data = ordered_data for k in self._shared_conda_keys: self.settings.conda[k] = d[k] # convert relative paths to absolute for key in (self._env_paths + self._data_paths): if d[key]: d[key] = util.resolve_path(d[key], root_path=self.code_root, env=os.environ)