From 2c8b23c2cb6a8e417320a9572b1cdf8ab4e4c6ce Mon Sep 17 00:00:00 2001 From: notoraptor Date: Thu, 28 Nov 2024 09:56:06 -0500 Subject: [PATCH 1/2] [cw-556] add a script to generate cluster status --- clockwork_web/core/users_helper.py | 48 +++++++---------- clockwork_web/templates/base.html | 10 ++-- scripts/update_clusters_status.py | 84 ++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+), 35 deletions(-) create mode 100644 scripts/update_clusters_status.py diff --git a/clockwork_web/core/users_helper.py b/clockwork_web/core/users_helper.py index 303fdc1f..ff09149b 100644 --- a/clockwork_web/core/users_helper.py +++ b/clockwork_web/core/users_helper.py @@ -591,40 +591,28 @@ def render_template_with_user_settings(template_name_or_list, **context): ) # Get cluster status (if jobs are old and cluster has error). - """ for cluster_name in context["clusters"]: - # Cluster error cannot yet be checked, so - # cluster_has_error is always False for now. - cluster_has_error = False - context["clusters"][cluster_name]["status"] = { - "jobs_are_old": _jobs_are_old(cluster_name), - "cluster_has_error": cluster_has_error, - } - """ + context["clusters"][cluster_name]["status"] = _get_cluster_status(cluster_name) return render_template(template_name_or_list, **context) -def _jobs_are_old(cluster_name): - """Return True if last slurm update in given cluster is older than 2 days.""" - jobs_are_old = False +def _get_cluster_status(cluster_name): + """ + Get cluster status from DB collection `cluster_status`. - mongodb_filter = {"slurm.cluster_name": cluster_name} + Collection should be updated from an independent script + (`scripts/update_clusters_status.py`) regularly. + """ mc = get_db() - job_with_max_cw_last_slurm_update = list( - mc["jobs"].find(mongodb_filter).sort([("cw.last_slurm_update", -1)]).limit(1) - ) - - if job_with_max_cw_last_slurm_update: - (job,) = job_with_max_cw_last_slurm_update - if "last_slurm_update" in job["cw"]: - most_recent_job_edition = job["cw"]["last_slurm_update"] - current_timestamp = datetime.now().timestamp() - elapsed_time = timedelta( - seconds=current_timestamp - most_recent_job_edition - ) - # Let's say the latest jobs edition must not be older than max_delay. - max_delay = timedelta(days=2) - jobs_are_old = elapsed_time > max_delay - - return jobs_are_old + statuses = list(mc["cluster_status"].find({"cluster_name": cluster_name})) + if statuses: + # Status found + (status,) = statuses + return status + else: + # No status found, return default values + return { + "jobs_are_old": False, + "cluster_has_error": False, + } diff --git a/clockwork_web/templates/base.html b/clockwork_web/templates/base.html index ce3f6e20..011db8ba 100644 --- a/clockwork_web/templates/base.html +++ b/clockwork_web/templates/base.html @@ -232,17 +232,17 @@

-