/* * Copyright 2017 Huawei Technologies Co., Ltd. * * 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 Configuration from 'sdc-app/config/Configuration.js'; import { actionTypes as modalActionTypes, modalSizes } from 'nfvo-components/modal/GlobalModalConstants.js'; import { modalContentMapper } from 'sdc-app/common/modal/ModalContentMapper.js'; import SoftwareProductActionHelper from 'sdc-app/onboarding/softwareProduct/SoftwareProductActionHelper.js'; import { actionTypes } from './VNFImportConstants.js'; import i18n from 'nfvo-utils/i18n/i18n.js'; function baseUrl(selectedVendor) { const restPrefix = Configuration.get('restPrefix'); let vspId = selectedVendor.id; let version = selectedVendor.version; return `${restPrefix}/v1.0/vendor-software-products/${vspId}/versions/${ version.id }/vnfrepository`; } function getVNFMarketplace(dispatch, currentSoftwareProduct) { return RestAPIUtil.fetch(`${baseUrl(currentSoftwareProduct)}/vnfpackages`, { isAnonymous: false }) .then(response => { dispatch({ type: actionTypes.OPEN, response }); dispatch({ type: modalActionTypes.GLOBAL_MODAL_SHOW, data: { modalComponentName: modalContentMapper.VNF_IMPORT, title: i18n('Browse VNF'), modalComponentProps: { currentSoftwareProduct, size: modalSizes.LARGE } } }); }) .catch(error => { let errMessage = error.responseJSON ? error.responseJSON.message : i18n('VNF import failed msg'); dispatch({ type: modalActionTypes.GLOBAL_MODAL_ERROR, data: { title: i18n('VNF import failed title'), msg: errMessage, cancelButtonText: i18n('Ok') } }); }); } function downloadCSARFile(csarId, currSoftwareProduct) { let url = `${baseUrl(currSoftwareProduct)}/vnfpackage/${csarId}/download`; return RestAPIUtil.fetch(url, { dataType: 'binary', isAnonymous: false }); } function getFileName(xhr, defaultFilename) { let filename = ''; let contentDisposition = xhr && xhr.getResponseHeader('Content-Disposition') ? xhr.getResponseHeader('Content-Disposition') : ''; let match = contentDisposition.match(/filename=(.*?)(;|$)/); if (match) { filename = match[1].replace(/['"]/g, ''); } else { filename = defaultFilename; } return filename; } function uploadVNFData(csarId, currSoftwareProduct, dispatch) { let softwareProductId = currSoftwareProduct.id; let version = { id: currSoftwareProduct.version }; SoftwareProductActionHelper.uploadVNFFile(dispatch, { csarId, currSoftwareProduct, failedNotificationTitle: i18n('Upload validation failed'), softwareProductId, version }); } 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 showFileSaveDialog({ blob, xhr, defaultFilename, addTimestamp }) { let filename = getFileName(xhr, defaultFilename); if (addTimestamp) { filename = filename.replace( /(^.*?)\.([^.]+$)/, `$1_${getTimestampString()}.$2` ); } let link = document.createElement('a'); let url = URL.createObjectURL(blob.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); } const VNFImportActionHelper = { open(dispatch, currentSoftwareProduct) { getVNFMarketplace(dispatch, currentSoftwareProduct); }, download(csarId, currSoftwareProduct) { downloadCSARFile(csarId, currSoftwareProduct).then( (blob, statusText, xhr) => showFileSaveDialog({ blob, xhr, defaultFilename: 'MyNewCSAR.csar', addTimestamp: true }) ); }, resetData(dispatch) { dispatch({ type: modalActionTypes.GLOBAL_MODAL_CLOSE }); dispatch({ type: actionTypes.RESET_DATA }); }, getVNFMarketplace(dispatch) { return getVNFMarketplace(dispatch); }, uploadData(currSoftwareProduct, csarId, dispatch) { this.resetData(dispatch); uploadVNFData(csarId, currSoftwareProduct, dispatch); } }; export default VNFImportActionHelper;