1 import {Action} from "redux";
2 import {VnfInstance} from "../../../models/vnfInstance";
4 CreateVnfInstanceAction,
5 DeleteActionVnfInstanceAction, RemoveVnfInstanceAction, UndoDeleteActionVnfInstanceAction,
6 UpdateVnfInstanceAction, UpdateVnfPosition,
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";
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);
22 updateVnfInstanceAction.vnfInstance.originalName = vnfModelName;
23 updateVnfInstanceAction.vnfModelName = calculateNextUniqueModelName(vnfModelName, serviceUuid, newState, 'vnfs');
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);
33 newState.serviceInstance[serviceUuid].vnfs[updateVnfInstanceAction.vnfModelName] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance);
37 case VNFActions.UPDATE_VNF_INSTANCE: {
38 const updateVnfInstanceAction = <UpdateVnfInstanceAction>action;
39 const serviceUuid = updateVnfInstanceAction.serviceUuid;
40 let vnfStoreKey = updateVnfInstanceAction.vnfStoreKey;
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]);
47 vnfInstance = vnfInstance || new VnfInstance();
48 updateServiceValidationCounter(newState, vnfInstance['isMissingData'], updateVnfInstanceAction.vnfInstance['isMissingData'], serviceUuid);
50 newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance);
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);
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);
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];
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;
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++;
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()];
103 if (!_.isNil(newName)) {
104 existingNames[newName.toLowerCase()] = "";
109 export const calculateNextUniqueModelName = (vnfModelName: string, serviceId: string, state: any, levelName: string): string => {
110 let counter: number = null;
112 let pattern = !_.isNil(counter) ? ("_" + counter) : "";
113 if (!_.isNil(state.serviceInstance[serviceId][levelName][vnfModelName + pattern])) {
114 counter = counter ? (counter + 1) : 1;
116 return vnfModelName + pattern;