Test Cases Addition and Fixes
[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,
5   DeleteActionVfModuleInstanceAction,
6   DeleteVFModuleField,
7   DeleteVfModuleInstanceAction,
8   PauseVFModuleInstanciationAction, RemovePauseOnVFModuleInstanciationAction,
9   UndoDeleteActionVfModuleInstanceAction,
10   UpdateVFModluePosition,
11   UpdateVFModuleField,
12   UpdateVFModuleInstanceAction,
13   UpgradeVfModuleInstanceAction,
14   VfModuleActions,
15 } from "./vfModule.actions";
16 import {ServiceInstance} from "../../../models/serviceInstance";
17 import {VfModuleMap} from "../../../models/vfModulesMap";
18 import {ServiceState} from "../main.reducer";
19 import {PauseStatus, ServiceInstanceActions} from "../../../models/serviceInstanceActions";
20 import {updateServiceValidationCounter} from "../reducersHelper";
21 import {calculatePosition} from "../reducersHelper";
22
23
24 export function vfModuleReducer(state: ServiceState , action: Action) : ServiceState{
25   switch (action.type) {
26     case VfModuleActions.CREATE_VF_MODULE: {
27       const updateVFModuleInstanceAction = <CreateVFModuleInstanceAction>action;
28       const vfInstance = updateVFModuleInstanceAction.vfInstance;
29       const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
30       const vfModuleId = updateVFModuleInstanceAction.vfId;
31       const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey;
32
33       let newState = Object.assign({}, state);
34
35       let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] || new VfModuleMap();
36       let randomId = generateId();
37       vfInstance.action = ServiceInstanceActions.Create;
38       let dynamicName = vfModuleId + randomId;
39       vfModulesMap[dynamicName] = vfInstance;
40       updateUniqueNames(null, vfInstance.instanceName, newState.serviceInstance[serviceUuid]);
41       updateUniqueNames(null, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]);
42       updateServiceValidationCounter(newState, false, vfInstance['isMissingData'], serviceUuid);
43
44       newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] = vfModulesMap;
45       //update position of newly added VF module
46       calculatePosition(newState,serviceUuid, vnfStoreKey);
47       return newState;
48     }
49     case VfModuleActions.UPDATE_VF_MODULE: {
50       const updateVFModuleInstanceAction = <UpdateVFModuleInstanceAction>action;
51       const vfInstance = updateVFModuleInstanceAction.vfInstance;
52       const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
53       const vfModuleId = updateVFModuleInstanceAction.vfId;
54       const newState = _.cloneDeep(state);
55       const vnfs = newState.serviceHierarchy[serviceUuid].vnfs;
56       let vnfId = getVfModuleParentVnfId(vnfs, vfModuleId);
57       const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey;
58       if (!_.isNil(vnfStoreKey)) {
59         vnfId = vnfStoreKey;
60       }
61       let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] || new VfModuleMap();
62       updateServiceValidationCounter(newState, vfModulesMap[updateVFModuleInstanceAction.dynamicModelName]['isMissingData'], vfInstance.isMissingData, serviceUuid);
63       updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].instanceName, vfInstance.instanceName, newState.serviceInstance[serviceUuid]);
64       updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].volumeGroupName, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]);
65       vfModulesMap[updateVFModuleInstanceAction.dynamicModelName] = vfInstance;
66       newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] = vfModulesMap;
67       //retain the position of newly added VF module -- change logic
68       calculatePosition(newState,serviceUuid, vnfStoreKey);
69       return newState;
70     }
71     case VfModuleActions.REMOVE_VNF_MODULE_INSTANCE: {
72       const actionData = (<DeleteVfModuleInstanceAction>action);
73       if (state.serviceInstance[actionData.serviceModelId]) {
74         let vfModulesMap = state.serviceInstance[actionData.serviceModelId].vnfs[actionData.vnfStoreKey].vfModules;
75         updateIsMissingDataOnDeleteVFModule(state, actionData.serviceModelId, actionData.vnfStoreKey, actionData.modelName);
76         updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].instanceName, null, state.serviceInstance[actionData.serviceModelId] );
77         updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].volumeGroupName, null, state.serviceInstance[actionData.serviceModelId] );
78         delete vfModulesMap[actionData.modelName][actionData.dynamicModelName];
79         if(_.isEmpty(vfModulesMap[actionData.modelName])){
80           delete vfModulesMap[actionData.modelName];
81         }
82       }
83       return Object.assign({}, state);
84     }
85     case VfModuleActions.PAUSE_ACTION_VFMODULE_INSTANCE : {
86       const pauseVfModuleAction = (<PauseVFModuleInstanciationAction>action);
87       let newState = _.cloneDeep(state);
88       newState.serviceInstance[pauseVfModuleAction.serviceId].vnfs[pauseVfModuleAction.vnfStoreKey]
89       .vfModules[pauseVfModuleAction.vfModuleModelName][pauseVfModuleAction.dynamicModelName]
90         .pauseInstantiation = PauseStatus.AFTER_COMPLETION;
91       return newState;
92     }
93
94     case VfModuleActions.REMOVE_PAUSE_ON_VFMODULE_INSTANCE : {
95       const removePauseVfModuleAction = (<RemovePauseOnVFModuleInstanciationAction>action);
96       let newState = _.cloneDeep(state);
97       newState.serviceInstance[removePauseVfModuleAction.serviceId].vnfs[removePauseVfModuleAction.vnfStoreKey]
98         .vfModules[removePauseVfModuleAction.vfModuleModelName][removePauseVfModuleAction.dynamicModelName]
99         .pauseInstantiation = null;
100       return newState;
101     }
102
103     case VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE : {
104       const deleteAction = (<DeleteActionVfModuleInstanceAction>action);
105       let newState = _.cloneDeep(state);
106       let vfModule = newState.serviceInstance[deleteAction.serviceId].vnfs[deleteAction.vnfStoreKey]
107         .vfModules[deleteAction.vfModuleModelName][deleteAction.dynamicModelName];
108       let oldAction = vfModule.action;
109       if (oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
110       newState.serviceInstance[deleteAction.serviceId].vnfs[deleteAction.vnfStoreKey]
111         .vfModules[deleteAction.vfModuleModelName][deleteAction.dynamicModelName].action = (oldAction + '_Delete') as ServiceInstanceActions;
112       setLcpCloudRegionIdAndTenantIdFromVnf(newState, deleteAction.serviceId, deleteAction.vnfStoreKey, deleteAction.vfModuleModelName, deleteAction.dynamicModelName);
113       updateIsMissingDataOnDeleteVFModule(newState, deleteAction.serviceId, deleteAction.vnfStoreKey, deleteAction.vfModuleModelName);
114
115       return newState;
116     }
117     case VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE : {
118       const undoDeleteAction = (<UndoDeleteActionVfModuleInstanceAction>action);
119       let newState = _.cloneDeep(state);
120       let vfModule = newState.serviceInstance[undoDeleteAction.serviceId].vnfs[undoDeleteAction.vnfStoreKey]
121         .vfModules[undoDeleteAction.vfModuleModelName][undoDeleteAction.dynamicModelName];
122
123           let oldAction = vfModule.action;
124           newState.serviceInstance[undoDeleteAction.serviceId].vnfs[undoDeleteAction.vnfStoreKey]
125             .vfModules[undoDeleteAction.vfModuleModelName][undoDeleteAction.dynamicModelName].action = (oldAction.split('_')[0]) as ServiceInstanceActions;
126           updateIsMissingDataOnDeleteVFModule(newState, undoDeleteAction.serviceId, undoDeleteAction.vnfStoreKey, undoDeleteAction.vfModuleModelName);
127       return newState;
128     }
129
130     case VfModuleActions.UPDATE_VFMODULE_POSITION : {
131       const updateVFModluePosition = <UpdateVFModluePosition>action;
132       const serviceUuid = updateVFModluePosition.instanceId;
133       const dynamicModelName = updateVFModluePosition.node.dynamicModelName;
134       const modelName = updateVFModluePosition.node.modelName;
135       const newState = _.cloneDeep(state);
136
137       newState.serviceInstance[serviceUuid].vnfs[updateVFModluePosition.vnfStoreKey].vfModules[modelName][dynamicModelName].position = updateVFModluePosition.node.position;
138       return newState;
139     }
140
141     case VfModuleActions.UPGRADE_VFMODULE : {
142       let clonedState = _.cloneDeep(state);
143       const upgradeAction = (<UpgradeVfModuleInstanceAction>action);
144       let oldAction = clonedState
145         .serviceInstance[upgradeAction.serviceId]
146         .vnfs[upgradeAction.vnfStoreKey]
147         .vfModules[upgradeAction.modelName][upgradeAction.dynamicModelName]
148         .action;
149       if(!_.isNil(oldAction) && oldAction.includes("Upgrade")) {
150         return clonedState;
151       }
152       clonedState.serviceInstance[upgradeAction.serviceId]
153         .vnfs[upgradeAction.vnfStoreKey]
154         .vfModules[upgradeAction.modelName][upgradeAction.dynamicModelName]
155         .action = (`${oldAction}_Upgrade`) as ServiceInstanceActions;
156       return clonedState;
157     }
158     case VfModuleActions.UNDO_UPGRADE_VFMODULE_ACTION : {
159       let clonedState = _.cloneDeep(state);
160       const upgradeAction = (<UpgradeVfModuleInstanceAction>action);
161       let oldAction = clonedState
162         .serviceInstance[upgradeAction.serviceId]
163         .vnfs[upgradeAction.vnfStoreKey]
164         .vfModules[upgradeAction.modelName][upgradeAction.dynamicModelName]
165         .action;
166       if(!_.isNil(oldAction) && oldAction.includes("Upgrade")) {
167         clonedState.serviceInstance[upgradeAction.serviceId]
168           .vnfs[upgradeAction.vnfStoreKey]
169           .vfModules[upgradeAction.modelName][upgradeAction.dynamicModelName]
170           .action = ServiceInstanceActions.None;
171       }
172       return clonedState;
173     }
174     case VfModuleActions.UPDATE_VFMODULE_FEILD : {
175       let clonedState = _.cloneDeep(state);
176       let updateFieldAction =  <UpdateVFModuleField> action;
177
178         clonedState.serviceInstance[updateFieldAction.serviceId]
179           .vnfs[updateFieldAction.vnfStoreKey]
180           .vfModules[updateFieldAction.modelName][updateFieldAction.dynamicModelName][updateFieldAction.fieldName] =  updateFieldAction.fieldValue;
181
182       return clonedState;
183     }
184     case VfModuleActions.DELETE_VFMODULE_FIELD : {
185       let clonedState = _.cloneDeep(state);
186       let deleteAction =  <DeleteVFModuleField> action;
187
188       delete clonedState.serviceInstance[deleteAction.serviceId]
189         .vnfs[deleteAction.vnfStoreKey]
190         .vfModules[deleteAction.modelName][deleteAction.dynamicModelName][deleteAction.deleteFieldName];
191
192       return clonedState;
193     }
194   }
195 }
196
197 const updateIsMissingDataOnDeleteVFModule = (state: any, serviceModelId: string, vnfStoreKey: string, vfModuleName): void => {
198   const vfModules = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[vfModuleName];
199
200   _.forOwn(vfModules, (vfModuleInstance) => {
201     let isMissingData: boolean = vfModuleInstance.isMissingData;
202     updateServiceValidationCounter(state, isMissingData, false, serviceModelId);
203   });
204 };
205
206 const  setLcpCloudRegionIdAndTenantIdFromVnf = (state: any, serviceModelId: string, vnfStoreKey: string, key: string, firstKey: string) :void => {
207   let tenantId = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].tenantId;
208   let lcpCloudRegion = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].lcpCloudRegionId;
209
210   state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[key][firstKey].tenantId = tenantId;
211   state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[key][firstKey].lcpCloudRegionId = lcpCloudRegion;
212 }
213
214 const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => {
215   let existingNames = serviceInstance.existingNames;
216   if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
217     delete existingNames[oldName.toLowerCase()];
218   }
219   if(!_.isNil(newName)) {
220     existingNames[newName.toLowerCase()] = "";
221   }
222 };
223
224
225 const generateId = () => {
226   return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
227 };
228 const getVfModuleParentVnfId = (vnfs: object, vfModuleId: string) => {
229   let vnfId = undefined;
230   _.forOwn(vnfs, (value, key) => {
231     if (vnfs[key].vfModules && vnfs[key].vfModules[vfModuleId]) {
232       vnfId = vnfs[key].modelCustomizationName;
233       return false;
234     }
235   });
236   return vnfId;
237 };
238
239
240
241
242
243
244
245
246
247