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=b4960411f214e8e3d7eb45b76d0e11b229c5c360;hp=7581ed5ba1ad6ecf1ae85b7fe5970977a329b37c;hb=7c0d1adb5981f247ae7c19e0ab0a000a607de191;hpb=e29efc315df33d546237e270470916e26df391d6 diff --git a/skyquake/plugins/composer/src/src/libraries/model/DescriptorModelSerializer.js b/skyquake/plugins/composer/src/src/libraries/model/DescriptorModelSerializer.js index 7581ed5ba..b4960411f 100644 --- a/skyquake/plugins/composer/src/src/libraries/model/DescriptorModelSerializer.js +++ b/skyquake/plugins/composer/src/src/libraries/model/DescriptorModelSerializer.js @@ -1,6 +1,5 @@ - /* - * + * * Copyright 2016 RIFT.IO Inc * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,171 +19,28 @@ * Created by onvelocity on 10/20/15. */ -import _ from 'lodash' -import utils from './../utils' -import DescriptorModelFields from './DescriptorModelFields' import DescriptorModelMetaFactory from './DescriptorModelMetaFactory' -let nsdFields = null; -let vldFields = null; -let vnfdFields = null; -let cvnfdFields = null; - - - - -/** - * Serialize DescriptorModel JSON into CONFD JSON. Also, cleans up the data as needed. - * - * @type {{serialize: (function(*=)), ':clean': (function(*=)), nsd: {serialize: (function(*=))}, vld: {serialize: (function(*=))}, vnfd-connection-point-ref: {serialize: (function(*=))}, constituent-vnfd: {serialize: (function(*=))}, vnfd: {serialize: (function(*=))}, vdu: {serialize: (function(*=))}}} - */ const DescriptorModelSerializer = { + /** + * Create a json object that can be sent to the backend. I.e. CONFD JSON compliant to the schema definition. + * + * @param {any} model - the data blob from the editor. This is not modified. + * @returns cleansed data model + */ serialize(model) { - const type = model.uiState && model.uiState.type; - const serializer = this[type]; - if (serializer) { - model = serializer.serialize(model); - this[':clean'](model); - return model; - } - return false; - }, - ':clean'(model) { - // remove uiState from all elements accept nsd and vnfd - // remove empty / blank value fields - function clean(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]; - } - const isMetaAllowed = /^nsd|vnfd$/.test(m.uiState && m.uiState.type); - if (k === 'uiState') { - if (isMetaAllowed) { - // remove any transient ui state properties - const uiState = _.pick(m.uiState, DescriptorModelFields.meta); - if (!_.isEmpty(uiState)) { - // uiState field must be a string - m['meta'] = JSON.stringify(uiState); - } - } - delete m[k]; - } - if (typeof m[k] === 'object') { - clean(m[k]); - } - }); - } - clean(model); - return model; - }, - nsd: { - serialize(nsdModel) { - if(!nsdFields) nsdFields = DescriptorModelMetaFactory.getModelFieldNamesForType('nsd').concat('uiState'); - const confd = _.pick(nsdModel, nsdFields); - - // vnfd is defined in the ETSI etsi_gs reference manual but RIFT does not use it - delete confd.vnfd; - - // map the vnfd instances into the CONFD constituent-vnfd ref instances - confd['constituent-vnfd'] = confd['constituent-vnfd'].map((d, index) => { - - const constituentVNFD = { - 'member-vnf-index': d['member-vnf-index'], - 'vnfd-id-ref': d['vnfd-id-ref'] - }; - - if (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']; - utils.assignPathValue(constituentVNFD['vnf-configuration'], 'input-params.config-priority', configPriorityValue); - } else { - // remove any unused configuration options - ['netconf', 'rest', 'script', 'juju'].forEach(type => { - if (configType !== type) { - delete vnfConfig[type]; - } - }); - constituentVNFD['vnf-configuration'] = vnfConfig; - } - } - - if (d.hasOwnProperty('start-by-default')) { - constituentVNFD['start-by-default'] = d['start-by-default']; - } - - return constituentVNFD; - - }); - - // serialize the VLD instances - confd.vld = confd.vld.map(d => { - return DescriptorModelSerializer.serialize(d); - }); - - return confd; - - } - }, - vld: { - serialize(vldModel) { - if(!vldFields) vldFields = DescriptorModelMetaFactory.getModelFieldNamesForType('nsd.vld'); - const confd = _.pick(vldModel, vldFields); - const property = 'vnfd-connection-point-ref'; - - // TODO: There is a bug in RIFT-REST that is not accepting empty - // strings for string properties. - // 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]; - } - } - - const deepProperty = 'provider-network'; - for (var key in confd[deepProperty]) { - if (confd[deepProperty].hasOwnProperty(key) && confd[deepProperty][key] === '') { - delete confd[deepProperty][key]; - } - } - // fix-end - - - confd[property] = confd[property].map(d => DescriptorModelSerializer[property].serialize(d)); - return confd; - } - }, - 'vnfd-connection-point-ref': { - serialize(ref) { - return _.pick(ref, ['member-vnf-index-ref', 'vnfd-id-ref', 'vnfd-connection-point-ref']); - } - }, - 'constituent-vnfd': { - serialize(cvnfdModel) { - if(!cvnfdFields) cvnfdFields = DescriptorModelMetaFactory.getModelFieldNamesForType('nsd.constituent-vnfd'); - return _.pick(cvnfdModel, cvnfdFields); - } - }, - vnfd: { - serialize(vnfdModel) { - if(!vnfdFields) vnfdFields = DescriptorModelMetaFactory.getModelFieldNamesForType('vnfd').concat('uiState'); - const confd = _.pick(vnfdModel, vnfdFields); - confd.vdu = confd.vdu.map(d => DescriptorModelSerializer.serialize(d)); - return confd; - } - }, - vdu: { - serialize(vduModel) { - const confd = _.omit(vduModel, ['uiState']); - return confd; - } + if (!model.uiState) { + console.error('model uiState null', model); + return {}; + } + const path = model.uiState['qualified-type'] || model.uiState['type']; + const metaModel = DescriptorModelMetaFactory.getModelMetaForType(path); + const data = {}; + const name = model.uiState['type']; + data[name] = model; // lets get the meta hierachy from the top + const result = metaModel.serialize(data); + console.debug(result); + return result; } -}; - -export default DescriptorModelSerializer; +} +export default DescriptorModelSerializer; \ No newline at end of file