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