X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FUI.git;a=blobdiff_plain;f=skyquake%2Fplugins%2Fcomposer%2Fsrc%2Fsrc%2Flibraries%2Fmodel%2FDescriptorModelSerializer.js;h=737078f08a5e00f63515167a9b93eb693119ddbf;hp=4e6b792645f866b6aa1f9a8b93bccbd8cf317ed1;hb=075200b023e659111da2ffd47129c88314140dd1;hpb=c02d242125c45704991405449fbeb35de8c9687c diff --git a/skyquake/plugins/composer/src/src/libraries/model/DescriptorModelSerializer.js b/skyquake/plugins/composer/src/src/libraries/model/DescriptorModelSerializer.js index 4e6b79264..737078f08 100644 --- a/skyquake/plugins/composer/src/src/libraries/model/DescriptorModelSerializer.js +++ b/skyquake/plugins/composer/src/src/libraries/model/DescriptorModelSerializer.js @@ -1,6 +1,6 @@ /* - * + * * Copyright 2016 RIFT.IO Inc * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,7 +20,11 @@ * Created by onvelocity on 10/20/15. */ -import _ from 'lodash' +import _isNumber from 'lodash/isNumber' +import _cloneDeep from 'lodash/cloneDeep' +import _isEmpty from 'lodash/isEmpty' +import _omit from 'lodash/omit' +import _pick from 'lodash/pick' import utils from './../utils' import DescriptorModelFields from './DescriptorModelFields' import DescriptorModelMetaFactory from './DescriptorModelMetaFactory' @@ -54,7 +58,7 @@ const DescriptorModelSerializer = { // remove empty / blank value fields function clean(m) { Object.keys(m).forEach(k => { - const isEmptyObject = typeof m[k] === 'object' && _.isEmpty(m[k]); + const isEmptyObject = typeof m[k] === 'object' && _isEmpty(m[k]); if (typeof m[k] === 'undefined' || isEmptyObject || m[k] === '') { delete m[k]; } @@ -62,8 +66,8 @@ const DescriptorModelSerializer = { if (k === 'uiState') { if (isMetaAllowed) { // remove any transient ui state properties - const uiState = _.pick(m.uiState, DescriptorModelFields.meta); - if (!_.isEmpty(uiState)) { + const uiState = _pick(m.uiState, DescriptorModelFields.meta); + if (!_isEmpty(uiState)) { // uiState field must be a string m['meta'] = JSON.stringify(uiState); } @@ -81,7 +85,7 @@ const DescriptorModelSerializer = { nsd: { serialize(nsdModel) { if(!nsdFields) nsdFields = DescriptorModelMetaFactory.getModelFieldNamesForType('nsd').concat('uiState'); - const confd = _.pick(nsdModel, nsdFields); + const confd = _pick(nsdModel, nsdFields); // vnfd is defined in the ETSI etsi_gs reference manual but RIFT does not use it delete confd.vnfd; @@ -95,13 +99,13 @@ const DescriptorModelSerializer = { }; if (d['vnf-configuration']) { - const vnfConfig = _.cloneDeep(d['vnf-configuration']); + const vnfConfig = _cloneDeep(d['vnf-configuration']); const configType = vnfConfig['config-type'] || 'none'; // make sure we send the correct values based on config type if (configType === 'none') { constituentVNFD['vnf-configuration'] = {'config-type': 'none'}; const configPriority = utils.resolvePath(vnfConfig, 'input-params.config-priority'); - const configPriorityValue = _.isNumber(configPriority) ? configPriority : d.uiState['member-vnf-index']; + const configPriorityValue = _isNumber(configPriority) ? configPriority : d.uiState['member-vnf-index']; utils.assignPathValue(constituentVNFD['vnf-configuration'], 'input-params.config-priority', configPriorityValue); } else { // remove any unused configuration options @@ -121,20 +125,22 @@ const DescriptorModelSerializer = { return constituentVNFD; }); - + for (var key in confd) { + checkForChoiceAndRemove(key, confd, nsdModel); + } // serialize the VLD instances confd.vld = confd.vld.map(d => { return DescriptorModelSerializer.serialize(d); }); - return confd; + return cleanEmptyTopKeys(confd); } }, vld: { serialize(vldModel) { if(!vldFields) vldFields = DescriptorModelMetaFactory.getModelFieldNamesForType('nsd.vld'); - const confd = _.pick(vldModel, vldFields); + const confd = _pick(vldModel, vldFields); const property = 'vnfd-connection-point-ref'; // TODO: There is a bug in RIFT-REST that is not accepting empty @@ -142,11 +148,15 @@ const DescriptorModelSerializer = { // once that is fixed, remove this piece of code. // fix-start for (var key in confd) { - if (confd.hasOwnProperty(key) && confd[key] === '') { - delete confd[key]; - } + if (confd.hasOwnProperty(key) && confd[key] === '') { + delete confd[key]; + } else { + //removes choice properties from top level object and copies immediate children onto it. + checkForChoiceAndRemove(key, confd, vldModel); + } } + const deepProperty = 'provider-network'; for (var key in confd[deepProperty]) { if (confd[deepProperty].hasOwnProperty(key) && confd[deepProperty][key] === '') { @@ -154,42 +164,83 @@ const DescriptorModelSerializer = { } } // fix-end - - confd[property] = confd[property].map(d => DescriptorModelSerializer[property].serialize(d)); - return confd; + return cleanEmptyTopKeys(confd); } }, 'vnfd-connection-point-ref': { serialize(ref) { - return _.pick(ref, ['member-vnf-index-ref', 'vnfd-id-ref', 'vnfd-connection-point-ref']); + return _pick(ref, ['member-vnf-index-ref', 'vnfd-id-ref', 'vnfd-connection-point-ref']); } }, 'internal-connection-point': { serialize(ref) { - return _.pick(ref, ['id-ref']); + return _pick(ref, ['id-ref']); } }, 'constituent-vnfd': { serialize(cvnfdModel) { if(!cvnfdFields) cvnfdFields = DescriptorModelMetaFactory.getModelFieldNamesForType('nsd.constituent-vnfd'); - return _.pick(cvnfdModel, cvnfdFields); + return _pick(cvnfdModel, cvnfdFields); } }, vnfd: { serialize(vnfdModel) { if(!vnfdFields) vnfdFields = DescriptorModelMetaFactory.getModelFieldNamesForType('vnfd').concat('uiState'); - const confd = _.pick(vnfdModel, vnfdFields); + const confd = _pick(vnfdModel, vnfdFields); confd.vdu = confd.vdu.map(d => DescriptorModelSerializer.serialize(d)); - return confd; + return cleanEmptyTopKeys(confd); } }, vdu: { serialize(vduModel) { - const confd = _.omit(vduModel, ['uiState']); - return confd; + const copy = _cloneDeep(vduModel); + for (let k in copy) { + checkForChoiceAndRemove(k, copy, vduModel) + } + const confd = _omit(copy, ['uiState']); + return cleanEmptyTopKeys(confd); } } }; + +function checkForChoiceAndRemove(k, confd, model) { + let state = model.uiState; + if (state.choice) { + let choice = state.choice[k] + if(choice) { + if (choice.constructor.name == "Array") { + for(let i = 0; i < choice.length; i++) { + for (let key in confd[k][i]) { + if(choice[i] && (choice[i].selected.indexOf(key) > -1)) { + confd[k][i][key] = confd[k][i][key] + } + confd[key]; + }; + } + } else { + for (let key in confd[k]) { + if(choice && (choice.selected.indexOf(key) > -1)) { + confd[key] = confd[k][key] + } + }; + delete confd[k]; + } + + } + } + return confd; +} + +function cleanEmptyTopKeys(m){ + Object.keys(m).forEach(k => { + const isEmptyObject = typeof m[k] === 'object' && _isEmpty(m[k]); + if (typeof m[k] === 'undefined' || isEmptyObject || m[k] === '') { + delete m[k]; + } + }); + return m; +} + export default DescriptorModelSerializer;