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:04 UTC

[airavata-django-portal] 02/02: AIRAVATA-2598 Load queues for deployment with deployment default values

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