Merge changes Ib4430bf2,Icc0bdb9e,I2736b984
[vid.git] / vid-webpack-master / src / app / shared / storeUtil / utils / vfModule / vfModule.reducers.ts
1 import {Action} from "redux";
2 import * as _ from "lodash";
3 import {
4   CreateVFModuleInstanceAction, DeleteActionVfModuleInstanceAction,
5   DeleteVfModuleInstanceAction, UndoDeleteActionVfModuleInstanceAction, UpdateVFModluePosition,
6   UpdateVFModuleInstanceAction,
7   VfModuleActions
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";
13 import {updateServiceValidationCounter} from "../reducersHelper";
14
15
16 export function vfModuleReducer(state: ServiceState , action: Action) : ServiceState{
17   switch (action.type) {
18     case VfModuleActions.CREATE_VF_MODULE: {
19       const updateVFModuleInstanceAction = <CreateVFModuleInstanceAction>action;
20       const vfInstance = updateVFModuleInstanceAction.vfInstance;
21       const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
22       const vfModuleId = updateVFModuleInstanceAction.vfId;
23       const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey;
24
25       let newState = Object.assign({}, state);
26
27       let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] || new VfModuleMap();
28       let randomId = generateId();
29       vfModulesMap[vfModuleId + randomId] = vfInstance;
30       updateUniqueNames(null, vfInstance.instanceName, newState.serviceInstance[serviceUuid]);
31       updateUniqueNames(null, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]);
32       updateServiceValidationCounter(newState, false, vfInstance['isMissingData'], serviceUuid);
33
34       newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] = vfModulesMap;
35       return newState;
36     }
37     case VfModuleActions.UPDATE_VF_MODULE: {
38       const updateVFModuleInstanceAction = <UpdateVFModuleInstanceAction>action;
39       const vfInstance = updateVFModuleInstanceAction.vfInstance;
40       const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
41       const vfModuleId = updateVFModuleInstanceAction.vfId;
42       const newState = _.cloneDeep(state);
43       const vnfs = newState.serviceHierarchy[serviceUuid].vnfs;
44       let vnfId = getVfModuleParentVnfId(vnfs, vfModuleId);
45       const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey;
46       if (!_.isNil(vnfStoreKey)) {
47         vnfId = vnfStoreKey;
48       }
49       let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] || new VfModuleMap();
50       updateServiceValidationCounter(newState, vfModulesMap[updateVFModuleInstanceAction.dynamicModelName]['isMissingData'], vfInstance.isMissingData, serviceUuid);
51       updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].instanceName, vfInstance.instanceName, newState.serviceInstance[serviceUuid]);
52       updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].volumeGroupName, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]);
53       vfModulesMap[updateVFModuleInstanceAction.dynamicModelName] = vfInstance;
54       newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] = vfModulesMap;
55       return newState;
56     }
57     case VfModuleActions.REMOVE_VNF_MODULE_INSTANCE: {
58       const actionData = (<DeleteVfModuleInstanceAction>action);
59       if (state.serviceInstance[actionData.serviceModelId]) {
60         let vfModulesMap = state.serviceInstance[actionData.serviceModelId].vnfs[actionData.vnfStoreKey].vfModules;
61         updateIsMissingDataOnDeleteVFModule(state, actionData.serviceModelId, actionData.vnfStoreKey, actionData.modelName);
62         updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].instanceName, null, state.serviceInstance[actionData.serviceModelId] );
63         updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].volumeGroupName, null, state.serviceInstance[actionData.serviceModelId] );
64         delete vfModulesMap[actionData.modelName][actionData.dynamicModelName];
65         if(_.isEmpty(vfModulesMap[actionData.modelName])){
66           delete vfModulesMap[actionData.modelName];
67         }
68       }
69       return Object.assign({}, state);
70     }
71     case VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE : {
72       let newState = _.cloneDeep(state);
73       let vfModules = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules;
74
75       for(let key in vfModules){
76         let firstKey = Object.keys(vfModules[key])[0];
77         if(firstKey === (<DeleteActionVfModuleInstanceAction>action).dynamicModelName){
78           let oldAction = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action;
79           if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
80           newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
81           updateIsMissingDataOnDeleteVFModule(newState, (<UndoDeleteActionVfModuleInstanceAction>action).serviceId, (<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey, key);
82           return newState;
83         }
84       }
85       return newState;
86     }
87     case VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE : {
88       let newState = _.cloneDeep(state);
89       let vfModules = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules;
90
91       for(let key in vfModules){
92         let firstKey = Object.keys(vfModules[key])[0];
93         if(firstKey === (<UndoDeleteActionVfModuleInstanceAction>action).dynamicModelName){
94           let oldAction = newState.serviceInstance[(<UndoDeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action;
95           newState.serviceInstance[(<UndoDeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action = (oldAction.split('_')[0]) as ServiceInstanceActions;
96           updateIsMissingDataOnDeleteVFModule(newState, (<UndoDeleteActionVfModuleInstanceAction>action).serviceId, (<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey, key);
97           return newState;
98         }
99       }
100       return newState;
101     }
102
103     case VfModuleActions.UPDATE_VFMODULE_POSITION : {
104       const updateVFModluePosition = <UpdateVFModluePosition>action;
105       const serviceUuid = updateVFModluePosition.instanceId;
106       const dynamicModelName = updateVFModluePosition.node.dynamicModelName;
107       const modelName = updateVFModluePosition.node.modelName;
108       const newState = _.cloneDeep(state);
109
110       newState.serviceInstance[serviceUuid].vnfs[updateVFModluePosition.vnfStoreKey].vfModules[modelName][dynamicModelName].position = updateVFModluePosition.node.position;
111       return newState;
112     }
113   }
114 }
115
116 const updateIsMissingDataOnDeleteVFModule = (state: any, serviceModelId: string, vnfStoreKey: string, vfModuleName): void => {
117   const vfModules = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[vfModuleName];
118
119   _.forOwn(vfModules, (vfModuleInstance) => {
120     let isMissingData: boolean = vfModuleInstance.isMissingData;
121     updateServiceValidationCounter(state, isMissingData, false, serviceModelId);
122   });
123 };
124
125
126 const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => {
127   let existingNames = serviceInstance.existingNames;
128   if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
129     delete existingNames[oldName.toLowerCase()];
130   }
131   if(!_.isNil(newName)) {
132     existingNames[newName.toLowerCase()] = "";
133   }
134 };
135
136
137 const generateId = () => {
138   return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
139 };
140 const getVfModuleParentVnfId = (vnfs: object, vfModuleId: string) => {
141   let vnfId = undefined;
142   _.forOwn(vnfs, (value, key) => {
143     if (vnfs[key].vfModules && vnfs[key].vfModules[vfModuleId]) {
144       vnfId = vnfs[key].modelCustomizationName;
145       return false;
146     }
147   });
148   return vnfId;
149 };
150
151
152
153
154
155
156
157
158
159