Source code for oasislmf.execution.runner

import logging
import os
import shutil
import subprocess

from ..utils.exceptions import OasisException
from ..utils.log import oasis_log
from .bash import (bash_wrapper, create_bash_analysis,
                   create_bash_outputs, genbash)


@oasis_log()
[docs] def run(analysis_settings, number_of_processes=-1, set_alloc_rule_gul=None, set_alloc_rule_il=None, set_alloc_rule_ri=None, run_debug=False, custom_gulcalc_cmd=None, custom_gulcalc_log_start=None, custom_gulcalc_log_finish=None, custom_get_getmodel_cmd=None, filename='run_ktools.sh', gul_legacy_stream=False, df_engine='oasis_data_manager.df_reader.reader.OasisPandasReader', model_df_engine=None, dynamic_footprint=False, **kwargs ): model_df_engine = model_df_engine or df_engine # MOVED into bash_params ######################################### # keep here for the moment and refactor after testing # # Example: # from .bash import get_complex_model_cmd # <var> = get_complex_model_cmd(custom_gulcalc_cmd, analysis_settings) # # If `given_gulcalc_cmd` is set then always run as a complex model # and raise an exception when not found in PATH if custom_gulcalc_cmd: if not shutil.which(custom_gulcalc_cmd): raise OasisException( 'Run error: Custom Gulcalc command "{}" explicitly set but not found in path.'.format(custom_gulcalc_cmd) ) # when not set then fallback to previous behaviour: # Check if a custom binary `<supplier>_<model>_gulcalc` exists in PATH else: inferred_gulcalc_cmd = "{}_{}_gulcalc".format( analysis_settings.get('model_supplier_id'), analysis_settings.get('model_name_id')) if shutil.which(inferred_gulcalc_cmd): custom_gulcalc_cmd = inferred_gulcalc_cmd # TODO: should be integrated into bash.py if custom_gulcalc_cmd: if not custom_get_getmodel_cmd: def custom_get_getmodel_cmd( number_of_samples, gul_threshold, gul_legacy_stream, use_random_number_file, coverage_output, item_output, process_id, max_process_id, gul_alloc_rule, stderr_guard, **kwargs ): cmd = "{} -e {} {} -a {} -p {}".format( custom_gulcalc_cmd, process_id, max_process_id, os.path.abspath("analysis_settings.json"), "input") if gul_legacy_stream and coverage_output != '': cmd = '{} -c {}'.format(cmd, coverage_output) if item_output != '': cmd = '{} -i {}'.format(cmd, item_output) if stderr_guard: cmd = '({}) 2>> log/gul_stderror.err'.format(cmd) return cmd else: custom_get_getmodel_cmd = None ########################################################### # Calls run_analysis + run_outputs in a single script genbash( number_of_processes, analysis_settings, gul_alloc_rule=set_alloc_rule_gul, il_alloc_rule=set_alloc_rule_il, ri_alloc_rule=set_alloc_rule_ri, gul_legacy_stream=gul_legacy_stream, bash_trace=run_debug, filename=filename, _get_getmodel_cmd=custom_get_getmodel_cmd, custom_gulcalc_log_start=custom_gulcalc_log_start, custom_gulcalc_log_finish=custom_gulcalc_log_finish, model_df_engine=model_df_engine, dynamic_footprint=dynamic_footprint, **kwargs, ) bash_trace = subprocess.check_output(['bash', filename]) logging.info(bash_trace.decode('utf-8'))
@oasis_log()
[docs] def run_analysis(**params): with bash_wrapper(params['filename'], params['bash_trace'], params['stderr_guard'], log_sub_dir=params.get("process_number", None), process_number=params.get("process_number", None)): create_bash_analysis(**params) bash_trace = subprocess.check_output(['bash', params['filename']]).decode('utf-8') logging.info(bash_trace) return params['fifo_queue_dir'], bash_trace
@oasis_log()
[docs] def run_outputs(**params): with bash_wrapper(params['filename'], params['bash_trace'], params['stderr_guard'], log_sub_dir='out'): create_bash_outputs(**params) bash_trace = subprocess.check_output(['bash', params['filename']]).decode('utf-8') logging.info(bash_trace) return bash_trace