1 import {Action} from "redux";
2 import {VnfInstance} from "../../../models/vnfInstance";
4 CreateVnfInstanceAction,
5 RemoveVnfInstanceAction,
6 UpdateVnfInstanceAction, UpdateVnfPosition, UpgradeVnfAction,
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 import {deleteFirstLevel, updateServiceValidationCounter} from "../reducersHelper";
14 import {ActionOnFirstLevel} from "../firstLevel/firstLevel.actions";
16 export function vnfReducer(state: ServiceState, action: Action): ServiceState {
17 switch (action.type) {
18 case VNFActions.CREATE_VNF_INSTANCE: {
19 const updateVnfInstanceAction = <CreateVnfInstanceAction>action;
20 const serviceUuid = updateVnfInstanceAction.serviceUuid;
21 let vnfModelName = updateVnfInstanceAction.vnfModelName;
22 let newState = _.cloneDeep(state);
24 updateVnfInstanceAction.vnfInstance.originalName = vnfModelName;
25 updateVnfInstanceAction.vnfModelName = calculateNextUniqueModelName(vnfModelName, serviceUuid, newState, 'vnfs');
27 let vnfInstance: VnfInstance = newState.serviceInstance[serviceUuid].vnfs[vnfModelName];
28 vnfInstance = new VnfInstance();
29 updateVnfInstanceAction.vnfInstance.vnfStoreKey = updateVnfInstanceAction.vnfModelName;
30 updateVnfInstanceAction.vnfInstance.originalName = vnfModelName;
31 vnfInstance.originalName = updateVnfInstanceAction.vnfInstance.originalName;
32 vnfInstance.vnfStoreKey = updateVnfInstanceAction.vnfInstance.vnfStoreKey;
33 updateServiceValidationCounter(newState, vnfInstance['isMissingData'], updateVnfInstanceAction.vnfInstance['isMissingData'], serviceUuid);
35 newState.serviceInstance[serviceUuid].vnfs[updateVnfInstanceAction.vnfModelName] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance);
39 case VNFActions.UPDATE_VNF_INSTANCE: {
40 const updateVnfInstanceAction = <UpdateVnfInstanceAction>action;
41 const serviceUuid = updateVnfInstanceAction.serviceUuid;
42 let vnfStoreKey = updateVnfInstanceAction.vnfStoreKey;
45 let newState = _.cloneDeep(state);
46 let vnfInstance: VnfInstance = newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey];
47 updateUniqueNames(vnfInstance ? vnfInstance.instanceName : null, updateVnfInstanceAction.vnfInstance.instanceName, newState.serviceInstance[serviceUuid]);
49 vnfInstance = vnfInstance || new VnfInstance();
50 updateServiceValidationCounter(newState, vnfInstance['isMissingData'], updateVnfInstanceAction.vnfInstance['isMissingData'], serviceUuid);
52 newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance);
56 case VNFActions.DELETE_ACTION_VNF_INSTANCE : {
57 return deleteFirstLevel(state, <ActionOnFirstLevel>action,true);
60 case VNFActions.UNDO_DELETE_ACTION_VNF_INSTANCE : {
61 let newState = _.cloneDeep(state);
62 let vnf = newState.serviceInstance[(<ActionOnFirstLevel>action).serviceId].vnfs[(<ActionOnFirstLevel>action).storeKey];
63 let oldState = vnf.action;
64 newState.serviceInstance[(<ActionOnFirstLevel>action).serviceId].vnfs[(<ActionOnFirstLevel>action).storeKey].action = (oldState.split('_')[0]) as ServiceInstanceActions;
65 updateServiceValidationCounter(newState, vnf['isMissingData'], false, (<ActionOnFirstLevel>action).serviceId);
69 case VNFActions.REMOVE_VNF_INSTANCE : {
70 let newState = _.cloneDeep(state);
71 let vnfInstance = newState.serviceInstance[(<RemoveVnfInstanceAction>action).serviceId].vnfs[(<RemoveVnfInstanceAction>action).vnfStoreKey];
72 updateServiceValidationCounter(newState, vnfInstance['isMissingData'], false, (<RemoveVnfInstanceAction>action).serviceId);
73 delete newState.serviceInstance[(<RemoveVnfInstanceAction>action).serviceId].vnfs[(<RemoveVnfInstanceAction>action).vnfStoreKey];
77 case VNFActions.UPDATE_VNF_POSITION : {
78 let newState = _.cloneDeep(state);
79 newState.serviceInstance[(<UpdateVnfPosition>action).instanceId]
80 .vnfs[(<UpdateVnfPosition>action).vnfStoreKey]
81 .position = (<UpdateVnfPosition>action).node.position;
85 case VNFActions.UPGRADE_VNF_ACTION: {
86 let clonedState = _.cloneDeep(state);
87 const castingAction = <UpgradeVnfAction>action;
88 let oldAction = clonedState
89 .serviceInstance[castingAction.serviceUuid]
90 .vnfs[castingAction.vnfStoreKey].action;
91 if(!oldAction.includes("Upgrade")) {
92 clonedState.serviceInstance[castingAction.serviceUuid]
93 .vnfs[castingAction.vnfStoreKey]
94 .action = (`${oldAction}_Upgrade`) as ServiceInstanceActions;
97 if(_.isNil(clonedState.serviceInstance[castingAction.serviceUuid]
98 .vnfs[castingAction.vnfStoreKey].upgradedVFMSonsCounter)) {
99 clonedState.serviceInstance[castingAction.serviceUuid]
100 .vnfs[castingAction.vnfStoreKey].upgradedVFMSonsCounter = 1;
103 clonedState.serviceInstance[castingAction.serviceUuid]
104 .vnfs[castingAction.vnfStoreKey].upgradedVFMSonsCounter++;
108 case VNFActions.UNDO_UPGRADE_VNF_ACTION: {
109 let clonedState = _.cloneDeep(state);
110 const castingAction = <UpgradeVnfAction>action;
111 if(clonedState.serviceInstance[castingAction.serviceUuid]
112 .vnfs[castingAction.vnfStoreKey]
113 .action.includes("Upgrade")) {
115 .serviceInstance[castingAction.serviceUuid]
116 .vnfs[castingAction.vnfStoreKey].upgradedVFMSonsCounter--;
117 if(clonedState.serviceInstance[castingAction.serviceUuid].vnfs[castingAction.vnfStoreKey]
118 .upgradedVFMSonsCounter === 0){
119 clonedState.serviceInstance[castingAction.serviceUuid]
120 .vnfs[castingAction.vnfStoreKey]
121 .action = ServiceInstanceActions.None;
131 const updateUniqueNames = (oldName: string, newName: string, serviceInstance: ServiceInstance): void => {
132 let existingNames = serviceInstance.existingNames;
133 if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
134 delete existingNames[oldName.toLowerCase()];
136 if (!_.isNil(newName)) {
137 existingNames[newName.toLowerCase()] = "";
142 export const calculateNextUniqueModelName = (vnfModelName: string, serviceId: string, state: any, levelName: string): string => {
143 let counter: number = null;
145 let pattern = !_.isNil(counter) ? ("_" + counter) : "";
146 if (!_.isNil(state.serviceInstance[serviceId][levelName][vnfModelName + pattern])) {
147 counter = counter ? (counter + 1) : 1;
149 return vnfModelName + pattern;