merge from ecomp a88f0072 - Modern UI
[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
14
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;
23
24       let newState = Object.assign({}, state);
25
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);
32
33       newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] = vfModulesMap;
34       return newState;
35     }
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)) {
46         vnfId = vnfStoreKey;
47       }
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;
54       return newState;
55     }
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];
66         }
67       }
68       return Object.assign({}, state);
69     }
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;
73
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);
81           return newState;
82         }
83       }
84       return newState;
85     }
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;
89
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);
96           return newState;
97         }
98       }
99       return newState;
100     }
101
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);
108
109       newState.serviceInstance[serviceUuid].vnfs[updateVFModluePosition.vnfStoreKey].vfModules[modelName][dynamicModelName].position = updateVFModluePosition.node.position;
110       return newState;
111     }
112   }
113 }
114
115 const updateIsMissingDataOnDeleteVFModule = (state: any, serviceModelId: string, vnfStoreKey: string, vfModuleName): void => {
116   const vfModules = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[vfModuleName];
117
118   _.forOwn(vfModules, (vfModuleInstance) => {
119     let isMissingData: boolean = vfModuleInstance.isMissingData;
120     updateServiceValidationCounter(state, isMissingData, false, serviceModelId);
121   });
122 };
123
124
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()];
129   }
130   if(!_.isNil(newName)) {
131     existingNames[newName.toLowerCase()] = "";
132   }
133 };
134
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++;
140   }
141 };
142
143 const generateId = () => {
144   return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
145 };
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;
151       return false;
152     }
153   });
154   return vnfId;
155 };
156
157
158
159
160
161
162
163
164
165