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/15 14:46:03 UTC

[airavata-django-portal] 01/02: AIRAVATA-2598 Load compute resource options

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

commit 1c337586086e2ac5bf715e5915fc6d69ebdc5aa2
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Wed Dec 13 11:59:18 2017 -0500

    AIRAVATA-2598 Load compute resource options
---
 django_airavata/apps/api/serializers.py            |  8 ++---
 .../django_airavata_api/js/models/BaseModel.js     | 14 +++++++-
 ....js => ComputationalResourceSchedulingModel.js} |  0
 .../django_airavata_api/js/models/Experiment.js    |  1 +
 .../js/models/UserConfigurationData.js             |  3 +-
 .../js/services/ApplicationInterfaceService.js     |  4 +++
 django_airavata/apps/api/urls.py                   |  2 +-
 django_airavata/apps/api/views.py                  |  5 +++
 .../js/views/CreateExperimentContainer.vue         |  4 ++-
 .../js/views/ExperimentEditor.vue                  | 37 +++++++++++++++++++++-
 10 files changed, 67 insertions(+), 11 deletions(-)

diff --git a/django_airavata/apps/api/serializers.py b/django_airavata/apps/api/serializers.py
index 7f10532..cf9c2b2 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -182,13 +182,9 @@ class CustomSerializer(serializers.Serializer):
         return params
 
 
-
-
-
-
-
-
 class ApplicationInterfaceDescriptionSerializer(CustomSerializer):
+    url = FullyEncodedHyperlinkedIdentityField(view_name='django_airavata_api:application-interface-detail', lookup_field='applicationInterfaceId', lookup_url_kwarg='app_interface_id')
+    applicationInterfaceId = serializers.CharField(read_only=True)
     applicationName = serializers.CharField(required=False)
     applicationDescription = serializers.CharField(required=False)
     archiveWorkingDirectory = serializers.BooleanField(required=False)
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 4dd029c..119ebd0 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
@@ -20,7 +20,7 @@ export default class BaseModel {
                 let fieldName = fieldDefinition.name;
                 let fieldType = fieldDefinition.type;
                 let fieldIsList = typeof fieldDefinition.list !== 'undefined' ? fieldDefinition.list : false;
-                let fieldDefault = typeof fieldDefinition.default !== 'undefined' ? fieldDefinition.default : null;
+                let fieldDefault = typeof fieldDefinition.default !== 'undefined' ? this.getDefaultValue(fieldDefinition.default) : null;
                 let fieldValue = data[fieldName];
                 if (fieldIsList) {
                     this[fieldName] = fieldValue ? fieldValue.map(item => this.convertField(fieldType, item, fieldDefault)) : fieldDefault;
@@ -54,6 +54,18 @@ export default class BaseModel {
         return typeof fieldValue !== 'undefined' ? new modelClass(fieldValue) : fieldDefault;
     }
 
+    getDefaultValue(fieldDefault) {
+        if (typeof fieldDefault === 'function') {
+            return fieldDefault();
+        } else {
+            return fieldDefault;
+        }
+    }
+
+    static defaultNewInstance(classRef) {
+        return () => new classRef();
+    }
+
     /**
      * Override to provide validation. If there are validation errors this
      * method should return a dictionary where keys are property names and
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/ComputationalResourceSchedulingModel.js
similarity index 100%
rename from django_airavata/apps/api/static/django_airavata_api/js/models/ComputationResourceSchedulingModel.js
rename to django_airavata/apps/api/static/django_airavata_api/js/models/ComputationalResourceSchedulingModel.js
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 da1643a..53aa4d2 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
@@ -27,6 +27,7 @@ const FIELDS = [
     {
         name: 'userConfigurationData',
         type: UserConfigurationData,
+        default: BaseModel.defaultNewInstance(UserConfigurationData),
     },
     {
         name: 'experimentInputs',
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 8907cda..e1a5a47 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
@@ -1,5 +1,5 @@
 import BaseModel from './BaseModel';
-import ComputationalResourceSchedulingModel from './ComputationResourceSchedulingModel'
+import ComputationalResourceSchedulingModel from './ComputationalResourceSchedulingModel'
 
 const FIELDS = [
     'airavataAutoSchedule',
@@ -8,6 +8,7 @@ const FIELDS = [
     {
         name: 'computationalResourceScheduling',
         type: ComputationalResourceSchedulingModel,
+        default: BaseModel.defaultNewInstance(ComputationalResourceSchedulingModel),
     },
     'throttleResources',
     'userDN',
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/services/ApplicationInterfaceService.js b/django_airavata/apps/api/static/django_airavata_api/js/services/ApplicationInterfaceService.js
index 9c83752..f0eeb0c 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/services/ApplicationInterfaceService.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/services/ApplicationInterfaceService.js
@@ -23,6 +23,10 @@ class ApplicationIterfaceService {
         return FetchUtils.get('/api/applications/' + encodeURIComponent(appModuleId) + '/application_interface/')
             .then(json => new ApplicationInterfaceDefinition(json))
     }
+
+    getComputeResources(appInterfaceId) {
+        return FetchUtils.get('/api/application-interfaces/' + encodeURIComponent(appInterfaceId) + '/compute_resources');
+    }
 }
 
 // Export as a singleton
diff --git a/django_airavata/apps/api/urls.py b/django_airavata/apps/api/urls.py
index 6375ad0..1edc10d 100644
--- a/django_airavata/apps/api/urls.py
+++ b/django_airavata/apps/api/urls.py
@@ -11,7 +11,7 @@ logger = logging.getLogger(__name__)
 router = routers.DefaultRouter()
 router.register(r'projects', views.ProjectViewSet, base_name='project')
 router.register(r'new/application/module', views.RegisterApplicationModule, base_name='register_app_module')
-router.register(r'application-interface', views.ApplicationInterfaceViewSet, base_name='application-interface')
+router.register(r'application-interfaces', views.ApplicationInterfaceViewSet, base_name='application-interface')
 router.register(r'applications', views.ApplicationModuleViewSet, base_name='application')
 
 app_name = 'django_airavata_api'
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index 9a19867..25cf730 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -336,6 +336,11 @@ class ApplicationInterfaceViewSet(APIBackedViewSet):
         application_interface = serializer.save()
         self.request.airavata_client.updateApplicationInterface(self.authz_token, application_interface.applicationInterfaceId, application_interface)
 
+    @detail_route()
+    def compute_resources(self, request, app_interface_id):
+        compute_resources = request.airavata_client.getAvailableAppInterfaceComputeResources(self.authz_token, app_interface_id)
+        return Response(compute_resources)
+
 class ComputeResourceList(APIView):
     renderer_classes = (JSONRenderer,)
 
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 e9caf1c..90a097d 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">
+    <experiment-editor :experiment="experiment" :app-module="appModule" :app-interface="appInterface">
         <span slot="title">Create a New Experiment</span>
     </experiment-editor>
 </template>
@@ -20,6 +20,7 @@ export default {
         return {
             'experiment': new models.Experiment(),
             'appModule': null,
+            'appInterface': null,
         }
     },
     components: {
@@ -39,6 +40,7 @@ export default {
         services.ApplicationInterfaceService.getForAppModuleId(this.appModuleId)
             .then(appInterface => {
                 this.experiment.experimentInputs = appInterface.getOrderedApplicationInputs().map(input => input.clone());
+                this.appInterface = appInterface;
             });
     }
 }
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 72592fd..2d94d2b 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
@@ -52,6 +52,19 @@
                                     :placeholder="experimentInput.userFriendlyDescription"></b-form-input>
                             </b-form-group>
                         </b-form>
+                        <h2 class="h5 mb-3">
+                            Resource Selection
+                        </h2>
+                        <b-form novalidate>
+                            <b-form-group label="Compute Resource" label-for="compute-resource">
+                                <b-form-select id="compute-resource"
+                                    v-model="experiment.userConfigurationData.computationalResourceScheduling.resourceHostId" :options="computeResourceOptions" required>
+                                    <template slot="first">
+                                        <option :value="null" disabled>Select a Compute Resource</option>
+                                    </template>
+                                </b-form-select>
+                            </b-form-group>
+                        </b-form>
                     </div>
                 </div>
             </div>
@@ -64,10 +77,11 @@ import {models, services} from 'django-airavata-api'
 
 export default {
     name: 'edit-experiment',
-    props: ['experiment', 'appModule'],
+    props: ['experiment', 'appModule', 'appInterface'],
     data () {
         return {
             'projects': [],
+            'computeResources': {},
         }
     },
     mounted: function () {
@@ -80,6 +94,27 @@ export default {
                 value: project.projectID,
                 text: project.name,
             }));
+        },
+        computeResourceOptions: function() {
+            const computeResourceOptions = [];
+            for (let computeResourceId in this.computeResources) {
+                if (this.computeResources.hasOwnProperty(computeResourceId)) {
+                    computeResourceOptions.push({
+                        value: computeResourceId,
+                        text: this.computeResources[computeResourceId],
+                    })
+                }
+            }
+            computeResourceOptions.sort((a, b) => a.text.localeCompare(b.text));
+            return computeResourceOptions;
+        }
+    },
+    watch: {
+        appInterface: function() {
+            if (this.appInterface) {
+                services.ApplicationInterfaceService.getComputeResources(this.appInterface.applicationInterfaceId)
+                    .then(computeResources => this.computeResources = computeResources);
+            }
         }
     }
 }

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