X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FUI.git;a=blobdiff_plain;f=skyquake%2Fplugins%2Fcomposer%2Fapi%2Fcomposer.js;h=8df1a9123f912e63dcb26782a56a1f25ce1c0558;hp=d9dc5e2f580894dcfd5a1b6220e89689047adc14;hb=e4df686d0a75f68183f594363253f059d1ed3a2b;hpb=e29efc315df33d546237e270470916e26df391d6 diff --git a/skyquake/plugins/composer/api/composer.js b/skyquake/plugins/composer/api/composer.js index d9dc5e2f5..8df1a9123 100644 --- a/skyquake/plugins/composer/api/composer.js +++ b/skyquake/plugins/composer/api/composer.js @@ -1,5 +1,5 @@ /* - * + * * Copyright 2016 RIFT.IO Inc * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,9 +22,13 @@ var rp = require('request-promise'); var utils = require('../../../framework/core/api_utils/utils.js'); var constants = require('../../../framework/core/api_utils/constants.js'); var _ = require('underscore'); +var URL = require('url'); +var uuid = require('uuid'); var APIVersion = '/v1'; -var Composer = {}; +var PackageFileHandler = require('./packageFileHandler.js'); +var Composer = {}; +var FileManager = {}; var DataCenters = {}; // Catalog module methods Composer.get = function(req) { @@ -268,34 +272,384 @@ Composer.create = function(req) { }); }); }; +// Composer.update = function(req) { +// var api_server = req.query['api_server']; +// var catalogType = req.params.catalogType; +// var id = req.params.id; +// var data = req.body; +// console.log('Updating', catalogType, 'id', id, 'on', api_server); +// var jsonData = {}; +// jsonData[catalogType] = {}; +// jsonData[catalogType] = data; +// return new Promise(function(resolve, reject) { +// var requestHeaders = {}; +// _.extend(requestHeaders, constants.HTTP_HEADERS.accept.data, constants.HTTP_HEADERS.content_type.data, { +// 'Authorization': req.get('Authorization') +// }); +// request({ +// uri: utils.confdPort(api_server) + APIVersion + '/api/config/' + catalogType + '-catalog' + '/' + catalogType + '/' + id, +// method: 'PUT', +// headers: requestHeaders, +// forever: constants.FOREVER_ON, +// rejectUnauthorized: false, +// json: jsonData +// }, function(error, response, body) { +// if (utils.validateResponse('Composer.update', error, response, body, resolve, reject)) { +// resolve({ +// statusCode: response.statusCode +// }); +// } +// }); +// }); +// + Composer.update = function(req) { + console.log(' Updating file', req.file.originalname, 'as', req.file.filename); var api_server = req.query['api_server']; - var catalogType = req.params.catalogType; - var id = req.params.id; - var data = req.body; - console.log('Updating', catalogType, 'id', id, 'on', api_server); - var jsonData = {}; - jsonData[catalogType] = {}; - jsonData[catalogType] = data; + // dev_download_server is for testing purposes. + // It is the direct IP address of the Node server where the + // package will be hosted. + var download_host = req.query['dev_download_server']; + + if (!download_host) { + download_host = req.protocol + '://' + req.headers.host; + } + var input = { + 'external-url': download_host + '/composer/update/' + req.file.filename, + 'package-type': 'VNFD', + 'package-id': uuid() + } return new Promise(function(resolve, reject) { - var requestHeaders = {}; - _.extend(requestHeaders, constants.HTTP_HEADERS.accept.data, constants.HTTP_HEADERS.content_type.data, { - 'Authorization': req.get('Authorization') + Promise.all([ + rp({ + uri: utils.confdPort(api_server) + '/api/operations/package-update', + method: 'POST', + headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { + 'Authorization': req.get('Authorization') + }), + forever: constants.FOREVER_ON, + rejectUnauthorized: false, + resolveWithFullResponse: true, + json: true, + body: { + input: input + } + }) + ]).then(function(result) { + var data = {}; + data['transaction_id'] = result[0].body['output']['transaction-id']; + + // Add a status checker on the transaction and then to delete the file later + PackageFileHandler.checkCreatePackageStatusAndHandleFile(req, data['transaction_id'], true); + + // Return status to composer UI to update the status. + resolve({ + statusCode: constants.HTTP_RESPONSE_CODES.SUCCESS.OK, + data: data + }); + }).catch(function(error) { + var res = {}; + console.log('Problem with Composer.upload', error); + res.statusCode = error.statusCode || 500; + res.errorMessage = { + error: 'Failed to upload package ' + req.file.originalname + '. Error: ' + error + }; + reject(res); + }); + }); +}; + +Composer.upload = function(req) { + console.log(' Uploading file', req.file.originalname, 'as', req.file.filename); + var api_server = req.query['api_server']; + // dev_download_server is for testing purposes. + // It is the direct IP address of the Node server where the + // package will be hosted. + var download_host = req.query['dev_download_server']; + + if (!download_host) { + download_host = req.protocol + '://' + req.headers.host; + } + + return new Promise(function(resolve, reject) { + Promise.all([ + rp({ + uri: utils.confdPort(api_server) + '/api/operations/package-create', + method: 'POST', + headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { + 'Authorization': req.get('Authorization') + }), + forever: constants.FOREVER_ON, + rejectUnauthorized: false, + resolveWithFullResponse: true, + json: true, + body: { + input: { + 'external-url': download_host + '/composer/upload/' + req.file.filename, + 'package-type': 'VNFD', + 'package-id': uuid() + } + } + }) + ]).then(function(result) { + var data = {}; + data['transaction_id'] = result[0].body['output']['transaction-id']; + + // Add a status checker on the transaction and then to delete the file later + PackageFileHandler.checkCreatePackageStatusAndHandleFile(req, data['transaction_id']); + + // Return status to composer UI to update the status. + resolve({ + statusCode: constants.HTTP_RESPONSE_CODES.SUCCESS.OK, + data: data + }); + }).catch(function(error) { + var res = {}; + console.log('Problem with Composer.upload', error); + res.statusCode = error.statusCode || 500; + res.errorMessage = { + error: 'Failed to upload package ' + req.file.originalname + '. Error: ' + error + }; + reject(res); + }); + }); +}; + + + +Composer.addFile = function(req) { + console.log(' Uploading file', req.file.originalname, 'as', req.file.filename); + var api_server = req.query['api_server']; + var download_host = req.query['dev_download_server']; + var package_id = req.query['package_id']; + var package_type = req.query['package_type'].toUpperCase(); + var package_path = req.query['package_path']; + if (!download_host) { + download_host = req.protocol + '://' + req.headers.host; + } + + return new Promise(function(resolve, reject) { + Promise.all([ + rp({ + uri: utils.confdPort(api_server) + '/api/operations/package-file-add', + method: 'POST', + headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { + 'Authorization': req.get('Authorization') + }), + forever: constants.FOREVER_ON, + rejectUnauthorized: false, + resolveWithFullResponse: true, + json: true, + body: { + input: { + 'external-url': download_host + '/composer/upload/' + req.query['package_id'] + '/' + req.file.filename, + 'package-type': package_type, + 'package-id': package_id, + 'package-path': package_path + '/' + req.file.filename + } + } + }) + ]).then(function(result) { + var data = {}; + data['transaction_id'] = result[0].body['output']['task-id']; + resolve({ + statusCode: constants.HTTP_RESPONSE_CODES.SUCCESS.OK, + data: data + }); + }).catch(function(error) { + var res = {}; + console.log('Problem with Composer.upload', error); + res.statusCode = error.statusCode || 500; + res.errorMessage = { + error: 'Failed to upload package ' + req.file.originalname + '. Error: ' + error + }; + reject(res); + }); + }); +} + +Composer.exportPackage = function(req) { + // /api/operations/package-export + var api_server = req.query['api_server']; + return new Promise(function(resolve, reject) { + Promise.all([ + rp({ + uri: utils.confdPort(api_server) + '/api/operations/package-export', + method: 'POST', + headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { + 'Authorization': req.get('Authorization') + }), + forever: constants.FOREVER_ON, + rejectUnauthorized: false, + resolveWithFullResponse: true, + json: true, + body: { "input": req.body} + }) + ]).then(function(result) { + var data = {}; + resolve({ + statusCode: constants.HTTP_RESPONSE_CODES.SUCCESS.OK, + data: result[0].body + }); + }).catch(function(error) { + var res = {}; + console.log('Problem with Composer.exportPackage', error); + res.statusCode = error.statusCode || 500; + res.errorMessage = { + error: error + }; + reject(res); }); + }); +} + +FileManager.get = function(req) { + var api_server = req.query['api_server']; + var type = req.query['package_type'] && req.query['package_type'].toUpperCase(); + var id = req.query['package_id']; + var downloadUrl = req.query['url']; + var path = req.query['package_path']; + var payload = { + "input": { + "package-type": type, + "package-id": id + } + } + if(req.method == 'GET') { + if(downloadUrl && path) { + payload.input['external-url'] = downloadUrl; + payload.input['package-path'] = path; + return download(payload); + } else { + return list(payload); + } + } + if(req.method == 'DELETE') { + payload.input['package-path'] = path; + return deleteFile(payload) + } + + function deleteFile(payload) { + return new Promise(function(resolve, reject) { + rp({ + uri: utils.confdPort(api_server) + '/api/operations/rw-pkg-mgmt:package-file-delete', + method: 'POST', + headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { + 'Authorization': req.get('Authorization') + }), + json: payload, + forever: constants.FOREVER_ON, + rejectUnauthorized: false, + resolveWithFullResponse: true + }).then(function(data) { + if (utils.validateResponse('FileManager.delete', data.error, data, data.body, resolve, reject)) { + resolve({ + statusCode: data.statusCode, + data: data.body + }); + } + }) + }) + } + function download(payload) { + return new Promise(function(resolve, reject) { + rp({ + uri: utils.confdPort(api_server) + '/api/operations/rw-pkg-mgmt:package-file-add', + method: 'POST', + headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { + 'Authorization': req.get('Authorization') + }), + json: payload, + forever: constants.FOREVER_ON, + rejectUnauthorized: false, + resolveWithFullResponse: true + }).then(function(data) { + if (utils.validateResponse('FileManager.get', data.error, data, data.body, resolve, reject)) { + resolve({ + statusCode: data.statusCode, + data: data.body + }); + } + }) + }) + } + function list(payload) { + return new Promise(function(resolve, reject) { + rp({ + uri: utils.confdPort(api_server) + '/api/operations/get-package-endpoint', + method: 'POST', + headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { + 'Authorization': req.get('Authorization') + }), + json: payload, + forever: constants.FOREVER_ON, + rejectUnauthorized: false, + resolveWithFullResponse: true + }).then(function(data) { + if (utils.validateResponse('FileManager.get', data.error, data, data.body, resolve, reject)) { + var endpoint = null; + var parsedEndpoint = null; + try { + endpoint = data.body.output.endpoint + } catch(e) { + console.log('Something went wrong with the FileManager.get data that was returned'); + reject({}); + } + parsedEndpoint = URL.parse(endpoint); + rp({ + uri: api_server + ':' + parsedEndpoint.port + parsedEndpoint.path, + method: 'GET', + headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { + 'Authorization': req.get('Authorization') + }), + forever: constants.FOREVER_ON, + rejectUnauthorized: false, + resolveWithFullResponse: true + }).then(function(data) { + if (utils.validateResponse('FileManager.get', data.error, data, data.body, resolve, reject)) { + resolve({ + statusCode: data.statusCode, + data: data.body + }); + } + }) + } + }) + }) + } +} +FileManager.job = function(req) { + var api_server = req.query["api_server"]; + var uri = utils.confdPort(api_server); + var url = '/api/operational/download-jobs'; + var id = req.params['id']; + return new Promise(function(resolve, reject) { request({ - uri: utils.confdPort(api_server) + APIVersion + '/api/config/' + catalogType + '-catalog' + '/' + catalogType + '/' + id, - method: 'PUT', - headers: requestHeaders, + url: uri + url + '?deep', + method: 'GET', + headers: _.extend({}, constants.HTTP_HEADERS.accept.data, { + 'Authorization': req.get('Authorization') + }), forever: constants.FOREVER_ON, rejectUnauthorized: false, - json: jsonData }, function(error, response, body) { - if (utils.validateResponse('Composer.update', error, response, body, resolve, reject)) { + if (utils.validateResponse('restconfAPI.streams', error, response, body, resolve, reject)) { + var data = JSON.parse(response.body)['rw-pkg-mgmt:download-jobs']; + var returnData = []; + data && data.job.map(function(d) { + if(d['package-id'] == id) { + returnData.push(d) + } + }) resolve({ - statusCode: response.statusCode - }); - } - }); - }); + statusCode: response.statusCode, + data: returnData + }) + }; + }) + }) +} +module.exports = { + Composer:Composer, + FileManager: FileManager }; -module.exports = Composer;