add tenantId and lcpCloudRegion to vfm instance during delete vfm
[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, DeleteVFModuleField,
5   DeleteVfModuleInstanceAction, UndoDeleteActionVfModuleInstanceAction, UpdateVFModluePosition, UpdateVFModuleField,
6   UpdateVFModuleInstanceAction, UpgradeVfModuleInstanceAction,
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       vfInstance.action = ServiceInstanceActions.Create;
30       vfModulesMap[vfModuleId + randomId] = vfInstance;
31       updateUniqueNames(null, vfInstance.instanceName, newState.serviceInstance[serviceUuid]);
32       updateUniqueNames(null, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]);
33       updateServiceValidationCounter(newState, false, vfInstance['isMissingData'], serviceUuid);
34
35       newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] = vfModulesMap;
36       return newState;
37     }
38     case VfModuleActions.UPDATE_VF_MODULE: {
39       const updateVFModuleInstanceAction = <UpdateVFModuleInstanceAction>action;
40       const vfInstance = updateVFModuleInstanceAction.vfInstance;
41       const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
42       const vfModuleId = updateVFModuleInstanceAction.vfId;
43       const newState = _.cloneDeep(state);
44       const vnfs = newState.serviceHierarchy[serviceUuid].vnfs;
45       let vnfId = getVfModuleParentVnfId(vnfs, vfModuleId);
46       const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey;
47       if (!_.isNil(vnfStoreKey)) {
48         vnfId = vnfStoreKey;
49       }
50       let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] || new VfModuleMap();
51       updateServiceValidationCounter(newState, vfModulesMap[updateVFModuleInstanceAction.dynamicModelName]['isMissingData'], vfInstance.isMissingData, serviceUuid);
52       updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].instanceName, vfInstance.instanceName, newState.serviceInstance[serviceUuid]);
53       updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].volumeGroupName, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]);
54       vfModulesMap[updateVFModuleInstanceAction.dynamicModelName] = vfInstance;
55       newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] = vfModulesMap;
56       return newState;
57     }
58     case VfModuleActions.REMOVE_VNF_MODULE_INSTANCE: {
59       const actionData = (<DeleteVfModuleInstanceAction>action);
60       if (state.serviceInstance[actionData.serviceModelId]) {
61         let vfModulesMap = state.serviceInstance[actionData.serviceModelId].vnfs[actionData.vnfStoreKey].vfModules;
62         updateIsMissingDataOnDeleteVFModule(state, actionData.serviceModelId, actionData.vnfStoreKey, actionData.modelName);
63         updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].instanceName, null, state.serviceInstance[actionData.serviceModelId] );
64         updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].volumeGroupName, null, state.serviceInstance[actionData.serviceModelId] );
65         delete vfModulesMap[actionData.modelName][actionData.dynamicModelName];
66         if(_.isEmpty(vfModulesMap[actionData.modelName])){
67           delete vfModulesMap[actionData.modelName];
68         }
69       }
70       return Object.assign({}, state);
71     }
72     case VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE : {
73       let newState = _.cloneDeep(state);
74       let vfModules = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules;
75
76       for(let key in vfModules){
77         let firstKey = Object.keys(vfModules[key])[0];
78         if(firstKey === (<DeleteActionVfModuleInstanceAction>action).dynamicModelName){
79           let oldAction = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action;
80           if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
81           newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
82           setLcpCloudRegionIdAndTenantIdFromVnf(newState, (<DeleteActionVfModuleInstanceAction>action).serviceId, (<DeleteActionVfModuleInstanceAction>action).vnfStoreKey, key, firstKey);
83           updateIsMissingDataOnDeleteVFModule(newState, (<UndoDeleteActionVfModuleInstanceAction>action).serviceId, (<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey, key);
84           return newState;
85         }
86       }
87       return newState;
88     }
89     case VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE : {
90       let newState = _.cloneDeep(state);
91       let vfModules = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules;
92
93       for(let key in vfModules){
94         let firstKey = Object.keys(vfModules[key])[0];
95         if(firstKey === (<UndoDeleteActionVfModuleInstanceAction>action).dynamicModelName){
96           let oldAction = newState.serviceInstance[(<UndoDeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action;
97           newState.serviceInstance[(<UndoDeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action = (oldAction.split('_')[0]) as ServiceInstanceActions;
98           updateIsMissingDataOnDeleteVFModule(newState, (<UndoDeleteActionVfModuleInstanceAction>action).serviceId, (<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey, key);
99           return newState;
100         }
101       }
102       return newState;
103     }
104
105     case VfModuleActions.UPDATE_VFMODULE_POSITION : {
106       const updateVFModluePosition = <UpdateVFModluePosition>action;
107       const serviceUuid = updateVFModluePosition.instanceId;
108       const dynamicModelName = updateVFModluePosition.node.dynamicModelName;
109       const modelName = updateVFModluePosition.node.modelName;
110       const newState = _.cloneDeep(state);
111
112       newState.serviceInstance[serviceUuid].vnfs[updateVFModluePosition.vnfStoreKey].vfModules[modelName][dynamicModelName].position = updateVFModluePosition.node.position;
113       return newState;
114     }
115
116     case VfModuleActions.UPGRADE_VFMODULE : {
117       let clonedState = _.cloneDeep(state);
118       const upgradeAction = (<UpgradeVfModuleInstanceAction>action);
119       let oldAction = clonedState
120         .serviceInstance[upgradeAction.serviceId]
121         .vnfs[upgradeAction.vnfStoreKey]
122         .vfModules[upgradeAction.modelName][upgradeAction.dynamicModelName]
123         .action;
124       if(!_.isNil(oldAction) && oldAction.includes("Upgrade")) {
125         return clonedState;
126       }
127       clonedState.serviceInstance[upgradeAction.serviceId]
128         .vnfs[upgradeAction.vnfStoreKey]
129         .vfModules[upgradeAction.modelName][upgradeAction.dynamicModelName]
130         .action = (`${oldAction}_Upgrade`) as ServiceInstanceActions;
131       return clonedState;
132     }
133     case VfModuleActions.UNDO_UPGRADE_VFMODULE_ACTION : {
134       let clonedState = _.cloneDeep(state);
135       const upgradeAction = (<UpgradeVfModuleInstanceAction>action);
136       let oldAction = clonedState
137         .serviceInstance[upgradeAction.serviceId]
138         .vnfs[upgradeAction.vnfStoreKey]
139         .vfModules[upgradeAction.modelName][upgradeAction.dynamicModelName]
140         .action;
141       if(!_.isNil(oldAction) && oldAction.includes("Upgrade")) {
142         clonedState.serviceInstance[upgradeAction.serviceId]
143           .vnfs[upgradeAction.vnfStoreKey]
144           .vfModules[upgradeAction.modelName][upgradeAction.dynamicModelName]
145           .action = ServiceInstanceActions.None;
146       }
147       return clonedState;
148     }
149     case VfModuleActions.UPDATE_VFMODULE_FEILD : {
150       let clonedState = _.cloneDeep(state);
151       let updateFieldAction =  <UpdateVFModuleField> action;
152
153         clonedState.serviceInstance[updateFieldAction.serviceId]
154           .vnfs[updateFieldAction.vnfStoreKey]
155           .vfModules[updateFieldAction.modelName][updateFieldAction.dynamicModelName][updateFieldAction.fieldName] =  updateFieldAction.fieldValue;
156
157       return clonedState;
158     }
159     case VfModuleActions.DELETE_VFMODULE_FIELD : {
160       let clonedState = _.cloneDeep(state);
161       let deleteAction =  <DeleteVFModuleField> action;
162
163       delete clonedState.serviceInstance[deleteAction.serviceId]
164         .vnfs[deleteAction.vnfStoreKey]
165         .vfModules[deleteAction.modelName][deleteAction.dynamicModelName][deleteAction.deleteFieldName];
166
167       return clonedState;
168     }
169   }
170 }
171
172 const updateIsMissingDataOnDeleteVFModule = (state: any, serviceModelId: string, vnfStoreKey: string, vfModuleName): void => {
173   const vfModules = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[vfModuleName];
174
175   _.forOwn(vfModules, (vfModuleInstance) => {
176     let isMissingData: boolean = vfModuleInstance.isMissingData;
177     updateServiceValidationCounter(state, isMissingData, false, serviceModelId);
178   });
179 };
180
181 const  setLcpCloudRegionIdAndTenantIdFromVnf = (state: any, serviceModelId: string, vnfStoreKey: string, key: string, firstKey: string) :void => {
182   let tenantId = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].tenantId;
183   let lcpCloudRegion = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].lcpCloudRegionId;
184
185   state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[key][firstKey].tenantId = tenantId;
186   state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[key][firstKey].lcpCloudRegionId = lcpCloudRegion;
187 }
188
189 const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => {
190   let existingNames = serviceInstance.existingNames;
191   if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
192     delete existingNames[oldName.toLowerCase()];
193   }
194   if(!_.isNil(newName)) {
195     existingNames[newName.toLowerCase()] = "";
196   }
197 };
198
199
200 const generateId = () => {
201   return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
202 };
203 const getVfModuleParentVnfId = (vnfs: object, vfModuleId: string) => {
204   let vnfId = undefined;
205   _.forOwn(vnfs, (value, key) => {
206     if (vnfs[key].vfModules && vnfs[key].vfModules[vfModuleId]) {
207       vnfId = vnfs[key].modelCustomizationName;
208       return false;
209     }
210   });
211   return vnfId;
212 };
213
214
215
216
217
218
219
220
221
222