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