Rift.IO OSM R1 Initial Submission
[osm/UI.git] / skyquake / plugins / composer / src / src / libraries / model / DescriptorModelMetaFactory.js
1 /**
2 * Created by onvelocity on 1/27/16.
3 *
4 * This class provides methods to get the metadata about descriptor models.
5 */
6
7 'use strict';
8
9 import _ from 'lodash'
10 import utils from './../utils'
11 import DescriptorModelMetaProperty from './DescriptorModelMetaProperty'
12 import CommonUtils from 'utils/utils';
13 const assign = Object.assign;
14
15 const exportInnerTypesMap = {
16 'constituent-vnfd': 'nsd.constituent-vnfd',
17 'vdu': 'vnfd.vdu'
18 };
19
20 function getPathForType(type) {
21 if (exportInnerTypesMap[type]) {
22 return exportInnerTypesMap[type];
23 }
24 return type;
25 }
26
27 let modelMetaByPropertyNameMap = [];
28
29 let cachedDescriptorModelMetaRequest = null;
30
31 export default {
32 init() {
33 if (!cachedDescriptorModelMetaRequest) {
34 cachedDescriptorModelMetaRequest = new Promise(function(resolve, reject) {
35 CommonUtils.getDescriptorModelMeta().then(function(data) {
36 let DescriptorModelMetaJSON = data;
37 modelMetaByPropertyNameMap = Object.keys(DescriptorModelMetaJSON).reduce((map, key) => {
38 function mapProperties(parentMap, parentObj) {
39 parentMap[':meta'] = parentObj;
40 const properties = parentObj && parentObj.properties ? parentObj.properties : [];
41 properties.forEach(p => {
42 parentMap[p.name] = mapProperties({}, assign(p, {':qualified-type': parentObj[':qualified-type'] + '.' + p.name}));
43 return map;
44 }, parentMap);
45 return parentMap;
46 }
47 map[key] = mapProperties({}, assign(DescriptorModelMetaJSON[key], {':qualified-type': key}));
48 return map;
49 }, {});
50
51 (() => {
52 // initialize the UI centric properties that CONFD could care less about
53 utils.assignPathValue(modelMetaByPropertyNameMap, 'nsd.meta.:meta.preserve-line-breaks', true);
54 utils.assignPathValue(modelMetaByPropertyNameMap, 'vnfd.meta.:meta.preserve-line-breaks', true);
55 utils.assignPathValue(modelMetaByPropertyNameMap, 'vnfd.vdu.cloud-init.:meta.preserve-line-breaks', true);
56 utils.assignPathValue(modelMetaByPropertyNameMap, 'nsd.constituent-vnfd.vnf-configuration.config-template.:meta.preserve-line-breaks', true);
57 })();
58 resolve();
59 }, function(error) {
60 cachedDescriptorModelMetaRequest = null;
61 })
62 })
63 }
64
65 return cachedDescriptorModelMetaRequest;
66 },
67 createModelInstanceForType(typeOrPath) {
68 const modelMeta = this.getModelMetaForType(typeOrPath);
69 return DescriptorModelMetaProperty.createModelInstance(modelMeta);
70 },
71 getModelMetaForType(typeOrPath, filterProperties = () => true) {
72 // resolve paths like 'nsd' or 'vnfd.vdu' or 'nsd.constituent-vnfd'
73 const found = utils.resolvePath(modelMetaByPropertyNameMap, getPathForType(typeOrPath));
74 if (found) {
75 const uiState = _.cloneDeep(found[':meta']);
76 uiState.properties = uiState.properties.filter(filterProperties);
77 return uiState;
78 }
79 console.warn('no model uiState found for type', typeOrPath);
80 },
81 getModelFieldNamesForType(typeOrPath) {
82 // resolve paths like 'nsd' or 'vnfd.vdu' or 'nsd.constituent-vnfd'
83 const found = utils.resolvePath(modelMetaByPropertyNameMap, getPathForType(typeOrPath));
84 if (found) {
85 return found[':meta'].properties.map(p => p.name);
86 }
87 console.warn('no model uiState found for type', typeOrPath);
88 }
89 }