1 import {Action} from "redux";
2 import * as _ from "lodash";
4 CreateVFModuleInstanceAction, DeleteActionVfModuleInstanceAction, DeleteVFModuleField,
5 DeleteVfModuleInstanceAction, UndoDeleteActionVfModuleInstanceAction, UpdateVFModluePosition, UpdateVFModuleField,
6 UpdateVFModuleInstanceAction, UpgradeVfModuleInstanceAction,
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";
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;
25 let newState = Object.assign({}, state);
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);
35 newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] = vfModulesMap;
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)) {
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;
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];
70 return Object.assign({}, state);
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;
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);
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;
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);
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);
112 newState.serviceInstance[serviceUuid].vnfs[updateVFModluePosition.vnfStoreKey].vfModules[modelName][dynamicModelName].position = updateVFModluePosition.node.position;
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]
124 if(!_.isNil(oldAction) && oldAction.includes("Upgrade")) {
127 clonedState.serviceInstance[upgradeAction.serviceId]
128 .vnfs[upgradeAction.vnfStoreKey]
129 .vfModules[upgradeAction.modelName][upgradeAction.dynamicModelName]
130 .action = (`${oldAction}_Upgrade`) as ServiceInstanceActions;
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]
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;
149 case VfModuleActions.UPDATE_VFMODULE_FEILD : {
150 let clonedState = _.cloneDeep(state);
151 let updateFieldAction = <UpdateVFModuleField> action;
153 clonedState.serviceInstance[updateFieldAction.serviceId]
154 .vnfs[updateFieldAction.vnfStoreKey]
155 .vfModules[updateFieldAction.modelName][updateFieldAction.dynamicModelName][updateFieldAction.fieldName] = updateFieldAction.fieldValue;
159 case VfModuleActions.DELETE_VFMODULE_FIELD : {
160 let clonedState = _.cloneDeep(state);
161 let deleteAction = <DeleteVFModuleField> action;
163 delete clonedState.serviceInstance[deleteAction.serviceId]
164 .vnfs[deleteAction.vnfStoreKey]
165 .vfModules[deleteAction.modelName][deleteAction.dynamicModelName][deleteAction.deleteFieldName];
172 const updateIsMissingDataOnDeleteVFModule = (state: any, serviceModelId: string, vnfStoreKey: string, vfModuleName): void => {
173 const vfModules = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[vfModuleName];
175 _.forOwn(vfModules, (vfModuleInstance) => {
176 let isMissingData: boolean = vfModuleInstance.isMissingData;
177 updateServiceValidationCounter(state, isMissingData, false, serviceModelId);
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;
185 state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[key][firstKey].tenantId = tenantId;
186 state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[key][firstKey].lcpCloudRegionId = lcpCloudRegion;
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()];
194 if(!_.isNil(newName)) {
195 existingNames[newName.toLowerCase()] = "";
200 const generateId = () => {
201 return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
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;