1 import {Action} from "redux";
2 import * as _ from "lodash";
4 CreateVFModuleInstanceAction,
5 DeleteActionVfModuleInstanceAction,
7 DeleteVfModuleInstanceAction,
8 PauseVFModuleInstanciationAction, RemovePauseOnVFModuleInstanciationAction,
9 UndoDeleteActionVfModuleInstanceAction,
10 UpdateVFModluePosition,
12 UpdateVFModuleInstanceAction,
13 UpgradeVfModuleInstanceAction,
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";
23 export function vfModuleReducer(state: ServiceState , action: Action) : ServiceState{
24 switch (action.type) {
25 case VfModuleActions.CREATE_VF_MODULE: {
26 const updateVFModuleInstanceAction = <CreateVFModuleInstanceAction>action;
27 const vfInstance = updateVFModuleInstanceAction.vfInstance;
28 const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
29 const vfModuleId = updateVFModuleInstanceAction.vfId;
30 const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey;
31 const position = updateVFModuleInstanceAction.index;
33 let newState = Object.assign({}, state);
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);
44 newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] = vfModulesMap;
45 newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId][dynamicName].position = position;
48 case VfModuleActions.UPDATE_VF_MODULE: {
49 const updateVFModuleInstanceAction = <UpdateVFModuleInstanceAction>action;
50 const vfInstance = updateVFModuleInstanceAction.vfInstance;
51 const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
52 const vfModuleId = updateVFModuleInstanceAction.vfId;
53 const position = updateVFModuleInstanceAction.position;
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)) {
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
68 newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId][updateVFModuleInstanceAction.dynamicModelName].position= updateVFModuleInstanceAction.position;
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];
83 return Object.assign({}, state);
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;
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;
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);
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];
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);
130 case VfModuleActions.UPDATE_VFMODULE_POSITION : {
131 const updateVFModluePosition = <UpdateVFModluePosition>action;
132 const serviceUuid = updateVFModluePosition.instanceId;
133 const dynamicModelName = updateVFModluePosition.dynamicModelName;
134 const modelName = updateVFModluePosition.vfKey;
135 const newState = _.cloneDeep(state);
137 newState.serviceInstance[serviceUuid].vnfs[updateVFModluePosition.vnfStoreKey].vfModules[modelName][dynamicModelName].position = updateVFModluePosition.position;
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]
149 if(!_.isNil(oldAction) && oldAction.includes("Upgrade")) {
152 clonedState.serviceInstance[upgradeAction.serviceId]
153 .vnfs[upgradeAction.vnfStoreKey]
154 .vfModules[upgradeAction.modelName][upgradeAction.dynamicModelName]
155 .action = (`${oldAction}_Upgrade`) as ServiceInstanceActions;
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]
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;
174 case VfModuleActions.UPDATE_VFMODULE_FEILD : {
175 let clonedState = _.cloneDeep(state);
176 let updateFieldAction = <UpdateVFModuleField> action;
178 clonedState.serviceInstance[updateFieldAction.serviceId]
179 .vnfs[updateFieldAction.vnfStoreKey]
180 .vfModules[updateFieldAction.modelName][updateFieldAction.dynamicModelName][updateFieldAction.fieldName] = updateFieldAction.fieldValue;
184 case VfModuleActions.DELETE_VFMODULE_FIELD : {
185 let clonedState = _.cloneDeep(state);
186 let deleteAction = <DeleteVFModuleField> action;
188 delete clonedState.serviceInstance[deleteAction.serviceId]
189 .vnfs[deleteAction.vnfStoreKey]
190 .vfModules[deleteAction.modelName][deleteAction.dynamicModelName][deleteAction.deleteFieldName];
197 const updateIsMissingDataOnDeleteVFModule = (state: any, serviceModelId: string, vnfStoreKey: string, vfModuleName): void => {
198 const vfModules = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[vfModuleName];
200 _.forOwn(vfModules, (vfModuleInstance) => {
201 let isMissingData: boolean = vfModuleInstance.isMissingData;
202 updateServiceValidationCounter(state, isMissingData, false, serviceModelId);
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;
210 state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[key][firstKey].tenantId = tenantId;
211 state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[key][firstKey].lcpCloudRegionId = lcpCloudRegion;
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()];
219 if(!_.isNil(newName)) {
220 existingNames[newName.toLowerCase()] = "";
225 const generateId = () => {
226 return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
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;