From 5b780234242860acc1979bbdece817bcbfa918c8 Mon Sep 17 00:00:00 2001 From: KIRAN KASHALKAR Date: Tue, 18 Apr 2017 14:28:26 -0400 Subject: [PATCH] RIFT-16227: Fix RPC's for project context in UI Signed-off-by: KIRAN KASHALKAR --- skyquake/framework/core/api_utils/utils.js | 25 +- skyquake/framework/widgets/components.js | 348 -------------------- skyquake/plugins/accounts/api/accounts.js | 6 +- skyquake/plugins/composer/api/composer.js | 52 ++- skyquake/plugins/launchpad/api/launchpad.js | 19 +- 5 files changed, 78 insertions(+), 372 deletions(-) diff --git a/skyquake/framework/core/api_utils/utils.js b/skyquake/framework/core/api_utils/utils.js index 06a4e7263..3a509646a 100644 --- a/skyquake/framework/core/api_utils/utils.js +++ b/skyquake/framework/core/api_utils/utils.js @@ -60,12 +60,29 @@ var projectContextUrl = function(req, url) { JSON.parse(req.sessionStore.sessions[req.session.id])['projectId']) || (null); if (projectId) { - return url.replace(/(\/api\/operational\/|\/api\/config\/|\/api\/operations\/)(.*)/, '$1project/' + projectId + '/$2'); - + return url.replace(/(\/api\/operational\/|\/api\/config\/)(.*)/, '$1project/' + projectId + '/$2'); } return url; } +var addProjectContextToRPCPayload = function(req, url, inputPayload) { + //NOTE: We need to go into the sessionStore because express-session + // does not reliably update the session. + // See https://github.com/expressjs/session/issues/450 + var projectId = (req.session && + req.sessionStore && + req.sessionStore.sessions && + req.sessionStore.sessions[req.session.id] && + JSON.parse(req.sessionStore.sessions[req.session.id])['projectId']) || + (null); + if (projectId) { + if (url.indexOf('/api/operations/')) { + inputPayload['project-name'] = projectId; + } + } + return inputPayload; +} + var validateResponse = function(callerName, error, response, body, resolve, reject) { var res = {}; @@ -263,5 +280,7 @@ module.exports = { getPortForProtocol: getPortForProtocol, - projectContextUrl: projectContextUrl + projectContextUrl: projectContextUrl, + + addProjectContextToRPCPayload: addProjectContextToRPCPayload }; diff --git a/skyquake/framework/widgets/components.js b/skyquake/framework/widgets/components.js index f38719aee..18311978b 100644 --- a/skyquake/framework/widgets/components.js +++ b/skyquake/framework/widgets/components.js @@ -30,351 +30,3 @@ export default { Bullet: require('./bullet/bullet.js') }; -// require('../../assets/js/n3-line-chart.js'); -// var Gauge = require('../../assets/js/gauge-modified.js'); -// var bulletController = function($scope, $element) { -// this.$element = $element; -// this.vertical = false; -// this.value = 0; -// this.min = 0; -// this.max = 100; -// //this.range = this.max - this.min; -// //this.percent = (this.value - this.min) / this.range; -// this.displayValue = this.value; -// this.isPercent = (this.units == '')? true:false; -// this.bulletColor = "#6BB814"; -// this.fontsize = 28; -// this.radius = 4; -// this.containerMarginX = 0; -// this.containerMarginY = 0; -// this.textMarginX = 5; -// this.textMarginY = 42; -// this.bulletMargin = 0; -// this.width = 512; -// this.height = 64; -// this.markerX = -100; // puts it off screen unless set -// var self = this; -// if (this.isPercent) { -// this.displayValue + "%"; -// } -// $scope.$watch( -// function() { -// return self.value; -// }, -// function() { -// self.valueChanged(); -// } -// ); - -// } - -// bulletController.prototype = { - -// valueChanged: function() { -// var range = this.max - this.min; -// var normalizedValue = (this.value - this.min) / range; -// if (this.isPercent) { -// this.displayValue = String(Math.round(normalizedValue * 100)) + "%"; -// } else { -// this.displayValue = this.value; -// } -// // All versions of IE as of Jan 2015 does not support inline CSS transforms on SVG -// if (platform.name == 'IE') { -// this.bulletWidth = Math.round(100 * normalizedValue) + '%'; -// } else { -// this.bulletWidth = this.width - (2 * this.containerMarginX); -// var transform = 'scaleX(' + normalizedValue + ')'; -// var bullet = $(this.$element).find('.bullet2'); -// bullet.css('transform', transform); -// bullet.css('-webkit-transform', transform); -// } -// }, - -// markerChanged: function() { -// var range = this.max - this.min; -// var w = this.width - (2 * this.containerMarginX); -// this.markerX = this.containerMarginX + ((this.marker - this.min) / range ) * w; -// this.markerY1 = 7; -// this.markerY2 = this.width - 7; -// } -// } - -// angular.module('components', ['n3-line-chart']) -// .directive('rwBullet', function() { -// return { -// restrict : 'E', -// templateUrl: 'modules/views/rw.bullet.tmpl.html', -// bindToController: true, -// controllerAs: 'bullet', -// controller: bulletController, -// replace: true, -// scope: { -// min : '@?', -// max : '@?', -// value : '@', -// marker: '@?', -// units: '@?', -// bulletColor: '@?', -// label: '@?' -// } -// }; -// }) -// .directive('rwSlider', function() { -// var controller = function($scope, $element, $timeout) { -// // Q: is there a way to force attributes to be ints? -// $scope.min = $scope.min || "0"; -// $scope.max = $scope.max || "100"; -// $scope.step = $scope.step || "1"; -// $scope.height = $scope.height || "30"; -// $scope.orientation = $scope.orientation || 'horizontal'; -// $scope.tooltipInvert = $scope.tooltipInvert || false; -// $scope.percent = $scope.percent || false; -// $scope.kvalue = $scope.kvalue || false; -// $scope.direction = $scope.direction || "ltr"; -// $($element).noUiSlider({ -// start: parseInt($scope.value), -// step: parseInt($scope.step), -// orientation: $scope.orientation, -// range: { -// min: parseInt($scope.min), -// max: parseInt($scope.max) -// }, -// direction: $scope.direction -// }); -// //$(".no-Ui-target").Link('upper').to('-inline-
') -// var onSlide = function(e, value) { -// $timeout(function(){ -// $scope.value = value; -// }) - -// }; -// $($element).on({ -// change: onSlide, -// slide: onSlide, -// set: $scope.onSet({value: $scope.value}) -// }); -// var val = String(Math.round($scope.value)); -// if ($scope.percent) { -// val += "%" -// } else if ($scope.kvalue) { -// val += "k" -// } -// $($element).height($scope.height); -// if ($scope.tooltipInvert) { -// $($element).find('.noUi-handle').append("
" + val + "
"); -// } else { -// $($element).find('.noUi-handle').append("
" + val + "
"); -// } -// $scope.$watch('value', function(value) { -// var val = String(Math.round($scope.value)); -// if ($scope.percent) { -// val += "%" -// } else if($scope.kvalue) { -// val += "k" -// } -// $($element).val(value); -// $($element).find('.tooltip').html(val); -// if ($scope.tooltipInvert) { -// $($element).find('.tooltip').css('right', $($element).find('.tooltip').innerWidth() * -1); -// } else { -// $($element).find('.tooltip').css('left', $($element).find('.tooltip').innerWidth() * -1); -// } -// }); -// }; - -// return { -// restrict : 'E', -// template: '
', -// controller : controller, -// replace: true, -// scope: { -// min : '@', -// max : '@', -// width: '@', -// height: '@', -// step : '@', -// orientation : '@', -// tooltipInvert: '@', -// percent: '@', -// kvalue: '@?', -// onSet:'&?', -// direction: '@?', -// value:'=?' -// } -// }; -// }) -// .directive('rwGauge', function() { -// return { -// restrict: 'AE', -// template: '', -// replace: true, -// scope: { -// min: '@?', -// max: '@?', -// size: '@?', -// color: '@?', -// value: '@?', -// resize: '@?', -// isAggregate: '@?', -// units: '@?', -// valueFormat: '=?', -// width: '@?' -// }, -// bindToController: true, -// controllerAs: 'gauge', -// controller: function($scope, $element) { -// var self = this; -// this.gauge = null; -// this.min = this.min || 0; -// this.max = this.max || 100; -// this.nSteps = 14; -// this.size = this.size || 300; -// this.units = this.units || ''; -// $scope.width = this.width || 240; -// this.color = this.color || 'hsla(212, 57%, 50%, 1)'; -// if (!this.valueFormat) { -// if (this.max > 1000 || this.value) { -// self.valueFormat = { -// "int": 1, -// "dec": 0 -// }; -// } else { -// self.valueFormat = { -// "int": 1, -// "dec": 2 -// }; -// } -// } -// this.isAggregate = this.isAggregate || false; -// this.resize = this.resize || false; -// if (this.format == 'percent') { -// self.valueFormat = { -// "int": 3, -// "dec": 0 -// }; -// } -// $scope.$watch(function() { -// return self.max; -// }, function(n, o) { -// if(n !== o) { -// renderGauge(); -// } -// }); -// $scope.$watch(function() { -// return self.valueFormat; -// }, function(n, o) { -// if(n != 0) { -// renderGauge(); -// } -// }); -// $scope.$watch(function() { -// return self.value; -// }, function() { -// if (self.gauge) { -// // w/o rounding gauge will unexplainably thrash round. -// self.valueFormat = determineValueFormat(self.value); -// self.gauge.setValue(Math.ceil(self.value * 100) / 100); -// //self.gauge.setValue(Math.round(self.value)); -// } -// }); -// angular.element($element).ready(function() { -// console.log('rendering') -// renderGauge(); -// }) -// window.testme = renderGauge; -// function determineValueFormat(value) { - -// if (value > 999 || self.units == "%") { -// return { -// "int": 1, -// "dec": 0 -// } -// } - -// return { -// "int": 1, -// "dec": 2 -// } -// } -// function renderGauge(calcWidth) { -// if (self.max == self.min) { -// self.max = 14; -// } -// var range = self.max - self.min; -// var step = Math.round(range / self.nSteps); -// var majorTicks = []; -// for (var i = 0; i <= self.nSteps; i++) { -// majorTicks.push(self.min + (i * step)); -// }; -// var redLine = self.min + (range * 0.9); -// var config = { -// isAggregate: self.isAggregate, -// renderTo: angular.element($element)[0], -// width: calcWidth || self.size, -// height: calcWidth || self.size, -// glow: false, -// units: self.units, -// title: false, -// minValue: self.min, -// maxValue: self.max, -// majorTicks: majorTicks, -// valueFormat: determineValueFormat(self.value), -// minorTicks: 0, -// strokeTicks: false, -// highlights: [], -// colors: { -// plate: 'rgba(0,0,0,0)', -// majorTicks: 'rgba(15, 123, 182, .84)', -// minorTicks: '#ccc', -// title: 'rgba(50,50,50,100)', -// units: 'rgba(50,50,50,100)', -// numbers: '#fff', -// needle: { -// start: 'rgba(255, 255, 255, 1)', -// end: 'rgba(255, 255, 255, 1)' -// } -// } -// }; -// var min = config.minValue; -// var max = config.maxValue; -// var N = 1000; -// var increment = (max - min) / N; -// for (i = 0; i < N; i++) { -// var temp_color = 'rgb(0, 172, 238)'; -// if (i > 0.5714 * N && i <= 0.6428 * N) { -// temp_color = 'rgb(0,157,217)'; -// } else if (i >= 0.6428 * N && i < 0.7142 * N) { -// temp_color = 'rgb(0,142,196)'; -// } else if (i >= 0.7142 * N && i < 0.7857 * N) { -// temp_color = 'rgb(0,126,175)'; -// } else if (i >= 0.7857 * N && i < 0.8571 * N) { -// temp_color = 'rgb(0,122,154)'; -// } else if (i >= 0.8571 * N && i < 0.9285 * N) { -// temp_color = 'rgb(0,96,133)'; -// } else if (i >= 0.9285 * N) { -// temp_color = 'rgb(0,80,112)'; -// } -// config.highlights.push({ -// from: i * increment, -// to: increment * (i + 2), -// color: temp_color -// }) -// } -// var updateSize = _.debounce(function() { -// config.maxValue = self.max; -// var clientWidth = self.parentNode.parentNode.clientWidth / 2; -// var calcWidth = (300 > clientWidth) ? clientWidth : 300; -// self.gauge.config.width = self.gauge.config.height = calcWidth; -// self.renderGauge(calcWidth); -// }, 500); -// if (self.resize) $(window).resize(updateSize) -// if (self.gauge) { -// self.gauge.updateConfig(config); -// } else { -// self.gauge = new Gauge(config); -// self.gauge.draw(); -// } -// }; -// }, -// } -// }); diff --git a/skyquake/plugins/accounts/api/accounts.js b/skyquake/plugins/accounts/api/accounts.js index cc34f390d..d26b566ff 100644 --- a/skyquake/plugins/accounts/api/accounts.js +++ b/skyquake/plugins/accounts/api/accounts.js @@ -241,10 +241,14 @@ function refreshAccountConnectionStatus (req) { 'Authorization': req.session && req.session.authorization } ); + var uri = utils.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/' + rpcInfo[Type].rpc); + + jsonData['input'] = utils.addProjectContextToRPCPayload(req, uri, jsonData['input']); + return new Promise(function(resolve, reject) { request({ - uri: utils.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/' + rpcInfo[Type].rpc), + uri: uri, method: 'POST', headers: headers, forever: constants.FOREVER_ON, diff --git a/skyquake/plugins/composer/api/composer.js b/skyquake/plugins/composer/api/composer.js index f98020cd9..61cf79b51 100644 --- a/skyquake/plugins/composer/api/composer.js +++ b/skyquake/plugins/composer/api/composer.js @@ -320,10 +320,15 @@ Composer.update = function(req) { '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.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/package-update'), + uri: uri, method: 'POST', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { 'Authorization': req.session && req.session.authorization @@ -372,10 +377,20 @@ Composer.upload = function(req) { download_host = req.protocol + '://' + req.get('host');//req.api_server + ':' + utils.getPortForProtocol(req.protocol); } + var input = { + '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.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/package-create'), + uri: uri, method: 'POST', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { 'Authorization': req.session && req.session.authorization @@ -385,11 +400,7 @@ Composer.upload = function(req) { 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) { @@ -434,10 +445,15 @@ Composer.addFile = function(req) { 'package-id': package_id, 'package-path': package_path + '/' + req.file.filename } + + var uri = utils.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/package-file-add'); + + input = utils.addProjectContextToRPCPayload(req, uri, input); + return new Promise(function(resolve, reject) { Promise.all([ rp({ - uri: utils.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/package-file-add'), + uri: uri, method: 'POST', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { 'Authorization': req.session && req.session.authorization @@ -470,12 +486,14 @@ Composer.addFile = function(req) { } Composer.exportPackage = function(req) { - // /api/operations/package-export var api_server = req.query['api_server']; + 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.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/package-export'), + uri: uri, method: 'POST', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { 'Authorization': req.session && req.session.authorization @@ -484,7 +502,7 @@ Composer.exportPackage = function(req) { rejectUnauthorized: false, resolveWithFullResponse: true, json: true, - body: { "input": req.body} + body: { "input": input } }) ]).then(function(result) { var data = {}; @@ -531,9 +549,11 @@ FileManager.get = function(req) { } 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.projectContextUrl(req, 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.session && req.session.authorization @@ -553,9 +573,11 @@ 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.projectContextUrl(req, 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.session && req.session.authorization @@ -575,9 +597,11 @@ 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.projectContextUrl(req, utils.confdPort(api_server) + '/api/operations/get-package-endpoint'), + uri: uri, method: 'POST', headers: _.extend({}, constants.HTTP_HEADERS.accept.collection, { 'Authorization': req.session && req.session.authorization diff --git a/skyquake/plugins/launchpad/api/launchpad.js b/skyquake/plugins/launchpad/api/launchpad.js index 2febc3cad..17a9154c7 100644 --- a/skyquake/plugins/launchpad/api/launchpad.js +++ b/skyquake/plugins/launchpad/api/launchpad.js @@ -48,8 +48,9 @@ APIConfig.NfviMetrics = ['vcpu', 'memory']; RPC.executeNSServicePrimitive = function(req) { var api_server = req.query['api_server']; return new Promise(function(resolve, reject) { + var uri = utils.projectContextUrl(req, utils.confdPort(api_server) + APIVersion + '/api/operations/exec-ns-service-primitive'); var jsonData = { - "input": req.body + "input": utils.addProjectContextToRPCPayload(req, uri, req.body) }; var headers = _.extend({}, @@ -59,7 +60,7 @@ RPC.executeNSServicePrimitive = function(req) { } ); request({ - url: utils.projectContextUrl(req, utils.confdPort(api_server) + APIVersion + '/api/operations/exec-ns-service-primitive'), + url: uri, method: 'POST', headers: headers, forever: constants.FOREVER_ON, @@ -81,8 +82,10 @@ RPC.getNSServicePrimitiveValues = function(req) { // var nsr_id = req.body['nsr_id_ref']; // var nsConfigPrimitiveName = req.body['name']; return new Promise(function(resolve, reject) { + var uri = utils.projectContextUrl(req, utils.confdPort(api_server) + APIVersion + '/api/operations/get-ns-service-primitive-values'); + var jsonData = { - "input": req.body + "input": utils.addProjectContextToRPCPayload(req, uri, req.body) }; var headers = _.extend({}, @@ -92,7 +95,7 @@ RPC.getNSServicePrimitiveValues = function(req) { } ); request({ - uri: utils.projectContextUrl(req, utils.confdPort(api_server) + APIVersion + '/api/operations/get-ns-service-primitive-values'), + uri: uri, method: 'POST', headers: headers, forever: constants.FOREVER_ON, @@ -133,6 +136,11 @@ RPC.refreshAccountConnectionStatus = function(req) { } } jsonData.input[rpcInfo[Type].label] = Name; + + var uri = utils.projectContextUrl(req, utils.confdPort(api_server) + APIVersion + '/api/operations/' + rpcInfo[Type].rpc); + + jsonData.input = utils.addProjectContextToRPCPayload(req, uri, jsonData.input); + var headers = _.extend({}, constants.HTTP_HEADERS.accept.data, constants.HTTP_HEADERS.content_type.data, { @@ -140,9 +148,8 @@ RPC.refreshAccountConnectionStatus = function(req) { } ); return new Promise(function(resolve, reject) { - request({ - uri: utils.projectContextUrl(req, utils.confdPort(api_server) + APIVersion + '/api/operations/' + rpcInfo[Type].rpc), + uri: uri, method: 'POST', headers: headers, forever: constants.FOREVER_ON, -- 2.17.1