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:02 UTC
[airavata-django-portal] branch master updated (acfff5c -> 373cb61)
This is an automated email from the ASF dual-hosted git repository.
machristie pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git.
from acfff5c Copy app interface inputs into experiment inputs and display
new 1c33758 AIRAVATA-2598 Load compute resource options
new 373cb61 AIRAVATA-2598 Load queues for deployment with deployment default values
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
django_airavata/apps/api/serializers.py | 43 ++++++--------------
.../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 | 3 +-
django_airavata/apps/api/views.py | 46 ++++++++++++++++++++++
.../js/views/CreateExperimentContainer.vue | 4 +-
.../js/views/ExperimentEditor.vue | 37 ++++++++++++++++-
thrift_django_serializer.py | 5 ++-
11 files changed, 123 insertions(+), 37 deletions(-)
rename django_airavata/apps/api/static/django_airavata_api/js/models/{ComputationResourceSchedulingModel.js => ComputationalResourceSchedulingModel.js} (100%)
--
To stop receiving notification emails like this one, please contact
['"commits@airavata.apache.org" <co...@airavata.apache.org>'].
[airavata-django-portal] 01/02: AIRAVATA-2598 Load compute resource
options
Posted by ma...@apache.org.
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>.
[airavata-django-portal] 02/02: AIRAVATA-2598 Load queues for
deployment with deployment default values
Posted by ma...@apache.org.
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 373cb6146e8ff4b313cfe395cada4f044669197a
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Fri Dec 15 09:45:55 2017 -0500
AIRAVATA-2598 Load queues for deployment with deployment default values
---
django_airavata/apps/api/serializers.py | 35 ++++++++--------------------
django_airavata/apps/api/urls.py | 1 +
django_airavata/apps/api/views.py | 41 +++++++++++++++++++++++++++++++++
thrift_django_serializer.py | 5 +++-
4 files changed, 56 insertions(+), 26 deletions(-)
diff --git a/django_airavata/apps/api/serializers.py b/django_airavata/apps/api/serializers.py
index cf9c2b2..9f7a583 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -7,6 +7,9 @@ from airavata.model.application.io.ttypes import InputDataObjectType, OutputData
from airavata.model.experiment.ttypes import ExperimentModel
from airavata.model.workspace.ttypes import Project
from airavata.model.appcatalog.appdeployment.ttypes import ApplicationModule
+from airavata.model.appcatalog.computeresource.ttypes import BatchQueue
+import thrift_django_serializer
+
from django.conf import settings
from rest_framework import serializers
@@ -224,31 +227,10 @@ class SetEnvPathsSerializer(CustomSerializer):
raise Exception("Not implemented")
-class ApplicationDeploymentDescriptionSerializer(CustomSerializer):
- appModuleId = serializers.CharField(required=False)
- computeHostId = serializers.CharField(required=False)
- executablePath = serializers.CharField(required=False)
- parallelism = serializers.IntegerField(required=False)
- appDeploymentDescription = serializers.CharField(required=False)
- moduleLoadCmds = serializers.ListSerializer(child=CommandObjectSerializer())
- libPrependPaths = serializers.ListSerializer(child=SetEnvPathsSerializer())
- libAppendPaths = serializers.ListSerializer(child=SetEnvPathsSerializer())
- setEnvironment = serializers.ListSerializer(child=SetEnvPathsSerializer())
- preJobCommands = serializers.ListSerializer(child=CommandObjectSerializer())
- postJobCommands = serializers.ListSerializer(child=CommandObjectSerializer())
- defaultQueueName = serializers.CharField(required=False)
- defaultNodeCount = serializers.IntegerField(required=False)
- defaultCPUCount = serializers.IntegerField(required=False)
- defaultWalltime = serializers.IntegerField(required=False)
- editableByUser = serializers.BooleanField(required=False)
-
- def create(self, validated_data):
- params=self.process_list_fields(validated_data)
- return ApplicationDeploymentDescription(**params)
-
- def update(self, instance, validated_data):
- raise Exception("Not Implemented")
-
+class ApplicationDeploymentDescriptionSerializer(thrift_django_serializer.create_serializer_class(ApplicationDeploymentDescription)):
+ url = FullyEncodedHyperlinkedIdentityField(view_name='django_airavata_api:application-deployment-detail', lookup_field='appDeploymentId', lookup_url_kwarg='app_deployment_id')
+ # Default values returned in these results have been overridden with app deployment defaults for any that exist
+ queues = FullyEncodedHyperlinkedIdentityField(view_name='django_airavata_api:application-deployment-queues', lookup_field='appDeploymentId', lookup_url_kwarg='app_deployment_id')
class ComputeResourceDescriptionSerializer(CustomSerializer):
@@ -257,3 +239,6 @@ class ComputeResourceDescriptionSerializer(CustomSerializer):
ipAddresses=serializers.ListField(child=serializers.CharField())
resourceDescription=serializers.CharField()
enabled=serializers.BooleanField()
+
+class BatchQueueSerializer(thrift_django_serializer.create_serializer_class(BatchQueue)):
+ pass
diff --git a/django_airavata/apps/api/urls.py b/django_airavata/apps/api/urls.py
index 1edc10d..f9c6e4d 100644
--- a/django_airavata/apps/api/urls.py
+++ b/django_airavata/apps/api/urls.py
@@ -13,6 +13,7 @@ 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-interfaces', views.ApplicationInterfaceViewSet, base_name='application-interface')
router.register(r'applications', views.ApplicationModuleViewSet, base_name='application')
+router.register(r'application-deployments', views.ApplicationDeploymentViewSet, base_name='application-deployment')
app_name = 'django_airavata_api'
urlpatterns = [
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index 25cf730..fc79e70 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -341,6 +341,47 @@ class ApplicationInterfaceViewSet(APIBackedViewSet):
compute_resources = request.airavata_client.getAvailableAppInterfaceComputeResources(self.authz_token, app_interface_id)
return Response(compute_resources)
+class ApplicationDeploymentViewSet(APIBackedViewSet):
+
+ serializer_class = serializers.ApplicationDeploymentDescriptionSerializer
+ lookup_field = 'app_deployment_id'
+ lookup_value_regex = '[^/]+'
+
+ def get_list(self):
+ return self.request.airavata_client.getAllApplicationDeployments(self.authz_token, self.gateway_id)
+
+ def get_instance(self, lookup_value):
+ return self.request.airavata_client.getApplicationDeployment(self.authz_token, lookup_value)
+
+ def perform_create(self, serializer):
+ application_deployment = serializer.save()
+ app_deployment_id = self.request.airavata_client.registerApplicationDeployment(self.authz_token, self.gateway_id, application_deployment)
+ application_deployment.appDeploymentId = app_deployment_id
+
+ def perform_update(self, serializer):
+ application_deployment = serializer.save()
+ self.request.airavata_client.updateApplicationDeployment(self.authz_token, application_deployment.appDeploymentId, application_deployment)
+
+ @detail_route()
+ def queues(self, request, app_deployment_id):
+ """Return queues for this deployment with defaults overridden by deployment defaults if they exist"""
+ app_deployment = self.request.airavata_client.getApplicationDeployment(self.authz_token, app_deployment_id)
+ compute_resource = request.airavata_client.getComputeResource(request.authz_token, app_deployment.computeHostId)
+ # Override defaults with app deployment defaults
+ batch_queues = []
+ for batch_queue in compute_resource.batchQueues:
+ if app_deployment.defaultQueueName:
+ batch_queue.isDefaultQueue = (app_deployment.defaultQueueName == batch_queue.queueName)
+ if app_deployment.defaultNodeCount:
+ batch_queue.defaultNodeCount = app_deployment.defaultNodeCount
+ if app_deployment.defaultCPUCount:
+ batch_queue.defaultCPUCount = app_deployment.defaultCPUCount
+ if app_deployment.defaultWalltime:
+ batch_queue.defaultWalltime = app_deployment.defaultWalltime
+ batch_queues.append(batch_queue)
+ serializer = serializers.BatchQueueSerializer(batch_queues, many=True, context={'request': request})
+ return Response(serializer.data)
+
class ComputeResourceList(APIView):
renderer_classes = (JSONRenderer,)
diff --git a/thrift_django_serializer.py b/thrift_django_serializer.py
index f3cb713..e23671e 100644
--- a/thrift_django_serializer.py
+++ b/thrift_django_serializer.py
@@ -27,6 +27,9 @@ def create_serializer(thrift_data_type, **kwargs):
:param kwargs: Other Django Framework Serializer initialization parameters
:return: instance of custom serializer for the given thrift data type
"""
+ return create_serializer_class(thrift_data_type)(**kwargs)
+
+def create_serializer_class(thrift_data_type):
class CustomSerializerMeta(SerializerMetaclass):
def __new__(cls, name, bases, attrs):
@@ -58,7 +61,7 @@ def create_serializer(thrift_data_type, **kwargs):
def update(self, instance, validated_data):
raise Exception("Not implemented")
- return CustomSerializer(**kwargs)
+ return CustomSerializer
def process_field(field):
--
To stop receiving notification emails like this one, please contact
"commits@airavata.apache.org" <co...@airavata.apache.org>.