cc24d8dc334eb91cf37e604b47eab9cf1befe2cd
[vid.git] / vid-webpack-master / src / app / shared / storeUtil / utils / vnf / vnf.reducers.ts
1 import {Action} from "redux";
2 import {VnfInstance} from "../../../models/vnfInstance";
3 import {
4   CreateVnfInstanceAction,
5   DeleteActionVnfInstanceAction, RemoveVnfInstanceAction, UndoDeleteActionVnfInstanceAction,
6   UpdateVnfInstanceAction, UpdateVnfPosition,
7   VNFActions
8 } from "./vnf.actions";
9 import * as _ from "lodash";
10 import {ServiceInstance} from "../../../models/serviceInstance";
11 import {ServiceState} from "../main.reducer";
12 import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
13
14 export function vnfReducer(state: ServiceState, action: Action): ServiceState {
15   switch (action.type) {
16     case VNFActions.CREATE_VNF_INSTANCE: {
17       const updateVnfInstanceAction = <CreateVnfInstanceAction>action;
18       const serviceUuid = updateVnfInstanceAction.serviceUuid;
19       let vnfModelName = updateVnfInstanceAction.vnfModelName;
20       let newState = _.cloneDeep(state);
21
22       updateVnfInstanceAction.vnfInstance.originalName = vnfModelName;
23       updateVnfInstanceAction.vnfModelName = calculateNextUniqueModelName(vnfModelName, serviceUuid, newState, 'vnfs');
24
25       let vnfInstance: VnfInstance = newState.serviceInstance[serviceUuid].vnfs[vnfModelName];
26       vnfInstance = new VnfInstance();
27       updateVnfInstanceAction.vnfInstance.vnfStoreKey = updateVnfInstanceAction.vnfModelName;
28       updateVnfInstanceAction.vnfInstance.originalName = vnfModelName;
29       vnfInstance.originalName = updateVnfInstanceAction.vnfInstance.originalName;
30       vnfInstance.vnfStoreKey = updateVnfInstanceAction.vnfInstance.vnfStoreKey;
31       updateServiceValidationCounter(newState, vnfInstance['isMissingData'], updateVnfInstanceAction.vnfInstance['isMissingData'], serviceUuid);
32
33       newState.serviceInstance[serviceUuid].vnfs[updateVnfInstanceAction.vnfModelName] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance);
34       return newState;
35     }
36
37     case VNFActions.UPDATE_VNF_INSTANCE: {
38       const updateVnfInstanceAction = <UpdateVnfInstanceAction>action;
39       const serviceUuid = updateVnfInstanceAction.serviceUuid;
40       let vnfStoreKey = updateVnfInstanceAction.vnfStoreKey;
41
42
43       let newState = _.cloneDeep(state);
44       let vnfInstance: VnfInstance = newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey];
45       updateUniqueNames(vnfInstance ? vnfInstance.instanceName : null, updateVnfInstanceAction.vnfInstance.instanceName, newState.serviceInstance[serviceUuid]);
46
47       vnfInstance = vnfInstance || new VnfInstance();
48       updateServiceValidationCounter(newState, vnfInstance['isMissingData'], updateVnfInstanceAction.vnfInstance['isMissingData'], serviceUuid);
49
50       newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance);
51       return newState;
52     }
53
54     case VNFActions.DELETE_ACTION_VNF_INSTANCE : {
55       let newState = _.cloneDeep(state);
56       let vnf = newState.serviceInstance[(<DeleteActionVnfInstanceAction>action).serviceId].vnfs[(<DeleteActionVnfInstanceAction>action).vnfStoreKey];
57       let oldAction = vnf.action;
58       if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
59       newState.serviceInstance[(<DeleteActionVnfInstanceAction>action).serviceId].vnfs[(<DeleteActionVnfInstanceAction>action).vnfStoreKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
60       updateServiceValidationCounter(newState, vnf['isMissingData'], false,  (<RemoveVnfInstanceAction>action).serviceId);
61       return newState;
62     }
63
64     case VNFActions.UNDO_DELETE_ACTION_VNF_INSTANCE : {
65       let newState = _.cloneDeep(state);
66       let vnf = newState.serviceInstance[(<UndoDeleteActionVnfInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVnfInstanceAction>action).vnfStoreKey];
67       let oldState = vnf.action;
68       newState.serviceInstance[(<UndoDeleteActionVnfInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVnfInstanceAction>action).vnfStoreKey].action = (oldState.split('_')[0]) as ServiceInstanceActions;
69       updateServiceValidationCounter(newState, vnf['isMissingData'], false,  (<UndoDeleteActionVnfInstanceAction>action).serviceId);
70       return newState;
71     }
72
73     case VNFActions.REMOVE_VNF_INSTANCE : {
74       let newState = _.cloneDeep(state);
75       let vnfInstance = newState.serviceInstance[(<RemoveVnfInstanceAction>action).serviceId].vnfs[(<RemoveVnfInstanceAction>action).vnfStoreKey];
76       updateServiceValidationCounter(newState, vnfInstance['isMissingData'], false,  (<RemoveVnfInstanceAction>action).serviceId);
77       delete newState.serviceInstance[(<RemoveVnfInstanceAction>action).serviceId].vnfs[(<RemoveVnfInstanceAction>action).vnfStoreKey];
78       return newState;
79     }
80
81     case VNFActions.UPDATE_VNF_POSITION : {
82       let newState = _.cloneDeep(state);
83       newState.serviceInstance[(<UpdateVnfPosition>action).instanceId].vnfs[(<UpdateVnfPosition>action).vnfStoreKey].position = (<UpdateVnfPosition>action).node.position;
84       return newState;
85     }
86   }
87 }
88
89 const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => {
90   if (oldValidationState && !newValidationState) {
91     newState.serviceInstance[serviceUuid].validationCounter--;
92   } else if (!oldValidationState && newValidationState) {
93     newState.serviceInstance[serviceUuid].validationCounter++;
94   }
95 };
96
97
98 const updateUniqueNames = (oldName: string, newName: string, serviceInstance: ServiceInstance): void => {
99   let existingNames = serviceInstance.existingNames;
100   if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
101     delete existingNames[oldName.toLowerCase()];
102   }
103   if (!_.isNil(newName)) {
104     existingNames[newName.toLowerCase()] = "";
105   }
106 };
107
108
109 export const calculateNextUniqueModelName = (vnfModelName: string, serviceId: string, state: any, levelName: string): string => {
110   let counter: number = null;
111   while (true) {
112     let pattern = !_.isNil(counter) ? ("_" + counter) : "";
113     if (!_.isNil(state.serviceInstance[serviceId][levelName][vnfModelName + pattern])) {
114       counter = counter ? (counter + 1) : 1;
115     } else {
116       return vnfModelName + pattern;
117     }
118   }
119 };
120
121
122
123
124