1 import {Action} from "redux";
2 import {VnfInstance} from "../../../models/vnfInstance";
4 CreateVnfInstanceAction,
5 RemoveVnfInstanceAction,
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";
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);
61 case VNFActions.UNDO_DELETE_ACTION_VNF_INSTANCE : {
62 let newState = _.cloneDeep(state);
63 let vnf = newState.serviceInstance[(<ActionOnFirstLevel>action).serviceId].vnfs[(<ActionOnFirstLevel>action).storeKey];
64 let oldState = vnf.action;
65 newState.serviceInstance[(<ActionOnFirstLevel>action).serviceId].vnfs[(<ActionOnFirstLevel>action).storeKey].action = (oldState.split('_')[0]) as ServiceInstanceActions;
66 updateServiceValidationCounter(newState, vnf['isMissingData'], false, (<ActionOnFirstLevel>action).serviceId);
70 case VNFActions.REMOVE_VNF_INSTANCE : {
71 let newState = _.cloneDeep(state);
72 let vnfInstance = newState.serviceInstance[(<RemoveVnfInstanceAction>action).serviceId].vnfs[(<RemoveVnfInstanceAction>action).vnfStoreKey];
73 updateServiceValidationCounter(newState, vnfInstance['isMissingData'], false, (<RemoveVnfInstanceAction>action).serviceId);
74 delete newState.serviceInstance[(<RemoveVnfInstanceAction>action).serviceId].vnfs[(<RemoveVnfInstanceAction>action).vnfStoreKey];
78 case VNFActions.UPDATE_VNF_POSITION : {
79 let newState = _.cloneDeep(state);
80 newState.serviceInstance[(<UpdateVnfPosition>action).instanceId].vnfs[(<UpdateVnfPosition>action).vnfStoreKey].position = (<UpdateVnfPosition>action).node.position;
89 const updateUniqueNames = (oldName: string, newName: string, serviceInstance: ServiceInstance): void => {
90 let existingNames = serviceInstance.existingNames;
91 if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
92 delete existingNames[oldName.toLowerCase()];
94 if (!_.isNil(newName)) {
95 existingNames[newName.toLowerCase()] = "";
100 export const calculateNextUniqueModelName = (vnfModelName: string, serviceId: string, state: any, levelName: string): string => {
101 let counter: number = null;
103 let pattern = !_.isNil(counter) ? ("_" + counter) : "";
104 if (!_.isNil(state.serviceInstance[serviceId][levelName][vnfModelName + pattern])) {
105 counter = counter ? (counter + 1) : 1;
107 return vnfModelName + pattern;