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 <[email protected]> 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 "[email protected]" <[email protected]>.
