1 import {Action} from "redux";
2 import * as _ from "lodash";
4 CreateVFModuleInstanceAction, DeleteActionVfModuleInstanceAction,
5 DeleteVfModuleInstanceAction, UndoDeleteActionVfModuleInstanceAction, UpdateVFModluePosition,
6 UpdateVFModuleInstanceAction,
8 } from "./vfModule.actions";
9 import {ServiceInstance} from "../../../models/serviceInstance";
10 import {VfModuleMap} from "../../../models/vfModulesMap";
11 import {ServiceState} from "../main.reducer";
12 import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
15 export function vfModuleReducer(state: ServiceState , action: Action) : ServiceState{
16 switch (action.type) {
17 case VfModuleActions.CREATE_VF_MODULE: {
18 const updateVFModuleInstanceAction = <CreateVFModuleInstanceAction>action;
19 const vfInstance = updateVFModuleInstanceAction.vfInstance;
20 const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
21 const vfModuleId = updateVFModuleInstanceAction.vfId;
22 const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey;
24 let newState = Object.assign({}, state);
26 let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] || new VfModuleMap();
27 let randomId = generateId();
28 vfModulesMap[vfModuleId + randomId] = vfInstance;
29 updateUniqueNames(null, vfInstance.instanceName, newState.serviceInstance[serviceUuid]);
30 updateUniqueNames(null, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]);
31 updateServiceValidationCounter(newState, false, vfInstance['isMissingData'], serviceUuid);
33 newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] = vfModulesMap;
36 case VfModuleActions.UPDATE_VF_MODULE: {
37 const updateVFModuleInstanceAction = <UpdateVFModuleInstanceAction>action;
38 const vfInstance = updateVFModuleInstanceAction.vfInstance;
39 const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
40 const vfModuleId = updateVFModuleInstanceAction.vfId;
41 const newState = _.cloneDeep(state);
42 const vnfs = newState.serviceHierarchy[serviceUuid].vnfs;
43 let vnfId = getVfModuleParentVnfId(vnfs, vfModuleId);
44 const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey;
45 if (!_.isNil(vnfStoreKey)) {
48 let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] || new VfModuleMap();
49 updateServiceValidationCounter(newState, vfModulesMap[updateVFModuleInstanceAction.dynamicModelName]['isMissingData'], vfInstance.isMissingData, serviceUuid);
50 updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].instanceName, vfInstance.instanceName, newState.serviceInstance[serviceUuid]);
51 updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].volumeGroupName, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]);
52 vfModulesMap[updateVFModuleInstanceAction.dynamicModelName] = vfInstance;
53 newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] = vfModulesMap;
56 case VfModuleActions.REMOVE_VNF_MODULE_INSTANCE: {
57 const actionData = (<DeleteVfModuleInstanceAction>action);
58 if (state.serviceInstance[actionData.serviceModelId]) {
59 let vfModulesMap = state.serviceInstance[actionData.serviceModelId].vnfs[actionData.vnfStoreKey].vfModules;
60 updateIsMissingDataOnDeleteVFModule(state, actionData.serviceModelId, actionData.vnfStoreKey, actionData.modelName);
61 updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].instanceName, null, state.serviceInstance[actionData.serviceModelId] );
62 updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].volumeGroupName, null, state.serviceInstance[actionData.serviceModelId] );
63 delete vfModulesMap[actionData.modelName][actionData.dynamicModelName];
64 if(_.isEmpty(vfModulesMap[actionData.modelName])){
65 delete vfModulesMap[actionData.modelName];
68 return Object.assign({}, state);
70 case VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE : {
71 let newState = _.cloneDeep(state);
72 let vfModules = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules;
74 for(let key in vfModules){
75 let firstKey = Object.keys(vfModules[key])[0];
76 if(firstKey === (<DeleteActionVfModuleInstanceAction>action).dynamicModelName){
77 let oldAction = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action;
78 if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
79 newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
80 updateIsMissingDataOnDeleteVFModule(newState, (<UndoDeleteActionVfModuleInstanceAction>action).serviceId, (<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey, key);
86 case VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE : {
87 let newState = _.cloneDeep(state);
88 let vfModules = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules;
90 for(let key in vfModules){
91 let firstKey = Object.keys(vfModules[key])[0];
92 if(firstKey === (<UndoDeleteActionVfModuleInstanceAction>action).dynamicModelName){
93 let oldAction = newState.serviceInstance[(<UndoDeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action;
94 newState.serviceInstance[(<UndoDeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action = (oldAction.split('_')[0]) as ServiceInstanceActions;
95 updateIsMissingDataOnDeleteVFModule(newState, (<UndoDeleteActionVfModuleInstanceAction>action).serviceId, (<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey, key);
102 case VfModuleActions.UPDATE_VFMODULE_POSITION : {
103 const updateVFModluePosition = <UpdateVFModluePosition>action;
104 const serviceUuid = updateVFModluePosition.instanceId;
105 const dynamicModelName = updateVFModluePosition.node.dynamicModelName;
106 const modelName = updateVFModluePosition.node.modelName;
107 const newState = _.cloneDeep(state);
109 newState.serviceInstance[serviceUuid].vnfs[updateVFModluePosition.vnfStoreKey].vfModules[modelName][dynamicModelName].position = updateVFModluePosition.node.position;
115 const updateIsMissingDataOnDeleteVFModule = (state: any, serviceModelId: string, vnfStoreKey: string, vfModuleName): void => {
116 const vfModules = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[vfModuleName];
118 _.forOwn(vfModules, (vfModuleInstance) => {
119 let isMissingData: boolean = vfModuleInstance.isMissingData;
120 updateServiceValidationCounter(state, isMissingData, false, serviceModelId);
125 const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => {
126 let existingNames = serviceInstance.existingNames;
127 if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
128 delete existingNames[oldName.toLowerCase()];
130 if(!_.isNil(newName)) {
131 existingNames[newName.toLowerCase()] = "";
135 const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => {
136 if (oldValidationState && !newValidationState) {
137 newState.serviceInstance[serviceUuid].validationCounter--;
138 } else if (!oldValidationState && newValidationState) {
139 newState.serviceInstance[serviceUuid].validationCounter++;
143 const generateId = () => {
144 return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
146 const getVfModuleParentVnfId = (vnfs: object, vfModuleId: string) => {
147 let vnfId = undefined;
148 _.forOwn(vnfs, (value, key) => {
149 if (vnfs[key].vfModules && vnfs[key].vfModules[vfModuleId]) {
150 vnfId = vnfs[key].modelCustomizationName;