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>'].