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