1 import {DynamicInputsService} from "../../dynamicInputs.service";
2 import {ILevelNodeInfo} from "../basic.model.info";
3 import {VFModuleModelInfo} from "../vfModule/vfModule.model.info";
4 import {VNFModel} from "../../../../../shared/models/vnfModel";
5 import {VnfInstance} from "../../../../../shared/models/vnfInstance";
6 import {VnfTreeNode} from "../../../../../shared/models/vnfTreeNode";
7 import {InputType} from "../../../../../shared/models/inputTypes";
8 import {SharedTreeService} from "../../shared.tree.service";
9 import {NgRedux} from "@angular-redux/store";
10 import {AppState} from "../../../../../shared/store/reducers";
11 import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
12 import {GenericFormPopupComponent, PopupType} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
13 import {DialogService} from 'ng2-bootstrap-modal';
14 import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
15 import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
16 import {ITreeNode} from "angular-tree-component/dist/defs/api";
17 import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
18 import {DuplicateService} from "../../../duplicate/duplicate.service";
19 import {DuplicateVnfComponent} from "../../../duplicate/duplicate-vnf.component";
20 import {SdcUiServices} from "onap-ui-angular";
21 import {IframeService} from "../../../../../shared/utils/iframe.service";
22 import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions";
23 import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data";
24 import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
25 import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions";
26 import {deleteActionVnfInstance, undoDeleteActionVnfInstance, undoUpgradeVnf, updateVnfPosition, upgradeVnf} from "../../../../../shared/storeUtil/utils/vnf/vnf.actions";
27 import * as _ from 'lodash';
28 import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config";
29 import {ComponentInfoType} from "../../../component-info/component-info-model";
30 import {ComponentInfoService} from "../../../component-info/component-info.service";
31 import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
32 import {VfModuleUpgradePopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModuleUpgrade/vfModule.upgrade.popuop.service";
33 import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.service";
35 export class VnfModelInfo implements ILevelNodeInfo {
36 constructor(private _dynamicInputsService: DynamicInputsService,
37 private _sharedTreeService: SharedTreeService,
38 private _defaultDataGeneratorService: DefaultDataGeneratorService,
39 private _dialogService: DialogService,
40 private _vnfPopupService: VnfPopupService,
41 private _vfModulePopupService: VfModulePopuopService,
42 private _vfModuleUpgradePopupService: VfModuleUpgradePopupService,
43 private _duplicateService: DuplicateService,
44 private modalService: SdcUiServices.ModalService,
45 private _iframeService: IframeService,
46 private _componentInfoService: ComponentInfoService,
47 private _featureFlagsService: FeatureFlagsService,
48 private _store: NgRedux<AppState>) {
51 name: string = 'vnfs';
53 childNames: string[] = ['vfModules'];
54 typeName: string = 'VNF';
55 componentInfoType = ComponentInfoType.VNF;
57 /***********************************************************
58 * return if user should provide instance name or not.
59 * @param currentModel - current Model object
60 ************************************************************/
61 isEcompGeneratedNaming = (currentModel): boolean => {
62 const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
63 return ecompGeneratedNaming === "true";
66 /***********************************************************
67 * return model dynamic inputs
68 * @param currentModel - current Model object
69 ************************************************************/
70 updateDynamicInputsDataFromModel = (currentModel): any => {
72 return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
75 /***********************************************************
77 * @param vnfModelId - current Model id
78 * @param instance - vnf instance
79 * @param serviceHierarchy - serviceHierarchy
80 ************************************************************/
81 getModel = (vnfModelId: string, instance: VnfInstance, serviceHierarchy): VNFModel => {
82 const originalModelName = instance.originalName ? instance.originalName : vnfModelId;
83 return new VNFModel(serviceHierarchy[this.name][originalModelName], this._featureFlagsService.getAllFlags());
87 /***********************************************************
88 * return vnf instance tree node
89 * @param instance - vnf instance
90 * @param model - vnf model
92 * @param storeKey - store key if exist
93 ************************************************************/
94 createInstanceTreeNode = (instance: VnfInstance, model: VNFModel, parentModel, storeKey: string): VnfTreeNode => {
95 let node = new VnfTreeNode(instance, model, storeKey);
96 node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
97 node.typeName = this.typeName;
98 node.menuActions = this.getMenuAction(<any>node, model.uuid);
99 node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
100 node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage : "";
101 node = this._sharedTreeService.addingStatusProperty(node);
105 /***********************************************************
106 * return next level object (VFModule)
107 ************************************************************/
108 getNextLevelObject = (): VFModuleModelInfo => {
109 return new VFModuleModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._vfModulePopupService, this._vfModuleUpgradePopupService, this._iframeService, this._featureFlagsService, this._store, this._componentInfoService);
112 /***********************************************************
113 * return if instance has missing data
114 * @param instance - vnf instance
115 * @param dynamicInputs
116 * @param isEcompGeneratedNaming
117 ************************************************************/
118 hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
119 return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]);
122 getTooltip = (): string => 'VF';
124 getType = (): string => 'VF';
126 /***********************************************************
127 * return if instance has missing data
128 * @param node - VNF node
129 * @param serviceModelId - current service id
130 ************************************************************/
131 onClickAdd(node, serviceModelId: string): void {
132 this._dialogService.addDialog(GenericFormPopupComponent, {
135 serviceId: serviceModelId,
136 modelName: node.data.name,
138 modelId: node.data.modelVersionId,
139 type: node.data.type,
140 popupService: this._vnfPopupService
147 /***********************************************************
148 * return number of existing instances
149 * @param node - VNF node
150 * @param serviceModelId - current service id
151 ************************************************************/
152 getNodeCount(node: ITreeNode, serviceModelId: string): number {
154 if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
155 map = this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap || 0;
158 let count = map[node.data.modelUniqueId] || 0;
159 count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs');
166 /***********************************************************
167 * should show node icon
168 * @param node - current ITrees node
169 * @param serviceModelId - service id
170 ************************************************************/
171 showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
172 let counter: number = !_.isNil(this._store.getState().service.serviceInstance[serviceModelId]) ?
173 (this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap[node.data.modelUniqueId] || 0) : 0;
174 counter -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs');
176 const properties = this._store.getState().service.serviceHierarchy[serviceModelId].vnfs[node.data.name].properties;
177 const flags = FeatureFlagsService.getAllFlags(this._store);
178 const isReachedLimit: boolean = this._sharedTreeService.isReachedToMaxInstances(properties, counter, flags);
179 const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !isReachedLimit;
180 return new AvailableNodeIcons(showAddIcon, isReachedLimit)
183 getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
186 method: (node, serviceModelId) => {
187 this._iframeService.addClassOpenModal('content');
188 this._dialogService.addDialog(GenericFormPopupComponent, {
191 serviceId: serviceModelId,
192 modelName: node.data.modelName,
193 vnfStoreKey: node.data.vnfStoreKey,
194 modelId: node.data.modelId,
195 type: node.data.type,
196 popupService: this._vnfPopupService
202 visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
203 enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
206 method: (node, serviceModelId) => {
207 const instance = this._store.getState().service.serviceInstance[serviceModelId].vnfs[node.data.vnfStoreKey];
208 this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VNF', this);
210 visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
211 enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
214 method: (node, serviceModelId) => {
215 const storeKey = node.data.vnfStoreKey;
216 let modalConfig: IModalConfig = this._duplicateService.openDuplicateModal(serviceModelId, node.data.modelUniqueId, node.data.modelName, storeKey, 1, this._store, node);
217 this.modalService.openCustomModal(modalConfig, DuplicateVnfComponent);
219 visible: (node) => this._sharedTreeService.shouldShowDuplicate(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create && this._duplicateService.canDuplicate(node),
220 enable: (node, serviceModelId) => this._duplicateService.isEnabled(node, this._store, serviceModelId)
223 method: (node, serviceModelId) => {
224 if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
225 let storeKey: string = node.data.vnfStoreKey;
226 this._store.dispatch(removeInstance(node.data.vnfStoreKey, serviceModelId, storeKey, node));
227 this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
228 this._sharedTreeService.selectedVNF = null;
230 let messageBoxData: MessageBoxData = new MessageBoxData(
231 "Remove VNF", // modal title
232 "You are about to remove this VNF and all its children from this service. Are you sure you want to remove it?",
239 callback: this.removeVnf.bind(this, node, serviceModelId),
242 {text: "Don’t Remove", size: "medium", closeModal: true}
245 MessageBoxService.openModal.next(messageBoxData);
248 visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
249 enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
252 method: (node, serviceModelId) => {
253 if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
254 this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
256 this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(node, serviceModelId, (node, serviceModelId) => {
257 this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
258 this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
263 visible: (node) => this._sharedTreeService.shouldShowDelete(node),
264 enable: (node) => this._sharedTreeService.shouldShowDelete(node)
267 method: (node, serviceModelId) => {
268 if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
269 this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
271 this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
272 this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
276 visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
277 enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
280 method: (node, serviceModelId) => {
281 this._store.dispatch(upgradeVnf(node.data.vnfStoreKey, serviceModelId));
283 visible: () => false,
287 method: (node, serviceModelId) => {
288 this._store.dispatch(undoUpgradeVnf(node.data.vnfStoreKey, serviceModelId));
290 visible: () => false,
296 removeVnf(this, node, serviceModelId) {
297 this._store.dispatch(removeInstance(node.data.modelName, serviceModelId, node.data.vnfStoreKey, node));
298 this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
299 this._sharedTreeService.selectedVNF = null;
302 /***********************************************************
303 * should update node position inside the tree
304 * @param node - current ITrees node
305 ************************************************************/
306 updatePosition(that, node, instanceId): void {
307 that.store.dispatch(updateVnfPosition(node, instanceId, node.vnfStoreKey));
310 /***********************************************************
311 * return the position of the current node in the tree
312 * @param instance - current ITrees node instance
313 ************************************************************/
314 getNodePosition(instance): number {
315 return !_.isNil(instance) ? instance.position : null;
318 getInfo(model, instance): ModelInformationItem[] {
319 const modelInformation = !_.isEmpty(model) ? [
320 ModelInformationItem.createInstance("Min instances", !_.isNil(model.min) ? String(model.min) : null),
321 ModelInformationItem.createInstance("Max instances", !_.isNil(model.max) ? String(model.max) : 'Unlimited (default)')
324 const instanceInfo = !_.isEmpty(instance) ? [
325 ModelInformationItem.createInstance("NF type", instance.nfType),
326 ModelInformationItem.createInstance("NF role", instance.nfRole)
329 const result = [modelInformation, instanceInfo];
330 return _.uniq(_.flatten(result));