From 654f1393cbddf89472b398e8bb2c46c6dd5db7b6 Mon Sep 17 00:00:00 2001 From: rcsm17 Date: Fri, 17 Jun 2022 16:40:15 +0200 Subject: [PATCH 001/111] new service account mode --- static/assets/themes/hhnb.css | 5 +- templates/hhnb/workflow.html | 192 ++++++++++++---------------------- 2 files changed, 70 insertions(+), 127 deletions(-) diff --git a/static/assets/themes/hhnb.css b/static/assets/themes/hhnb.css index b26b8874..bf09439a 100644 --- a/static/assets/themes/hhnb.css +++ b/static/assets/themes/hhnb.css @@ -839,7 +839,6 @@ body { min-width: 170px; } - .form-control.username { margin-right: 12px; border-top-right-radius: .25rem; @@ -1823,4 +1822,8 @@ i.disabled:hover { } .dimmed-background-fade-out { opacity: 0; +} + +.sa-dropdown, .sa-dropdown-menu { + width: 100%; } \ No newline at end of file diff --git a/templates/hhnb/workflow.html b/templates/hhnb/workflow.html index 05002277..6d9cbaf4 100644 --- a/templates/hhnb/workflow.html +++ b/templates/hhnb/workflow.html @@ -225,9 +225,7 @@

- - Project ID - + Project ID
@@ -238,16 +236,12 @@

Algorithm Parameters
- - # Gen - + # Gen

- - Offspring - + Offspring

@@ -257,7 +251,6 @@

- @@ -266,23 +259,17 @@

Optimization Run Parameters
- - # Nodes - + # Nodes

- - # Cores - + # Cores

- - Runtime - + Runtime
@@ -292,74 +279,6 @@

-
-

- -

-
-
-
-
-
-
Algorithm Parameters
-
-
- - # Gen - - -
-
-
- - Offspring - - -
-
- - -
-
-
-
-
-
Optimization Run Parameters
-
-
- - # Nodes - - -
-
-
- - # Cores - - -
-
-
- - Runtime - - -
-
-
-
-
-
-
-

-
+
+
+
+
+
HPC System
+
+ +
+
+
+
+
+
Service Account Project
+
+ +
+
+
+
+
Algorithm Parameters
- # Gen - + # Gen +

- Offspring - + Offspring +

@@ -477,18 +417,18 @@

Optimization Run Parameters
- # Nodes - + # Nodes +

- # Cores - + # Cores +

- Runtime - + Runtime +

From dce6c3b0b02c8e1fc02c1ecec8670755c3ec1eee Mon Sep 17 00:00:00 2001 From: rcsm17 Date: Sun, 19 Jun 2022 09:02:45 +0200 Subject: [PATCH 002/111] dev version --- hhnb/core/conf/__init__.py | 4 ++ hhnb/core/workflow.py | 2 + hhnb/views.py | 28 ++++++-- static/hhnb/js/ui/components/dialog.js | 91 ++++++++++++-------------- templates/hhnb/workflow.html | 16 ++--- 5 files changed, 81 insertions(+), 60 deletions(-) create mode 100644 hhnb/core/conf/__init__.py diff --git a/hhnb/core/conf/__init__.py b/hhnb/core/conf/__init__.py new file mode 100644 index 00000000..28c02ae5 --- /dev/null +++ b/hhnb/core/conf/__init__.py @@ -0,0 +1,4 @@ +def get_default_optimization_values(): + return { + + } \ No newline at end of file diff --git a/hhnb/core/workflow.py b/hhnb/core/workflow.py index eee65ca7..27ec58c3 100644 --- a/hhnb/core/workflow.py +++ b/hhnb/core/workflow.py @@ -5,6 +5,7 @@ from hh_neuron_builder.settings import MEDIA_ROOT, HHF_TEMPLATE_DIR, TMP_DIR, LOG_ROOT_PATH from hhnb.core.conf.exec_files_conf import ExecFileConf +from hhnb.core.conf import get_default_optimization_values from hhnb.core.lib.exception.workflow_exception import * from hhnb.core.model import * @@ -185,6 +186,7 @@ def get_optimization_settings(self): except JSONDecodeError: return {} except FileNotFoundError: + raise FileNotFoundError("%s not found" % self._optimization_settings) def set_optimization_settings(self, optimization_settings, job_submitted_flag=False): diff --git a/hhnb/views.py b/hhnb/views.py index 8796aba4..c486d3e9 100644 --- a/hhnb/views.py +++ b/hhnb/views.py @@ -1,5 +1,6 @@ """ Views """ +from telnetlib import SE from django.shortcuts import render, redirect from django.views.decorators.csrf import csrf_exempt @@ -19,7 +20,6 @@ from ebrains_drive.exceptions import ClientHttpError as EbrainsDriveClientError import ebrains_drive -from subprocess import CalledProcessError import requests import datetime import os @@ -34,6 +34,9 @@ LOG_ACTION = 'User: "{}"\t Action: {}' +SERVICE_ACCOUNT_ROOT_URL = 'https://bspsa.cineca.it/' + + def status(request): return ResponseUtil.ok_json_response({'hh-neuron-builder-status': 1}) @@ -540,16 +543,33 @@ def delete_files(request, exc): def optimization_settings(request, exc=None): + if not exc in request.session.keys(): return ResponseUtil.no_exc_code_response() workflow, hhnb_user = get_workflow_and_user(request, exc) + if request.method == 'GET': logger.info(LOG_ACTION.format(hhnb_user, 'get optimization settings from %s' % workflow)) + + # fetch service account hpc and projects + settings = {'settings': {}, 'service-account': {}} + r0 = requests.get(SERVICE_ACCOUNT_ROOT_URL + 'hpc/') + r1 = requests.get(SERVICE_ACCOUNT_ROOT_URL + 'projects/') + if r0.status_code == 200 and r1.status_code == 200: + for hpc in r0.json(): + h = hpc['id'] + projects = [] + for p in r1.json(): + if p['hpc'] == h and 'hhnb' in p['name']: + projects.append(p['name']) + settings['service-account'].update({h: projects}) + print(settings) try: - return ResponseUtil.ok_json_response(workflow.get_optimization_settings()) + settings['settings'].update(workflow.get_optimization_settings()) + return ResponseUtil.ok_json_response(settings) except FileNotFoundError as e: - logger.error(e) - return ResponseUtil.ok_json_response({}) + return ResponseUtil.ok_json_response(settings) + elif request.method == 'POST': logger.info(LOG_ACTION.format(hhnb_user, 'set optimization settings from %s' % workflow)) optimization_settings = json.loads(request.body) diff --git a/static/hhnb/js/ui/components/dialog.js b/static/hhnb/js/ui/components/dialog.js index 6da41732..53c56cb9 100644 --- a/static/hhnb/js/ui/components/dialog.js +++ b/static/hhnb/js/ui/components/dialog.js @@ -113,8 +113,7 @@ class UploadFileDialog { // Enable apply button hpc selection -$(".accordion-button.hpc").on("click", (button) => { - Log.debug(button); +$(".accordion-button.hpc").on("click", async (button) => { let isAlreadyOpened = $("#" + button.currentTarget.id).hasClass("active"); $(".accordion-button.hpc").removeClass("active"); if (!isAlreadyOpened) { @@ -136,11 +135,11 @@ class OptimizationSettingsDialog { $("#daint-node-num").val(6); $("#daint-core-num").val(24); $("#daint-runtime").val("120m"); - $("#sa-daint-gen-max").val(2) + /* $("#sa-daint-gen-max").val(2) $("#sa-daint-offspring").val(10) $("#sa-daint-node-num").val(3); $("#sa-daint-core-num").val(24); - $("#sa-daint-runtime").val(2); + $("#sa-daint-runtime").val(2); */ $("#username_submit").val(""); $("#password_submit").val(""); $("#nsg-gen-max").val(2); @@ -148,43 +147,46 @@ class OptimizationSettingsDialog { $("#nsg-node-num").val(1); $("#nsg-core-num").val(2); $("#nsg-runtime").val(2); - $("#sa-nsg-gen-max").val(2) - $("#sa-nsg-offspring").val(10) - $("#sa-nsg-node-num").val(1); - $("#sa-nsg-core-num").val(2); - $("#sa-nsg-runtime").val(2); + $("#sa-gen-max").val(2) + $("#sa-offspring").val(10) + $("#sa-runtime").val(2); + // $("#sa-nsg-node-num").val(1); + // $("#sa-nsg-core-num").val(2); } static loadSettings(jObj) { Log.debug("settings value"); this.#setDefaultValue(); - if (!$.isEmptyObject(jObj)) { + let jObjS = jObj.settings; + if (!$.isEmptyObject(jObjS)) { Log.debug("open default accordion") - if (jObj.hpc == "DAINT-CSCS") { - $("#daint_project_id").val(jObj.project); - $("#daint-gen-max").val(jObj["gen-max"]); - $("#daint-offspring").val(jObj.offspring); - $("#daint-node-num").val(jObj["node-num"]); - $("#daint-core-num").val(jObj["core-num"]); - $("#daint-runtime").val(jObj.runtime); - } else if (jObj.hpc == "SA-CSCS") { - $("#sa-daint-gen-max").val(jObj["gen-max"]); - $("#sa-daint-offspring").val(jObj.offspring); - $("#sa-daint-node-num").val(jObj["node-num"]); - $("#sa-daint-core-num").val(jObj["core-num"]); - $("#sa-daint-runtime").val(jObj.runtime); - } else if (jObj.hpc == "NSG") { - $("#nsg-gen-max").val(jObj["gen-max"]); - $("#nsg-offspring").val(jObj.offspring); - $("#nsg-node-num").val(jObj["node-num"]); - $("#nsg-core-num").val(jObj["core-num"]); - $("#nsg-runtime").val(jObj.runtime); - } else if (jObj.hpc == "SA-NSG") { - $("#sa-nsg-gen-max").val(jObj["gen-max"]); - $("#sa-ngs-offspring").val(jObj.offspring); - $("#sa-nsg-node-num").val(jObj["node-num"]); - $("#sa-nsg-core-num").val(jObj["core-num"]); - $("#sa-nsg-runtime").val(jObj.runtime); + $(".accordion-button.hpc").removeClass("active"); + $(".accordion-collapse").removeClass("show"); + if (jObjS.hpc == "DAINT-CSCS") { + $("#accordionDaint").addClass("active"); + $("#daintCollapse").addClass("show"); + $("#daint_project_id").val(jObjS.project); + $("#daint-gen-max").val(jObjS["gen-max"]); + $("#daint-offspring").val(jObjS.offspring); + $("#daint-node-num").val(jObjS["node-num"]); + $("#daint-core-num").val(jObjS["core-num"]); + $("#daint-runtime").val(jObjS.runtime); + } else if (jObjS.hpc == "NSG") { + $("#accordionNSG").addClass("active"); + $("#nsgCollapse").addClass("show"); + $("#nsg-gen-max").val(jObjS["gen-max"]); + $("#nsg-offspring").val(jObjS.offspring); + $("#nsg-node-num").val(jObjS["node-num"]); + $("#nsg-core-num").val(jObjS["core-num"]); + $("#nsg-runtime").val(jObjS.runtime); + } else if (jObjS.hpc == "SA") { + $("#accordionSA").addClass("active"); + $("#saCollapse").addClass("show"); + $("#sa-gen-max").val(jObjS["gen-max"]); + $("#sa-offspring").val(jObjS.offspring); + $("#sa-node-num").val(jObjS["node-num"]); + $("#sa-core-num").val(jObjS["core-num"]); + $("#sa-runtime").val(jObjS.runtime); } } } @@ -206,13 +208,6 @@ class OptimizationSettingsDialog { data["runtime"] = $("#daint-runtime").val(); data["project"] = $("#daint_project_id").val(); } - if (hpc == "SA-CSCS") { - data["gen-max"] = $("#sa-daint-gen-max").val(); - data["offspring"] = $("#sa-daint-offspring").val(); - data["node-num"] = $("#sa-daint-node-num").val(); - data["core-num"] = $("#sa-daint-core-num").val(); - data["runtime"] = $("#sa-daint-runtime").val(); - } if (hpc == "NSG") { data["gen-max"] = $("#nsg-gen-max").val(); data["offspring"] = $("#nsg-offspring").val(); @@ -232,12 +227,12 @@ class OptimizationSettingsDialog { data["password_submit"] = nsgPass.val(); } } - if (hpc == "SA-NSG") { - data["gen-max"] = $("#sa-nsg-gen-max").val(); - data["offspring"] = $("#sa-nsg-offspring").val(); - data["node-num"] = $("#sa-nsg-node-num").val(); - data["core-num"] = $("#sa-nsg-core-num").val(); - data["runtime"] = $("#sa-nsg-runtime").val(); + if (hpc == "SA") { + data["gen-max"] = $("#sa-gen-max").val(); + data["offspring"] = $("#sa-offspring").val(); + data["node-num"] = $("#sa-node-num").val(); + data["core-num"] = $("#sa-core-num").val(); + data["runtime"] = $("#sa-runtime").val(); } return data; diff --git a/templates/hhnb/workflow.html b/templates/hhnb/workflow.html index 6d9cbaf4..ddb289e8 100644 --- a/templates/hhnb/workflow.html +++ b/templates/hhnb/workflow.html @@ -346,22 +346,22 @@

-

-
+
HPC System
-
+
+
From 2a6e6c7e3b4746e095d2a361a2d29274d901ddbd Mon Sep 17 00:00:00 2001 From: rcsm17 Date: Sun, 26 Jun 2022 20:10:28 +0200 Subject: [PATCH 008/111] fixed service account optimization settings --- hhnb/core/job_handler.py | 26 +++++++++++--------------- hhnb/core/workflow.py | 10 +++++++++- static/hhnb/js/ui/components/dialog.js | 25 ++++++++++++++----------- static/hhnb/js/utils/misc.js | 15 ++++++++++++--- static/hhnb/js/workflow/workflow.js | 1 + 5 files changed, 47 insertions(+), 30 deletions(-) diff --git a/hhnb/core/job_handler.py b/hhnb/core/job_handler.py index 414b02e0..5a9ec2af 100644 --- a/hhnb/core/job_handler.py +++ b/hhnb/core/job_handler.py @@ -308,11 +308,11 @@ def _get_service_account_headers(self, token, zip_name=None, payload=None): headers.update({'payload': json.dumps(payload)}) return headers - def _submit_on_service_account(self, hpc, token, zip_file, settings): + def _submit_on_service_account(self, hpc, project, token, zip_file, settings): zip_name = os.path.split(zip_file)[1] payload = self._get_service_account_payload( - command=self._get_unicore_command(zip_name) if hpc=='SA-CSCS' else None, - tool=self._NSG_TOOL if hpc=='SA-NSG' else None, + command=self._get_unicore_command(zip_name) if hpc=='pizdaint' else None, + tool=self._NSG_TOOL if hpc=='nsg' else None, node_num=settings['node-num'], core_num=settings['core-num'], runtime=settings['runtime'], @@ -322,21 +322,16 @@ def _submit_on_service_account(self, hpc, token, zip_file, settings): headers = self._get_service_account_headers(token, zip_name, payload) job_file = {'file': open(zip_file, 'rb')} - if hpc == self._SA_CSCS: - sa_endpoint = self._SA_DAINT_JOB_URL - elif hpc == self._SA_NSG: - sa_endpoint =self._SA_NSG_JOB_URL + sa_endpoint = self._SA_JOBS_URL.format(hpc, project) + r = requests.post(url=sa_endpoint, headers=headers, files=job_file) logger.debug(f'requests: {r.url} with headers: {r.headers} and files: {job_file}') if r.status_code >= 400: logger.error(f'CODE: {r.status_code}, CONTENT: {r.content}') return ResponseUtil.ko_response(r.text) - message = 'Job submitted' - if hpc == self._SA_CSCS: - message = messages.JOB_SUBMITTED.format('SA-CSCS') - elif hpc == self._SA_NSG: - message = messages.JOB_SUBMITTED.format('SA-NSG') + message = messages.JOB_SUBMITTED.format( + '' + hpc.upper() + ' using the Service Account project ' + project + '') return ResponseUtil.ok_response(message) def _get_service_account_jobs(self, hpc, project, token): @@ -393,9 +388,10 @@ def submit_job(cls, user, zip_file, settings): elif settings['hpc'] == job_handler._DAINT_CSCS: return job_handler._submit_on_unicore(job_handler._DAINT_CSCS, user.get_token(), zip_file, settings) - elif settings['hpc'] == job_handler._SA_CSCS or settings['hpc'] == job_handler._SA_NSG: - return job_handler._submit_on_service_account(settings['hpc'], user.get_token(), - zip_file, settings) + # elif settings['hpc'] == job_handler._SA_CSCS or settings['hpc'] == job_handler._SA_NSG: + elif settings['hpc'] == job_handler._SA: + return job_handler._submit_on_service_account(settings['sa-hpc'], settings['sa-project'], + user.get_token(), zip_file, settings) return ResponseUtil.ko_response(messages.GENERAL_ERROR) @classmethod diff --git a/hhnb/core/workflow.py b/hhnb/core/workflow.py index 25ecc29b..53cc17c9 100644 --- a/hhnb/core/workflow.py +++ b/hhnb/core/workflow.py @@ -228,10 +228,18 @@ def get_properties(self): ['mechanisms', 'morphology', 'checkpoints']: analysis_flag = True + optset_flag = False + if os.path.exists(self._optimization_settings): + with open(self._optimization_settings, 'r') as fd: + jj = json.load(fd) + if jj.get('hpc') == 'SA': + if jj.get('sa-hpc') and jj.get('sa-project'): + optset_flag = True + props = { 'id': self._id, 'model': self._model.get_properties(), - 'optimization_settings': os.path.exists(self._optimization_settings), + 'optimization_settings': optset_flag, 'etraces': any(os.scandir(self._etraces_dir)), 'job_submitted': job_submitted, 'results': any(os.scandir(self._results_dir)), diff --git a/static/hhnb/js/ui/components/dialog.js b/static/hhnb/js/ui/components/dialog.js index fe18b1a9..af4d9ad1 100644 --- a/static/hhnb/js/ui/components/dialog.js +++ b/static/hhnb/js/ui/components/dialog.js @@ -122,6 +122,12 @@ $(".accordion-button.hpc").on("click", async (button) => { } else { $("#apply-param").prop("disabled", true); } + if (button.currentTarget.id == "accordionSA") { + if ($("#sa-project-dropdown-optset-btn").text().toLowerCase() == "select project") { + $("#apply-param").prop("disabled", true); + $("#sa-project-dropdown-optset-btn").prop("disabled", true); + } + } }) @@ -142,21 +148,16 @@ class OptimizationSettingsDialog { $("#daint-node-num").val(6); $("#daint-core-num").val(24); $("#daint-runtime").val("120m"); - /* $("#sa-daint-gen-max").val(2) - $("#sa-daint-offspring").val(10) - $("#sa-daint-node-num").val(3); - $("#sa-daint-core-num").val(24); - $("#sa-daint-runtime").val(2); */ $("#nsg-gen-max").val(2); $("#nsg-offspring").val(10); $("#nsg-node-num").val(1); $("#nsg-core-num").val(2); $("#nsg-runtime").val(2); + $("#sa-gen-max").val(2) $("#sa-offspring").val(10) $("#sa-runtime").val(2); - // $("#sa-nsg-node-num").val(1); - // $("#sa-nsg-core-num").val(2); + } static loadSettings(jObj) { @@ -169,7 +170,7 @@ class OptimizationSettingsDialog { $("#accordionSA").append(" *( temporarily unreachable )"); } } - populateServiceAccountSettings(jObj["service-account"], "submit"); + populateServiceAccountSettings(jObj["service-account"], "optset"); let settings = jObj.settings; Log.debug(settings); @@ -204,7 +205,6 @@ class OptimizationSettingsDialog { $("#password_submit").addClass("is-invalid").removeClass("is-valid"); } } else if (settings.hpc == "SA") { - Log.debug("SETTINGS SERVICEACCOUNT") $("#accordionSA").addClass("active"); $("#saCollapse").addClass("show"); $("#sa-gen-max").val(settings["gen-max"]); @@ -214,12 +214,15 @@ class OptimizationSettingsDialog { $("#sa-runtime").val(settings.runtime); Log.debug(Object.keys(settings)); if (Object.keys(settings).includes("sa-hpc")) { - Log.debug(settings["sa-hpc"]); - Log.debug($(".dropdown-item.project." + settings["sa-hpc"])); $("#sa-hpc-dropdown-optset > button").html(settings["sa-hpc"].toUpperCase()); $("#sa-project-dropdown-optset > button").html(settings["sa-project"]).prop("disabled", false); $(".dropdown-item.project." + settings["sa-hpc"]).removeClass("gone"); } + if ($("#sa-hpc-dropdown-optset-btn").text().toLowerCase() == "select hpc" || + $("#sa-project-dropdown-optset-btn").text().toLowerCase() == "select project") { + $("#sa-project-dropdown-optset-btn").prop("disabled", true); + $("#apply-param").prop("disabled", true); + } } } } diff --git a/static/hhnb/js/utils/misc.js b/static/hhnb/js/utils/misc.js index 6b255803..17d72a6d 100644 --- a/static/hhnb/js/utils/misc.js +++ b/static/hhnb/js/utils/misc.js @@ -99,7 +99,14 @@ function setServiceAccountHPC(hpc, context) { } hpcButton.html(hpc); projectButton.prop("disabled", false).html("Select Project"); - + if (hpc == "PIZDAINT") { + $("#sa-node-num").val(3); + $("#sa-core-num").val(24); + } else if (hpc == "NSG") { + $("#sa-node-num").val(1); + $("#sa-core-num").val(2); + } + $(".dropdown-item.project").addClass("gone"); $(".dropdown-item.project." + hpc.toLowerCase()).removeClass("gone"); @@ -111,9 +118,11 @@ function setServiceAccountHPC(hpc, context) { function setServiceAccountProject(project, context) { $("#sa-project-dropdown-" + context + " > button").html(project); - if (context == "jobs") { + if (context == "optset") { + $("#apply-param").prop("disabled", false); + } else if (context == "jobs") { $("#sa-fetch-jobs").prop("disabled", false); - } + } } function populateServiceAccountSettings(jObj, context) { diff --git a/static/hhnb/js/workflow/workflow.js b/static/hhnb/js/workflow/workflow.js index 6381a59b..0eb266f0 100644 --- a/static/hhnb/js/workflow/workflow.js +++ b/static/hhnb/js/workflow/workflow.js @@ -165,6 +165,7 @@ export default class Workflow { #updateSettingsBlock() { let bar = $("#opt-param-bar"); + console.log(this.#props.optimization_settings); if (this.#props.optimization_settings) { bar.addClass("green").removeClass("red"); bar.text(""); From 7b6c075360fbeb849912aeaddcf2d11c6a8cfaf5 Mon Sep 17 00:00:00 2001 From: rcsm17 Date: Mon, 27 Jun 2022 16:47:44 +0200 Subject: [PATCH 009/111] completed new SA version for both submission and fetch --- hhnb/core/job_handler.py | 44 ++++++++++++------------------------ hhnb/core/model.py | 1 - hhnb/core/security.py | 1 - hhnb/core/user.py | 2 -- hhnb/core/workflow.py | 23 ++++++++++++------- hhnb/utils/messages.py | 2 +- hhnb/views.py | 14 ++++-------- static/hhnb/js/app.js | 14 ++++++++++-- static/hhnb/js/utils/misc.js | 15 +++++++----- 9 files changed, 55 insertions(+), 61 deletions(-) diff --git a/hhnb/core/job_handler.py b/hhnb/core/job_handler.py index 5a9ec2af..d6e9e2ab 100644 --- a/hhnb/core/job_handler.py +++ b/hhnb/core/job_handler.py @@ -67,11 +67,7 @@ class HPCException(Exception): def __init__(self): self._SA_ROOT_URL = 'https://bspsa.cineca.it/' self._SA_JOBS_URL = self._SA_ROOT_URL + 'jobs/{}/{}/' - - self._SA_DAINT_JOB_URL = self._SA_ROOT_URL + 'jobs/pizdaint/hhnb_daint_cscs/' - self._SA_DAINT_FILES_URL = self._SA_ROOT_URL + 'files/pizdaint/hhnb_daint_cscs/' - self._SA_NSG_JOB_URL = self._SA_ROOT_URL + 'jobs/nsg/hhnb_nsg/' - self._SA_NSG_FILES_URL = self._SA_ROOT_URL + 'files/nsg/hhnb_nsg/' + self._SA_FILES_URL = self._SA_ROOT_URL + 'files/{}/{}/' self._NSG_URL = 'https://nsgr.sdsc.edu:8443/cipresrest/v1' self._DAINT_URL = 'https://brissago.cscs.ch:8080/DAINT-CSCS/rest/core' @@ -133,7 +129,7 @@ def _submit_on_nsg(self, username, password, zip_file, settings): if not r.status_code == 200: return ResponseUtil.ko_response(r.text) - return ResponseUtil.ok_response(messages.JOB_SUBMITTED.format('NSG')) + return ResponseUtil.ok_response(messages.JOB_SUBMITTED.format('NSG')) return ResponseUtil.ko_response(r.text) @@ -271,7 +267,7 @@ def _submit_on_unicore(self, hpc, token, zip_file, settings): client = self._initialize_unicore_client(hpc, token) job = client.new_job(job_description=job_description, inputs=[zip_file]) logger.info(f'job submitted on UNICORE Client: {job}') - return ResponseUtil.ok_response(messages.JOB_SUBMITTED.format(hpc)) + return ResponseUtil.ok_response(messages.JOB_SUBMITTED.format('' + hpc + '')) def _get_unicore_jobs(self, hpc, token): client = self._initialize_unicore_client(hpc, token) @@ -336,29 +332,20 @@ def _submit_on_service_account(self, hpc, project, token, zip_file, settings): def _get_service_account_jobs(self, hpc, project, token): headers = self._get_service_account_headers(token) - # if hpc == self._SA_CSCS: - # sa_endpoint = self._SA_DAINT_JOB_URL - # elif hpc == self._SA_NSG: - # sa_endpoint = self._SA_NSG_JOB_URL sa_endpoint = self._SA_JOBS_URL.format(hpc, project) - print(sa_endpoint) r = requests.get(url=sa_endpoint, headers=headers) - print(r.content) logger.debug(f'requests: {r.url} with headers: {r.headers}') if r.status_code != 200: logger.error(f'CODE: {r.status_code}, CONTENT: {r.content}') raise self.ServiceAccountException(r.content, r.status_code) return r.json() - def _get_service_account_job_results(self, hpc, token, job_id): + def _get_service_account_job_results(self, hpc, project, token, job_id): headers = self._get_service_account_headers(token) - if hpc == self._SA_CSCS: - sa_endpoint = self._SA_DAINT_FILES_URL + job_id + '/' - elif hpc == self._SA_NSG: - sa_endpoint = self._SA_NSG_FILES_URL + job_id + '/' + sa_endpoint = self._SA_FILES_URL.format(hpc, project) - r = requests.get(url=sa_endpoint, headers=headers) + r = requests.get(url=sa_endpoint + job_id + '/', headers=headers) logger.debug(f'requests: {r.url} with headers: {r.headers}') if r.status_code >= 400: @@ -370,9 +357,9 @@ def _get_service_account_job_results(self, hpc, token, job_id): file_list = [] for f in r.json(): - if hpc == self._SA_CSCS: + if hpc == 'pizdaint': file_list.append({'id': f, 'name': f}) - elif hpc == self._SA_NSG: + elif hpc == 'nsg': file_list.append({'id': f['fileid'], 'name': f['filename']}) return file_list @@ -388,7 +375,6 @@ def submit_job(cls, user, zip_file, settings): elif settings['hpc'] == job_handler._DAINT_CSCS: return job_handler._submit_on_unicore(job_handler._DAINT_CSCS, user.get_token(), zip_file, settings) - # elif settings['hpc'] == job_handler._SA_CSCS or settings['hpc'] == job_handler._SA_NSG: elif settings['hpc'] == job_handler._SA: return job_handler._submit_on_service_account(settings['sa-hpc'], settings['sa-project'], user.get_token(), zip_file, settings) @@ -416,7 +402,6 @@ def fetch_jobs_list(cls, hpc, user, sa_hpc=None, sa_project=None): } jobs.update(job) - # elif hpc == job_handler._SA_CSCS or hpc == job_handler._SA_NSG: elif hpc == job_handler._SA: raw_jobs = job_handler._get_service_account_jobs(sa_hpc, sa_project, user.get_token()) for raw_job in raw_jobs: @@ -437,7 +422,7 @@ def fetch_jobs_list(cls, hpc, user, sa_hpc=None, sa_project=None): @classmethod - def fetch_job_files(cls, hpc, job_id, user): + def fetch_job_files(cls, hpc, job_id, user, sa_hpc=None, sa_project=None): logger.info(LOG_ACTION.format(user, 'fetch files of job: %s in %s' % (job_id, hpc))) job_handler = cls() if hpc == job_handler._NSG: @@ -459,16 +444,15 @@ def fetch_job_files(cls, hpc, job_id, user): 'file_list': raw_file_list } - # if hpc == job_handler._SA_CSCS or hpc == job_handler._SA_NSG: elif hpc == job_handler._SA: - raw_file_list = job_handler._get_service_account_job_results(hpc, user.get_token(), job_id) - if hpc == job_handler._SA_CSCS: - root_url = job_handler._SA_DAINT_FILES_URL + job_id - elif hpc == job_handler._SA_NSG: - root_url = job_handler._SA_NSG_FILES_URL + job_id + '/' + raw_file_list = job_handler._get_service_account_job_results(sa_hpc, sa_project, user.get_token(), job_id) + root_url = job_handler._SA_FILES_URL.format(sa_hpc, sa_project) + job_id + if sa_hpc == 'nsg': + root_url += '/' file_list = { 'root_url': root_url, 'file_list': raw_file_list, 'headers': {'Authorization': 'Bearer ' + user.get_token()} } + return file_list diff --git a/hhnb/core/model.py b/hhnb/core/model.py index 01f17fba..0710ff42 100644 --- a/hhnb/core/model.py +++ b/hhnb/core/model.py @@ -238,7 +238,6 @@ def clone(model): @staticmethod def write_to_workflow(model, workflow_id): - print("==========================================================") if not os.path.exists(workflow_id): raise FileNotFoundError('%s path not found' % workflow_id) model_dir = os.path.join(workflow_id, 'model') diff --git a/hhnb/core/security.py b/hhnb/core/security.py index 27b90c9a..3ddbbfce 100644 --- a/hhnb/core/security.py +++ b/hhnb/core/security.py @@ -12,7 +12,6 @@ class Cypher: @staticmethod def encrypt(plain_text, at_time=None): - print(plain_text) if type(plain_text) == str: data = bytes(plain_text, 'utf-8') f = Fernet(FERNET_KEY) diff --git a/hhnb/core/user.py b/hhnb/core/user.py index 3e03ffcd..142ee7ad 100644 --- a/hhnb/core/user.py +++ b/hhnb/core/user.py @@ -99,7 +99,6 @@ def validate_credentials(self): auth=(self._username, self._password), headers={'cipres-appkey': NSG_KEY}, verify=False) - print(r.status_code, r.content) if r.status_code == 200: return True return False @@ -173,5 +172,4 @@ def get_user_from_request(cls, request): hhnb_user.set_nsg_user(nsg_user) - print(str(hhnb_user)) return hhnb_user \ No newline at end of file diff --git a/hhnb/core/workflow.py b/hhnb/core/workflow.py index 53cc17c9..3ebf8088 100644 --- a/hhnb/core/workflow.py +++ b/hhnb/core/workflow.py @@ -235,6 +235,11 @@ def get_properties(self): if jj.get('hpc') == 'SA': if jj.get('sa-hpc') and jj.get('sa-project'): optset_flag = True + elif jj.get('hpc') == 'DAINT-CSCS': + if jj.get('project'): + optset_flag = True + elif jj.get('hpc') == 'NSG': + optset_flag = True props = { 'id': self._id, @@ -374,11 +379,13 @@ def make_optimization_model(workflow): pass settings = workflow.get_optimization_settings() - if settings['hpc'] == 'NSG' or settings['hpc'] == 'SA-NSG': + if settings['hpc'] == 'NSG' or \ + (settings['hpc'] == 'SA' and settings['sa-hpc'] == 'nsg'): ExecFileConf.write_nsg_exec(dst_dir=tmp_model_dir, max_gen=settings['gen-max'], offspring=settings['offspring']) - elif settings['hpc'] == 'DAINT-CSCS' or settings['hpc'] == 'SA-CSCS': + elif settings['hpc'] == 'DAINT-CSCS' or \ + (settings['hpc'] == 'SA' and settings['sa-hpc'] == 'pizdaint'): ExecFileConf.write_daint_exec(dst_dir=tmp_model_dir, folder_name=workflow.get_model().get_key(), offspring=settings['offspring'], @@ -545,13 +552,13 @@ def run_analysis(workflow, job_output): curr_dir = os.getcwd() - log_file_path = os.path.join(LOG_ROOT_PATH, 'analysis', workflow.get_user()) - if not os.path.exists(log_file_path): - os.makedirs(log_file_path) - log_file = os.path.join(log_file_path, workflow.get_id() + '.log') + # log_file_path = os.path.join(LOG_ROOT_PATH, 'analysis', workflow.get_user()) + # if not os.path.exists(log_file_path): + # os.makedirs(log_file_path) + # log_file = os.path.join(log_file_path, workflow.get_id() + '.log') - build_mechanisms_command = f'source {env_prefix}/bin/activate; nrnivmodl mechanisms > {log_file}' - opt_neuron_analysis_command = f'source {env_prefix}/bin/activate; python ./opt_neuron.py --analyse --checkpoint ./checkpoints > {log_file}' + build_mechanisms_command = f'source {env_prefix}/bin/activate; nrnivmodl mechanisms'# > {log_file}' + opt_neuron_analysis_command = f'source {env_prefix}/bin/activate; python ./opt_neuron.py --analyse --checkpoint ./checkpoints'# > {log_file}' os.chdir(output_dir) p0 = subprocess.call(build_mechanisms_command, shell=True, executable='/bin/bash') diff --git a/hhnb/utils/messages.py b/hhnb/utils/messages.py index 4c21205e..09ebb236 100644 --- a/hhnb/utils/messages.py +++ b/hhnb/utils/messages.py @@ -40,7 +40,7 @@ # Analysis error messages ANALYSIS_ERROR = 'Error !

Something went wrong while the analysis process was running.
Please contact the EBRAINS support if the problem persists.' -MECHANISMS_PROCESS_ERROR = 'Error !

Something went wrong while mechanisms file were building.
Please, take a look on the files and if the problem persists contact the EBRAINS support.' +MECHANISMS_PROCESS_ERROR = 'Error !

Something went wrong while mechanisms files were building.
Please, take a look on the files and if the problem persists contact the EBRAINS support.' ANALYSIS_PROCESS_ERROR = 'Error !

Analysis process was stopped due to the following error:

{}

If the problem persists contact the EBRAINS support.' BLUE_NAAS_NOT_AVAILABLE = 'The BlueNaas is temporarily not available.
Please, try again later.' diff --git a/hhnb/views.py b/hhnb/views.py index 85bfd08f..343eab0f 100644 --- a/hhnb/views.py +++ b/hhnb/views.py @@ -76,9 +76,6 @@ def index_docs(request): def home_page(request): hhnb_user = HhnbUser.get_user_from_request(request) - print(hhnb_user) - print(request.user) - print(request.user.is_authenticated) context = {} logger.info(LOG_ACTION.format(hhnb_user, 'access HOME page')) @@ -552,12 +549,10 @@ def optimization_settings(request, exc=None): settings = {'settings': {}, 'service-account': {}} # fetch service account hpc and projects - print(json.loads(get_service_account_content(request).content)) settings.update(json.loads(get_service_account_content(request).content)) try: settings['settings'].update(workflow.get_optimization_settings()) - print(settings) return ResponseUtil.ok_json_response(settings) except FileNotFoundError as e: return ResponseUtil.ok_json_response(settings) @@ -665,8 +660,10 @@ def fetch_job_results(request, exc): if exc not in request.session.keys(): return ResponseUtil.no_exc_code_response() - hpc = request.GET.get('hpc') job_id = request.GET.get('job_id') + hpc = request.GET.get('hpc') + sa_hpc = request.GET.get('saHPC') + sa_project = request.GET.get('saProject') if not hpc: return ResponseUtil.ko_response(messages.NO_HPC_SELECTED) @@ -679,7 +676,7 @@ def fetch_job_results(request, exc): )) try: - file_list = JobHandler.fetch_job_files(hpc, job_id, hhnb_user) + file_list = JobHandler.fetch_job_files(hpc, job_id, hhnb_user, sa_hpc, sa_project) WorkflowUtil.download_job_result_files(workflow, file_list) return ResponseUtil.ok_response() @@ -946,7 +943,6 @@ def hhf_list_files_new(request, exc): workflow, _ = get_workflow_and_user(request, exc) model_files = WorkflowUtil.list_model_files(workflow) - print(json.dumps(model_files, indent=4)) return ResponseUtil.ok_json_response(model_files) @@ -1045,10 +1041,8 @@ def hhf_save_config_file(request, folder, config_file, exc): json.dump(file_content, fd, indent=4) return ResponseUtil.ok_response('') except json.JSONDecodeError: - print('Malformed json') return ResponseUtil.ko_response(messages.MARLFORMED_FILE.format(config_file + '.json')) except FileNotFoundError: - print('File not found') return ResponseUtil.ko_response(404, messages.CRITICAL_ERROR) except Exception as e: print(str(e)) diff --git a/static/hhnb/js/app.js b/static/hhnb/js/app.js index 51be89bb..e6c09303 100644 --- a/static/hhnb/js/app.js +++ b/static/hhnb/js/app.js @@ -708,7 +708,12 @@ function closeJobProcessingDiv() { async function downloadJobOnly(jobId) { Log.debug("Downloading " + jobId); // disable all buttons - const data = { "job_id": jobId, "hpc": $("button.fetch-jobs.active").attr("name") } + const data = { + "job_id": jobId, + "hpc": $("button.fetch-jobs.active").attr("name"), + "saHPC": $("#sa-hpc-dropdown-jobs-btn").text().toLowerCase(), + "saProject": $("#sa-project-dropdown-jobs-btn").text().toLowerCase() + } $("#jobProcessingTitle").html("Downloading job:
" + jobId.toUpperCase() + "
"); @@ -739,7 +744,12 @@ async function downloadJobOnly(jobId) { async function downloadJobAndRunAnalysis(jobId) { Log.debug("Downloading " + jobId); // disable all buttons - const data = { "job_id": jobId, "hpc": $("button.fetch-jobs.active").attr("name") } + const data = { + "job_id": jobId, + "hpc": $("button.fetch-jobs.active").attr("name"), + "saHPC": $("#sa-hpc-dropdown-jobs-btn").text().toLowerCase(), + "saProject": $("#sa-project-dropdown-jobs-btn").text().toLowerCase() + } $("#jobProcessingTitle").html("Downloading job:
" + jobId.toUpperCase() + "
"); diff --git a/static/hhnb/js/utils/misc.js b/static/hhnb/js/utils/misc.js index 17d72a6d..6251f932 100644 --- a/static/hhnb/js/utils/misc.js +++ b/static/hhnb/js/utils/misc.js @@ -49,7 +49,6 @@ async function checkLastPage(iframe){ }; - $("#modalBlueNaas")[0].addEventListener("transitionstart", function (transition) { if (transition.target == $(this)[0]) { if ($(this).hasClass("show")) { @@ -80,6 +79,7 @@ function dismissAlert(el) { console.log($(el).parent().removeClass("show")); } + $("#modelPrivate").on("click", (button) => { console.log(button.target.checked); if (button.target.checked) { @@ -97,8 +97,10 @@ function setServiceAccountHPC(hpc, context) { if (hpcButton.text() == hpc) { return false; } + hpcButton.html(hpc); - projectButton.prop("disabled", false).html("Select Project"); + projectButton.prop("disabled", false); + if (hpc == "PIZDAINT") { $("#sa-node-num").val(3); $("#sa-core-num").val(24); @@ -111,8 +113,8 @@ function setServiceAccountHPC(hpc, context) { $(".dropdown-item.project." + hpc.toLowerCase()).removeClass("gone"); // automatically set the project if there is only one project for the selecte HPC system - if ($(".dropdown-item.project." + hpc.toLowerCase()).length == 1) { - setServiceAccountProject($(".dropdown-item.project." + hpc.toLowerCase()).text(), context) + if ($(".dropdown-item.project." + context + "." + hpc.toLowerCase()).length == 1) { + setServiceAccountProject($(".dropdown-item.project." + context + "." + hpc.toLowerCase()).text(), context) } } @@ -122,7 +124,7 @@ function setServiceAccountProject(project, context) { $("#apply-param").prop("disabled", false); } else if (context == "jobs") { $("#sa-fetch-jobs").prop("disabled", false); - } + } } function populateServiceAccountSettings(jObj, context) { @@ -132,6 +134,7 @@ function populateServiceAccountSettings(jObj, context) { hpcList.empty(); projectList.empty(); + let saHPC = Object.keys(jObj); let dividerNum = saHPC.length - 1; @@ -147,7 +150,7 @@ function populateServiceAccountSettings(jObj, context) { let projects = jObj[hpc]; let dividerNum = projects.length - 1; for (let i=0; i < projects.length; i++) { - projectList.append("
  • "+ projects[i] +"
  • "); + projectList.append("
  • "+ projects[i] +"
  • "); if (dividerNum > 0) { projectList.append("
  • "); dividerNumm -= 1; From 3d402d98f6a4296efccb413369db8e50f7cf72d6 Mon Sep 17 00:00:00 2001 From: rcsm17 Date: Mon, 27 Jun 2022 16:53:37 +0200 Subject: [PATCH 010/111] restore log on analysis processes --- hhnb/core/workflow.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/hhnb/core/workflow.py b/hhnb/core/workflow.py index 3ebf8088..06880be8 100644 --- a/hhnb/core/workflow.py +++ b/hhnb/core/workflow.py @@ -248,7 +248,6 @@ def get_properties(self): 'etraces': any(os.scandir(self._etraces_dir)), 'job_submitted': job_submitted, 'results': any(os.scandir(self._results_dir)), - # 'analysis': any(os.scandir(self._analysis_dir)), 'analysis': analysis_flag } return props @@ -552,13 +551,13 @@ def run_analysis(workflow, job_output): curr_dir = os.getcwd() - # log_file_path = os.path.join(LOG_ROOT_PATH, 'analysis', workflow.get_user()) - # if not os.path.exists(log_file_path): - # os.makedirs(log_file_path) - # log_file = os.path.join(log_file_path, workflow.get_id() + '.log') + log_file_path = os.path.join(LOG_ROOT_PATH, 'analysis', workflow.get_user()) + if not os.path.exists(log_file_path): + os.makedirs(log_file_path) + log_file = os.path.join(log_file_path, workflow.get_id() + '.log') - build_mechanisms_command = f'source {env_prefix}/bin/activate; nrnivmodl mechanisms'# > {log_file}' - opt_neuron_analysis_command = f'source {env_prefix}/bin/activate; python ./opt_neuron.py --analyse --checkpoint ./checkpoints'# > {log_file}' + build_mechanisms_command = f'source {env_prefix}/bin/activate; nrnivmodl mechanisms > {log_file}' + opt_neuron_analysis_command = f'source {env_prefix}/bin/activate; python ./opt_neuron.py --analyse --checkpoint ./checkpoints > {log_file}' os.chdir(output_dir) p0 = subprocess.call(build_mechanisms_command, shell=True, executable='/bin/bash') From 6c8776b0b27db5824c4359ab178f208f9d8b8b4d Mon Sep 17 00:00:00 2001 From: rcsm17 Date: Mon, 27 Jun 2022 17:00:52 +0200 Subject: [PATCH 011/111] minor fix --- static/hhnb/js/app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/static/hhnb/js/app.js b/static/hhnb/js/app.js index e6c09303..2ab0cf22 100644 --- a/static/hhnb/js/app.js +++ b/static/hhnb/js/app.js @@ -539,6 +539,7 @@ $(".jobs-unicore").on("click", (button) => { }) .fail((error) => { checkRefreshSession(error); + $("#spinnerRow").css("display", "none"); $("#jobsAuthAlert").addClass("show"); }); }); From b7707445c2d1e1037f30026234c33da1413b1f55 Mon Sep 17 00:00:00 2001 From: rcsm17 Date: Wed, 29 Jun 2022 19:09:45 +0200 Subject: [PATCH 012/111] removed google analytics and renamed motomo to matomo --- static/bspganalytics.js | 9 --------- static/{hhnb-motomo.js => hhnb-matomo.js} | 0 2 files changed, 9 deletions(-) delete mode 100755 static/bspganalytics.js rename static/{hhnb-motomo.js => hhnb-matomo.js} (100%) diff --git a/static/bspganalytics.js b/static/bspganalytics.js deleted file mode 100755 index 7469da15..00000000 --- a/static/bspganalytics.js +++ /dev/null @@ -1,9 +0,0 @@ - (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ - (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), - m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) - })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); - - ga('create', 'UA-91794319-3', 'auto'); - ga('send', 'pageview'); - - diff --git a/static/hhnb-motomo.js b/static/hhnb-matomo.js similarity index 100% rename from static/hhnb-motomo.js rename to static/hhnb-matomo.js From afc4d23fe15591daa4a89aa355b889d716c2a675 Mon Sep 17 00:00:00 2001 From: rcsm17 Date: Wed, 29 Jun 2022 19:12:26 +0200 Subject: [PATCH 013/111] added optimized loading animation in svg and removed frames --- .../animation/loading_animation/frame_0.png | Bin 7767 -> 0 bytes .../animation/loading_animation/frame_1.png | Bin 7706 -> 0 bytes .../animation/loading_animation/frame_2.png | Bin 7718 -> 0 bytes .../animation/loading_animation/frame_3.png | Bin 7731 -> 0 bytes .../animation/loading_animation/frame_4.png | Bin 7720 -> 0 bytes .../animation/loading_animation/frame_5.png | Bin 7730 -> 0 bytes .../animation/loading_animation/frame_6.png | Bin 7721 -> 0 bytes .../animation/loading_animation/frame_7.png | Bin 7730 -> 0 bytes .../animation/loading_animation/frame_8.png | Bin 7719 -> 0 bytes .../animation/loading_animation/frame_9.png | Bin 7660 -> 0 bytes .../loading_animation/loading_animation.css | 18 ++--------- .../loading_animation/loading_animation.js | 30 +++++++++++++++--- .../neuron_animation_compressed.svg | 1 + templates/efelg/docs/file_formats.html | 2 -- templates/efelg/error_space_left.html | 3 +- templates/efelg/overview.html | 2 +- templates/efelg/results.html | 3 +- templates/efelg/select_features.html | 2 +- templates/efelg/show_traces.html | 3 +- templates/hhnb/docs/index.html | 3 +- templates/hhnb/home.html | 12 +------ templates/hhnb/home_layout.html | 22 +++++-------- templates/hhnb/workflow.html | 12 ++----- 23 files changed, 45 insertions(+), 68 deletions(-) delete mode 100755 static/assets/animation/loading_animation/frame_0.png delete mode 100755 static/assets/animation/loading_animation/frame_1.png delete mode 100755 static/assets/animation/loading_animation/frame_2.png delete mode 100755 static/assets/animation/loading_animation/frame_3.png delete mode 100755 static/assets/animation/loading_animation/frame_4.png delete mode 100755 static/assets/animation/loading_animation/frame_5.png delete mode 100755 static/assets/animation/loading_animation/frame_6.png delete mode 100755 static/assets/animation/loading_animation/frame_7.png delete mode 100755 static/assets/animation/loading_animation/frame_8.png delete mode 100755 static/assets/animation/loading_animation/frame_9.png create mode 100644 static/assets/animation/loading_animation/neuron_animation_compressed.svg diff --git a/static/assets/animation/loading_animation/frame_0.png b/static/assets/animation/loading_animation/frame_0.png deleted file mode 100755 index c975f5cab4c84c9a7d2a4c8cf086f66263a82e04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7767 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 Jm7ICV{{f)G7##or diff --git a/static/assets/animation/loading_animation/frame_1.png b/static/assets/animation/loading_animation/frame_1.png deleted file mode 100755 index 43a1fe358b3302523a0bb93df0933a1f1137caa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7706 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
      LZ9KQ9JA62ZN19V! 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 diff --git a/static/assets/animation/loading_animation/frame_4.png b/static/assets/animation/loading_animation/frame_4.png deleted file mode 100755 index 63e2790b24d29927cb22fe6d19a37ee5aec07b24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7720 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 diff --git a/static/assets/animation/loading_animation/frame_6.png b/static/assets/animation/loading_animation/frame_6.png deleted file mode 100755 index f3d2f379e779638c7150e15b9973dc87a6bb646d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7721 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 eKl1CxbkJN-HJZozf*KyzBq{FmcVC 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 { + $("#" + id) + .attr("dur", "0.1s") + .attr("begin", "0.1s") + }); } \ No newline at end of file diff --git a/static/assets/animation/loading_animation/neuron_animation_compressed.svg b/static/assets/animation/loading_animation/neuron_animation_compressed.svg new file mode 100644 index 00000000..78d6dcdd --- /dev/null +++ b/static/assets/animation/loading_animation/neuron_animation_compressed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/efelg/docs/file_formats.html b/templates/efelg/docs/file_formats.html index 77272261..7815bebc 100755 --- a/templates/efelg/docs/file_formats.html +++ b/templates/efelg/docs/file_formats.html @@ -134,6 +134,4 @@

      JSON

      - - diff --git a/templates/efelg/error_space_left.html b/templates/efelg/error_space_left.html index 6a1bf29e..f8603d63 100644 --- a/templates/efelg/error_space_left.html +++ b/templates/efelg/error_space_left.html @@ -11,7 +11,7 @@ - + @@ -56,6 +56,5 @@

      - \ No newline at end of file diff --git a/templates/efelg/overview.html b/templates/efelg/overview.html index 707fbf6e..80d8e091 100755 --- a/templates/efelg/overview.html +++ b/templates/efelg/overview.html @@ -11,7 +11,7 @@ - + diff --git a/templates/efelg/results.html b/templates/efelg/results.html index 634b7aae..09defb77 100755 --- a/templates/efelg/results.html +++ b/templates/efelg/results.html @@ -11,7 +11,7 @@ - + @@ -88,6 +88,5 @@

      Result

      - diff --git a/templates/efelg/select_features.html b/templates/efelg/select_features.html index 6040e8ea..76302d97 100755 --- a/templates/efelg/select_features.html +++ b/templates/efelg/select_features.html @@ -11,7 +11,7 @@ - + diff --git a/templates/efelg/show_traces.html b/templates/efelg/show_traces.html index bf536a5e..b35a0999 100755 --- a/templates/efelg/show_traces.html +++ b/templates/efelg/show_traces.html @@ -11,7 +11,7 @@ - + @@ -379,7 +379,6 @@

      - - - + diff --git a/templates/hhnb/home.html b/templates/hhnb/home.html index 05555632..4b1033f9 100755 --- a/templates/hhnb/home.html +++ b/templates/hhnb/home.html @@ -10,7 +10,6 @@
      Welcome to the
      Hodgkin-Huxley Neuron Builder

      This tool makes an intensive use of JavaScript.
      Please, make sure you have not disabled JavaScript for this domain.

      -
    @@ -65,16 +64,7 @@
    Welcome to the
    Hodgkin-Huxley
    - -
    -
    -
    - Loading... -
    -
    -
    -
    - + - - + @@ -90,7 +78,13 @@

    Neuron Builder

    {% block content %}{% endblock %} - +
    +
    +
    Loading...
    + +
    +
    + - {% endblock %} From 1c3ec3ed28d031a0172f7a3f29242a67031e0582 Mon Sep 17 00:00:00 2001 From: rcsm17 Date: Fri, 1 Jul 2022 14:59:49 +0200 Subject: [PATCH 014/111] bugfix --- hh_neuron_builder/settings.py | 4 ++++ hhnb/utils/misc.py | 4 ---- .../loading_animation/loading_animation.js | 6 +++-- static/assets/themes/hhnb.css | 1 - static/hhnb/js/app.js | 15 +++++++----- static/hhnb/js/ui/components/dialog.js | 1 - static/hhnb/js/workflow/workflow.js | 18 ++++++++------ templates/efelg/docs/dataset.html | 1 - templates/efelg/docs/index.html | 2 -- templates/efelg/overview.html | 1 - templates/efelg/select_features.html | 1 - templates/hhnb/home_layout.html | 24 ++++++++----------- templates/hhnb/workflow.html | 5 ++-- 13 files changed, 40 insertions(+), 43 deletions(-) diff --git a/hh_neuron_builder/settings.py b/hh_neuron_builder/settings.py index 285348ae..d951df28 100755 --- a/hh_neuron_builder/settings.py +++ b/hh_neuron_builder/settings.py @@ -219,6 +219,10 @@ OIDC_OP_TOKEN_ENDPOINT = 'https://iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/token' OIDC_OP_USER_ENDPOINT = 'https://iam.ebrains.eu/auth/realms/hbp/protocol/openid-connect/userinfo' + +# OIDC_TIMEOUT = 1 + + LOGIN_REDIRECT_URL = "/hh-neuron-builder" LOGOUT_REDIRECT_URL = "/hh-neuron-builder" diff --git a/hhnb/utils/misc.py b/hhnb/utils/misc.py index 30e1a5a7..f4a7e411 100644 --- a/hhnb/utils/misc.py +++ b/hhnb/utils/misc.py @@ -9,7 +9,6 @@ import time - class InvalidArchiveError(Exception): pass @@ -59,11 +58,9 @@ def validate_archive(archive): # read zip data and validate the sign with open(archive_path, 'rb') as fd: Sign.verify_data_sign(signature, fd.read()) - return archive_path - def get_signed_archive(arch_file): """ Sign archive and return a new archive contening the archive itself, @@ -96,4 +93,3 @@ def get_signed_archive(arch_file): # remove tmp dir shutil.rmtree(tmp_dir) return signed_archive - diff --git a/static/assets/animation/loading_animation/loading_animation.js b/static/assets/animation/loading_animation/loading_animation.js index 225660d8..e7a8195c 100755 --- a/static/assets/animation/loading_animation/loading_animation.js +++ b/static/assets/animation/loading_animation/loading_animation.js @@ -1,7 +1,9 @@ function showLoadingAnimation(message="") { setLoadingAnimationText(message); - $(".loading-animation").removeClass("hide").addClass("show"); - startAnimation(); + if ($(".loading-animation").hasClass("hide")) { + $(".loading-animation").removeClass("hide").addClass("show"); + startAnimation(); + } } function hideLoadingAnimation() { diff --git a/static/assets/themes/hhnb.css b/static/assets/themes/hhnb.css index 431f9894..15c5bb34 100644 --- a/static/assets/themes/hhnb.css +++ b/static/assets/themes/hhnb.css @@ -1616,7 +1616,6 @@ i.disabled:hover { } - .modal-content.sublayer { display: flex; position: absolute; diff --git a/static/hhnb/js/app.js b/static/hhnb/js/app.js index 2ab0cf22..ea44c371 100644 --- a/static/hhnb/js/app.js +++ b/static/hhnb/js/app.js @@ -30,7 +30,7 @@ function checkRefreshSession(response) { } -$(document).ready(() => { +$(document).on("load", () => { if (workflow.getProps().hhf_flag) { $("#modalHHF").modal("show"); } @@ -252,8 +252,9 @@ $("#apply-param").on("click", () => { workflow.uploadOptimizationSettings(formData); }).fail((error) => { checkRefreshSession(error); - $("#hpcAuthAlert").addClass("show"); - }).always(() => { hideLoadingAnimation() }); + $("#hpcAuthAlert").addClass("show"); + hideLoadingAnimation(); + }) } else { OptimizationSettingsDialog.close(); workflow.uploadOptimizationSettings(formData); @@ -297,8 +298,9 @@ $("#save-feature-files").on("click", () => { $("#modalNFEContainer").removeClass("show"); workflow.updateProperties(); }).fail((error) => { + hideLoadingAnimation(); alert("Something goes wrong. Please download the Features files and upload them manually."); - }).always(() => { hideLoadingAnimation() }); + }); }); /* **** */ @@ -378,7 +380,8 @@ function chooseOptModel() { }).fail((error) => { checkRefreshSession(error); Log.error(error); - }).always(() => { hideLoadingAnimation() }) + hideLoadingAnimation() + }); } }); }).done(() => { @@ -817,7 +820,7 @@ $("#checkNsgLoginButton").on("click", () => { var blueNaasModel = ""; $("#run-sim-btn").on("click", () => { showLoadingAnimation("Uploading to BlueNaas..."); - $("#run-sim-btn").prop("disabled", true); + $("#run-sim-btn").prop("disabled", true).blur(); $.get("/hh-neuron-builder/upload-to-naas/" + exc) .done((data) => { if (blueNaasModel != data) { diff --git a/static/hhnb/js/ui/components/dialog.js b/static/hhnb/js/ui/components/dialog.js index af4d9ad1..b1c935f4 100644 --- a/static/hhnb/js/ui/components/dialog.js +++ b/static/hhnb/js/ui/components/dialog.js @@ -377,7 +377,6 @@ class ModelRegistrationDialog { showLoadingAnimation("Loading options..."); let modelName = $("#wf-title").text().split("Workflow ID: ")[1]; - $.ajax({ url: "/hh-neuron-builder/get-model-catalog-attribute-options", method: "GET", diff --git a/static/hhnb/js/workflow/workflow.js b/static/hhnb/js/workflow/workflow.js index 0eb266f0..5687f878 100644 --- a/static/hhnb/js/workflow/workflow.js +++ b/static/hhnb/js/workflow/workflow.js @@ -66,12 +66,12 @@ export default class Workflow { } } - updateProperties() { + async updateProperties(async=true) { showLoadingAnimation("Loading..."); $.ajax({ url: GET_PROPS_BASE_URL + this.#exc, method: "GET", - async: false, + async: async, success: (props) => { this.#props = props; $("#wf-title").html("Workflow ID: " + this.#props.id + ""); @@ -278,8 +278,9 @@ export default class Workflow { error: (error) => { Log.error("Status: " + error.status + " > " + error.responseText); MessageDialog.openErrorDialog(error.responseText); + hideLoadingAnimation() }, - }).always(() => { hideLoadingAnimation() }); + }); } setUploadFileType(fileType) { @@ -307,8 +308,9 @@ export default class Workflow { error: (error) => { Log.error("Status: " + error.status + " > " + error.responseText); MessageDialog.openErrorDialog(error.responseText); + hideLoadingAnimation(); }, - }).always(() => { hideLoadingAnimation(); }); + }); } @@ -355,6 +357,7 @@ export default class Workflow { this.updateProperties(); }, error: (error) => { + hideLoadingAnimation(); Log.error("Status: " + error.status + " > " + error.responseText); MessageDialog.openErrorDialog(error.responseText); if (error.responseText == "Invalid credentials.") { @@ -362,7 +365,7 @@ export default class Workflow { $("#password_submit").removeClass("is-valid").addClass("is-invalid"); } } - }).always(() => { hideLoadingAnimation() }); + }); } runOptimization() { @@ -374,14 +377,15 @@ export default class Workflow { async: false, success: (result) => { Log.debug(result); + this.updateProperties(false); MessageDialog.openSuccessDialog(result); - this.updateProperties(); }, error: (error) => { Log.error("Status: " + error.status + " > " + error.responseText); MessageDialog.openErrorDialog(error.responseText); + hideLoadingAnimation(); } - }).always(() => { hideLoadingAnimation() }); + }); } registerModel(formData) { diff --git a/templates/efelg/docs/dataset.html b/templates/efelg/docs/dataset.html index 3f0607c5..df751163 100644 --- a/templates/efelg/docs/dataset.html +++ b/templates/efelg/docs/dataset.html @@ -58,7 +58,6 @@

    The data provided in the Trace selection page are available at the following - diff --git a/templates/efelg/docs/index.html b/templates/efelg/docs/index.html index 3523f180..126fc363 100755 --- a/templates/efelg/docs/index.html +++ b/templates/efelg/docs/index.html @@ -217,6 +217,4 @@

    Results
    - - diff --git a/templates/efelg/overview.html b/templates/efelg/overview.html index 80d8e091..bdfef8fa 100755 --- a/templates/efelg/overview.html +++ b/templates/efelg/overview.html @@ -275,6 +275,5 @@

    Terms & Conditions

    - \ No newline at end of file diff --git a/templates/efelg/select_features.html b/templates/efelg/select_features.html index 76302d97..6389e78f 100755 --- a/templates/efelg/select_features.html +++ b/templates/efelg/select_features.html @@ -79,6 +79,5 @@

    Feature selection

    - diff --git a/templates/hhnb/home_layout.html b/templates/hhnb/home_layout.html index e6591604..728cc968 100755 --- a/templates/hhnb/home_layout.html +++ b/templates/hhnb/home_layout.html @@ -6,24 +6,19 @@ Hodgkin-Huxley Neuron Builder - + - - - - - - - + + - - + + - +