You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2018/01/11 17:23:40 UTC

[airavata-django-portal] branch master updated: AIRAVATA-2598 Validation for experiment fields, queue settings

This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git


The following commit(s) were added to refs/heads/master by this push:
     new 4508522  AIRAVATA-2598 Validation for experiment fields, queue settings
4508522 is described below

commit 450852271bea1efdaf800824269e00c69a998722
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Thu Jan 11 12:22:04 2018 -0500

    AIRAVATA-2598 Validation for experiment fields, queue settings
---
 .../models/ComputationalResourceSchedulingModel.js | 17 ++++++++++
 .../django_airavata_api/js/models/Experiment.js    | 12 ++++++-
 .../js/models/UserConfigurationData.js             |  9 ++++++
 .../ComputationalResourceSchedulingEditor.vue      | 16 ++++++++--
 .../js/components/experiment/ExperimentEditor.vue  | 29 ++++++++++++-----
 .../components/experiment/QueueSettingsEditor.vue  | 37 ++++++++++++++++------
 django_airavata/static/common/js/index.js          |  3 ++
 django_airavata/static/common/js/utils.js          |  8 +++++
 8 files changed, 110 insertions(+), 21 deletions(-)

diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/ComputationalResourceSchedulingModel.js b/django_airavata/apps/api/static/django_airavata_api/js/models/ComputationalResourceSchedulingModel.js
index f9cc61f..1e17acf 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/ComputationalResourceSchedulingModel.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/ComputationalResourceSchedulingModel.js
@@ -19,4 +19,21 @@ export default class ComputationalResourceSchedulingModel extends BaseModel {
     constructor(data = {}) {
         super(FIELDS, data);
     }
+
+    validate() {
+        const validationResults = {};
+        if (this.isEmpty(this.resourceHostId)) {
+            validationResults['resourceHostId'] = "Please select a compute resource.";
+        }
+        if (!(this.nodeCount > 0)) {
+            validationResults['nodeCount'] = "Enter a node count greater than 0.";
+        }
+        if (!(this.totalCPUCount > 0)) {
+            validationResults['totalCPUCount'] = "Enter a core count greater than 0.";
+        }
+        if (!(this.wallTimeLimit > 0)) {
+            validationResults['wallTimeLimit'] = "Enter a wall time limit greater than 0.";
+        }
+        return validationResults;
+    }
 }
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/Experiment.js b/django_airavata/apps/api/static/django_airavata_api/js/models/Experiment.js
index 6066c3a..1f249dc 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/Experiment.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/Experiment.js
@@ -73,7 +73,7 @@ export default class Experiment extends BaseModel {
 
     validate() {
         let validationResults = {};
-        let experimentInputsValidation = this.experimentInputs
+        const experimentInputsValidation = this.experimentInputs
             .map(experimentInput => {
                 const validation = experimentInput.validate();
                 if (validation && 'value' in validation) {
@@ -86,6 +86,16 @@ export default class Experiment extends BaseModel {
         if (Object.keys(experimentInputsValidation).length > 0) {
             validationResults['experimentInputs'] = experimentInputsValidation;
         }
+        const userConfigurationDataValidation = this.userConfigurationData.validate();
+        if (Object.keys(userConfigurationDataValidation).length > 0) {
+            validationResults['userConfigurationData'] = userConfigurationDataValidation;
+        }
+        if (this.isEmpty(this.experimentName)) {
+            validationResults['experimentName'] = "Please provide a name for this experiment.";
+        }
+        if (this.isEmpty(this.projectId)) {
+            validationResults['projectId'] = "Please select a project.";
+        }
         return validationResults;
     }
 }
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/UserConfigurationData.js b/django_airavata/apps/api/static/django_airavata_api/js/models/UserConfigurationData.js
index 244d3fb..81829da 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/UserConfigurationData.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/UserConfigurationData.js
@@ -46,4 +46,13 @@ export default class UserConfigurationData extends BaseModel {
     constructor(data = {}) {
         super(FIELDS, data);
     }
+
+    validate() {
+        const validationResults = {};
+        const computationalResourceSchedulingValidation = this.computationalResourceScheduling.validate();
+        if (Object.keys(computationalResourceSchedulingValidation).length > 0) {
+            validationResults['computationalResourceScheduling'] = computationalResourceSchedulingValidation;
+        }
+        return validationResults;
+    }
 }
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ComputationalResourceSchedulingEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ComputationalResourceSchedulingEditor.vue
index 08af0ea..116abad 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ComputationalResourceSchedulingEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ComputationalResourceSchedulingEditor.vue
@@ -1,10 +1,13 @@
 <template>
     <b-form novalidate>
-        <b-form-group label="Compute Resource" label-for="compute-resource">
+        <b-form-group label="Compute Resource" label-for="compute-resource"
+                :feedback="getValidationFeedback('resourceHostId')"
+                :state="getValidationState('resourceHostId')">
             <b-form-select id="compute-resource"
                 v-model="resourceHostId"
                 :options="computeResourceOptions" required
-                @change="computeResourceChanged">
+                @change="computeResourceChanged"
+                :state="getValidationState('resourceHostId')">
                 <template slot="first">
                     <option :value="null" disabled>Select a Compute Resource</option>
                 </template>
@@ -23,6 +26,7 @@
 <script>
 import QueueSettingsEditor from './QueueSettingsEditor.vue'
 import {models, services} from 'django-airavata-api'
+import {utils} from 'django-airavata-common-ui'
 
 export default {
     name: 'computational-resource-scheduling-editor',
@@ -102,7 +106,13 @@ export default {
         },
         emitValueChanged: function() {
             this.$emit('input', this.localComputationalResourceScheduling);
-        }
+        },
+        getValidationFeedback: function(properties) {
+            return utils.getProperty(this.localComputationalResourceScheduling.validate(), properties);
+        },
+        getValidationState: function(properties) {
+            return this.getValidationFeedback(properties) ? 'invalid' : null;
+        },
     },
     watch: {
     }
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue
index e2f5581..50f9c13 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue
@@ -13,14 +13,20 @@
                 <div class="card">
                     <div class="card-body">
                         <b-form novalidate>
-                            <b-form-group label="Experiment Name" label-for="experiment-name">
+                            <b-form-group label="Experiment Name" label-for="experiment-name"
+                                :feedback="getValidationFeedback('experimentName')"
+                                :state="getValidationState('experimentName')">
                                 <b-form-input id="experiment-name"
                                 type="text" v-model="localExperiment.experimentName" required
-                                placeholder="Experiment name"></b-form-input>
+                                placeholder="Experiment name"
+                                :state="getValidationState('experimentName')"></b-form-input>
                             </b-form-group>
-                            <b-form-group label="Project" label-for="project">
+                            <b-form-group label="Project" label-for="project"
+                                :feedback="getValidationFeedback('projectId')"
+                                :state="getValidationState('projectId')">
                                 <b-form-select id="project"
-                                    v-model="localExperiment.projectId" :options="projectOptions" required>
+                                    v-model="localExperiment.projectId" :options="projectOptions" required
+                                    :state="getValidationState('projectId')">
                                     <template slot="first">
                                         <option :value="null" disabled>Select a Project</option>
                                     </template>
@@ -48,11 +54,11 @@
                         <b-form novalidate>
                             <b-form-group v-for="experimentInput in localExperiment.experimentInputs"
                                     :label="experimentInput.name" :label-for="experimentInput.name" :key="experimentInput.name"
-                                    :feedback="getApplicationInputFeedback(experimentInput)"
-                                    :state="getApplicationInputState(experimentInput)">
+                                    :feedback="getValidationFeedback(['experimentInputs', experimentInput.name, 'value'])"
+                                    :state="getValidationState(['experimentInputs', experimentInput.name, 'value'])">
                                 <b-form-input :id="experimentInput.name" type="text" v-model="experimentInput.value" required
                                     :placeholder="experimentInput.userFriendlyDescription"
-                                    :state="getApplicationInputState(experimentInput)"></b-form-input>
+                                    :state="getValidationState(['experimentInputs', experimentInput.name, 'value'])"></b-form-input>
                             </b-form-group>
                         </b-form>
                         <h2 class="h5 mb-3">
@@ -84,6 +90,7 @@
 import ComputationalResourceSchedulingEditor from './ComputationalResourceSchedulingEditor.vue'
 import QueueSettingsEditor from './QueueSettingsEditor.vue'
 import {models, services} from 'django-airavata-api'
+import {utils} from 'django-airavata-common-ui'
 
 export default {
     name: 'edit-experiment',
@@ -171,7 +178,13 @@ export default {
                 return validationResults;
             }
             return null;
-        }
+        },
+        getValidationFeedback: function(properties) {
+            return utils.getProperty(this.localExperiment.validate(), properties);
+        },
+        getValidationState: function(properties) {
+            return this.getValidationFeedback(properties) ? 'invalid' : null;
+        },
     },
     watch: {
         experiment: function(newValue) {
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/QueueSettingsEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/QueueSettingsEditor.vue
index 0d31068..edf38d4 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/QueueSettingsEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/QueueSettingsEditor.vue
@@ -25,29 +25,41 @@
             <a href="#" @click.prevent="showConfiguration = true">Configure Resource</a>
         </div>
         <div v-if="showConfiguration">
-            <b-form-group label="Select a Queue" label-for="queue">
+            <b-form-group label="Select a Queue" label-for="queue"
+                :feedback="getValidationFeedback('queueName')"
+                :state="getValidationState('queueName')">
                 <b-form-select id="queue"
                     v-model="localComputationalResourceScheduling.queueName"
                     :options="queueOptions" required
-                    @change="queueChanged">
+                    @change="queueChanged"
+                    :state="getValidationState('queueName')">
                 </b-form-select>
             </b-form-group>
-            <b-form-group label="Node Count" label-for="node-count">
+            <b-form-group label="Node Count" label-for="node-count"
+                :feedback="getValidationFeedback('nodeCount')"
+                :state="getValidationState('nodeCount')">
                 <b-form-input id="node-count" type="number" min="1"
                     v-model="localComputationalResourceScheduling.nodeCount" required
-                    @change="emitValueChanged">
+                    @input="emitValueChanged"
+                    :state="getValidationState('nodeCount')">
                 </b-form-input>
             </b-form-group>
-            <b-form-group label="Total Core Count" label-for="core-count">
+            <b-form-group label="Total Core Count" label-for="core-count"
+                :feedback="getValidationFeedback('totalCPUCount')"
+                :state="getValidationState('totalCPUCount')">
                 <b-form-input id="core-count" type="number" min="1"
                     v-model="localComputationalResourceScheduling.totalCPUCount" required
-                    @change="emitValueChanged">
+                    @input="emitValueChanged"
+                    :state="getValidationState('totalCPUCount')">
                 </b-form-input>
             </b-form-group>
-            <b-form-group label="Wall Time Limit" label-for="walltime-limit">
+            <b-form-group label="Wall Time Limit" label-for="walltime-limit"
+                :feedback="getValidationFeedback('wallTimeLimit')"
+                :state="getValidationState('wallTimeLimit')">
                 <b-form-input id="walltime-limit" type="number" min="1"
                     v-model="localComputationalResourceScheduling.wallTimeLimit" required
-                    @change="emitValueChanged">
+                    @input="emitValueChanged"
+                    :state="getValidationState('wallTimeLimit')">
                 </b-form-input>
             </b-form-group>
             <div>
@@ -60,6 +72,7 @@
 
 <script>
 import {models, services} from 'django-airavata-api'
+import {utils} from 'django-airavata-common-ui'
 
 export default {
     name: 'queue-settings-editor',
@@ -126,7 +139,13 @@ export default {
                     this.localComputationalResourceScheduling.wallTimeLimit = defaultQueue.defaultWalltime;
                     this.emitValueChanged();
                 });
-        }
+        },
+        getValidationFeedback: function(properties) {
+            return utils.getProperty(this.localComputationalResourceScheduling.validate(), properties);
+        },
+        getValidationState: function(properties) {
+            return this.getValidationFeedback(properties) ? 'invalid' : null;
+        },
     },
     watch: {
         value: function(newValue) {
diff --git a/django_airavata/static/common/js/index.js b/django_airavata/static/common/js/index.js
index 4e01df0..8086e4c 100644
--- a/django_airavata/static/common/js/index.js
+++ b/django_airavata/static/common/js/index.js
@@ -1,7 +1,10 @@
 import ApplicationCard from './components/ApplicationCard.vue'
 import Pager from './components/Pager.vue'
+import * as utils from './utils'
 
 exports.components = {
     Pager,
     ApplicationCard,
 }
+
+exports.utils = utils;
diff --git a/django_airavata/static/common/js/utils.js b/django_airavata/static/common/js/utils.js
new file mode 100644
index 0000000..0ddd1ea
--- /dev/null
+++ b/django_airavata/static/common/js/utils.js
@@ -0,0 +1,8 @@
+
+export function getProperty(obj, props) {
+    if (typeof props === 'string') {
+        return obj[props];
+    } else if (typeof props === 'object' && props instanceof Array) { // Array
+        return props.reduce((o, prop) => o && prop in o ? o[prop] : undefined, obj);
+    }
+}
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
['"commits@airavata.apache.org" <co...@airavata.apache.org>'].