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/04 17:48:40 UTC

[airavata-django-portal] branch master updated (71968d9 -> cde96c2)

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 71968d9  AIRAVATA-2598 Loading queue defaults for selected app deployment
     new 3b5a18b  AIRAVATA-2598 Moved Vue components into separate packages
     new cde96c2  AIRAVATA-2598 Separated out queue settings into separate component

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_api/js/models/BaseModel.js     |   4 +
 .../js/models/InputDataObjectType.js               |   4 -
 .../experiment}/ExperimentEditor.vue               |  91 ++++----------
 .../components/experiment/QueueSettingsEditor.vue  | 131 +++++++++++++++++++++
 .../project}/ProjectButtonNew.vue                  |   0
 .../{views => components/project}/ProjectList.vue  |   0
 .../project}/ProjectListItem.vue                   |   0
 .../CreateExperimentContainer.vue                  |   2 +-
 .../{views => containers}/DashboardContainer.vue   |   0
 .../{views => containers}/ProjectListContainer.vue |   4 +-
 .../js/entry-create-experiment.js                  |   2 +-
 .../js/entry-dashboard.js                          |   2 +-
 .../js/entry-project-list.js                       |   2 +-
 13 files changed, 161 insertions(+), 81 deletions(-)
 rename django_airavata/apps/workspace/static/django_airavata_workspace/js/{views => components/experiment}/ExperimentEditor.vue (55%)
 create mode 100644 django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/QueueSettingsEditor.vue
 rename django_airavata/apps/workspace/static/django_airavata_workspace/js/{views => components/project}/ProjectButtonNew.vue (100%)
 rename django_airavata/apps/workspace/static/django_airavata_workspace/js/{views => components/project}/ProjectList.vue (100%)
 rename django_airavata/apps/workspace/static/django_airavata_workspace/js/{views => components/project}/ProjectListItem.vue (100%)
 rename django_airavata/apps/workspace/static/django_airavata_workspace/js/{views => containers}/CreateExperimentContainer.vue (94%)
 rename django_airavata/apps/workspace/static/django_airavata_workspace/js/{views => containers}/DashboardContainer.vue (100%)
 rename django_airavata/apps/workspace/static/django_airavata_workspace/js/{views => containers}/ProjectListContainer.vue (93%)

-- 
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 Separated out queue settings into separate component

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 cde96c2626b36d929d0adf80868c41e457ea1bd0
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Thu Jan 4 12:47:44 2018 -0500

    AIRAVATA-2598 Separated out queue settings into separate component
---
 .../django_airavata_api/js/models/BaseModel.js     |   4 +
 .../js/models/InputDataObjectType.js               |   4 -
 .../js/components/experiment/ExperimentEditor.vue  |  91 ++++----------
 .../components/experiment/QueueSettingsEditor.vue  | 131 +++++++++++++++++++++
 4 files changed, 155 insertions(+), 75 deletions(-)

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 119ebd0..c5ef43a 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
@@ -74,4 +74,8 @@ export default class BaseModel {
     validate() {
         return null;
     }
+
+    clone() {
+        return new this.constructor(this);
+    }
 }
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js b/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
index 56bb108..601fdd0 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
@@ -21,8 +21,4 @@ export default class InputDataObjectType extends BaseModel {
     constructor(data = {}) {
         super(FIELDS, data);
     }
-
-    clone() {
-        return new InputDataObjectType(this);
-    }
 }
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 6a66601..1e9db4e 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
@@ -56,9 +56,12 @@
                             Resource Selection
                         </h2>
                         <b-form novalidate>
+                            <!-- TODO: combine compute resource selector with
+                            queue-settings-editor to create a
+                            ComputationalResourceSchedulingModelEditor component -->
                             <b-form-group label="Compute Resource" label-for="compute-resource">
                                 <b-form-select id="compute-resource"
-                                    v-model="experiment.userConfigurationData.computationalResourceScheduling.resourceHostId"
+                                    v-model="resourceHostId"
                                     :options="computeResourceOptions" required
                                     @change="computeResourceChanged">
                                     <template slot="first">
@@ -67,33 +70,12 @@
                                 </b-form-select>
                             </b-form-group>
 
-                            <div class="card border-default">
-                                <div class="card-body">
-                                    <h4 class="card-title">Current Settings</h4>
-                                </div>
-                            </div>
-                            <b-form-group label="Select a Queue" label-for="queue">
-                                <b-form-select id="queue"
-                                    v-model="experiment.userConfigurationData.computationalResourceScheduling.queueName"
-                                    :options="queueOptions" required
-                                    @change="queueChanged">
-                                </b-form-select>
-                            </b-form-group>
-                            <b-form-group label="Node Count" label-for="node-count">
-                                <b-form-input id="node-count" type="number" min="1"
-                                    v-model="experiment.userConfigurationData.computationalResourceScheduling.nodeCount" required>
-                                </b-form-input>
-                            </b-form-group>
-                            <b-form-group label="Total Core Count" label-for="core-count">
-                                <b-form-input id="core-count" type="number" min="1"
-                                    v-model="experiment.userConfigurationData.computationalResourceScheduling.totalCPUCount" required>
-                                </b-form-input>
-                            </b-form-group>
-                            <b-form-group label="Wall Time Limit" label-for="walltime-limit">
-                                <b-form-input id="walltime-limit" type="number" min="1"
-                                    v-model="experiment.userConfigurationData.computationalResourceScheduling.wallTimeLimit" required>
-                                </b-form-input>
-                            </b-form-group>
+                            <queue-settings-editor
+                                v-model="experiment.userConfigurationData.computationalResourceScheduling"
+                                v-if="appDeploymentId && resourceHostId"
+                                :app-deployment-id="appDeploymentId"
+                                :resource-host-id="resourceHostId">
+                            </queue-settings-editor>
                         </b-form>
                     </div>
                 </div>
@@ -103,19 +85,25 @@
 </template>
 
 <script>
+import QueueSettingsEditor from './QueueSettingsEditor.vue'
 import {models, services} from 'django-airavata-api'
 
 export default {
     name: 'edit-experiment',
+    // TODO: clone experiment instead of editing it directly
     props: ['experiment', 'appModule', 'appInterface'],
     data () {
         return {
             projects: [],
             computeResources: {},
             applicationDeployments: [],
-            queueDefaults: [],
+            appDeploymentId: null,
+            resourceHostId: null,
         }
     },
+    components: {
+        QueueSettingsEditor,
+    },
     mounted: function () {
         services.ProjectService.listAll()
             .then(projects => this.projects = projects);
@@ -146,55 +134,16 @@ export default {
             computeResourceOptions.sort((a, b) => a.text.localeCompare(b.text));
             return computeResourceOptions;
         },
-        queueOptions: function() {
-            const queueOptions = this.queueDefaults.map(queueDefault => {
-                return {
-                    value: queueDefault.queueName,
-                    text: `${queueDefault.queueName}: ${queueDefault.queueDescription}`,
-                }
-            });
-            return queueOptions;
-        },
     },
     methods: {
         computeResourceChanged: function(selectedComputeResourceId) {
             // Find application deployment that corresponds to this compute resource
-            // TODO: switch to find()
-            let selectedApplicationDeployments = this.applicationDeployments.filter(dep => dep.computeHostId === selectedComputeResourceId);
-            if (selectedApplicationDeployments.length === 0) {
+            let selectedApplicationDeployment = this.applicationDeployments.find(dep => dep.computeHostId === selectedComputeResourceId);
+            if (!selectedApplicationDeployment) {
                 throw new Error("Failed to find application deployment!");
             }
-            let selectedApplicationDeployment = selectedApplicationDeployments[0];
-            services.ApplicationDeploymentService.getQueues(selectedApplicationDeployment.appDeploymentId)
-                .then(queueDefaults => {
-                    // Sort queue defaults
-                    this.queueDefaults = queueDefaults.sort((a, b) => {
-                        // Sort default first, then by alphabetically by name
-                        if (a.isDefaultQueue) {
-                            return -1;
-                        } else if (b.isDefaultQueue) {
-                            return 1;
-                        } else {
-                            return a.queueName.localeCompare(b.queueName);
-                        }
-                    });
-                    // Find the default queue and apply it's settings
-                    const defaultQueue = this.queueDefaults[0];
-
-                    // TODO: we really shouldn't be modifying the props right?
-                    this.experiment.userConfigurationData.computationalResourceScheduling.queueName = defaultQueue.queueName;
-                    this.experiment.userConfigurationData.computationalResourceScheduling.totalCPUCount = defaultQueue.defaultCPUCount;
-                    this.experiment.userConfigurationData.computationalResourceScheduling.nodeCount = defaultQueue.defaultNodeCount;
-                    this.experiment.userConfigurationData.computationalResourceScheduling.wallTimeLimit = defaultQueue.defaultWalltime;
-                });
+            this.appDeploymentId = selectedApplicationDeployment.appDeploymentId;
         },
-        queueChanged: function(queueName) {
-
-            const queueDefault = this.queueDefaults.find(queue => queue.queueName === queueName);
-            this.experiment.userConfigurationData.computationalResourceScheduling.totalCPUCount = queueDefault.defaultCPUCount;
-            this.experiment.userConfigurationData.computationalResourceScheduling.nodeCount = queueDefault.defaultNodeCount;
-            this.experiment.userConfigurationData.computationalResourceScheduling.wallTimeLimit = queueDefault.defaultWalltime;
-        }
     },
     watch: {
         appInterface: function() {
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/QueueSettingsEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/QueueSettingsEditor.vue
new file mode 100644
index 0000000..b590da3
--- /dev/null
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/QueueSettingsEditor.vue
@@ -0,0 +1,131 @@
+<template>
+    <b-form novalidate>
+
+        <div class="card border-default">
+            <div class="card-body">
+                <h4 class="card-title">Current Settings</h4>
+            </div>
+        </div>
+        <b-form-group label="Select a Queue" label-for="queue">
+            <b-form-select id="queue"
+                v-model="localComputationalResourceScheduling.queueName"
+                :options="queueOptions" required
+                @change="queueChanged">
+            </b-form-select>
+        </b-form-group>
+        <b-form-group label="Node Count" label-for="node-count">
+            <b-form-input id="node-count" type="number" min="1"
+                v-model="localComputationalResourceScheduling.nodeCount" required
+                @change="emitValueChanged">
+            </b-form-input>
+        </b-form-group>
+        <b-form-group label="Total Core Count" label-for="core-count">
+            <b-form-input id="core-count" type="number" min="1"
+                v-model="localComputationalResourceScheduling.totalCPUCount" required
+                @change="emitValueChanged">
+            </b-form-input>
+        </b-form-group>
+        <b-form-group label="Wall Time Limit" label-for="walltime-limit">
+            <b-form-input id="walltime-limit" type="number" min="1"
+                v-model="localComputationalResourceScheduling.wallTimeLimit" required
+                @change="emitValueChanged">
+            </b-form-input>
+        </b-form-group>
+    </b-form>
+</template>
+
+<script>
+import {models, services} from 'django-airavata-api'
+
+export default {
+    name: 'queue-settings-editor',
+    props: {
+        value: {
+            type: models.ComputationalResourceSchedulingModel,
+            required: true
+        },
+        appDeploymentId: {
+            type: String,
+            required: true
+        },
+        resourceHostId: {
+            type: String,
+            required: true
+        }
+    },
+    data () {
+        const localComputationalResourceScheduling = this.value.clone();
+        localComputationalResourceScheduling.resourceHostId = this.resourceHostId;
+        return {
+            localComputationalResourceScheduling: localComputationalResourceScheduling,
+            queueDefaults: [],
+        }
+    },
+    computed: {
+        queueOptions: function() {
+            const queueOptions = this.queueDefaults.map(queueDefault => {
+                return {
+                    value: queueDefault.queueName,
+                    text: `${queueDefault.queueName}: ${queueDefault.queueDescription}`,
+                }
+            });
+            return queueOptions;
+        },
+    },
+    methods: {
+        queueChanged: function(queueName) {
+
+            const queueDefault = this.queueDefaults.find(queue => queue.queueName === queueName);
+            this.localComputationalResourceScheduling.totalCPUCount = queueDefault.defaultCPUCount;
+            this.localComputationalResourceScheduling.nodeCount = queueDefault.defaultNodeCount;
+            this.localComputationalResourceScheduling.wallTimeLimit = queueDefault.defaultWalltime;
+            this.emitValueChanged();
+        },
+        emitValueChanged: function() {
+            this.$emit('input', this.localComputationalResourceScheduling);
+        },
+        loadQueueDefaults: function() {
+            services.ApplicationDeploymentService.getQueues(this.appDeploymentId)
+                .then(queueDefaults => {
+                    // Sort queue defaults
+                    this.queueDefaults = queueDefaults.sort((a, b) => {
+                        // Sort default first, then by alphabetically by name
+                        if (a.isDefaultQueue) {
+                            return -1;
+                        } else if (b.isDefaultQueue) {
+                            return 1;
+                        } else {
+                            return a.queueName.localeCompare(b.queueName);
+                        }
+                    });
+                    // Find the default queue and apply it's settings
+                    const defaultQueue = this.queueDefaults[0];
+
+                    this.localComputationalResourceScheduling.queueName = defaultQueue.queueName;
+                    this.localComputationalResourceScheduling.totalCPUCount = defaultQueue.defaultCPUCount;
+                    this.localComputationalResourceScheduling.nodeCount = defaultQueue.defaultNodeCount;
+                    this.localComputationalResourceScheduling.wallTimeLimit = defaultQueue.defaultWalltime;
+                    this.emitValueChanged();
+                });
+        }
+    },
+    watch: {
+        value: function(newValue) {
+            this.localComputationalResourceScheduling = newValue.clone();
+        },
+        appDeploymentId: function(appDeploymentId) {
+            this.loadQueueDefaults();
+        },
+        resourceHostId: function(resourceHostId) {
+            this.localComputationalResourceScheduling.resourceHostId = resourceHostId;
+            this.emitValueChanged();
+        }
+    },
+    mounted: function() {
+        this.loadQueueDefaults();
+    }
+}
+</script>
+
+<style>
+</style>
\ No newline at end of file

-- 
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 Moved Vue components into separate packages

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 3b5a18beea08cdc3dc6ef26ba5260d72103a0d08
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Tue Jan 2 18:52:05 2018 -0500

    AIRAVATA-2598 Moved Vue components into separate packages
---
 .../js/{views => components/experiment}/ExperimentEditor.vue          | 0
 .../js/{views => components/project}/ProjectButtonNew.vue             | 0
 .../js/{views => components/project}/ProjectList.vue                  | 0
 .../js/{views => components/project}/ProjectListItem.vue              | 0
 .../js/{views => containers}/CreateExperimentContainer.vue            | 2 +-
 .../js/{views => containers}/DashboardContainer.vue                   | 0
 .../js/{views => containers}/ProjectListContainer.vue                 | 4 ++--
 .../static/django_airavata_workspace/js/entry-create-experiment.js    | 2 +-
 .../workspace/static/django_airavata_workspace/js/entry-dashboard.js  | 2 +-
 .../static/django_airavata_workspace/js/entry-project-list.js         | 2 +-
 10 files changed, 6 insertions(+), 6 deletions(-)

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/components/experiment/ExperimentEditor.vue
similarity index 100%
rename from django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ExperimentEditor.vue
rename to django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ProjectButtonNew.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectButtonNew.vue
similarity index 100%
rename from django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ProjectButtonNew.vue
rename to django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectButtonNew.vue
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ProjectList.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectList.vue
similarity index 100%
rename from django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ProjectList.vue
rename to django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectList.vue
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ProjectListItem.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectListItem.vue
similarity index 100%
rename from django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ProjectListItem.vue
rename to django_airavata/apps/workspace/static/django_airavata_workspace/js/components/project/ProjectListItem.vue
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/containers/CreateExperimentContainer.vue
similarity index 94%
rename from django_airavata/apps/workspace/static/django_airavata_workspace/js/views/CreateExperimentContainer.vue
rename to django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/CreateExperimentContainer.vue
index e440313..9ffdb94 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/CreateExperimentContainer.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/CreateExperimentContainer.vue
@@ -7,7 +7,7 @@
 <script>
 
 import {models, services} from 'django-airavata-api'
-import ExperimentEditor from './ExperimentEditor.vue'
+import ExperimentEditor from '../components/experiment/ExperimentEditor.vue'
 
 import moment from 'moment';
 
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/DashboardContainer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/DashboardContainer.vue
similarity index 100%
rename from django_airavata/apps/workspace/static/django_airavata_workspace/js/views/DashboardContainer.vue
rename to django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/DashboardContainer.vue
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ProjectListContainer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/ProjectListContainer.vue
similarity index 93%
rename from django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ProjectListContainer.vue
rename to django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/ProjectListContainer.vue
index 17093af..5cf94a8 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/views/ProjectListContainer.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/containers/ProjectListContainer.vue
@@ -23,8 +23,8 @@
 </template>
 
 <script>
-import ProjectButtonNew from './ProjectButtonNew.vue'
-import ProjectList from './ProjectList.vue'
+import ProjectButtonNew from '../components/project/ProjectButtonNew.vue'
+import ProjectList from '../components/project/ProjectList.vue'
 
 import { models, services } from 'django-airavata-api'
 import { components as comps } from 'django-airavata-common-ui'
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-create-experiment.js b/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-create-experiment.js
index 867e528..1df69e7 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-create-experiment.js
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-create-experiment.js
@@ -1,6 +1,6 @@
 import Vue from 'vue'
 import BootstrapVue from 'bootstrap-vue'
-import CreateExperimentContainer from './views/CreateExperimentContainer.vue'
+import CreateExperimentContainer from './containers/CreateExperimentContainer.vue'
 
 // This is imported globally on the website so no need to include it again in this view
 // import 'bootstrap/dist/css/bootstrap.css'
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-dashboard.js b/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-dashboard.js
index 9edf0c0..a12c97a 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-dashboard.js
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-dashboard.js
@@ -1,6 +1,6 @@
 import Vue from 'vue'
 import BootstrapVue from 'bootstrap-vue'
-import DashboardContainer from './views/DashboardContainer.vue'
+import DashboardContainer from './containers/DashboardContainer.vue'
 
 // This is imported globally on the website so no need to include it again in this view
 // import 'bootstrap/dist/css/bootstrap.css'
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-project-list.js b/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-project-list.js
index ef5d2c7..6d7bec5 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-project-list.js
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/entry-project-list.js
@@ -1,6 +1,6 @@
 import Vue from 'vue'
 import BootstrapVue from 'bootstrap-vue'
-import ProjectListContainer from './views/ProjectListContainer.vue'
+import ProjectListContainer from './containers/ProjectListContainer.vue'
 
 // This is imported globally on the website so no need to include it again in this view
 // import 'bootstrap/dist/css/bootstrap.css'

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