| /*! |
| * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing |
| * permissions and limitations under the License. |
| */ |
| import RestAPIUtil from 'nfvo-utils/RestAPIUtil.js'; |
| import i18n from 'nfvo-utils/i18n/i18n.js'; |
| import isEqual from 'lodash/isEqual.js'; |
| import cloneDeep from 'lodash/cloneDeep.js'; |
| import {actionTypes as modalActionTypes} from 'nfvo-components/modal/GlobalModalConstants.js'; |
| import {modalContentMapper} from 'sdc-app/common/modal/ModalContentMapper.js'; |
| import {actionTypes as softwareProductsActionTypes} from '../onboarding/softwareProduct/SoftwareProductConstants.js'; |
| import {actionTypes as HeatSetupActions} from '../onboarding/softwareProduct/attachments/setup/HeatSetupConstants.js'; |
| |
| |
| |
| const options = { |
| headers: { |
| HTTP_CSP_ATTUID: 'validationOnlyVspUser' |
| } |
| }; |
| |
| |
| function getTimestampString() { |
| let date = new Date(); |
| let z = n => n < 10 ? '0' + n : n; |
| return `${date.getFullYear()}-${z(date.getMonth())}-${z(date.getDate())}_${z(date.getHours())}-${z(date.getMinutes())}`; |
| } |
| |
| function fetchVspId() { |
| |
| let vspId = sessionStorage.getItem('validationAppVspId'); |
| if (vspId) { |
| return Promise.resolve({value: vspId}); |
| }else { |
| return RestAPIUtil.fetch('/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/validation-vsp', options) |
| .then(response => { |
| sessionStorage.setItem('validationAppVspId', response.value); |
| return Promise.resolve(response); |
| }); |
| } |
| |
| } |
| |
| |
| function showFileSaveDialog({blob, xhr, defaultFilename, addTimestamp}) { |
| let filename; |
| let contentDisposition = xhr.getResponseHeader('content-disposition'); |
| let match = contentDisposition ? contentDisposition.match(/filename=(.*?)(;|$)/) : false; |
| if (match) { |
| filename = match[1]; |
| } else { |
| filename = defaultFilename; |
| } |
| |
| if (addTimestamp) { |
| filename = filename.replace(/(^.*?)\.([^.]+$)/, `$1_${getTimestampString()}.$2`); |
| } |
| |
| let link = document.createElement('a'); |
| let url = URL.createObjectURL(blob); |
| link.href = url; |
| link.download = filename; |
| link.style.display = 'none'; |
| document.body.appendChild(link); |
| link.click(); |
| setTimeout(function(){ |
| document.body.removeChild(link); |
| URL.revokeObjectURL(url); |
| }, 0); |
| } |
| |
| |
| function uploadFile(formData) { |
| return fetchVspId() |
| .then(response => { |
| return RestAPIUtil.post(`/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/${response.value}/versions/0.1/orchestration-template-candidate`, formData, options); |
| }); |
| } |
| |
| function loadSoftwareProductHeatCandidate(dispatch){ |
| return fetchVspId() |
| .then(response => { |
| return RestAPIUtil.fetch(`/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/${response.value}/versions/0.1/orchestration-template-candidate/manifest`, options) |
| .then(response => dispatch({ |
| type: HeatSetupActions.MANIFEST_LOADED, |
| response |
| })); |
| }); |
| } |
| |
| function updateHeatCandidate(dispatch, heatCandidate) { |
| return fetchVspId() |
| .then(response => { |
| return RestAPIUtil.put(`/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/${response.value}/versions/0.1/orchestration-template-candidate/manifest`, |
| heatCandidate.heatData, options) |
| .then(null, error => { |
| dispatch({ |
| type: modalActionTypes.GLOBAL_MODAL_ERROR, |
| data: { |
| title: i18n('Save Failed'), |
| modalComponentName: modalContentMapper.SUMBIT_ERROR_RESPONSE, |
| modalComponentProps: { |
| validationResponse: error.responseJSON |
| }, |
| cancelButtonText: i18n('Ok') |
| } |
| }); |
| return Promise.reject(error); |
| }); |
| }); |
| } |
| |
| function fetchSoftwareProduct() { |
| return fetchVspId() |
| .then(response => { |
| return RestAPIUtil.fetch(`/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/${response.value}/versions/0.1`, options); |
| }); |
| } |
| |
| function downloadHeatFile() { |
| return fetchVspId() |
| .then(response => { |
| RestAPIUtil.fetch(`/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/${response.value}/versions/0.1/orchestration-template-candidate`, { |
| ...options, |
| dataType: 'binary' |
| }) |
| .done((blob, statusText, xhr) => showFileSaveDialog({ |
| blob, |
| xhr, |
| defaultFilename: 'HEAT_file.zip', |
| addTimestamp: true |
| })); |
| }); |
| } |
| |
| function processAndValidateHeatCandidate(dispatch) { |
| return fetchVspId() |
| .then(response => { |
| return RestAPIUtil.put(`/sdc1/feProxy/onboarding-api/v1.0/vendor-software-products/${response.value}/versions/0.1/orchestration-template-candidate/process`, {}, options) |
| .then(response => { |
| if (response.status === 'Success') { |
| fetchSoftwareProduct().then(response => { |
| dispatch({ |
| type: softwareProductsActionTypes.SOFTWARE_PRODUCT_LOADED, |
| response |
| }); |
| }); |
| } |
| }); |
| }); |
| } |
| |
| const UploadScreenActionHelper = { |
| uploadFile(dispatch, formData) { |
| |
| return Promise.resolve() |
| .then(() => uploadFile(formData)) |
| .then(response => { |
| dispatch({ |
| type: softwareProductsActionTypes.SOFTWARE_PRODUCT_LOADED, |
| response |
| }); |
| dispatch({ |
| type: HeatSetupActions.FILL_HEAT_SETUP_CACHE, |
| payload:{} |
| }); |
| loadSoftwareProductHeatCandidate(dispatch); |
| }) |
| .catch(error => { |
| dispatch({ |
| type: modalActionTypes.GLOBAL_MODAL_ERROR, |
| data: { |
| title: i18n('File Upload Failed'), |
| msg: error.responseJSON.message, |
| cancelButtonText: i18n('Ok') |
| } |
| }); |
| }); |
| }, |
| |
| processAndValidateHeat(dispatch, heatData, heatDataCache){ |
| return isEqual(heatData, heatDataCache) ? Promise.resolve() : |
| updateHeatCandidate(dispatch, heatData) |
| .then(() => processAndValidateHeatCandidate(dispatch)) |
| .then(() => dispatch({type: HeatSetupActions.FILL_HEAT_SETUP_CACHE, payload: cloneDeep(heatData)})); |
| }, |
| |
| downloadHeatFile(){ |
| return downloadHeatFile(); |
| }, |
| }; |
| |
| export default UploadScreenActionHelper; |