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

[airavata-django-portal] branch master updated (9ba962d -> 550884b)

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 9ba962d  AIRAVATA-2615 Stop polling if experiment no longer progressing
     new 11c3dac  AIRAVATA-2615 experimentStatus is read only
     new 9289284  AIRAVATA-2615 Redirect from launch to experiment summary
     new 550884b  AIRAVATA-2615 List job details in experiment summary

The 3 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            | 12 ++++-
 .../django_airavata_api/js/models/Experiment.js    | 13 +++++
 .../js/models/FullExperiment.js                    | 10 +++-
 .../static/django_airavata_api/js/models/Job.js    | 30 ++++++++++++
 .../django_airavata_api/js/models/JobState.js      | 14 ++++++
 .../models/{ExperimentStatus.js => JobStatus.js}   |  8 +--
 django_airavata/apps/api/views.py                  | 13 ++++-
 .../js/components/experiment/ExperimentSummary.vue | 57 ++++++++++++++++------
 .../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 +-
 13 files changed, 159 insertions(+), 30 deletions(-)
 create mode 100644 django_airavata/apps/api/static/django_airavata_api/js/models/Job.js
 create mode 100644 django_airavata/apps/api/static/django_airavata_api/js/models/JobState.js
 copy django_airavata/apps/api/static/django_airavata_api/js/models/{ExperimentStatus.js => JobStatus.js} (58%)

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

[airavata-django-portal] 01/03: AIRAVATA-2615 experimentStatus is read only

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 11c3daccd82d208642dc1d4659e454653cd01440
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Mon Jan 29 09:36:08 2018 -0500

    AIRAVATA-2615 experimentStatus is read only
---
 django_airavata/apps/api/serializers.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/django_airavata/apps/api/serializers.py b/django_airavata/apps/api/serializers.py
index a230503..d9d32cc 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -248,7 +248,7 @@ class ExperimentSerializer(
     userName = GatewayUsernameDefaultField()
     gatewayId = GatewayIdDefaultField()
     creationTime = UTCPosixTimestampDateTimeField(allow_null=True)
-    experimentStatus = ExperimentStatusSerializer(many=True)
+    experimentStatus = ExperimentStatusSerializer(many=True, read_only=True)
 
 
 class DataReplicaLocationSerializer(

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

[airavata-django-portal] 03/03: AIRAVATA-2615 List job details in experiment summary

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 550884b5e2a4096d90a245614a83eeccc3b00fe5
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Mon Jan 29 16:07:04 2018 -0500

    AIRAVATA-2615 List job details in experiment summary
---
 django_airavata/apps/api/serializers.py            | 10 +++++++-
 .../js/models/FullExperiment.js                    | 10 ++++++--
 .../static/django_airavata_api/js/models/Job.js    | 30 ++++++++++++++++++++++
 .../django_airavata_api/js/models/JobState.js      | 14 ++++++++++
 .../django_airavata_api/js/models/JobStatus.js     | 20 +++++++++++++++
 django_airavata/apps/api/views.py                  | 13 +++++++++-
 .../js/components/experiment/ExperimentSummary.vue | 22 ++++++++++++++++
 7 files changed, 115 insertions(+), 4 deletions(-)

diff --git a/django_airavata/apps/api/serializers.py b/django_airavata/apps/api/serializers.py
index d9d32cc..3a0fd09 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -5,6 +5,7 @@ from airavata.model.appcatalog.computeresource.ttypes import BatchQueue
 from airavata.model.application.io.ttypes import InputDataObjectType, OutputDataObjectType
 from airavata.model.data.replica.ttypes import DataProductModel, DataReplicaLocationModel
 from airavata.model.experiment.ttypes import ExperimentModel
+from airavata.model.job.ttypes import JobModel
 from airavata.model.status.ttypes import ExperimentStatus
 from airavata.model.workspace.ttypes import Project
 
@@ -245,6 +246,7 @@ class ExperimentSerializer(
     url = FullyEncodedHyperlinkedIdentityField(view_name='django_airavata_api:experiment-detail', lookup_field='experimentId', lookup_url_kwarg='experiment_id')
     full_experiment = FullyEncodedHyperlinkedIdentityField(view_name='django_airavata_api:full-experiment-detail', lookup_field='experimentId', lookup_url_kwarg='experiment_id')
     project = FullyEncodedHyperlinkedIdentityField(view_name='django_airavata_api:project-detail', lookup_field='projectId', lookup_url_kwarg='project_id')
+    jobs = FullyEncodedHyperlinkedIdentityField(view_name='django_airavata_api:experiment-jobs', lookup_field='experimentId', lookup_url_kwarg='experiment_id')
     userName = GatewayUsernameDefaultField()
     gatewayId = GatewayIdDefaultField()
     creationTime = UTCPosixTimestampDateTimeField(allow_null=True)
@@ -270,7 +272,7 @@ class FullExperiment:
 
     def __init__(self, experimentModel, project=None, outputDataProducts=None,
                  inputDataProducts=None, applicationModule=None,
-                 computeResource=None):
+                 computeResource=None, jobDetails=None):
         self.experiment = experimentModel
         self.experimentId = experimentModel.experimentId
         self.project = project
@@ -278,6 +280,11 @@ class FullExperiment:
         self.inputDataProducts = inputDataProducts
         self.applicationModule = applicationModule
         self.computeResource = computeResource
+        self.jobDetails = jobDetails
+
+
+class JobSerializer(thrift_utils.create_serializer_class(JobModel)):
+    creationTime = UTCPosixTimestampDateTimeField()
 
 
 class FullExperimentSerializer(serializers.Serializer):
@@ -291,6 +298,7 @@ class FullExperimentSerializer(serializers.Serializer):
     applicationModule = ApplicationModuleSerializer(read_only=True)
     computeResource = ComputeResourceDescriptionSerializer(read_only=True)
     project = ProjectSerializer(read_only=True)
+    jobDetails = JobSerializer(many=True, read_only=True)
 
     def create(self, validated_data):
         raise Exception("Not implemented")
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/FullExperiment.js b/django_airavata/apps/api/static/django_airavata_api/js/models/FullExperiment.js
index 6059b2a..b7bac6a 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/FullExperiment.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/FullExperiment.js
@@ -2,8 +2,9 @@
 import ApplicationModule from './ApplicationModule'
 import BaseModel from './BaseModel'
 import ComputeResourceDescription from './ComputeResourceDescription'
-import DataProduct from './DataProduct.js'
+import DataProduct from './DataProduct'
 import Experiment from './Experiment'
+import Job from './Job'
 import Project from './Project'
 
 const FIELDS = [
@@ -33,7 +34,12 @@ const FIELDS = [
         name: 'inputDataProducts',
         type: DataProduct,
         list: true
-    }
+    },
+    {
+        name: 'jobDetails',
+        type: Job,
+        list: true,
+    },
 ];
 
 export default class FullExperiment extends BaseModel {
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/Job.js b/django_airavata/apps/api/static/django_airavata_api/js/models/Job.js
new file mode 100644
index 0000000..866088a
--- /dev/null
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/Job.js
@@ -0,0 +1,30 @@
+import BaseModel from './BaseModel';
+import JobStatus from './JobStatus';
+
+const FIELDS = [
+     'jobId',
+     'taskId',
+     'processId',
+     'jobDescription',
+     {
+         name: 'creationTime',
+         type: 'date',
+     },
+     {
+         name: 'jobStatuses',
+         type: JobStatus,
+         list: true,
+     },
+     'computeResourceConsumed',
+     'jobName',
+     'workingDir',
+     'stdOut',
+     'stdErr',
+     'exitCode',
+];
+
+export default class Job extends BaseModel {
+    constructor(data = {}) {
+        super(FIELDS, data);
+    }
+}
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/JobState.js b/django_airavata/apps/api/static/django_airavata_api/js/models/JobState.js
new file mode 100644
index 0000000..88d616d
--- /dev/null
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/JobState.js
@@ -0,0 +1,14 @@
+import BaseEnum from './BaseEnum'
+
+export default class JobState extends BaseEnum {
+}
+JobState.init([
+    'SUBMITTED',
+    'QUEUED',
+    'ACTIVE',
+    'COMPLETE',
+    'CANCELED',
+    'FAILED',
+    'SUSPENDED',
+    'UNKNOWN',
+]);
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/JobStatus.js b/django_airavata/apps/api/static/django_airavata_api/js/models/JobStatus.js
new file mode 100644
index 0000000..3aaac57
--- /dev/null
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/JobStatus.js
@@ -0,0 +1,20 @@
+import BaseModel from './BaseModel';
+import JobState from './JobState';
+
+const FIELDS = [
+     {
+         name: 'jobState',
+         type: JobState,
+     },
+     {
+         name: 'timeOfStateChange',
+         type: 'date',
+     },
+     'reason',
+];
+
+export default class JobStatus extends BaseModel {
+    constructor(data = {}) {
+        super(FIELDS, data);
+    }
+}
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index 99fce0d..c9b2f57 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -259,6 +259,14 @@ class ExperimentViewSet(APIBackedViewSet):
         except Exception as e:
             return Response({'success': False, 'errorMessage': e.message})
 
+    @detail_route(methods=['get'])
+    def jobs(self, request, experiment_id=None):
+        jobs = request.airavata_client.getJobDetails(
+            self.authz_token, experiment_id)
+        serializer = serializers.JobSerializer(
+            jobs, many=True, context={'request': request})
+        return Response(serializer.data)
+
 
 class FullExperimentViewSet(mixins.RetrieveModelMixin,
                             GenericAPIBackedViewSet):
@@ -303,13 +311,16 @@ class FullExperimentViewSet(mixins.RetrieveModelMixin,
             if compute_resource_id else None
         project = self.request.airavata_client.getProject(
             self.authz_token, experimentModel.projectId)
+        job_details = self.request.airavata_client.getJobDetails(
+            self.authz_token, lookup_value)
         full_experiment = serializers.FullExperiment(
             experimentModel,
             project=project,
             outputDataProducts=outputDataProducts,
             inputDataProducts=inputDataProducts,
             applicationModule=applicationModule,
-            computeResource=compute_resource)
+            computeResource=compute_resource,
+            jobDetails=job_details)
         return full_experiment
 
 
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 17d2634..7a327f7 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
@@ -60,6 +60,25 @@
                                         {{ localFullExperiment.experimentStatusName }}
                                     </td>
                                 </tr>
+                                <tr v-if="localFullExperiment.jobDetails && localFullExperiment.jobDetails.length > 0">
+                                    <th scope="row">Job</th>
+                                    <td>
+                                        <table class="table">
+                                            <thead>
+                                                <th>Name</th>
+                                                <th>ID</th>
+                                                <th>Status</th>
+                                                <th>Creation Time</th>
+                                            </thead>
+                                            <tr v-for="(jobDetail, index) in localFullExperiment.jobDetails">
+                                                <td>{{ jobDetail.jobName }}</td>
+                                                <td>{{ jobDetail.jobId }}</td>
+                                                <td>{{ jobDetail.jobStatuses[0].jobState.name }}</td>
+                                                <td><span :title="jobDetail.creationTime.toString()">{{ jobCreationTimes[index] }}</span></td>
+                                            </tr>
+                                        </table>
+                                    </td>
+                                </tr>
                                 <!--  TODO: leave this out for now -->
                                 <!-- <tr>
                                     <th scope="row">Notification List</th>
@@ -148,6 +167,9 @@ export default {
         },
         experiment: function() {
             return this.localFullExperiment.experiment;
+        },
+        jobCreationTimes: function() {
+            return this.localFullExperiment.jobDetails.map(jobDetail => moment(jobDetail.creationTime).fromNow());
         }
     },
     methods: {

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

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

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