Skip to content
Snippets Groups Projects
Select Git revision
  • master
1 result

bootstrap

Blame
  • generate_runscript.py 4.09 KiB
    # SPDX-FileCopyrightText: 2021 Earth System Data Exploration (ESDE), Jülich Supercomputing Center (JSC)
    #
    # SPDX-License-Identifier: MIT
    
    """
    Basic task of the Python-script:
    
    Creates user-defined runscripts for all workflow runscripts via keyboard interaction.
    """
    
    __email__ = "b.gong@fz-juelich.de"
    __authors__ = "Michael Langguth"
    __date__ = "2021-02-03"
    
    # import modules
    import sys, os
    import socket
    if sys.version_info[0] < 3:
        raise Exception("This script has to be run with Python 3!")
    # append path to get runscript-generator scripts
    sys.path.append(os.path.dirname(sys.path[0]))
    workdir = os.path.dirname(os.getcwd())
    sys.path.append(os.path.join(workdir, "utils"))
    import argparse
    
    from runscript_generator.config_utils import check_virtualenv
    
    from runscript_generator.config_utils import Config_runscript_base
    from runscript_generator.config_extraction import Config_Extraction
    from runscript_generator.config_preprocess_step1 import Config_Preprocess1
    from runscript_generator.config_preprocess_step2 import Config_Preprocess2
    from runscript_generator.config_training import Config_Train
    from runscript_generator.config_postprocess import Config_Postprocess
    
    #
    # ----------------------------- auxiliary function -----------------------------
    #
    def get_runscript_cls(target_runscript_name, venv_name, lhpc):
    
        method_name = get_runscript_cls.__name__
    
        if target_runscript_name == "extract":
            cls_inst = Config_Extraction(venv_name, lhpc)
        elif target_runscript_name == "preprocess1":
            cls_inst = Config_Preprocess1(venv_name, lhpc)
        elif target_runscript_name == "preprocess2":
            cls_inst = Config_Preprocess2(venv_name, lhpc)
        elif target_runscript_name == "train":
            cls_inst = Config_Train(venv_name, lhpc)
        elif target_runscript_name == "postprocess":
            cls_inst = Config_Postprocess(venv_name, lhpc)
        else:
            raise ValueError("%{0}: Unknown workflow runscript '{1}'. passed.".format(method_name, target_runscript_name))
    
        return cls_inst
    #
    # ------------------------------------ main ------------------------------------
    #
    def main():
    
        parser = argparse.ArgumentParser()
        parser.add_argument("--venv_path", "-venv", dest="venv_name", type=str, required=True,
                            help="Name of virtual environment to be used (created with create_env.sh).")
    
    
        args = parser.parse_args()
        venv_path = os.path.join(os.path.dirname(os.getcwd()), "virtual_envs", args.venv_name) 
        venv_name = check_virtualenv(lactive=False, venv_path=venv_path, labort=True)
    
        # check if we are on a known HPC
        lhpc = False
        if any(map(socket.gethostname().__contains__, ["juwels", "hdfml"])):
            lhpc = True
    
        print(" *** NOTE: Enter 'help' to receive support during the subsequent keyboard interaction. ***")
    
        config_dummy = Config_runscript_base(venv_name, lhpc)
        known_wrkflw_steps = config_dummy.known_workflow_steps
        keyboard_interaction = config_dummy.keyboard_interaction
    
        # get workflow step by keyboard interaction
        target_runscript_req = "Please enter the name of the workflow step for which a runscript should be created:"
        target_runscript_err = ValueError("Workflow step is unknown. Please select one of the known listed above")
    
        def check_target_runscript(runscript_name, silent=False):
            if not runscript_name in known_wrkflw_steps:
                if not silent:
                    if runscript_name != "help":
                        print("Invalid workflow step '{0}' passed!".format(runscript_name))
                    print("Known workflow steps:")
                    for step in known_wrkflw_steps:
                        print("* {0}".format(step))
                return False
            else:
                return True
    
        target_runscript = keyboard_interaction(target_runscript_req, check_target_runscript,
                                                target_runscript_err, ntries=2)
    
        cls_runscript = get_runscript_cls(target_runscript, venv_name, lhpc)
    
        cls_runscript.run()
    
        cls_runscript.finalize()
    
        print("*** Important note: Remember to open newly created directories for other AMBS-users! ***")
    
    if __name__== '__main__':
        main()