Skip to content

Commit

Permalink
Add email and simplify print function
Browse files Browse the repository at this point in the history
  • Loading branch information
mjaehn committed Sep 20, 2023
1 parent b969d6c commit b1b25d0
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 37 deletions.
1 change: 1 addition & 0 deletions cases/cosmo-ghg-11km-test/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ constraint: gpu
restart_step: 12
variant: spinup
spinup: 6
input_root: ./input/cosmo-ghg

# METEO
meteo_prefix: laf
Expand Down
65 changes: 28 additions & 37 deletions run_chain.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ def __init__(self, casename):
# Global attributes (initialized with default values)
self.casename = casename
self.user = os.environ['USER']
self.set_email()

self.chain_src_dir = os.getcwd()
self.path = os.path.join(self.chain_src_dir, self.casename)
self.work_root = os.path.join(self.chain_src_dir, 'work')
Expand Down Expand Up @@ -144,9 +146,6 @@ def load_config_file(self, casename):
for key, value in cfg_data.items():
setattr(self, key, value)

# Save the user-defined items
self.user_config = cfg_data.items()

return self

def set_account(self):
Expand Down Expand Up @@ -179,30 +178,26 @@ def set_node_info(self):

return self


def set_email(self):
if self.user == 'jenkins':
self.mail_address = None
elif os.path.exists(os.environ['HOME'] + '/.forward'):
with open(os.environ['HOME'] + '/.forward', 'r') as file:
self.mail_address = file.read().rstrip()
else:
self.mail_address = None

return self


def print_config(self):
# Print the configuration
max_col_width = max(len(key) for key in vars(self)) + 1

print("\nConfiguration:")
print(f"{'Attribute':<{max_col_width}} {'Value'}")
print("-" * 80)

# Global attributes
print(f"{'casename':<{max_col_width}} {self.casename}")
print(f"{'user':<{max_col_width}} {self.user}")
print(f"{'chain_src_dir':<{max_col_width}} {self.chain_src_dir}")
print(f"{'path':<{max_col_width}} {self.path}")
print(f"{'work_root':<{max_col_width}} {self.work_root}")

# User-defined attributes
for key, value in self.user_config:
for key, value in vars(self).items():
print(f"{key:<{max_col_width}} {value}")

# Derived attributes
print(f"{'compute_account':<{max_col_width}} {self.compute_account}")
print(f"{'ntasks_per_node':<{max_col_width}} {self.ntasks_per_node}")
print(f"{'mpich_cuda':<{max_col_width}} {self.mpich_cuda}")


def run_chain(work_root, model_cfg, cfg, start_time, hstart, hstop, job_names,
force):
Expand Down Expand Up @@ -241,14 +236,6 @@ def run_chain(work_root, model_cfg, cfg, start_time, hstart, hstop, job_names,
force : bool
If True will do job regardless of completion status
"""
# Read mail address
if os.environ['USER'] == 'jenkins':
mail_address = None
elif os.path.exists(os.environ['HOME'] + '/.forward'):
with open(os.environ['HOME'] + '/.forward', 'r') as file:
mail_address = file.read().rstrip()
else:
mail_address = None

# ini date and forecast time (ignore meteo times)
inidate = int((start_time - datetime(1970, 1, 1)).total_seconds())
Expand Down Expand Up @@ -496,23 +483,23 @@ def run_chain(work_root, model_cfg, cfg, start_time, hstart, hstop, job_names,
subject = "ERROR or TIMEOUT in job '%s' for chain '%s'" % (
job, job_id)
logging.exception(subject)
if mail_address:
if cfg.mail_address:
message = tools.prepare_message(
os.path.join(log_working_dir, job))
logging.info('Sending log file to %s' % mail_address)
tools.send_mail(mail_address, subject, message)
logging.info('Sending log file to %s' % cfg.mail_address)
tools.send_mail(cfg.mail_address, subject, message)
if try_count == 0:
raise RuntimeError(subject)

if exitcode != 0 or not os.path.exists(
os.path.join(log_finished_dir, job)):
subject = "ERROR or TIMEOUT in job '%s' for chain '%s'" % (
job, job_id)
if mail_address:
if cfg.mail_address:
message = tools.prepare_message(
os.path.join(log_working_dir, job))
logging.info('Sending log file to %s' % mail_address)
tools.send_mail(mail_address, subject, message)
logging.info('Sending log file to %s' % cfg.mail_address)
tools.send_mail(cfg.mail_address, subject, message)
raise RuntimeError(subject)


Expand Down Expand Up @@ -658,16 +645,20 @@ def load_model_config_yaml(yamlfile):
args = parse_arguments()

for casename in args.casenames:
# Load configs
model_cfg = load_model_config_yaml('config/models.yaml')
cfg = Config(casename)

# Print config
cfg.print_config()
sys.exit()
start_time = datetime.strptime(args.startdate, '%Y-%m-%d')

# Check if jobs are set or if default ones are used
if args.job_list is None:
args.job_list = model_cfg['models'][cfg.model]['jobs']

print(f"Starting chain for case {casename} and model {cfg.model}")

start_time = datetime.strptime(args.startdate, '%Y-%m-%d')
# check for restart compatibility and spinup
if 'restart' in model_cfg['models'][cfg.model]['features']:
if hasattr(cfg, 'spinup'):
Expand Down

0 comments on commit b1b25d0

Please sign in to comment.