PopupType
} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
import {DialogService} from "ng2-bootstrap-modal";
-import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VfModulePopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popup.service";
import {AppState} from "../../../../../shared/store/reducers";
import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data";
import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
import {IframeService} from "../../../../../shared/utils/iframe.service";
import {
deleteActionVfModuleInstance,
+ deleteVFModuleField,
removeVfModuleInstance,
undoDeleteVfModuleInstance,
- updateVFModulePosition
+ undoUgradeVFModule,
+ updateVFModulePosition,
+ upgradeVFModule
} from "../../../../../shared/storeUtil/utils/vfModule/vfModule.actions";
import {ComponentInfoService} from "../../../component-info/component-info.service";
-import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model";
+import {ComponentInfoType} from "../../../component-info/component-info-model";
import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
+import {VfModuleUpgradePopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModuleUpgrade/vfModule.upgrade.popuop.service";
+import {FeatureFlagsService, Features} from "../../../../../shared/services/featureFlag/feature-flags.service";
+import {Utils} from "../../../../../shared/utils/utils";
export class VFModuleModelInfo implements ILevelNodeInfo {
constructor(private _dynamicInputsService: DynamicInputsService,
private _sharedTreeService: SharedTreeService,
private _dialogService: DialogService,
- private _vfModulePopupService: VfModulePopuopService,
+ private _vfModulePopupService: VfModulePopupService,
+ private _vfModuleUpgradePopupService: VfModuleUpgradePopupService,
private _iframeService: IframeService,
+ private _featureFlagsService: FeatureFlagsService,
private _store: NgRedux<AppState>,
private _componentInfoService: ComponentInfoService) {
}
name: string = 'vfModules';
type: string = 'Module';
typeName: string = 'M';
+ componentInfoType = ComponentInfoType.VFMODULE;
/***********************************************************
* return if user should provide instance name or not.
/***********************************************************
* return vfModule model
- * @param vfModuleModelId - current Model id
- * @param instance
- * @param serviceHierarchy - serviceHierarchy
+ * @param instanceModel - The model of the instance (usually extracted from
+ * serviceHierarchy store)
************************************************************/
- getModel = (vfModuleModelId: string, instance, serviceHierarchy): any => {
- if (!_.isNil(serviceHierarchy)) {
- if (!_.isNil(serviceHierarchy[this.name]) && !_.isNil(serviceHierarchy[this.name][vfModuleModelId])) {
- return serviceHierarchy[this.name][vfModuleModelId];
- }
+ getModel = (instanceModel: any): Partial<VfModule> => {
+ if (!_.isNil(instanceModel)) {
+ return new VfModule(instanceModel, this._featureFlagsService.getAllFlags());
}
return {};
};
- createNode(instance: VfModuleInstance, currentModel: VfModule, parentModel: VNFModel, modelName: string, index: number): VfModuleTreeNode {
+ createNode(instance: VfModuleInstance, currentModel: VfModule, parentModel: VNFModel, modelName: string, index: number, serviceModelId: string): VfModuleTreeNode {
let dynamicModelName = Object.keys(instance)[index];
instance = instance[Object.keys(instance)[index]];
const isEcompGeneratedNaming: boolean = this.isEcompGeneratedNaming(currentModel, parentModel);
newVfModule.missingData = this._sharedTreeService.hasMissingData(instance, newVfModule.dynamicInputs, isEcompGeneratedNaming, []);
newVfModule.typeName = this.typeName;
- newVfModule.menuActions = this.getMenuAction(<any>newVfModule, currentModel.uuid);
+ newVfModule.menuActions = this.getMenuAction(<any>newVfModule, serviceModelId);
newVfModule.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
- newVfModule.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
+ newVfModule.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage : "";
newVfModule = this._sharedTreeService.addingStatusProperty(newVfModule);
return newVfModule;
}
- createInstanceTreeNode(instance: VfModuleInstance, currentModel: VfModule, parentModel: VNFModel, modelName: string): VfModuleTreeNode | VfModuleTreeNode[] {
+ createInstanceTreeNode(instance: any, model: any, parentModel: any, storeKey: string, serviceModelId: string): any {
let numberOfChilds = Object.keys(instance).length;
if (numberOfChilds > 1) {
let result: VfModuleTreeNode[] = [];
for (let i = 0; i < numberOfChilds; i++) {
- result.push(this.createNode(instance, currentModel, parentModel, modelName, i));
+ result.push(this.createNode(instance, model, parentModel, storeKey, i, serviceModelId));
}
return result;
} else {
- return this.createNode(instance, currentModel, parentModel, modelName, 0);
+ return this.createNode(instance, model, parentModel, storeKey, 0, serviceModelId);
}
}
getDefaultVNF(node: ITreeNode, serviceModelId: string): string {
let keys = _.keys(_.pickBy(this._store.getState().service.serviceInstance[serviceModelId].vnfs, vnf => {
- return (vnf.originalName == node.data.name);
+ return (this._sharedTreeService.modelUniqueId(vnf) === node.data.modelUniqueId);
}));
return keys.length === 1 ? this._store.getState().service.serviceInstance[serviceModelId].vnfs[keys[0]].vnfStoreKey : null;
}
* @param serviceModelId - current service id
************************************************************/
getNodeCount(node: ITreeNode, serviceModelId: string): number {
+ const vnfs = this._store.getState().service.serviceInstance[serviceModelId].vnfs;
let count: number = 0;
if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
- const vnfs = this._store.getState().service.serviceInstance[serviceModelId].vnfs;
-
- for (let vnfKey in vnfs) {
- count += this.countNumberOfVFModule(vnfs[vnfKey], node);
+ const selectedVNF: string = this._sharedTreeService.getSelectedVNF();
+ if (selectedVNF) {
+ count += this.countNumberOfVFModule(vnfs[selectedVNF], node);
+ }else {
+ for (let vnfKey in vnfs) {
+ count += this.countNumberOfVFModule(vnfs[vnfKey], node);
+ }
}
return count;
}
let count = 0;
for (let vfModuleKey in vnf['vfModules']) {
for (let vfModule in vnf['vfModules'][vfModuleKey]) {
- if (vnf['vfModules'][vfModuleKey][vfModule]['modelInfo'].modelCustomizationId === node.data.modelUniqueId) {
+ if (this._sharedTreeService.modelUniqueId(vnf['vfModules'][vfModuleKey][vfModule]) === node.data.modelUniqueId) {
const vfModuleObj = vnf['vfModules'][vfModuleKey][vfModule];
if (!(!_.isNil(vfModuleObj) && !_.isNil(vfModuleObj.action) && vfModuleObj.action.split('_').pop() === 'Delete')) count++;
}
getCountVFModuleOfSelectedVNF(node: ITreeNode, vnfStoreKey: string, serviceModelId: string): number {
let count: number = 0;
if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
- const vnfs = this._store.getState().service.serviceInstance[serviceModelId].vnfs;
-
- for (let vnfKey in vnfs) {
- count += this.countNumberOfVFModule(vnfs[vnfKey], node);
- }
+ const vnf = this._store.getState().service.serviceInstance[serviceModelId].vnfs[vnfStoreKey];
+ count += this.countNumberOfVFModule(vnf, node);
return count;
}
return count;
if (selectedVNF) {
return this.showVFModuleOnSelectedVNF(node, selectedVNF, serviceModelId);
} else {
- const optionalSelected = this.getOptionalVNFs(serviceModelId, node.parent.data.name);
+ const optionalSelected = this.getOptionalVNFs(serviceModelId, node.parent.data.modelUniqueId);
if (optionalSelected.length === 1) {
return this.showVFModuleOnSelectedVNF(node, optionalSelected[0].vnfStoreKey, serviceModelId);
} else {
showVFModuleOnSelectedVNF(node: ITreeNode, selectedVNF: string, serviceModelId: string): AvailableNodeIcons {
-
- if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF]) && node.parent.data.name === this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF].originalName) {
+ if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF])
+ && node.parent.data.modelUniqueId === this._sharedTreeService.modelUniqueId(this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF])) {
const existingVFModules = this.getCountVFModuleOfSelectedVNF(node, selectedVNF, serviceModelId);
const reachedLimit = this.isVFModuleReachedLimit(node, this._store.getState().service.serviceHierarchy, serviceModelId, existingVFModules);
- const showAddIcon = this._sharedTreeService.shouldShowAddIcon()&& !reachedLimit;
+ const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !reachedLimit;
return new AvailableNodeIcons(showAddIcon, reachedLimit);
}
return new AvailableNodeIcons(false, false);
}
- getOptionalVNFs(serviceUUID: string, vnfOriginalModelName: string): any[] {
+ getOptionalVNFs(serviceUUID: string, vnfModelUniqueId: string): any[] {
let result = [];
if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceUUID])) {
const serviceVNFsInstances = this._store.getState().service.serviceInstance[serviceUUID].vnfs;
for (let vnfKey in serviceVNFsInstances) {
- if (serviceVNFsInstances[vnfKey].originalName === vnfOriginalModelName) {
+ if (this._sharedTreeService.modelUniqueId(serviceVNFsInstances[vnfKey]) === vnfModelUniqueId) {
serviceVNFsInstances[vnfKey].vnfStoreKey = vnfKey;
result.push(serviceVNFsInstances[vnfKey]);
}
}
isVFModuleReachedLimit(node: any, serviceHierarchy: any, serviceModelId: string, currentNodeCount: number): boolean {
- let maxNodes: number = 1;
+ const flags = this._featureFlagsService.getAllFlags();
let vnfModules = serviceHierarchy[serviceModelId].vfModules;
- if (vnfModules[node.data.name]) {
- maxNodes = vnfModules[node.data.name].properties.maxCountInstances || 1;
+ const maxInstances = vnfModules[node.data.name]
+ ? Utils.getMaxVfModule(vnfModules[node.data.name].properties, flags)
+ : null;
+ if (_.isNil(maxInstances)) {
+ return false;
}
- return !(maxNodes > currentNodeCount);
+ return !(maxInstances > currentNodeCount);
}
getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
},
delete: {
method: (node, serviceModelId) => {
- this._store.dispatch(deleteActionVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId))
+ this._store.dispatch(deleteActionVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId, node.data.modelName))
},
- visible: (node) => this._sharedTreeService.shouldShowDelete(node),
- enable: (node) => this._sharedTreeService.shouldShowDelete(node)
+ visible: (node) => this._sharedTreeService.shouldShowDelete(node, serviceModelId),
+ enable: (node) => this._sharedTreeService.shouldShowDelete(node, serviceModelId)
},
undoDelete: {
method: (node, serviceModelId) => {
- this._store.dispatch(undoDeleteVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId))
+ this._store.dispatch(undoDeleteVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId));
+ this._store.dispatch(deleteVFModuleField(node.data.modelName, node.parent.data.vnfStoreKey, node.data.servicedId ,node.data.dynamicModelName, 'retainAssignments'));
},
visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
- enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && this._sharedTreeService.shouldShowDelete(node.parent) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
- }
+ enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && this._sharedTreeService.shouldShowDelete(node.parent, serviceModelId) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
+ },
+ upgrade: {
+ method: (node, serviceModelId) => {
+ this.upgradeVFM(serviceModelId, node);
+ },
+ visible: (node,serviceModelId) => {
+ return this._sharedTreeService.shouldShowUpgrade(node, serviceModelId);
+ },
+ enable: (node, serviceModelId) => {
+ return this._sharedTreeService.shouldShowUpgrade(node, serviceModelId);
+ }
+ },
+ undoUpgrade: {
+ method: (node, serviceModelId) => {
+ this._sharedTreeService.undoUpgradeBottomUp(node, serviceModelId);
+ this._store.dispatch(undoUgradeVFModule(node.data.modelName, node.parent.data.vnfStoreKey, serviceModelId, node.data.dynamicModelName));
+ },
+ visible: (node) => {
+ return this._sharedTreeService.shouldShowUndoUpgrade(node);
+ },
+ enable: (node) => {
+ return this._sharedTreeService.shouldShowUndoUpgrade(node);
+ }
+ },
};
+ }
-
+ private upgradeVFM(serviceModelId, node) {
+ if (FeatureFlagsService.getFlagState(Features.FLAG_2002_VFM_UPGRADE_ADDITIONAL_OPTIONS, this._store)) {
+ this._iframeService.addClassOpenModal('content');
+ this._dialogService.addDialog(GenericFormPopupComponent, {
+ type: PopupType.VF_MODULE_UPGRADE,
+ uuidData: <any>{
+ serviceId: serviceModelId,
+ modelName: node.data.modelName,
+ vFModuleStoreKey: node.data.dynamicModelName,
+ vnfStoreKey: node.parent.data.vnfStoreKey,
+ modelId: node.data.modelId,
+ type: node.data.type,
+ popupService: this._vfModuleUpgradePopupService,
+ vfModule : _.cloneDeep(node)
+ },
+ node,
+ isUpdateMode: true
+ });
+ } else {
+ this._sharedTreeService.upgradeBottomUp(node, serviceModelId);
+ this._store.dispatch(upgradeVFModule(node.data.modelName, node.parent.data.vnfStoreKey, serviceModelId ,node.data.dynamicModelName));
+ }
}
- updatePosition(that , node, instanceId, parentStoreKey): void {
+ updatePosition(that, node, instanceId, parentStoreKey): void {
that.store.dispatch(updateVFModulePosition(node, instanceId, parentStoreKey));
}
return (!_.isNil(instance) && !_.isNil(instance[deepDynamicName])) ? instance[deepDynamicName].position : null;
}
- onSelectedNode(node: ITreeNode): void {
- }
-
- getInfoForVFModule(model, instance): ComponentInfoModel {
- let modelInfoItems: ModelInformationItem[] = [];
- if (model && !_.isNil(model.properties))
- {
- modelInfoItems = [
- ModelInformationItem.createInstance("Base Module", model.properties.baseModule),
- ModelInformationItem.createInstance("Min Instances", model.properties.minCountInstances),
- ModelInformationItem.createInstance("Max Instances", model.properties.maxCountInstances),
- ModelInformationItem.createInstance("Initial Instances Count", model.properties.initialCount)
- ];
- }
- return this._componentInfoService.addGeneralInfoItems(modelInfoItems, ComponentInfoType.VFMODULE, model, instance);
+ getInfo(model:Partial<VfModule>, instance): ModelInformationItem[] {
+ const modelInformation = !_.isEmpty(model) ? [
+ ModelInformationItem.createInstance("Base module", model.baseModule),
+ ModelInformationItem.createInstance("Min instances", !_.isNull(model.min) ? String(model.min) : null),
+ this._sharedTreeService.createMaximumToInstantiateModelInformationItem(model),
+ ModelInformationItem.createInstance("Initial instances count", !_.isNull(model.initial) ? String(model.initial) : null)
+ ] : [];
+
+ const instanceInfo = [];
+ const result = [modelInformation, instanceInfo];
+ return _.uniq(_.flatten(result));
}
-
-
}