originalName fallbacks to customizationId or invariantId
[vid.git] / vid-webpack-master / src / app / drawingBoard / service-planning / objectsToTree / models / network / network.model.info.ts
1 import {DynamicInputsService} from "../../dynamicInputs.service";
2 import {ILevelNodeInfo} from "../basic.model.info";
3 import {NetworkInstance} from "../../../../../shared/models/networkInstance";
4 import {NetworkModel} from "../../../../../shared/models/networkModel";
5 import {NetworkTreeNode} from "../../../../../shared/models/networkTreeNode";
6 import {SharedTreeService} from "../../shared.tree.service";
7 import {InputType} from "../../../../../shared/models/inputTypes";
8 import {NgRedux} from "@angular-redux/store";
9 import {AppState} from "../../../../../shared/store/reducers";
10 import {
11   GenericFormPopupComponent,
12   PopupType
13 } from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
14 import {DialogService} from "ng2-bootstrap-modal";
15 import {NetworkPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
16 import * as _ from "lodash";
17 import {ITreeNode} from "angular-tree-component/dist/defs/api";
18 import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
19 import {DuplicateVnfComponent} from "../../../duplicate/duplicate-vnf.component";
20 import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions";
21 import {IframeService} from "../../../../../shared/utils/iframe.service";
22 import {DuplicateService} from "../../../duplicate/duplicate.service";
23 import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions";
24 import {
25   deleteActionNetworkInstance,
26   undoDeleteActionNetworkInstance,
27   updateNetworkPosition
28 } from "../../../../../shared/storeUtil/utils/network/network.actions";
29 import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config";
30 import {ComponentInfoType} from "../../../component-info/component-info-model";
31 import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
32 import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.service";
33 import {ModalService} from "../../../../../shared/components/customModal/services/modal.service";
34
35 export class NetworkModelInfo implements ILevelNodeInfo {
36   constructor(private _dynamicInputsService: DynamicInputsService,
37               private _sharedTreeService: SharedTreeService,
38               private _dialogService: DialogService,
39               private _networkPopupService: NetworkPopupService,
40               private _duplicateService: DuplicateService,
41               private modalService: ModalService,
42               private _iframeService: IframeService,
43               private _featureFlagsService: FeatureFlagsService,
44               private _store: NgRedux<AppState>) {
45   }
46
47   name: string = 'networks';
48   type: string = 'Network';
49   typeName: string = 'N';
50   childNames: string[];
51   componentInfoType = ComponentInfoType.NETWORK;
52
53   /***********************************************************
54    * return model dynamic inputs
55    * @param currentModel - current Model object
56    ************************************************************/
57   isEcompGeneratedNaming(currentModel): boolean {
58     const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
59     return ecompGeneratedNaming === "true";
60   }
61
62   updateDynamicInputsDataFromModel = (currentModel): any => {
63     let displayInputs;
64     return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
65   };
66
67   /***********************************************************
68    * return network model
69    * @param networkModelId - current Model id
70    * @param instance
71    * @param serviceHierarchy - serviceHierarchy
72    ************************************************************/
73   getModel = (networkModelId: string, instance: NetworkInstance, serviceHierarchy): NetworkModel => {
74     const uniqueIdOrName = this._sharedTreeService.modelUniqueNameOrId(instance);
75     return new NetworkModel(
76       this._sharedTreeService.modelByIdentifiers(serviceHierarchy, this.name, uniqueIdOrName, networkModelId),
77       this._featureFlagsService.getAllFlags());
78   };
79
80
81   /***********************************************************
82    * return network instance tree node
83    * @param instance - network instance
84    * @param model - network model
85    * @param parentModel
86    * @param storeKey - store key if exist
87    ************************************************************/
88   createInstanceTreeNode = (instance: any, model: any, parentModel: any, storeKey: string, serviceModelId: string): any => {
89     let node = new NetworkTreeNode(instance, model, storeKey);
90     node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
91     node.typeName = this.typeName;
92     node.menuActions = this.getMenuAction(<any>node, serviceModelId);
93     node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
94     node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage : "";
95     node = this._sharedTreeService.addingStatusProperty(node);
96     return node;
97   };
98
99   /***********************************************************
100    * return next level object (null because is last level)
101    ************************************************************/
102   getNextLevelObject(): any {
103     return null;
104   }
105
106   getTooltip = (): string => 'Network';
107
108   getType = (): string => 'Network';
109
110   /***********************************************************
111    * return if instance has missing data
112    * @param instance - vnf instance
113    * @param dynamicInputs
114    * @param isEcompGeneratedNaming
115    ************************************************************/
116   hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
117     return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]);
118   }
119
120
121   /***********************************************************
122    * return if instance has missing data
123    * @param node - Network node
124    * @param serviceModelId - current service id
125    ************************************************************/
126   onClickAdd(node, serviceModelId: string): void {
127     this._dialogService.addDialog(GenericFormPopupComponent, <any>{
128       type: PopupType.NETWORK,
129       uuidData: {
130         serviceId: serviceModelId,
131         networkId: node.data.name,
132         networkStoreKey: null,
133         type: 'VL',
134         popupService: this._networkPopupService
135       },
136       node: node,
137       isUpdateMode: false
138     });
139   }
140
141   /***********************************************************
142    * return number of existing instances
143    * @param node - Network node
144    * @param serviceModelId - current service id
145    ************************************************************/
146   getNodeCount(node: ITreeNode, serviceModelId: string): number {
147     let map = null;
148     if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
149       map = this._store.getState().service.serviceInstance[serviceModelId].existingNetworksCounterMap || 0;
150       if (!_.isNil(map)) {
151         let count = map[node.data.modelUniqueId] || 0;
152         count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'networks');
153         return count;
154       }
155     }
156     return 0;
157   }
158
159   /***********************************************************
160    * should show node icon
161    * @param node - current ITrees node
162    * @param serviceModelId - service id
163    ************************************************************/
164   showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
165     let counter: number = !_.isNil(this._store.getState().service.serviceInstance[serviceModelId]) ?
166       (this._store.getState().service.serviceInstance[serviceModelId].existingNetworksCounterMap[node.data.modelUniqueId] || 0) : 0;
167
168     counter -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'networks');
169
170     const properties = this._store.getState().service.serviceHierarchy[serviceModelId].networks[node.data.name].properties;
171     const flags = FeatureFlagsService.getAllFlags(this._store);
172     const isReachedLimit: boolean = this._sharedTreeService.isReachedToMaxInstances(properties, counter, flags);
173     const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !isReachedLimit;
174
175     return new AvailableNodeIcons(showAddIcon, isReachedLimit)
176   }
177
178   getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
179     const mode = this._store.getState().global.drawingBoardStatus;
180     return {
181       edit: {
182         method: (node, serviceModelId) => {
183           this._iframeService.addClassOpenModal('content');
184           this._dialogService.addDialog(GenericFormPopupComponent, {
185             type: PopupType.NETWORK,
186             uuidData: <any>{
187               serviceId: serviceModelId,
188               networkId: node.data.modelName,
189               networkStoreKey: node.data.networkStoreKey,
190               type: node.data.type,
191               popupService: this._networkPopupService
192             },
193             node: node,
194             isUpdateMode: true
195           });
196         },
197         visible: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowRemoveAndEdit(node),
198         enable: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowRemoveAndEdit(node)
199       },
200       showAuditInfo: {
201         method: (node, serviceModelId) => {
202           let instance = this._store.getState().service.serviceInstance[serviceModelId].networks[node.data.networkStoreKey];
203           this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'NETWORK', this);
204         },
205         visible: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowAuditInfo(node),
206         enable: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowAuditInfo(node)
207       },
208       duplicate: {
209         method: (node, serviceModelId) => {
210           const storeKey = node.data.networkStoreKey;
211           let modalConfig: IModalConfig = this._duplicateService.openDuplicateModal(serviceModelId, node.data.modelUniqueId, node.data.modelName, storeKey, 1, this._store, node);
212           this.modalService.openCustomModal(modalConfig, DuplicateVnfComponent);
213         },
214         visible: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowDuplicate(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create && this._duplicateService.canDuplicate(node),
215         enable: (node, serviceModelId) => node.data.parentType !== 'VRF' && this._duplicateService.isEnabled(node, this._store, serviceModelId)
216       },
217       remove: {
218         method: (node, serviceModelId) => {
219           let storeKey: string = node.data.networkStoreKey;
220           this._store.dispatch(removeInstance(node.data.networkStoreKey, serviceModelId, storeKey, node));
221           this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
222           this._sharedTreeService.selectedVNF = null;
223         },
224         visible: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowRemoveAndEdit(node),
225         enable: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowRemoveAndEdit(node),
226       },
227       delete: {
228         method: (node, serviceModelId) => {
229           if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
230             this._store.dispatch(deleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
231           } else {
232             this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
233               this._store.dispatch(deleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
234             });
235           }
236         },
237         visible: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowDelete(node, serviceModelId),
238         enable: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowDelete(node, serviceModelId)
239       },
240       undoDelete: {
241         method: (node, serviceModelId) => {
242           if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
243             this._store.dispatch(undoDeleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
244           } else {
245             this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
246               this._store.dispatch(undoDeleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
247             });
248           }
249         },
250         visible: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowUndoDelete(node),
251         enable: (node, serviceModelId) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
252       }
253
254     };
255   }
256
257   /***********************************************************
258    * should update node position inside the tree
259    * @param node - current ITrees node
260    ************************************************************/
261   updatePosition(that, node, instanceId): void {
262     that.store.dispatch(updateNetworkPosition(node));
263   }
264
265   getNodePosition(instance): number {
266     return !_.isNil(instance) ? instance.position : null;
267   }
268
269   getInfo(model, instance): ModelInformationItem[] {
270     const modelInformation = !_.isEmpty(model)  ? [
271       ModelInformationItem.createInstance("Min instances", !_.isNull(model.min) ? String(model.min) : null),
272       this._sharedTreeService.createMaximumToInstantiateModelInformationItem(model)
273     ] : [];
274
275     if (!_.isEmpty(model) && !_.isEmpty(model.properties)) {
276       modelInformation.push(ModelInformationItem.createInstance("Network role", model.properties.network_role))
277     }
278
279     const instanceInfo = !_.isEmpty(instance) ? [
280         ModelInformationItem.createInstance("Route target id", instance.routeTargetId ? instance.routeTargetId : null),
281         ModelInformationItem.createInstance("Route target role", instance.routeTargetRole ? instance.routeTargetRole : null)] :
282       [];
283     const result = [modelInformation, instanceInfo];
284     return _.uniq(_.flatten(result));
285   }
286 }