Ejemplo n.º 1
0
 def _print_config(self, cli_obj, config, paths):
     """Log end result of parsing package settings. This is only for the user's
     benefit; a machine-readable version which is usable for
     provenance/reproducibility is saved by the OutputManager as
     ``config_save.jsonc``.
     """
     d = dict()
     for n, case in enumerate(self.iter_children()):
         key = 'case_list({})'.format(n)
         d[key] = case
     d['paths'] = paths.toDict()
     d['paths'].pop('_unittest', None)
     d['settings'] = dict()
     all_groups = set(arg_gp.title for arg_gp in \
         cli_obj.iter_arg_groups(subcommand=None))
     settings_gps = all_groups.difference(
         ('parser', 'PATHS', 'MODEL', 'DIAGNOSTICS'))
     for group in settings_gps:
         d['settings'] = self._populate_from_cli(cli_obj, group,
                                                 d['settings'])
     d['settings'] = {k:v for k,v in d['settings'].items() \
         if k not in d['paths']}
     d['env_vars'] = config.global_env_vars
     _log.info('PACKAGE SETTINGS:')
     _log.info(util.pretty_print_json(d))
Ejemplo n.º 2
0
 def print_config(self):
     _tmp = {'settings': dict(), 'defaults to assign': dict()}
     for key, val in iter(self.config.items()):
         if key in self.settings.cli_defaults['default_keys']:
             _tmp['defaults to assign'][key] = val
         else:
             _tmp['settings'][key] = val
     print(util.pretty_print_json(_tmp, sort_keys=True))
Ejemplo n.º 3
0
 def _framework_init(self, code_root, defaults_rel_path):
     # set up CLI and parse arguments
     # print('\tDEBUG: argv = {}'.format(sys.argv[1:]))
     cli_obj = cli.FrameworkCLIHandler(code_root, defaults_rel_path)
     self._cli_pre_parse_hook(cli_obj)
     cli_obj.parse_cli()
     self._cli_post_parse_hook(cli_obj)
     # load pod data
     pod_info_tuple = cli.load_pod_settings(code_root)
     # do nontrivial parsing
     config = util_mdtf.ConfigManager(cli_obj, pod_info_tuple)
     print(util.pretty_print_json(config.paths))
     self.parse_mdtf_args(cli_obj, config)
     # config should be read-only from here on
     self._post_parse_hook(cli_obj, config)
     self._print_config(cli_obj, config)
Ejemplo n.º 4
0
def framework_verify(code_root, run_output):
    print("Checking linked output files")
    try:
        html_root = os.path.join(run_output, 'index.html')
        if not os.path.exists(html_root):
            raise IOError(
                "Can't find framework html output in {}".format(html_root))
        link_verifier = LinkVerifier(html_root, verbose=False)
        missing_dict = link_verifier.verify_all_links()
    except Exception as exc:
        fatal_exception_handler(exc, "ERROR in link verification.")
    if missing_dict:
        print("ERROR: the following files are missing:")
        print(util.pretty_print_json(missing_dict))
        util.exit_handler(code=1)
    print("SUCCESS: no missing links found.")
    print("Finished: framework test run successful!")
Ejemplo n.º 5
0
 def _print_config(self, cli_obj, config):
     # make config nested dict for backwards compatibility
     # this is all temporary
     d = dict()
     for n, case in enumerate(self.case_list):
         key = 'case_list({})'.format(n)
         d[key] = case
     d['pod_list'] = self.pod_list
     d['paths'] = config.paths
     d['paths'].pop('_unittest', None)
     d['settings'] = dict()
     settings_gps = set(cli_obj.parser_groups).difference(
         set(['parser', 'PATHS', 'MODEL', 'DIAGNOSTICS']))
     for group in settings_gps:
         d['settings'] = self._populate_from_cli(cli_obj, group,
                                                 d['settings'])
     d['settings'] = {k:v for k,v in iter(d['settings'].items()) \
         if k not in d['paths']}
     d['envvars'] = config.global_envvars
     print('DEBUG: SETTINGS:')
     print(util.pretty_print_json(d))
Ejemplo n.º 6
0
if __name__ == '__main__':
    # Wrap input/output if we're called as a standalone script
    parser = argparse.ArgumentParser()
    parser.add_argument("-v",
                        "--verbose",
                        action="store_true",
                        help="increase output verbosity")
    parser.add_argument(
        "path_or_url",
        help="URL or filesystem path to the MDTF framework output directory.")
    args = parser.parse_args()

    # instead of print(), use root logger
    log = logging.getLogger()
    handler = logging.StreamHandler(stream=sys.stdout)
    formatter = logging.Formatter(fmt='%(message)s', datefmt='%H:%M:%S')
    handler.setFormatter(formatter)
    log.addHandler(handler)

    link_verifier = LinkVerifier(args.path_or_url, verbose=args.verbose)
    missing_dict = link_verifier.verify_all_links()

    if missing_dict:
        print("ERROR: the following files are missing:")
        print(util.pretty_print_json(missing_dict))
        sys.exit(1)
    else:
        print("SUCCESS: no missing links found.")
        sys.exit(0)
Ejemplo n.º 7
0
        if 'CASE_ROOT_DIR' not in cli_d and cli_obj.config.get(
                'root_dir', None):
            # CASE_ROOT was set positionally
            cli_d['CASE_ROOT_DIR'] = cli_obj.config['root_dir']
        if not case_list_in:
            case_list_in = [cli_d]
        case_list = []
        for case_tup in enumerate(case_list_in):
            case_list.append(self.parse_case(case_tup, cli_d, cli_obj, config))
        self.case_list = [case for case in case_list if case is not None]
        if not self.case_list:
            print(
                "ERROR: no valid entries in case_list. Please specify model run information."
            )
            print('Received:')
            print(util.pretty_print_json(case_list_in))
            exit(1)

    def parse_case(self, case_tup, cli_d, cli_obj, config):
        n, d = case_tup
        if 'CASE_ROOT_DIR' not in d and 'root_dir' in d:
            d['CASE_ROOT_DIR'] = d.pop('root_dir')
        case_convention = d.get('convention', '')
        d.update(cli_d)
        if case_convention:
            d['convention'] = case_convention

        if not ('CASENAME' in d or ('model' in d and 'experiment' in d)):
            print((
                "WARNING: Need to specify either CASENAME or model/experiment "
                "in caselist entry {}, skipping.").format(n + 1))