1 package org.opendaylight.vpnservice.interfacemgr.test;
3 import com.google.common.base.Optional;
4 import com.google.common.util.concurrent.Futures;
6 import org.junit.Before;
8 import org.junit.runner.RunWith;
9 import org.mockito.Mock;
10 import org.mockito.runners.MockitoJUnitRunner;
11 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
12 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
13 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
14 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
15 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.vpnservice.interfacemgr.IfmConstants;
18 import org.opendaylight.vpnservice.interfacemgr.IfmUtil;
19 import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.statehelpers.FlowBasedServicesStateBindHelper;
20 import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.statehelpers.FlowBasedServicesStateUnbindHelper;
21 import org.opendaylight.vpnservice.mdsalutil.*;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.ServiceBindings;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.StypeOpenflow;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.service.bindings.ServicesInfo;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.service.bindings.ServicesInfoKey;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.service.bindings.services.info.BoundServices;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.service.bindings.services.info.BoundServicesKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeGre;
38 import org.opendaylight.yangtools.concepts.ListenerRegistration;
39 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
41 import java.math.BigInteger;
42 import java.util.ArrayList;
43 import java.util.List;
45 import static org.mockito.Matchers.any;
46 import static org.mockito.Mockito.*;
48 @RunWith(MockitoJUnitRunner.class)
49 public class FlowBasedServicesStateConfigurationTest {
51 Interface interfaceEnabled = null;
53 int instructionKeyval = 2;
54 InstanceIdentifier<Interface> interfaceInstanceIdentifier = null;
55 InstanceIdentifier<Flow> flowInstanceId = null;
56 Flow ingressFlow = null;
57 BigInteger dpId = BigInteger.valueOf(1);
58 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface stateInterface;
59 InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> interfaceStateIdentifier = null;
60 ServicesInfo servicesInfo = null;
61 NodeConnectorId nodeConnectorId = null;
62 BoundServices boundService = null;
63 StypeOpenflow stypeOpenflow = null;
64 Instruction instruction = null;
65 InstructionKey instructionKey = null;
66 List<Instruction>instructions = new ArrayList<>();
70 String serviceName = "VPN";
72 @Mock DataBroker dataBroker;
73 @Mock ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
74 @Mock ReadOnlyTransaction mockReadTx;
75 @Mock WriteTransaction mockWriteTx;
77 FlowBasedServicesStateBindHelper bindHelper;
78 FlowBasedServicesStateUnbindHelper unbindHelper;
81 public void setUp() throws Exception {
82 when(dataBroker.registerDataChangeListener(
83 any(LogicalDatastoreType.class),
84 any(InstanceIdentifier.class),
85 any(DataChangeListener.class),
86 any(DataChangeScope.class)))
87 .thenReturn(dataChangeListenerRegistration);
91 private void setupMocks(){
93 interfaceEnabled = InterfaceManagerTestUtil.buildInterface(InterfaceManagerTestUtil.interfaceName, "Test Vlan Interface1", true, L2vlan.class, dpId);
94 interfaceInstanceIdentifier = IfmUtil.buildId(InterfaceManagerTestUtil.interfaceName);
95 nodeConnectorId = InterfaceManagerTestUtil.buildNodeConnectorId(BigInteger.valueOf(1), portNum);
96 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder();
97 List<String> lowerLayerIfList = new ArrayList<>();
98 lowerLayerIfList.add(nodeConnectorId.getValue());
99 ifaceBuilder.setOperStatus(OperStatus.Up).setAdminStatus(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus.Up)
100 .setPhysAddress(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress.getDefaultInstance("AA:AA:AA:AA:AA:AA"))
101 .setIfIndex(ifIndexval)
102 .setLowerLayerIf(lowerLayerIfList)
103 .setKey(IfmUtil.getStateInterfaceKeyFromName(InterfaceManagerTestUtil.interfaceName))
104 .setName(InterfaceManagerTestUtil.interfaceName);
105 stypeOpenflow = InterfaceManagerTestUtil.buildStypeOpenflow(dpId,flowpriority, NwConstants.LPORT_DISPATCHER_TABLE, instructions);
106 instructionKey = new InstructionKey(instructionKeyval);
107 BigInteger[] metadataValues = IfmUtil.mergeOpenflowMetadataWriteInstructions(instructions);
108 boundService = InterfaceManagerTestUtil.buildBoundServices(serviceName,key,new BoundServicesKey(key),stypeOpenflow);
109 short sIndex = boundService.getServicePriority();
110 BigInteger metadata = MetaDataUtil.getMetaDataForLPortDispatcher(ifaceBuilder.getIfIndex(),
111 ++sIndex, metadataValues[0]);
112 BigInteger mask = MetaDataUtil.getMetaDataMaskForLPortDispatcher(
113 MetaDataUtil.METADATA_MASK_SERVICE_INDEX,
114 MetaDataUtil.METADATA_MASK_LPORT_TAG, metadataValues[1]);
115 instruction = InterfaceManagerTestUtil.buildInstruction(InterfaceManagerTestUtil.buildWriteMetaDataCase(InterfaceManagerTestUtil.buildWriteMetaData(metadata, mask)),
116 new InstructionKey(instructionKey));
117 instructions.add(instruction);
118 stateInterface = ifaceBuilder.build();
119 ServicesInfoKey servicesInfoKey = new ServicesInfoKey(InterfaceManagerTestUtil.interfaceName);
120 List<BoundServices> lowerlayerIfList = new ArrayList<>();
121 lowerlayerIfList.add(boundService);
122 interfaceStateIdentifier = IfmUtil.buildStateInterfaceId(interfaceEnabled.getName());
123 servicesInfo = InterfaceManagerTestUtil.buildServicesInfo(InterfaceManagerTestUtil.interfaceName,servicesInfoKey,lowerlayerIfList);
125 String flowRef = InterfaceManagerTestUtil.buildflowRef(dpId, InterfaceManagerTestUtil.interfaceName, boundService.getServiceName(), boundService.getServicePriority());
126 List<Instruction> instructionList = boundService.getAugmentation(StypeOpenflow.class).getInstruction();
127 String serviceRef = boundService.getServiceName();
128 List<MatchInfo> matches = new ArrayList<>();
129 matches.add(new MatchInfo(MatchFieldType.metadata, new BigInteger[] {
130 MetaDataUtil.getMetaDataForLPortDispatcher(ifaceBuilder.getIfIndex(), boundService.getServicePriority()),
131 MetaDataUtil.getMetaDataMaskForLPortDispatcher() }));
132 ingressFlow = MDSALUtil.buildFlowNew(stypeOpenflow.getDispatcherTableId(), flowRef, boundService.getServicePriority(), serviceRef, 0, 0,
133 stypeOpenflow.getFlowCookie(), matches, instructionList);
134 FlowKey flowKey = new FlowKey(new FlowId(ingressFlow.getId()));
135 flowInstanceId = InterfaceManagerTestUtil.getFlowInstanceIdentifier(dpId,ingressFlow.getTableId(),flowKey);
137 when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx);
138 when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx);
142 public void testStateBindSingleService(){
144 Optional<ServicesInfo>expectedservicesInfo = Optional.of(servicesInfo);
145 Optional<Interface> expectedInterface = Optional.of(interfaceEnabled);
146 Optional<NodeConnectorId>expectednodeconnectorId = Optional.of(nodeConnectorId);
147 Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> expectedStateInterface = Optional.of(stateInterface);
149 ServicesInfoKey servicesInfoKey = new ServicesInfoKey(InterfaceManagerTestUtil.interfaceName);
150 InstanceIdentifier.InstanceIdentifierBuilder<ServicesInfo> servicesInfoIdentifierBuilder =
151 InstanceIdentifier.builder(ServiceBindings.class).child(ServicesInfo.class, servicesInfoKey);
153 doReturn(Futures.immediateCheckedFuture(expectedservicesInfo)).when(mockReadTx).read(
154 LogicalDatastoreType.CONFIGURATION,servicesInfoIdentifierBuilder.build());
155 doReturn(Futures.immediateCheckedFuture(expectedInterface)).when(mockReadTx).read(
156 LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier);
157 doReturn(Futures.immediateCheckedFuture(expectednodeconnectorId)).when(mockReadTx).read(
158 LogicalDatastoreType.OPERATIONAL,interfaceStateIdentifier);
159 doReturn(Futures.immediateCheckedFuture(expectedStateInterface)).when(mockReadTx).read(
160 LogicalDatastoreType.OPERATIONAL,interfaceStateIdentifier);
162 bindHelper.bindServicesOnInterface(stateInterface,dataBroker);
164 verify(mockWriteTx).put(LogicalDatastoreType.CONFIGURATION,flowInstanceId,ingressFlow, true);
169 public void testStateUnbindSingleService(){
171 Optional<ServicesInfo>expectedservicesInfo = Optional.of(servicesInfo);
172 Optional<Interface> expectedInterface = Optional.of(interfaceEnabled);
173 Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> expectedStateInterface = Optional.of(stateInterface);
175 ServicesInfoKey servicesInfoKey = new ServicesInfoKey(InterfaceManagerTestUtil.interfaceName);
176 InstanceIdentifier.InstanceIdentifierBuilder<ServicesInfo> servicesInfoIdentifierBuilder =
177 InstanceIdentifier.builder(ServiceBindings.class).child(ServicesInfo.class, servicesInfoKey);
179 doReturn(Futures.immediateCheckedFuture(expectedservicesInfo)).when(mockReadTx).read(
180 LogicalDatastoreType.CONFIGURATION,servicesInfoIdentifierBuilder.build());
181 doReturn(Futures.immediateCheckedFuture(expectedInterface)).when(mockReadTx).read(
182 LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier);
183 doReturn(Futures.immediateCheckedFuture(expectedStateInterface)).when(mockReadTx).read(
184 LogicalDatastoreType.OPERATIONAL,interfaceStateIdentifier);
186 unbindHelper.unbindServicesFromInterface(stateInterface,dataBroker);
188 verify(mockWriteTx).delete(LogicalDatastoreType.CONFIGURATION,flowInstanceId);