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 2017/12/13 14:35:27 UTC

[airavata-django-portal] branch master updated: Copy app interface inputs into experiment inputs and display

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 acfff5c  Copy app interface inputs into experiment inputs and display
acfff5c is described below

commit acfff5cc5d9e885e48753d9f12c9691d13c23af2
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Wed Dec 13 09:35:20 2017 -0500

    Copy app interface inputs into experiment inputs and display
---
 .../js/models/ApplicationInterfaceDefinition.js    |  7 +++-
 .../django_airavata_api/js/models/BaseModel.js     |  1 -
 .../models/ComputationResourceSchedulingModel.js   | 22 +++++++++++
 .../django_airavata_api/js/models/ErrorModel.js    | 23 +++++++++++
 .../django_airavata_api/js/models/Experiment.js    | 46 ++++++++++++++++++++++
 .../js/models/ExperimentStatus.js                  | 17 ++++++++
 .../js/models/InputDataObjectType.js               |  4 ++
 ...utDataTypeObject.js => OutputDataObjectType.js} |  0
 .../js/models/UserConfigurationData.js             | 24 +++++++++++
 django_airavata/apps/api/views.py                  |  1 +
 .../js/views/CreateExperimentContainer.vue         |  6 +--
 .../js/views/ExperimentEditor.vue                  | 28 ++++++++++++-
 12 files changed, 171 insertions(+), 8 deletions(-)

diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/ApplicationInterfaceDefinition.js b/django_airavata/apps/api/static/django_airavata_api/js/models/ApplicationInterfaceDefinition.js
index 086ba2c..0383219 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/ApplicationInterfaceDefinition.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/ApplicationInterfaceDefinition.js
@@ -1,6 +1,6 @@
 import BaseModel from './BaseModel'
 import InputDataObjectType from './InputDataObjectType'
-import OutputDataObjectType from './OutputDataTypeObject'
+import OutputDataObjectType from './OutputDataObjectType'
 
 
 const FIELDS = [
@@ -31,4 +31,9 @@ export default class ApplicationInterfaceDefinition extends BaseModel {
     constructor(data = {}) {
         super(FIELDS, data);
     }
+
+    getOrderedApplicationInputs() {
+        // Use slice() to make a copy and sort that copy
+        return this.applicationInputs ? this.applicationInputs.slice().sort((a, b) => a.inputOrder - b.inputOrder) : [];
+    }
 }
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/BaseModel.js b/django_airavata/apps/api/static/django_airavata_api/js/models/BaseModel.js
index 49afcb9..4dd029c 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/BaseModel.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/BaseModel.js
@@ -1,5 +1,4 @@
 
-// TODO: document
 export default class BaseModel {
 
     /**
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/ComputationResourceSchedulingModel.js b/django_airavata/apps/api/static/django_airavata_api/js/models/ComputationResourceSchedulingModel.js
new file mode 100644
index 0000000..f9cc61f
--- /dev/null
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/ComputationResourceSchedulingModel.js
@@ -0,0 +1,22 @@
+import BaseModel from './BaseModel';
+
+const FIELDS = [
+    'resourceHostId',
+    'totalCPUCount',
+    'nodeCount',
+    'numberOfThreads',
+    'queueName',
+    'wallTimeLimit',
+    'totalPhysicalMemory',
+    'chessisNumber',
+    'staticWorkingDir',
+    'overrideLoginUserName',
+    'overrideScratchLocation',
+    'overrideAllocationProjectNumber',
+];
+
+export default class ComputationalResourceSchedulingModel extends BaseModel {
+    constructor(data = {}) {
+        super(FIELDS, data);
+    }
+}
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/ErrorModel.js b/django_airavata/apps/api/static/django_airavata_api/js/models/ErrorModel.js
new file mode 100644
index 0000000..7917cf9
--- /dev/null
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/ErrorModel.js
@@ -0,0 +1,23 @@
+import BaseModel from './BaseModel';
+
+const FIELDS = [
+    'errorId',
+    {
+        name: 'creationTime',
+        type: 'date',
+    },
+    'actualErrorMessage',
+    'userFriendlyMessage',
+    'transientOrPersistent',
+    {
+        name: 'rootCauseErrorIdList',
+        type: 'string',
+        list: true,
+    }
+];
+
+export default class ErrorModel extends BaseModel {
+    constructor(data = {}) {
+        super(FIELDS, data);
+    }
+}
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 b47e7a6..da1643a 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
@@ -1,4 +1,9 @@
 import BaseModel from './BaseModel';
+import UserConfigurationData from './UserConfigurationData'
+import InputDataObjectType from './InputDataObjectType'
+import OutputDataObjectType from './OutputDataObjectType'
+import ExperimentStatus from './ExperimentStatus'
+import ErrorModel from './ErrorModel'
 
 const FIELDS = [
     'experimentId',
@@ -7,7 +12,48 @@ const FIELDS = [
     'experimentType',
     'userName',
     'experimentName',
+    {
+        name: 'creationTime',
+        type: 'date'
+    },
     'description',
+    'executionId',
+    'enableEmailNotification',
+    {
+        name: 'emailAddresses',
+        type: 'string',
+        list: true,
+    },
+    {
+        name: 'userConfigurationData',
+        type: UserConfigurationData,
+    },
+    {
+        name: 'experimentInputs',
+        type: InputDataObjectType,
+        list: true,
+    },
+    {
+        name: 'experimentOutputs',
+        type: OutputDataObjectType,
+        list: true,
+    },
+    {
+        name: 'experimentStatus',
+        type: ExperimentStatus,
+        list: true,
+    },
+    {
+        name: 'errors',
+        type: ErrorModel,
+        list: true,
+    },
+    // TODO: map the ProcessModel
+    // {
+    //     name: 'processes',
+    //     type: ProcessModel,
+    //     list: true,
+    // },
 ];
 
 export default class Experiment extends BaseModel {
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/ExperimentStatus.js b/django_airavata/apps/api/static/django_airavata_api/js/models/ExperimentStatus.js
new file mode 100644
index 0000000..bc8f0bf
--- /dev/null
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/ExperimentStatus.js
@@ -0,0 +1,17 @@
+import BaseModel from './BaseModel';
+
+const FIELDS = [
+    // TODO: state is an enum field
+     'state',
+     {
+         name: 'timeOfStateChange',
+         type: 'date',
+     },
+     'reason',
+];
+
+export default class ExperimentStatus extends BaseModel {
+    constructor(data = {}) {
+        super(FIELDS, data);
+    }
+}
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js b/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
index 601fdd0..56bb108 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
@@ -21,4 +21,8 @@ export default class InputDataObjectType extends BaseModel {
     constructor(data = {}) {
         super(FIELDS, data);
     }
+
+    clone() {
+        return new InputDataObjectType(this);
+    }
 }
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/OutputDataTypeObject.js b/django_airavata/apps/api/static/django_airavata_api/js/models/OutputDataObjectType.js
similarity index 100%
rename from django_airavata/apps/api/static/django_airavata_api/js/models/OutputDataTypeObject.js
rename to django_airavata/apps/api/static/django_airavata_api/js/models/OutputDataObjectType.js
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
new file mode 100644
index 0000000..8907cda
--- /dev/null
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/UserConfigurationData.js
@@ -0,0 +1,24 @@
+import BaseModel from './BaseModel';
+import ComputationalResourceSchedulingModel from './ComputationResourceSchedulingModel'
+
+const FIELDS = [
+    'airavataAutoSchedule',
+    'overrideManualScheduledParams',
+    'shareExperimentPublicly',
+    {
+        name: 'computationalResourceScheduling',
+        type: ComputationalResourceSchedulingModel,
+    },
+    'throttleResources',
+    'userDN',
+    'generateCert',
+    'storageId',
+    'experimentDataDir',
+    'useUserCRPref',
+];
+
+export default class UserConfigurationData extends BaseModel {
+    constructor(data = {}) {
+        super(FIELDS, data);
+    }
+}
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index e6f975e..9a19867 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -269,6 +269,7 @@ class ApplicationModuleViewSet(APIBackedViewSet):
                 ApplicationInterfaceDescription, instance=app_interfaces[0], context={'request': request})
             return Response(serializer.data)
         elif len(app_interfaces) > 1:
+            log.error("More than one application interface found for module {}: {}".format(app_module_id, app_interfaces))
             return Response({'error': 'More than one application interface found for module id {}'.format(app_module_id)},
                             status=status.HTTP_500_INTERNAL_SERVER_ERROR)
         else:
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/CreateExperimentContainer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/CreateExperimentContainer.vue
index e7d36fd..e9caf1c 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/CreateExperimentContainer.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/CreateExperimentContainer.vue
@@ -1,5 +1,5 @@
 <template>
-    <experiment-editor :experiment="experiment" :app-module="appModule" :app-interface="appInterface">
+    <experiment-editor :experiment="experiment" :app-module="appModule">
         <span slot="title">Create a New Experiment</span>
     </experiment-editor>
 </template>
@@ -20,7 +20,6 @@ export default {
         return {
             'experiment': new models.Experiment(),
             'appModule': null,
-            'appInterface': null,
         }
     },
     components: {
@@ -39,8 +38,7 @@ export default {
             });
         services.ApplicationInterfaceService.getForAppModuleId(this.appModuleId)
             .then(appInterface => {
-                this.appInterface = appInterface
-                console.log(JSON.stringify(appInterface));
+                this.experiment.experimentInputs = appInterface.getOrderedApplicationInputs().map(input => input.clone());
             });
     }
 }
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ExperimentEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ExperimentEditor.vue
index 8caceaf..72592fd 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ExperimentEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ExperimentEditor.vue
@@ -26,7 +26,31 @@
                                     </template>
                                 </b-form-select>
                             </b-form-group>
-                            <div v-if="appInterface">App Interface name: {{ appInterface.applicationName }}</div>
+                        </b-form>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col">
+                <h1 class="h4 mb-4">
+                    Application Configuration
+                </h1>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col">
+                <div class="card">
+                    <div class="card-body">
+                        <h2 class="h5 mb-3">
+                            Application Inputs
+                        </h2>
+                        <b-form novalidate>
+                            <b-form-group v-for="experimentInput in experiment.experimentInputs"
+                                    :label="experimentInput.name" :label-for="experimentInput.name" :key="experimentInput.name">
+                                <b-form-input :id="experimentInput.name" type="text" v-model="experimentInput.value" required
+                                    :placeholder="experimentInput.userFriendlyDescription"></b-form-input>
+                            </b-form-group>
                         </b-form>
                     </div>
                 </div>
@@ -40,7 +64,7 @@ import {models, services} from 'django-airavata-api'
 
 export default {
     name: 'edit-experiment',
-    props: ['experiment', 'appModule', 'appInterface'],
+    props: ['experiment', 'appModule'],
     data () {
         return {
             'projects': [],

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