From c9013acbbab08bfe9b42ca31e015d238135b3cf8 Mon Sep 17 00:00:00 2001 From: Juan Puerto <=> Date: Thu, 4 Apr 2024 11:14:36 -0400 Subject: [PATCH 1/8] Views: For GET endpoint, return an empty data array if there is no workspace found. --- src/user_workspaces_server/views/job_view.py | 13 +++++++++---- .../views/workspace_view.py | 15 +++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/user_workspaces_server/views/job_view.py b/src/user_workspaces_server/views/job_view.py index 0758e16..2d11f01 100644 --- a/src/user_workspaces_server/views/job_view.py +++ b/src/user_workspaces_server/views/job_view.py @@ -24,12 +24,17 @@ def get(self, request, job_id=None): for key in set(params.keys()).intersection(set(models.Job.get_query_param_fields())): job = job.filter(**{key: params[key]}) - job = list(job.all().values(*models.Job.get_dict_fields())) + jobs = list(job.all().values(*models.Job.get_dict_fields())) - if job: - return JsonResponse({"message": "Successful.", "success": True, "data": {"jobs": job}}) + response = {"message": "Successful.", "success": True, "data": {"jobs": []}} + + if jobs: + response["data"]["jobs"] = jobs else: - raise NotFound("Job matching given parameters could not be found.") + response["message"] = "Job matching given parameters could not be found." + response["success"] = False + + return JsonResponse(response) def put(self, request, job_id, put_type): try: diff --git a/src/user_workspaces_server/views/workspace_view.py b/src/user_workspaces_server/views/workspace_view.py index e162cb0..7d38ba6 100644 --- a/src/user_workspaces_server/views/workspace_view.py +++ b/src/user_workspaces_server/views/workspace_view.py @@ -34,16 +34,15 @@ def get(self, request, workspace_id=None): workspaces = list(workspace.all().values(*models.Workspace.get_dict_fields())) + response = {"message": "Successful.", "success": True, "data": {"workspaces": []}} + if workspaces: - return JsonResponse( - { - "message": "Successful.", - "success": True, - "data": {"workspaces": workspaces}, - } - ) + response["data"]["workspaces"] = workspaces else: - raise NotFound("Workspace matching given parameters could not be found.") + response["message"] = "Workspace matching given parameters could not be found." + response["success"] = False + + return JsonResponse(response) def post(self, request): try: From 037e72c6e77bed9ab4cca993c5f15c610c861586 Mon Sep 17 00:00:00 2001 From: Juan Puerto <=> Date: Thu, 4 Apr 2024 13:04:10 -0400 Subject: [PATCH 2/8] Views: Update the base_dir for VERSION & BUILD --- src/user_workspaces_server/views/status_view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user_workspaces_server/views/status_view.py b/src/user_workspaces_server/views/status_view.py index fc01d66..40cdfe5 100644 --- a/src/user_workspaces_server/views/status_view.py +++ b/src/user_workspaces_server/views/status_view.py @@ -12,7 +12,7 @@ class StatusView(APIView): permission_classes = [] def get(self, request): - base_dir = Path(__file__).resolve().parent.parent + base_dir = Path(__file__).resolve().parent.parent.parent version_file_path = os.path.join(base_dir, "VERSION") build_file_path = os.path.join(base_dir, "BUILD") From 24dd5b4a593f6aef68eaf69bcd6cbbb2f2fdc70f Mon Sep 17 00:00:00 2001 From: jpuerto-psc Date: Thu, 4 Apr 2024 17:38:12 +0000 Subject: [PATCH 3/8] Auto generate BUILD file. --- BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BUILD b/BUILD index 3238d75..60a75ce 100644 --- a/BUILD +++ b/BUILD @@ -1 +1 @@ -b1db4e4 +845daf1 From 4fe1579398195ce83c7d97f3d2e46d852b92159c Mon Sep 17 00:00:00 2001 From: Juan Puerto <=> Date: Thu, 25 Apr 2024 11:15:10 -0400 Subject: [PATCH 4/8] Tasks: Test out catching jobs that are pending for too long. --- src/user_workspaces_server/tasks.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/user_workspaces_server/tasks.py b/src/user_workspaces_server/tasks.py index 783313a..bf1ba11 100644 --- a/src/user_workspaces_server/tasks.py +++ b/src/user_workspaces_server/tasks.py @@ -38,6 +38,15 @@ def update_job_status(job_id): job.job_details["metrics"]["time_pending"] = time_pending elif current_job_status in [models.Job.Status.COMPLETE, models.Job.Status.FAILED]: job.datetime_end = datetime.datetime.now() + elif current_job_status == models.Job.Status.PENDING: + current_time_pending = ( + datetime.datetime.now(job.datetime_created.tzinfo) - job.datetime_created + ).total_seconds() + time_pending_catch = resource.config.get("time_pending_catch") + if int(time_pending_catch) and current_time_pending > time_pending_catch: + logger.error( + f"Job {job_id} for user {job.user_id.username} has been pending more than {time_pending_catch}" + ) if current_job_status == models.Job.Status.FAILED: logger.error(f"Job {job_id} for user {job.user_id.username} has failed.") From 5c34662dee7ca1906cc2edcd488661df73add705 Mon Sep 17 00:00:00 2001 From: Juan Puerto <=> Date: Thu, 25 Apr 2024 11:17:21 -0400 Subject: [PATCH 5/8] Tasks: Return success = True --- src/user_workspaces_server/views/job_view.py | 1 - src/user_workspaces_server/views/workspace_view.py | 1 - 2 files changed, 2 deletions(-) diff --git a/src/user_workspaces_server/views/job_view.py b/src/user_workspaces_server/views/job_view.py index 2d11f01..92e9a2c 100644 --- a/src/user_workspaces_server/views/job_view.py +++ b/src/user_workspaces_server/views/job_view.py @@ -32,7 +32,6 @@ def get(self, request, job_id=None): response["data"]["jobs"] = jobs else: response["message"] = "Job matching given parameters could not be found." - response["success"] = False return JsonResponse(response) diff --git a/src/user_workspaces_server/views/workspace_view.py b/src/user_workspaces_server/views/workspace_view.py index 7d38ba6..1c08085 100644 --- a/src/user_workspaces_server/views/workspace_view.py +++ b/src/user_workspaces_server/views/workspace_view.py @@ -40,7 +40,6 @@ def get(self, request, workspace_id=None): response["data"]["workspaces"] = workspaces else: response["message"] = "Workspace matching given parameters could not be found." - response["success"] = False return JsonResponse(response) From bc7eb41e7211a09765f74df36bcce94522e3f33a Mon Sep 17 00:00:00 2001 From: jpuerto-psc Date: Thu, 25 Apr 2024 15:17:34 +0000 Subject: [PATCH 6/8] Auto generate BUILD file. --- BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BUILD b/BUILD index 60a75ce..372fee2 100644 --- a/BUILD +++ b/BUILD @@ -1 +1 @@ -845daf1 +5c34662 From 15ba0ad562273dea4becf9dcb254c6dabfb4ed93 Mon Sep 17 00:00:00 2001 From: Juan Puerto <=> Date: Thu, 9 May 2024 11:17:36 -0400 Subject: [PATCH 7/8] JupyterLab: Export SSL_CERT_FILE --- .../templates/script_templates/jupyter_lab_template.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/user_workspaces_server/templates/script_templates/jupyter_lab_template.sh b/src/user_workspaces_server/templates/script_templates/jupyter_lab_template.sh index 26ea3ea..3adf455 100644 --- a/src/user_workspaces_server/templates/script_templates/jupyter_lab_template.sh +++ b/src/user_workspaces_server/templates/script_templates/jupyter_lab_template.sh @@ -125,4 +125,5 @@ EOL # Launch the Jupyter Notebook Server set -x export JUPYTER_DATA_DIR="$VENV_PATH/share/jupyter" +export SSL_CERT_FILE="$VENV_PATH/ssl/cert.pem" python -m jupyterlab --config="${CONFIG_FILE}" &> "$(pwd)/JupyterLabJob_{{ job_id }}_output.log" \ No newline at end of file From 975ba5c53e2e590e4462b36a3b9160d88dad0833 Mon Sep 17 00:00:00 2001 From: jpuerto-psc Date: Thu, 9 May 2024 16:01:46 +0000 Subject: [PATCH 8/8] Auto generate BUILD file. --- BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BUILD b/BUILD index 372fee2..5983f3b 100644 --- a/BUILD +++ b/BUILD @@ -1 +1 @@ -5c34662 +351a34d