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 2018/01/11 16:18:48 UTC

[airavata-django-portal] 01/04: AIRAVATA-2598 Launch an experiment

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 a103b6e03b2a3751c14a99255d1079f85883ef4f
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Wed Jan 10 12:05:54 2018 -0500

    AIRAVATA-2598 Launch an experiment
---
 .../js/services/ApplicationInterfaceService.js     |  2 +-
 .../js/services/ExperimentService.js               | 30 ++++++++++++++++--
 .../django_airavata_api/js/utils/FetchUtils.js     | 23 +++++++++++++-
 django_airavata/apps/api/thrift_utils.py           | 12 +++++++
 django_airavata/apps/api/views.py                  |  8 +++--
 .../js/components/experiment/ExperimentEditor.vue  | 37 ++++++++++++----------
 django_airavata/settings_local.py.sample           |  1 +
 7 files changed, 89 insertions(+), 24 deletions(-)

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 f0eeb0c..796c666 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
@@ -25,7 +25,7 @@ class ApplicationIterfaceService {
     }
 
     getComputeResources(appInterfaceId) {
-        return FetchUtils.get('/api/application-interfaces/' + encodeURIComponent(appInterfaceId) + '/compute_resources');
+        return FetchUtils.get('/api/application-interfaces/' + encodeURIComponent(appInterfaceId) + '/compute_resources/');
     }
 }
 
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/services/ExperimentService.js b/django_airavata/apps/api/static/django_airavata_api/js/services/ExperimentService.js
index b840b86..0aa81b5 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/services/ExperimentService.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/services/ExperimentService.js
@@ -17,12 +17,36 @@ class ExperimentService {
             .then(result => new Experiment(result));
     }
 
-    update() {
-        // TODO
+    update(experiment) {
+        return FetchUtils.put('/api/experiments/'
+                + encodeURIComponent(experiment.experimentId) + '/',
+                JSON.stringify(experiment))
+            .then(result => new Experiment(result));
+    }
+
+    save(experiment) {
+        if (experiment.experimentId) {
+            return this.update(experiment);
+        } else {
+            return this.create(experiment);
+        }
     }
 
     get() {
-        // TODO
+        return FetchUtils.get('/api/experiments/'
+                + encodeURIComponent(experiment.experimentId) + '/')
+            .then(result => new Experiment(result));
+    }
+
+    launch(experimentId) {
+        return FetchUtils.post('/api/experiments/' + encodeURIComponent(experimentId) + '/launch/')
+            .then(result => {
+                if (result.success) {
+                    return Promise.resolve(result);
+                } else {
+                    return Promise.reject(result);
+                }
+            });
     }
 }
 
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/utils/FetchUtils.js b/django_airavata/apps/api/static/django_airavata_api/js/utils/FetchUtils.js
index 8e09498..074e4ea 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/utils/FetchUtils.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/utils/FetchUtils.js
@@ -38,11 +38,32 @@ export default {
             }
         })
     },
+    put: function (url, body, mediaType = "application/json") {
+        var headers = this.createHeaders(mediaType)
+        return fetch(url, {
+            method: 'put',
+            body: typeof body !== 'string' ? JSON.stringify(body) : body,
+            headers: headers,
+            credentials: "same-origin"
+        }).then((response) => {
+            if (response.ok) {
+                return Promise.resolve(response.json())
+            } else {
+                let error = new Error(response.statusText);
+                return response.json().then(json => {
+                    error.data = json;
+                })
+                .then(() => Promise.reject(error),() => Promise.reject(error));
+            }
+        })
+    },
     get: function (url, queryParams = "", mediaType = "application/json") {
         if (queryParams && typeof(queryParams) != "string") {
             queryParams = Object.keys(queryParams).map(key => encodeURIComponent(key) + "=" + encodeURIComponent(queryParams[key])).join("&")
         }
-        url=url+"?"+queryParams
+        if (queryParams) {
+            url=url+"?"+queryParams
+        }
         var headers = this.createHeaders(mediaType)
         return fetch(url, {
             method: 'get',
diff --git a/django_airavata/apps/api/thrift_utils.py b/django_airavata/apps/api/thrift_utils.py
index 476cfbf..363a016 100644
--- a/django_airavata/apps/api/thrift_utils.py
+++ b/django_airavata/apps/api/thrift_utils.py
@@ -67,8 +67,20 @@ def create_serializer_class(thrift_data_type):
                     params[field_name] = serializer.create(params[field_name])
             return params
 
+        def process_empty_char_fields(self, validated_data):
+            """Convert empty CharFields to None."""
+            fields = self.fields
+            params = copy.deepcopy(validated_data)
+            for field_name, serializer in fields.items():
+                if isinstance(serializer, CharField) \
+                        and params.get(field_name, None) is not None \
+                        and params[field_name].strip() == '':
+                    params[field_name] = None
+            return params
+
         def create(self, validated_data):
             params = self.process_nested_fields(validated_data)
+            params = self.process_empty_char_fields(params)
             return thrift_data_type(**params)
 
         def update(self, instance, validated_data):
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index dcada13..7d2f6ed 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -239,6 +239,7 @@ class ExperimentViewSet(APIBackedViewSet):
 
     def perform_create(self, serializer):
         experiment = serializer.save()
+        experiment.userConfigurationData.storageId = settings.GATEWAY_DATA_STORE_RESOURCE_ID
         experiment_id = self.request.airavata_client.createExperiment(self.authz_token, self.gateway_id, experiment)
         experiment.experimentId = experiment_id
 
@@ -248,8 +249,11 @@ class ExperimentViewSet(APIBackedViewSet):
 
     @detail_route(methods=['post'])
     def launch(self, request, experiment_id=None):
-        request.airavata_client.launchExperiment(request.authz_token, experiment_id, self.gateway_id)
-        return Response({'success': True})
+        try:
+            request.airavata_client.launchExperiment(request.authz_token, experiment_id, self.gateway_id)
+            return Response({'success': True})
+        except Exception as e:
+            return Response({'success': False, 'errorMessage': e.message})
 
 
 class ApplicationModuleViewSet(APIBackedViewSet):
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue
index 8ec6543..76040ca 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue
@@ -126,27 +126,30 @@ export default {
             console.log(JSON.stringify(this.localExperiment));
             // TODO: validate experiment
             // save experiment
-            if (this.localExperiment.experimentId) {
-                services.ExperimentService.update(this.localExperiment)
-                    .then(experiment => {
-                        console.log(experiment);
-                        this.$emit('saved', experiment);
-                    });
-            } else {
-                services.ExperimentService.create(this.localExperiment)
-                    .then(experiment => {
-                        this.localExperiment.experimentId = experiment.experimentId;
-                        console.log(experiment);
-                        this.$emit('saved', experiment);
-                    });
-            }
+            services.ExperimentService.save(this.localExperiment)
+                .then(experiment => {
+                    this.localExperiment = experiment;
+                    console.log(experiment);
+                    alert('Experiment saved!');
+                    this.$emit('saved', experiment);
+                });
         },
         saveAndLaunchExperiment: function() {
             console.log(JSON.stringify(this.localExperiment));
             // TODO: validate experiment
-            // TODO: save experiment
-            // TODO: set the experiment ID on the new experiment
-            // TODO: dispatch save event with updated experiment
+            let savedExperiment = null;
+            services.ExperimentService.save(this.localExperiment)
+                .then(experiment => {
+                    this.localExperiment = experiment;
+                    return services.ExperimentService.launch(experiment.experimentId)
+                        .then(result => {
+                            alert('Experiment launched!');
+                            this.$emit('savedAndLaunched', experiment);
+                        });
+                    })
+                .catch(result => {
+                    console.log("Launch failed!", result);
+                });
         },
     },
     watch: {
diff --git a/django_airavata/settings_local.py.sample b/django_airavata/settings_local.py.sample
index c847179..30037c3 100644
--- a/django_airavata/settings_local.py.sample
+++ b/django_airavata/settings_local.py.sample
@@ -32,6 +32,7 @@ GATEWAY_ID = 'default'
 AIRAVATA_API_HOST = 'localhost'
 AIRAVATA_API_PORT = 8930
 AIRAVATA_API_SECURE = False
+GATEWAY_DATA_STORE_RESOURCE_ID = '...'
 
 # Sharing API Configuration
 SHARING_API_HOST = 'localhost'

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