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/29 21:07:14 UTC

[airavata-django-portal] 02/03: AIRAVATA-2615 Redirect from launch to experiment summary

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 9289284d07f62afe39a63e690b5fba44d4f2b96b
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Mon Jan 29 10:53:34 2018 -0500

    AIRAVATA-2615 Redirect from launch to experiment summary
    
    'launching' query param/prop added to experiment summary to indicate
    that the experiment is currently launching so that experiment summary
    knows to poll for status updates until the experiment has launched.
---
 .../django_airavata_api/js/models/Experiment.js    | 13 ++++++++
 .../js/components/experiment/ExperimentSummary.vue | 35 ++++++++++++----------
 .../js/containers/CreateExperimentContainer.vue    | 13 +++++++-
 .../js/containers/ViewExperimentContainer.vue      |  6 +++-
 .../js/entry-view-experiment.js                    |  6 +++-
 .../django_airavata_workspace/view_experiment.html |  2 +-
 django_airavata/apps/workspace/views.py            |  5 +++-
 7 files changed, 59 insertions(+), 21 deletions(-)

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 560e4ce..bcbffdc 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
@@ -109,4 +109,17 @@ export default class Experiment extends BaseModel {
             && this.experimentStatus.length > 0
             && progressingStates.indexOf(this.experimentStatus[0].state) >= 0;
     }
+
+    get hasLaunched() {
+        const hasLaunchedStates = [ExperimentState.SCHEDULED,
+                                   ExperimentState.LAUNCHED,
+                                   ExperimentState.EXECUTING,
+                                   ExperimentState.CANCELING,
+                                   ExperimentState.CANCELED,
+                                   ExperimentState.FAILED,
+                                   ExperimentState.COMPLETED];
+        return this.experimentStatus
+            && this.experimentStatus.length > 0
+            && hasLaunchedStates.indexOf(this.experimentStatus[0].state) >= 0;
+    }
 }
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentSummary.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentSummary.vue
index ba00545..17d2634 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentSummary.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentSummary.vue
@@ -23,12 +23,12 @@
                                 </tr>
                                 <tr>
                                     <th scope="row">Project</th>
-                                    <td>{{ fullExperiment.projectName }}</td>
+                                    <td>{{ localFullExperiment.projectName }}</td>
                                 </tr>
                                 <tr>
                                     <th scope="row">Outputs</th>
                                     <td>
-                                        <template v-for="output in fullExperiment.outputDataProducts">
+                                        <template v-for="output in localFullExperiment.outputDataProducts">
                                             {{ output.filename }}
                                         </template>
                                     </td>
@@ -44,27 +44,27 @@
                                 </tr>
                                 <tr>
                                     <th scope="row">Application</th>
-                                    <td>{{ fullExperiment.applicationName }}</td>
+                                    <td>{{ localFullExperiment.applicationName }}</td>
                                 </tr>
                                 <tr>
                                     <th scope="row">Compute Resource</th>
-                                    <td>{{ fullExperiment.computeHostName }}</td>
+                                    <td>{{ localFullExperiment.computeHostName }}</td>
                                 </tr>
                                 <tr>
                                     <th scope="row">Experiment Status</th>
                                     <td>
-                                        <template v-if="fullExperiment.experiment.isProgressing">
+                                        <template v-if="localFullExperiment.experiment.isProgressing">
                                             <i class="fa fa-refresh fa-spin"></i>
                                             <span class="sr-only">Progressing...</span>
                                         </template>
-                                        {{ fullExperiment.experimentStatusName }}
+                                        {{ localFullExperiment.experimentStatusName }}
                                     </td>
                                 </tr>
                                 <!--  TODO: leave this out for now -->
                                 <!-- <tr>
                                     <th scope="row">Notification List</th>
-                                    <td>{{ fullExperiment.experiment.emailAddresses
-                                            ? fullExperiment.experiment.emailAddresses.join(", ")
+                                    <td>{{ experiment.emailAddresses
+                                            ? experiment.emailAddresses.join(", ")
                                             : '' }}</td>
                                 </tr> -->
                                 <tr>
@@ -73,7 +73,7 @@
                                 </tr>
                                 <tr>
                                     <th scope="row">Last Modified Time</th>
-                                    <td><span :title="fullExperiment.experimentStatus.timeOfStateChange.toString()">{{ lastModifiedTime }}</span></td>
+                                    <td><span :title="localFullExperiment.experimentStatus.timeOfStateChange.toString()">{{ lastModifiedTime }}</span></td>
                                 </tr>
                                 <tr>
                                     <th scope="row">Wall Time Limit</th>
@@ -95,7 +95,7 @@
                                     <!-- TODO -->
                                     <th scope="row">Inputs</th>
                                     <td>
-                                        <template v-for="input in fullExperiment.inputDataProducts">
+                                        <template v-for="input in localFullExperiment.inputDataProducts">
                                             {{ input.filename }}
                                         </template>
                                     </td>
@@ -127,6 +127,10 @@ export default {
             type: models.FullExperiment,
             required: true
         },
+        launching: {
+            type: Boolean,
+            default: false
+        }
     },
     data () {
         return {
@@ -153,13 +157,12 @@ export default {
         },
         initPollingExperiment: function() {
             var pollExperiment = function() {
-                if (!this.localFullExperiment.experiment.isProgressing) {
-                    return;
+                if ((this.launching && !this.localFullExperiment.experiment.hasLaunched) || this.localFullExperiment.experiment.isProgressing) {
+                    this.loadExperiment()
+                        .then(exp => {
+                            setTimeout(pollExperiment.bind(this), 3000);
+                        });
                 }
-                this.loadExperiment()
-                    .then(exp => {
-                        setTimeout(pollExperiment.bind(this), 3000);
-                    })
             }.bind(this);
             setTimeout(pollExperiment, 3000);
         }
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/CreateExperimentContainer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/CreateExperimentContainer.vue
index 52b6e9d..1ece761 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/CreateExperimentContainer.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/CreateExperimentContainer.vue
@@ -1,5 +1,8 @@
 <template>
-    <experiment-editor v-if="appModule && appInterface" :experiment="experiment" :app-module="appModule" :app-interface="appInterface">
+    <experiment-editor v-if="appModule && appInterface" :experiment="experiment"
+            :app-module="appModule" :app-interface="appInterface"
+            @saved="handleSavedExperiment"
+            @savedAndLaunched="handleSavedAndLaunchedExperiment">
         <span slot="title">Create a New Experiment</span>
     </experiment-editor>
 </template>
@@ -27,6 +30,14 @@ export default {
         'experiment-editor': ExperimentEditor,
     },
     methods: {
+        handleSavedExperiment: function(experiment) {
+            // Redirect to experiment view
+            window.location.assign("/workspace/experiments/" + encodeURIComponent(experiment.experimentId) + "/");
+        },
+        handleSavedAndLaunchedExperiment: function(experiment) {
+            // Redirect to experiment view
+            window.location.assign("/workspace/experiments/" + encodeURIComponent(experiment.experimentId) + "/?launching=true");
+        }
     },
     computed: {
     },
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/ViewExperimentContainer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/ViewExperimentContainer.vue
index bebfffa..979c3ac 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/ViewExperimentContainer.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/ViewExperimentContainer.vue
@@ -1,5 +1,5 @@
 <template>
-    <experiment-summary v-if="fullExperiment" :fullExperiment="fullExperiment">
+    <experiment-summary v-if="fullExperiment" :fullExperiment="fullExperiment" :launching="launching">
     </experiment-summary>
 </template>
 
@@ -14,6 +14,10 @@ export default {
         initialFullExperimentData: {
             required: true
         },
+        launching: {
+            type: Boolean,
+            default: false,
+        }
     },
     data () {
         return {
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-view-experiment.js b/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-view-experiment.js
index a2c8c8b..cde5d1f 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-view-experiment.js
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-view-experiment.js
@@ -10,10 +10,11 @@ Vue.use(BootstrapVue);
 
 new Vue({
   el: '#view-experiment',
-  template: '<view-experiment-container :initial-full-experiment-data="fullExperimentData"></view-experiment-container>',
+  template: '<view-experiment-container :initial-full-experiment-data="fullExperimentData" :launching="launching"></view-experiment-container>',
   data () {
       return {
           fullExperimentData: null,
+          launching: false,
       }
   },
   components: {
@@ -21,5 +22,8 @@ new Vue({
   },
   beforeMount: function () {
       this.fullExperimentData = JSON.parse(this.$el.dataset.fullExperimentData);
+      if ('launching' in this.$el.dataset) {
+          this.launching = JSON.parse(this.$el.dataset.launching);
+      }
   }
 })
diff --git a/django_airavata/apps/workspace/templates/django_airavata_workspace/view_experiment.html b/django_airavata/apps/workspace/templates/django_airavata_workspace/view_experiment.html
index 0f12b5e..c06baaa 100644
--- a/django_airavata/apps/workspace/templates/django_airavata_workspace/view_experiment.html
+++ b/django_airavata/apps/workspace/templates/django_airavata_workspace/view_experiment.html
@@ -9,7 +9,7 @@
 
 {% block content %}
 
-<div id="view-experiment" data-full-experiment-data="{{ full_experiment_data }}"></div>
+<div id="view-experiment" data-full-experiment-data="{{ full_experiment_data }}" data-launching="{{ launching }}"></div>
 
 {% endblock content %}
 
diff --git a/django_airavata/apps/workspace/views.py b/django_airavata/apps/workspace/views.py
index 9f78172..363475c 100644
--- a/django_airavata/apps/workspace/views.py
+++ b/django_airavata/apps/workspace/views.py
@@ -1,4 +1,5 @@
 
+import json
 import logging
 
 from rest_framework.renderers import JSONRenderer
@@ -47,10 +48,12 @@ def create_experiment(request, app_module_id):
 def view_experiment(request, experiment_id):
     request.active_nav_item = 'experiments'
 
+    launching = json.loads(request.GET.get('launching', 'false'))
     response = FullExperimentViewSet.as_view(
         {'get': 'retrieve'})(request, experiment_id=experiment_id)
     full_experiment_json = JSONRenderer().render(response.data)
 
     return render(request, 'django_airavata_workspace/view_experiment.html', {
-        'full_experiment_data': full_experiment_json
+        'full_experiment_data': full_experiment_json,
+        'launching': json.dumps(launching),
     })

-- 
To stop receiving notification emails like this one, please contact
machristie@apache.org.