From: Laurence Maultsby Date: Mon, 30 Jan 2017 19:58:45 +0000 (-0500) Subject: Merge branch 'master' into pkg_mgmt X-Git-Tag: v1.1.0~4^2~1 X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FUI.git;a=commitdiff_plain;h=13f32c0c3cbad3b1d70d20342f44c65328c91ec9;hp=df332f582aae48baaf5b1fa51c15f3bf0bab0443 Merge branch 'master' into pkg_mgmt Signed-off-by: Laurence Maultsby --- diff --git a/skyquake/framework/core/api_utils/sockets.js b/skyquake/framework/core/api_utils/sockets.js index 607659476..5e0b25bfb 100644 --- a/skyquake/framework/core/api_utils/sockets.js +++ b/skyquake/framework/core/api_utils/sockets.js @@ -32,17 +32,9 @@ var Promise = require('promise'); var url = require('url'); var sockjs = require('sockjs'); var websocket_multiplex = require('websocket-multiplex'); +var utils = require('./utils.js'); -function getPortForProtocol (protocol) { - switch (protocol) { - case 'http': - return 8000; - case 'https': - return 8443; - } -} - var Subscriptions = function() { this.ID = 0; this.socketServers = {}; @@ -85,7 +77,7 @@ Subscriptions.prototype.subscribe = function(req, callback) { var origin = ''; if (req.query['api_server']) { var api_server_protocol = req.query['api_server'].match(protocolTest)[1]; - var api_server_origin = req.query['api_server'] + ':' + getPortForProtocol(api_server_protocol); + var api_server_origin = req.query['api_server'] + ':' + utils.getPortForProtocol(api_server_protocol); origin = api_server_origin; protocol = api_server_protocol; } else { diff --git a/skyquake/framework/core/api_utils/utils.js b/skyquake/framework/core/api_utils/utils.js index 0d1990c64..5b17279d5 100644 --- a/skyquake/framework/core/api_utils/utils.js +++ b/skyquake/framework/core/api_utils/utils.js @@ -217,6 +217,15 @@ var passThroughConstructor = function(app) { }); } +var getPortForProtocol = function(protocol) { + switch (protocol) { + case 'http': + return 8000; + case 'https': + return 8443; + } +} + module.exports = { /** * Ensure confd port is on api_server variable. @@ -233,5 +242,7 @@ module.exports = { sendSuccessResponse: sendSuccessResponse, - passThroughConstructor: passThroughConstructor + passThroughConstructor: passThroughConstructor, + + getPortForProtocol: getPortForProtocol }; diff --git a/skyquake/plugins/accounts/src/account/accountStore.js b/skyquake/plugins/accounts/src/account/accountStore.js index dee59f23a..5d5bd2f92 100644 --- a/skyquake/plugins/accounts/src/account/accountStore.js +++ b/skyquake/plugins/accounts/src/account/accountStore.js @@ -115,14 +115,6 @@ let AccountMeta = { }, { label: "Authentication URL", ref: 'auth_url' - },{ - label: "User Domain", - ref: 'user-domain', - optional: true - },{ - label: "Project Domain", - ref: 'project-domain', - optional: true }, { label: "Tenant", ref: 'tenant' @@ -133,6 +125,18 @@ let AccountMeta = { label: 'Floating IP Pool', ref: 'floating-ip-pool', optional: true + }, { + label: "User Domain", + ref: 'user-domain', + optional: true + }, { + label: "Project Domain", + ref: 'project-domain', + optional: true + }, { + label: "Region", + ref: 'region', + optional: true }], "openvim": [{ label: "Host", diff --git a/skyquake/plugins/composer/api/composer.js b/skyquake/plugins/composer/api/composer.js index 864f2b06e..801873a36 100644 --- a/skyquake/plugins/composer/api/composer.js +++ b/skyquake/plugins/composer/api/composer.js @@ -272,36 +272,36 @@ 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.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); @@ -312,7 +312,7 @@ Composer.update = function(req) { var download_host = req.query['dev_download_server']; if (!download_host) { - download_host = req.protocol + '://' + req.headers.host; + download_host = api_server + ':' + utils.getPortForProtocol(req.protocol); } var input = { 'external-url': download_host + '/composer/update/' + req.file.filename, @@ -368,7 +368,7 @@ Composer.upload = function(req) { var download_host = req.query['dev_download_server']; if (!download_host) { - download_host = req.protocol + '://' + req.headers.host; + download_host = api_server + ':' + utils.getPortForProtocol(req.protocol); } return new Promise(function(resolve, reject) { @@ -425,7 +425,7 @@ Composer.addFile = function(req) { 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; + download_host = api_server + ':' + utils.getPortForProtocol(req.protocol); } return new Promise(function(resolve, reject) { diff --git a/skyquake/plugins/composer/routes.js b/skyquake/plugins/composer/routes.js index 2c78cc952..378220927 100644 --- a/skyquake/plugins/composer/routes.js +++ b/skyquake/plugins/composer/routes.js @@ -96,7 +96,7 @@ router.post('/api/catalog/:catalogType', cors(), function(req, res) { }); }); router.put('/api/catalog/:catalogType/:id', cors(), function(req, res) { - Composer.update(req).then(function(data) { + Composer.updateSave(req).then(function(data) { res.send(data); }, function(error) { res.status(error.statusCode); diff --git a/skyquake/plugins/composer/src/src/components/ComposerApp.js b/skyquake/plugins/composer/src/src/components/ComposerApp.js index b5cfa7528..6507b3419 100644 --- a/skyquake/plugins/composer/src/src/components/ComposerApp.js +++ b/skyquake/plugins/composer/src/src/components/ComposerApp.js @@ -163,7 +163,7 @@ const ComposerApp = React.createClass({ } } - let cpNumber = 0; + let AppHeader = (
); @@ -174,12 +174,7 @@ const ComposerApp = React.createClass({ const isModified = self.state.item && self.state.item.uiState.modified; const isEditingNSD = self.state.item && self.state.item.uiState && /nsd/.test(self.state.item.uiState.type); const isEditingVNFD = self.state.item && self.state.item.uiState && /vnfd/.test(self.state.item.uiState.type); - const containers = [self.state.item].reduce(DescriptorModelFactory.buildCatalogItemFactory(CatalogDataStore.getState().catalogs), []); - - containers.filter(d => DescriptorModelFactory.isConnectionPoint(d)).forEach(d => { - d.cpNumber = ++cpNumber; - containers.filter(d => DescriptorModelFactory.isVnfdConnectionPointRef(d)).filter(ref => ref.key === d.key).forEach(ref => ref.cpNumber = d.cpNumber); - }); + const containers = self.state.containers; const canvasTitle = containers.length ? containers[0].model.name : ''; const hasNoCatalogs = CatalogDataStore.getState().catalogs.length === 0; const isLoading = self.state.isLoading; diff --git a/skyquake/plugins/composer/src/src/libraries/model/DescriptorModelFields.js b/skyquake/plugins/composer/src/src/libraries/model/DescriptorModelFields.js index bc5576087..8b86b0c0b 100644 --- a/skyquake/plugins/composer/src/src/libraries/model/DescriptorModelFields.js +++ b/skyquake/plugins/composer/src/src/libraries/model/DescriptorModelFields.js @@ -27,7 +27,7 @@ export default { nsd: common.concat(['constituent-vnfd', 'vnffgd', 'vld']), vld: common.concat([]), vnfd: common.concat(['vdu', 'internal-vld']), - 'vnfd.vdu': common.concat(['image', 'external-interface', 'vm-flavor', 'cloud-init', 'filename']), + 'vnfd.vdu': common.concat(['image', 'image-checksum', 'external-interface', 'vm-flavor', 'cloud-init', 'filename']), // white-list valid fields to send in the meta field meta: ['containerPositionMap'] }; diff --git a/skyquake/plugins/composer/src/src/libraries/utils.js b/skyquake/plugins/composer/src/src/libraries/utils.js index a182b1a90..1d54a6f5b 100644 --- a/skyquake/plugins/composer/src/src/libraries/utils.js +++ b/skyquake/plugins/composer/src/src/libraries/utils.js @@ -290,7 +290,7 @@ export default { for (let subKey in catalogs[key]) { let found = _.find(catalogs[key][subKey], {id: fieldKeyArray[0]}); if (found) { - results = this.getResults(found, pathArray.splice(-i, i)); + results = this.getAbsoluteResults(found, pathArray.splice(-i, i)); return results; } } @@ -303,7 +303,7 @@ export default { for (let foundKey in found) { let topLevel = _.find(found[foundKey], {id: fieldKeyArray[1]}); if (topLevel) { - results = this.getResults(topLevel, pathArray.splice(-i, i)); + results = this.getAbsoluteResults(topLevel, pathArray.splice(-i, i)); return results; } } diff --git a/skyquake/plugins/composer/src/src/stores/ComposerAppStore.js b/skyquake/plugins/composer/src/src/stores/ComposerAppStore.js index 347ba9a07..75276d22a 100644 --- a/skyquake/plugins/composer/src/src/stores/ComposerAppStore.js +++ b/skyquake/plugins/composer/src/src/stores/ComposerAppStore.js @@ -122,9 +122,10 @@ class ComposerAppStore { this.fullScreenMode = false; this.panelTabShown = 'descriptor'; //File manager values - this.files = []; + this.files = false; this.filesState = {}; this.downloadJobs = {}; + this.containers = []; //End File manager values this.bindListeners({ onResize: PanelResizeAction.RESIZE, @@ -201,8 +202,17 @@ class ComposerAppStore { } updateItem(item) { + const self = this; + let containers = []; + let cpNumber = 0; if(!document.body.classList.contains('resizing')) { - this.setState({item: _.cloneDeep(item)}); + containers = [item].reduce(DescriptorModelFactory.buildCatalogItemFactory(CatalogDataStore.getState().catalogs), []); + + containers.filter(d => DescriptorModelFactory.isConnectionPoint(d)).forEach(d => { + d.cpNumber = ++cpNumber; + containers.filter(d => DescriptorModelFactory.isVnfdConnectionPointRef(d)).filter(ref => ref.key === d.key).forEach(ref => ref.cpNumber = d.cpNumber); + }); + this.setState({containers: containers, item: _.cloneDeep(item)}); } SelectionManager.refreshOutline(); } @@ -549,7 +559,7 @@ class ComposerAppStore { let self = this; let ws = window.multiplexer.channel(id); let downloadJobs = _.cloneDeep(self.downloadJobs); - let newFiles = {}; + let newFiles = false; ws.onmessage = (socket) => { if (self.files && self.files.length > 0) { let jobs = []; @@ -625,7 +635,6 @@ class ComposerAppStore { openFileManagerSockets(i) { let self = this; let item = i || self.item; - this.files = {data:[]}; // this.closeFileManagerSockets(); this.getInstance().openFileMonitoringSocket(item.id, item.uiState.type).then(function() { // // self.getInstance().openDownloadMonitoringSocket(item.id); diff --git a/skyquake/plugins/launchpad/api/launchpad.js b/skyquake/plugins/launchpad/api/launchpad.js index 509ff776b..6fb01704a 100644 --- a/skyquake/plugins/launchpad/api/launchpad.js +++ b/skyquake/plugins/launchpad/api/launchpad.js @@ -813,7 +813,7 @@ NSR.addVnfrDataPromise = function(req, nsrs) { vdur['console-url'] = 'api/vnfr/' + vnfr.id + '/vdur/' + vdur.id + '/console-url'; nsr['console-urls'].push({ id: vdur.id, - name: vdur.name, + name: vnfr.name, 'console-url': vdur['console-url'] }); }); diff --git a/skyquake/plugins/launchpad/src/instantiate/instantiateParameters.jsx b/skyquake/plugins/launchpad/src/instantiate/instantiateParameters.jsx index 0e5fa1fbb..5681851a1 100644 --- a/skyquake/plugins/launchpad/src/instantiate/instantiateParameters.jsx +++ b/skyquake/plugins/launchpad/src/instantiate/instantiateParameters.jsx @@ -44,52 +44,53 @@ class Instantiate extends Component { - + /> + ) } diff --git a/skyquake/plugins/launchpad/src/instantiate/instantiateStore.js b/skyquake/plugins/launchpad/src/instantiate/instantiateStore.js index 2e6e24236..e779beb16 100644 --- a/skyquake/plugins/launchpad/src/instantiate/instantiateStore.js +++ b/skyquake/plugins/launchpad/src/instantiate/instantiateStore.js @@ -484,6 +484,11 @@ class LaunchNetworkServiceStore { let value = e.target.nodeName == "SELECT" ? JSON.parse(e.target.value) : e.target.value; self.ipProfiles[i]['ip-profile-params'][key] = value; + if (value == '') { + // Don't send this key + delete self.ipProfiles[i]['ip-profile-params'][key]; + } + self.setState({ipProfiles:self.ipProfiles}); } }, diff --git a/skyquake/plugins/launchpad/src/recordViewer/recordCard.jsx b/skyquake/plugins/launchpad/src/recordViewer/recordCard.jsx index 449177634..88ff709a4 100644 --- a/skyquake/plugins/launchpad/src/recordViewer/recordCard.jsx +++ b/skyquake/plugins/launchpad/src/recordViewer/recordCard.jsx @@ -106,7 +106,7 @@ export default class RecordCard extends React.Component { //That match the currently selected job id if(v.id == cardData.id) { return v.primitive.map(function(p, i) { - return + return }) } }) @@ -208,7 +208,7 @@ export default class RecordCard extends React.Component { //That match the currently selected job id if(v.id == cardData.id) { return v.primitive.map(function(p, i) { - return + return }) } }) diff --git a/skyquake/plugins/launchpad/src/recordViewer/recordViewStore.js b/skyquake/plugins/launchpad/src/recordViewer/recordViewStore.js index b9f74990a..a7770a7fa 100644 --- a/skyquake/plugins/launchpad/src/recordViewer/recordViewStore.js +++ b/skyquake/plugins/launchpad/src/recordViewer/recordViewStore.js @@ -136,7 +136,7 @@ class RecordViewStore { let vnfrIndex = data.vnfrIndex; let configPrimitiveIndex = data.configPrimitiveIndex; let payload = {}; - let isValid = false; + let isValid = true; let configPrimitive = vnfrs[vnfrIndex]['vnf-configuration']['service-primitive'][configPrimitiveIndex]; payload['name'] = ''; @@ -144,7 +144,7 @@ class RecordViewStore { payload['vnf-list'] = []; payload['triggered-by'] = 'vnf-primitive'; let parameters = []; - configPrimitive['parameter'].map((parameter) => { + configPrimitive['parameter'] && configPrimitive['parameter'].map((parameter) => { if(!isValid) { isValid = validateParameter(parameter); } @@ -157,8 +157,11 @@ class RecordViewStore { let vnfPrimitive = []; vnfPrimitive[0] = { name: configPrimitive['name'], - index: configPrimitiveIndex, - parameter: parameters + index: configPrimitiveIndex + }; + + if (parameters.length > 0) { + vnfPrimitive[0].parameter = parameters; } payload['vnf-list'].push({