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