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";
11 GenericFormPopupComponent,
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";
25 deleteActionNetworkInstance,
26 undoDeleteActionNetworkInstance,
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";
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>) {
47 name: string = 'networks';
48 type: string = 'Network';
49 typeName: string = 'N';
51 componentInfoType = ComponentInfoType.NETWORK;
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";
62 updateDynamicInputsDataFromModel = (currentModel): any => {
64 return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
67 /***********************************************************
68 * return network model
69 * @param networkModelId - current Model id
71 * @param serviceHierarchy - serviceHierarchy
72 ************************************************************/
73 getModel = (networkModelId: string, instance: NetworkInstance, serviceHierarchy): NetworkModel => {
74 const originalModelName = instance.originalName ? instance.originalName : networkModelId;
75 return new NetworkModel(
76 this._sharedTreeService.modelByIdentifier(serviceHierarchy, this.name, originalModelName),
77 this._featureFlagsService.getAllFlags());
81 /***********************************************************
82 * return network instance tree node
83 * @param instance - network instance
84 * @param model - network model
86 * @param storeKey - store key if exist
87 ************************************************************/
88 createInstanceTreeNode = (instance: NetworkInstance, model: NetworkModel, parentModel, storeKey: string): NetworkTreeNode => {
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, model.uuid);
93 node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
94 node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage : "";
95 node = this._sharedTreeService.addingStatusProperty(node);
99 /***********************************************************
100 * return next level object (null because is last level)
101 ************************************************************/
102 getNextLevelObject(): any {
106 getTooltip = (): string => 'Network';
108 getType = (): string => 'Network';
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]);
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,
130 serviceId: serviceModelId,
131 networkId: node.data.name,
132 networkStoreKey: null,
134 popupService: this._networkPopupService
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 {
148 if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
149 map = this._store.getState().service.serviceInstance[serviceModelId].existingNetworksCounterMap || 0;
151 let count = map[node.data.modelUniqueId] || 0;
152 count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'networks');
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;
168 counter -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'networks');
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;
175 return new AvailableNodeIcons(showAddIcon, isReachedLimit)
178 getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
179 const mode = this._store.getState().global.drawingBoardStatus;
182 method: (node, serviceModelId) => {
183 this._iframeService.addClassOpenModal('content');
184 this._dialogService.addDialog(GenericFormPopupComponent, {
185 type: PopupType.NETWORK,
187 serviceId: serviceModelId,
188 networkId: node.data.modelName,
189 networkStoreKey: node.data.networkStoreKey,
190 type: node.data.type,
191 popupService: this._networkPopupService
197 visible: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowRemoveAndEdit(node),
198 enable: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowRemoveAndEdit(node)
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);
205 visible: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowAuditInfo(node),
206 enable: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowAuditInfo(node)
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);
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)
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;
224 visible: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowRemoveAndEdit(node),
225 enable: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowRemoveAndEdit(node),
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));
232 this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
233 this._store.dispatch(deleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
237 visible: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowDelete(node),
238 enable: (node) => node.data.parentType !== 'VRF' && this._sharedTreeService.shouldShowDelete(node)
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));
245 this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
246 this._store.dispatch(undoDeleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
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)
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));
265 getNodePosition(instance): number {
266 return !_.isNil(instance) ? instance.position : null;
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)
275 if (!_.isEmpty(model) && !_.isEmpty(model.properties)) {
276 modelInformation.push(ModelInformationItem.createInstance("Network role", model.properties.network_role))
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)] :
283 const result = [modelInformation, instanceInfo];
284 return _.uniq(_.flatten(result));