X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FUI.git;a=blobdiff_plain;f=skyquake%2Fplugins%2Fcomposer%2Fapi%2Fcomposer.js;h=31b3a005cba7daac387c9f569ac08fa49ed8ff76;hp=8df1a9123f912e63dcb26782a56a1f25ce1c0558;hb=6fc3e77438cd4e53c5d5f21512ee8ca260469ca8;hpb=6cbc0bd30ecad2fb08d3b220904889d439579f70 diff --git a/skyquake/plugins/composer/api/composer.js b/skyquake/plugins/composer/api/composer.js index 8df1a9123..31b3a005c 100644 --- a/skyquake/plugins/composer/api/composer.js +++ b/skyquake/plugins/composer/api/composer.js @@ -29,38 +29,40 @@ var PackageFileHandler = require('./packageFileHandler.js'); var Composer = {}; var FileManager = {}; +var PackageManager = {}; var DataCenters = {}; // Catalog module methods Composer.get = function(req) { var api_server = req.query['api_server']; var results = {} + var projectPrefix = req.session.projectId ? "project-" : ""; return new Promise(function(resolve, reject) { Promise.all([ rp({ - uri: utils.confdPort(api_server) + APIVersion + '/api/config/nsd-catalog/nsd?deep', + uri: utils.projectContextUrl(req, utils.confdPort(api_server) + APIVersion + '/api/config/nsd-catalog/nsd?deep'), method: 'GET', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { - 'Authorization': req.get('Authorization') + 'Authorization': req.session && req.session.authorization }), forever: constants.FOREVER_ON, rejectUnauthorized: false, resolveWithFullResponse: true }), rp({ - uri: utils.confdPort(api_server) + APIVersion + '/api/config/vnfd-catalog/vnfd?deep', + uri: utils.projectContextUrl(req, utils.confdPort(api_server) + APIVersion + '/api/config/vnfd-catalog/vnfd?deep'), method: 'GET', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { - 'Authorization': req.get('Authorization') + 'Authorization': req.session && req.session.authorization }), forever: constants.FOREVER_ON, rejectUnauthorized: false, resolveWithFullResponse: true }), rp({ - uri: utils.confdPort(api_server) + APIVersion + '/api/operational/ns-instance-opdata?deep', + uri: utils.projectContextUrl(req, utils.confdPort(api_server) + APIVersion + '/api/operational/ns-instance-opdata?deep'), method: 'GET', headers: _.extend({}, constants.HTTP_HEADERS.accept.data, { - 'Authorization': req.get('Authorization') + 'Authorization': req.session && req.session.authorization }), forever: constants.FOREVER_ON, rejectUnauthorized: false, @@ -73,7 +75,7 @@ Composer.get = function(req) { // headers: _.extend({}, // constants.HTTP_HEADERS.accept.collection, // { - // 'Authorization': req.get('Authorization') + // 'Authorization': req.session && req.session.authorization // }), // forever: constants.FOREVER_ON, // rejectUnauthorized: false, @@ -121,7 +123,7 @@ Composer.get = function(req) { "descriptors": [] }]; if (result[0].body) { - response[0].descriptors = JSON.parse(result[0].body).collection['nsd:nsd']; + response[0].descriptors = JSON.parse(result[0].body).collection[projectPrefix + 'nsd:nsd']; if (result[2].body) { var data = JSON.parse(result[2].body); if (data && data["nsr:ns-instance-opdata"] && data["nsr:ns-instance-opdata"]["rw-nsr:nsd-ref-count"]) { @@ -141,10 +143,10 @@ Composer.get = function(req) { } }; if (result[1].body) { - response[1].descriptors = JSON.parse(result[1].body).collection['vnfd:vnfd']; + response[1].descriptors = JSON.parse(result[1].body).collection[projectPrefix + 'vnfd:vnfd']; }; // if (result[2].body) { - // response[2].descriptors = JSON.parse(result[2].body).collection['pnfd:pnfd']; + // response[2].descriptors = JSON.parse(result[2].body).collection[projectPrefix + 'pnfd:pnfd']; // }; resolve({ statusCode: response.statusCode || 200, @@ -170,10 +172,10 @@ Composer.delete = function(req) { console.log('Deleting', catalogType, id, 'from', api_server); return new Promise(function(resolve, reject) { request({ - uri: utils.confdPort(api_server) + APIVersion + '/api/config/' + catalogType + '-catalog/' + catalogType + '/' + id, + uri: utils.projectContextUrl(req, utils.confdPort(api_server) + APIVersion + '/api/config/' + catalogType + '-catalog/' + catalogType + '/' + id), method: 'DELETE', headers: _.extend({}, constants.HTTP_HEADERS.accept.data, { - 'Authorization': req.get('Authorization') + 'Authorization': req.session && req.session.authorization }), forever: constants.FOREVER_ON, rejectUnauthorized: false, @@ -189,7 +191,7 @@ Composer.delete = function(req) { Composer.getVNFD = function(req) { var api_server = req.query['api_server']; var vnfdID = req.body.data; - var authorization = req.get('Authorization'); + var authorization = req.session && req.session.authorization; var VNFDs = []; if (typeof(vnfdID) == "object" && vnfdID.constructor.name == "Array") { vnfdID.map(function(id) { @@ -218,7 +220,7 @@ Composer.getVNFD = function(req) { return new Promise(function(resolve, reject) { var url = utils.confdPort(api_server) + APIVersion + '/api/config/vnfd-catalog/vnfd' + (id ? '/' + id : '') + '?deep'; request({ - uri: url, + uri: utils.projectContextUrl(req, url), method: 'GET', headers: _.extend({}, constants.HTTP_HEADERS.accept.data, { 'Authorization': authorization @@ -254,10 +256,10 @@ Composer.create = function(req) { 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') + 'Authorization': req.session && req.session.authorization }); request({ - uri: utils.confdPort(api_server) + '/api/config/' + catalogType + '-catalog', + uri: utils.projectContextUrl(req, utils.confdPort(api_server) + '/api/config/' + catalogType + '-catalog'), method: 'POST', headers: requestHeaders, forever: constants.FOREVER_ON, @@ -272,39 +274,39 @@ 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.updateSave = 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.session && req.session.authorization + }); + request({ + uri: utils.projectContextUrl(req, 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); +PackageManager.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 @@ -312,20 +314,26 @@ Composer.update = function(req) { var download_host = req.query['dev_download_server']; if (!download_host) { - download_host = req.protocol + '://' + req.headers.host; + download_host = req.protocol + '://' + req.get('host');//req.api_server + ':' + utils.getPortForProtocol(req.protocol); } + var input = { - 'external-url': download_host + '/composer/update/' + req.file.filename, + 'external-url': download_host + '/composer/upload/' + req.file.filename, 'package-type': 'VNFD', 'package-id': uuid() } + + var uri = utils.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/package-create'); + + input = utils.addProjectContextToRPCPayload(req, uri, input); + return new Promise(function(resolve, reject) { Promise.all([ rp({ - uri: utils.confdPort(api_server) + '/api/operations/package-update', + uri: uri, method: 'POST', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { - 'Authorization': req.get('Authorization') + 'Authorization': req.session && req.session.authorization }), forever: constants.FOREVER_ON, rejectUnauthorized: false, @@ -340,7 +348,7 @@ Composer.update = function(req) { 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); + PackageFileHandler.checkCreatePackageStatusAndHandleFile(req, data['transaction_id'], false); // Return status to composer UI to update the status. resolve({ @@ -349,7 +357,7 @@ Composer.update = function(req) { }); }).catch(function(error) { var res = {}; - console.log('Problem with Composer.upload', error); + console.log('Problem with PackageManager.upload', error); res.statusCode = error.statusCode || 500; res.errorMessage = { error: 'Failed to upload package ' + req.file.originalname + '. Error: ' + error @@ -359,8 +367,8 @@ Composer.update = function(req) { }); }; -Composer.upload = function(req) { - console.log(' Uploading file', req.file.originalname, 'as', req.file.filename); +PackageManager.update = function(req) { + console.log(' Updating 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 @@ -368,27 +376,32 @@ Composer.upload = function(req) { var download_host = req.query['dev_download_server']; if (!download_host) { - download_host = req.protocol + '://' + req.headers.host; + download_host = req.protocol + '://' + req.get('host');//api_server + ':' + utils.getPortForProtocol(req.protocol); } + var input = { + 'external-url': download_host + '/composer/update/' + req.file.filename, + 'package-type': 'VNFD', + 'package-id': uuid() + }; + + var uri = utils.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/package-update'); + + input = utils.addProjectContextToRPCPayload(req, uri, input); return new Promise(function(resolve, reject) { Promise.all([ rp({ - uri: utils.confdPort(api_server) + '/api/operations/package-create', + uri: uri, method: 'POST', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { - 'Authorization': req.get('Authorization') + 'Authorization': req.session && req.session.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() - } + input: input } }) ]).then(function(result) { @@ -396,7 +409,7 @@ Composer.upload = function(req) { 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']); + PackageFileHandler.checkCreatePackageStatusAndHandleFile(req, data['transaction_id'], true); // Return status to composer UI to update the status. resolve({ @@ -415,75 +428,64 @@ Composer.upload = function(req) { }); }; - - -Composer.addFile = function(req) { - console.log(' Uploading file', req.file.originalname, 'as', req.file.filename); +PackageManager.export = function(req) { + // /api/operations/package-export 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; - } - + var uri = utils.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/package-export'); + var input = req.body; + input = utils.addProjectContextToRPCPayload(req, uri, input); return new Promise(function(resolve, reject) { Promise.all([ rp({ - uri: utils.confdPort(api_server) + '/api/operations/package-file-add', + uri: utils.confdPort(api_server) + '/api/operations/package-export', method: 'POST', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { - 'Authorization': req.get('Authorization') + 'Authorization': req.session && req.session.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 - } - } + body: { "input": input } }) ]).then(function(result) { var data = {}; - data['transaction_id'] = result[0].body['output']['task-id']; resolve({ statusCode: constants.HTTP_RESPONSE_CODES.SUCCESS.OK, - data: data + data: result[0].body }); }).catch(function(error) { var res = {}; - console.log('Problem with Composer.upload', error); + console.log('Problem with PackageManager.export', error); res.statusCode = error.statusCode || 500; res.errorMessage = { - error: 'Failed to upload package ' + req.file.originalname + '. Error: ' + error + error: error }; reject(res); }); }); } -Composer.exportPackage = function(req) { - // /api/operations/package-export +PackageManager.copy = function(req) { + // /api/operations/package-copy var api_server = req.query['api_server']; + var uri = utils.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/package-copy'); + var input = req.body; + input = utils.addProjectContextToRPCPayload(req, uri, input); + return new Promise(function(resolve, reject) { Promise.all([ rp({ - uri: utils.confdPort(api_server) + '/api/operations/package-export', + uri: uri, method: 'POST', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { - 'Authorization': req.get('Authorization') + 'Authorization': req.session && req.session.authorization }), forever: constants.FOREVER_ON, rejectUnauthorized: false, resolveWithFullResponse: true, json: true, - body: { "input": req.body} + body: { "input": input} }) ]).then(function(result) { var data = {}; @@ -493,7 +495,7 @@ Composer.exportPackage = function(req) { }); }).catch(function(error) { var res = {}; - console.log('Problem with Composer.exportPackage', error); + console.log('Problem with PackageManager.copy', error); res.statusCode = error.statusCode || 500; res.errorMessage = { error: error @@ -503,22 +505,121 @@ Composer.exportPackage = function(req) { }); } +/** + * This methods retrieves the status of package operations. It takes an optional + * transaction id (id) this if present will return only that status otherwise + * an array of status' will be response. + */ +PackageManager.getJobStatus = function(req) { + var api_server = req.query["api_server"]; + var uri = utils.confdPort(api_server); + var id = req.params['id']; + var url = utils.projectContextUrl(req, uri + '/api/operational/copy-jobs' + (id ? '/job/' + id : '')); + return new Promise(function(resolve, reject) { + request({ + url: url, + method: 'GET', + headers: _.extend({}, constants.HTTP_HEADERS.accept.data, { + 'Authorization': req.session && req.session.authorization + }), + forever: constants.FOREVER_ON, + rejectUnauthorized: false + }, function(error, response, body) { + if (utils.validateResponse('PackageManager.getJobStatus', error, response, body, resolve, reject)) { + var returnData; + if (id) { + returnData = JSON.parse(response.body)['rw-pkg-mgmt:job']; + } else { + var data = JSON.parse(response.body)['rw-pkg-mgmt:copy-jobs']; + returnData = (data && data.job) || []; + } + resolve({ + statusCode: response.statusCode, + data: returnData + }) + }; + }) + }) +} + +function makeAssetTypeParamName (type) { + return type.toLowerCase() + '-file-type'; +} +FileManager.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.get('host');//api_server + ':' + utils.getPortForProtocol(req.protocol); + } + var 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 ? package_path + '/' + req.file.filename : req.file.filename + }; + + var uri = utils.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/package-file-add'); + + input = utils.addProjectContextToRPCPayload(req, uri, input); + + var assetType = req.query['asset_type'].toUpperCase(); + input[makeAssetTypeParamName(package_type)] = assetType; + return new Promise(function(resolve, reject) { + Promise.all([ + rp({ + uri: uri, + method: 'POST', + headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { + 'Authorization': req.session && req.session.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']['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); + }); + }); +} + 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 - } + var assetType = req.query['asset_type']; + var input = { + "package-type": type, + "package-id": id } + var payload = {input: input}; if(req.method == 'GET') { if(downloadUrl && path) { payload.input['external-url'] = downloadUrl; payload.input['package-path'] = path; + payload.input[makeAssetTypeParamName(type)] = assetType; return download(payload); } else { return list(payload); @@ -526,16 +627,19 @@ FileManager.get = function(req) { } if(req.method == 'DELETE') { payload.input['package-path'] = path; + payload.input[makeAssetTypeParamName(type)] = assetType; return deleteFile(payload) } function deleteFile(payload) { + var uri = utils.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/rw-pkg-mgmt:package-file-delete'); + payload.input = utils.addProjectContextToRPCPayload(req, uri, payload.input); return new Promise(function(resolve, reject) { rp({ - uri: utils.confdPort(api_server) + '/api/operations/rw-pkg-mgmt:package-file-delete', + uri: uri, method: 'POST', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { - 'Authorization': req.get('Authorization') + 'Authorization': req.session && req.session.authorization }), json: payload, forever: constants.FOREVER_ON, @@ -552,12 +656,14 @@ FileManager.get = function(req) { }) } function download(payload) { + var uri = utils.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/rw-pkg-mgmt:package-file-add'); + payload.input = utils.addProjectContextToRPCPayload(req, uri, payload.input); return new Promise(function(resolve, reject) { rp({ - uri: utils.confdPort(api_server) + '/api/operations/rw-pkg-mgmt:package-file-add', + uri: uri, method: 'POST', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { - 'Authorization': req.get('Authorization') + 'Authorization': req.session && req.session.authorization }), json: payload, forever: constants.FOREVER_ON, @@ -574,12 +680,14 @@ FileManager.get = function(req) { }) } function list(payload) { + var uri = utils.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/get-package-endpoint'); + payload.input = utils.addProjectContextToRPCPayload(req, uri, payload.input); return new Promise(function(resolve, reject) { rp({ - uri: utils.confdPort(api_server) + '/api/operations/get-package-endpoint', + uri: uri, method: 'POST', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { - 'Authorization': req.get('Authorization') + 'Authorization': req.session && req.session.authorization }), json: payload, forever: constants.FOREVER_ON, @@ -597,10 +705,10 @@ FileManager.get = function(req) { } parsedEndpoint = URL.parse(endpoint); rp({ - uri: api_server + ':' + parsedEndpoint.port + parsedEndpoint.path, + uri: utils.projectContextUrl(req, api_server + ':' + parsedEndpoint.port + parsedEndpoint.path), method: 'GET', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { - 'Authorization': req.get('Authorization') + 'Authorization': req.session && req.session.authorization }), forever: constants.FOREVER_ON, rejectUnauthorized: false, @@ -612,6 +720,9 @@ FileManager.get = function(req) { data: data.body }); } + }).catch(function(err) { + console.log('Failed to retrieve FileManager.list') + resolve(err); }) } }) @@ -625,10 +736,10 @@ FileManager.job = function(req) { var id = req.params['id']; return new Promise(function(resolve, reject) { request({ - url: uri + url + '?deep', + url: utils.projectContextUrl(req, uri + url + '?deep'), method: 'GET', headers: _.extend({}, constants.HTTP_HEADERS.accept.data, { - 'Authorization': req.get('Authorization') + 'Authorization': req.session && req.session.authorization }), forever: constants.FOREVER_ON, rejectUnauthorized: false, @@ -651,5 +762,6 @@ FileManager.job = function(req) { } module.exports = { Composer:Composer, - FileManager: FileManager + FileManager: FileManager, + PackageManager: PackageManager };