Merge "ITM: Fix for tunnel ports not getting deleted."
[genius.git] / interfacemanager / interfacemanager-impl / src / test / java / org / opendaylight / genius / interfacemanager / test / TopologyStateInterfaceTest.java
1 /**
2  * Created by eranjsu on 28-Dec-15.
3  */
4 package org.opendaylight.genius.interfacemanager.test;
5
6 import com.google.common.base.Optional;
7 import com.google.common.util.concurrent.Futures;
8 import org.junit.After;
9 import org.junit.Before;
10 import org.junit.Test;
11 import org.junit.runner.RunWith;
12 import org.mockito.Mock;
13 import org.mockito.runners.MockitoJUnitRunner;
14 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
15 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
16 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
17 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
19 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
20 import org.opendaylight.genius.interfacemanager.IfmUtil;
21 import org.opendaylight.genius.interfacemanager.commons.InterfaceMetaUtils;
22 import org.opendaylight.genius.interfacemanager.renderer.hwvtep.utilities.SouthboundUtils;
23 import org.opendaylight.genius.interfacemanager.renderer.ovs.statehelpers.OvsInterfaceTopologyStateAddHelper;
24 import org.opendaylight.genius.interfacemanager.renderer.ovs.statehelpers.OvsInterfaceTopologyStateRemoveHelper;
25 import org.opendaylight.genius.interfacemanager.renderer.ovs.statehelpers.OvsInterfaceTopologyStateUpdateHelper;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.*;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceBfdStatus;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceBfdStatusBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.BridgeEntry;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.BridgeEntryKey;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.bridge.entry.BridgeInterfaceEntry;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.bridge.entry.BridgeInterfaceEntryBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.bridge.entry.BridgeInterfaceEntryKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntry;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntryBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntryKey;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeGre;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
44 import org.opendaylight.yangtools.concepts.ListenerRegistration;
45 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
46
47 import java.math.BigInteger;
48 import java.util.ArrayList;
49 import java.util.List;
50
51 import static org.mockito.Mockito.*;
52
53
54 @RunWith(MockitoJUnitRunner.class)
55 public class TopologyStateInterfaceTest {
56
57     BigInteger dpId = BigInteger.valueOf(1);
58     InstanceIdentifier<OvsdbBridgeAugmentation>bridgeIid = null;
59     InstanceIdentifier<BridgeEntry> bridgeEntryIid = null;
60     OvsdbBridgeAugmentation bridgeNew;
61     OvsdbBridgeAugmentation bridgeOld;
62     BridgeEntry bridgeEntry = null;
63     ParentRefs parentRefs = null;
64     InstanceIdentifier<Interface> interfaceInstanceIdentifier = null;
65     InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> interfaceStateIdentifier = null;
66     Interface tunnelInterfaceEnabled = null;
67     BridgeInterfaceEntry bridgeInterfaceEntry;
68     BridgeInterfaceEntryKey bridgeInterfaceEntryKey;
69
70     @Mock DataBroker dataBroker;
71     @Mock ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
72     @Mock ReadOnlyTransaction mockReadTx;
73     @Mock WriteTransaction mockWriteTx;
74     OvsdbTerminationPointAugmentation newTerminationPoint;
75
76     OvsInterfaceTopologyStateAddHelper addHelper;
77     OvsInterfaceTopologyStateRemoveHelper removeHelper;
78     OvsInterfaceTopologyStateUpdateHelper updateHelper;
79
80     @Before
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);
88         setupMocks();
89     }
90
91     @After
92     public void tearDown(){
93         InterfaceManagerTestUtil.clearInterfaceCaches();
94     }
95
96     private void setupMocks()
97     {
98         Node node = new NodeBuilder().setKey(null).setNodeId(null).build();
99         tunnelInterfaceEnabled = InterfaceManagerTestUtil.buildTunnelInterface(dpId,
100             InterfaceManagerTestUtil.tunnelInterfaceName, "Test Interface1", true, TunnelTypeGre.class,
101             "192.168.56.101", "192.168.56.102");
102         newTerminationPoint = new OvsdbTerminationPointAugmentationBuilder()
103             .setName(InterfaceManagerTestUtil.tunnelInterfaceName).build();
104         bridgeIid = InterfaceManagerTestUtil
105             .getOvsdbAugmentationInstanceIdentifier(InterfaceManagerTestUtil.tunnelInterfaceName, node);
106         bridgeNew = InterfaceManagerTestUtil.getOvsdbBridgeRef("s1");
107         bridgeOld = InterfaceManagerTestUtil.getOvsdbBridgeRef("s1");
108         bridgeEntryIid = InterfaceMetaUtils.getBridgeEntryIdentifier(new BridgeEntryKey(dpId));
109         interfaceInstanceIdentifier = IfmUtil.buildId(InterfaceManagerTestUtil.tunnelInterfaceName);
110         interfaceStateIdentifier = IfmUtil.buildStateInterfaceId(newTerminationPoint.getName());
111         bridgeInterfaceEntryKey = new BridgeInterfaceEntryKey(InterfaceManagerTestUtil.tunnelInterfaceName);
112         bridgeInterfaceEntry =
113                 new BridgeInterfaceEntryBuilder().setKey(bridgeInterfaceEntryKey)
114                         .setInterfaceName(tunnelInterfaceEnabled.getName()).build();
115         bridgeEntry = InterfaceManagerTestUtil.buildBridgeEntry(dpId, bridgeInterfaceEntry);
116
117         when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx);
118         when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx);
119     }
120
121     @Test
122     public void testAddTopologyStateInterface()
123     {
124         Optional<OvsdbBridgeAugmentation>expectedOvsdbBridgeAugmentation = Optional.of(bridgeNew);
125         Optional<BridgeEntry> expectedBridgeEntry = Optional.of(bridgeEntry);
126         Optional<Interface> expectedInterface = Optional.of(tunnelInterfaceEnabled);
127
128         doReturn(Futures.immediateCheckedFuture(expectedInterface)).when(mockReadTx).read(
129                 LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier);
130         doReturn(Futures.immediateCheckedFuture(expectedBridgeEntry)).when(mockReadTx).read(
131                 LogicalDatastoreType.CONFIGURATION,bridgeEntryIid);
132
133         OvsdbBridgeAugmentationBuilder ovsdbBridgeAugmentation = new OvsdbBridgeAugmentationBuilder(bridgeNew);
134         ovsdbBridgeAugmentation.setDatapathId(DatapathId.getDefaultInstance("00:00:00:00:00:00:00:01"));
135         ovsdbBridgeAugmentation.setBridgeName(OvsdbBridgeName.getDefaultInstance("a"));
136         bridgeNew = ovsdbBridgeAugmentation.build();
137
138         addHelper.addPortToBridge(bridgeIid,bridgeNew,dataBroker);
139
140         BigInteger ovsdbDpId = BigInteger.valueOf(1);
141         BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(ovsdbDpId);
142         InstanceIdentifier<BridgeRefEntry> bridgeEntryId =
143                 InterfaceMetaUtils.getBridgeRefEntryIdentifier(bridgeRefEntryKey);
144         BridgeRefEntryBuilder tunnelDpnBridgeEntryBuilder =
145                 new BridgeRefEntryBuilder().setKey(bridgeRefEntryKey).setDpid(ovsdbDpId)
146                         .setBridgeReference(new OvsdbBridgeRef(bridgeIid));
147
148         verify(mockWriteTx).put(LogicalDatastoreType.OPERATIONAL, bridgeEntryId, tunnelDpnBridgeEntryBuilder.build(), true);
149     }
150
151     @Test
152     public void testDeleteTopologyStateInterface()
153     {
154         Optional<BridgeEntry> expectedBridgeEntry = Optional.of(bridgeEntry);
155         doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read(
156                 LogicalDatastoreType.OPERATIONAL, bridgeIid);
157         doReturn(Futures.immediateCheckedFuture(expectedBridgeEntry)).when(mockReadTx).read(
158                 LogicalDatastoreType.CONFIGURATION,bridgeEntryIid);
159         Optional<Interface> expectedInterface = Optional.of(tunnelInterfaceEnabled);
160         doReturn(Futures.immediateCheckedFuture(expectedInterface)).when(mockReadTx).read(
161                 LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier);
162         OvsdbBridgeAugmentationBuilder ovsdbBridgeAugmentation = new OvsdbBridgeAugmentationBuilder(bridgeOld);
163         ovsdbBridgeAugmentation.setDatapathId(DatapathId.getDefaultInstance("00:00:00:00:00:00:00:01"));
164         ovsdbBridgeAugmentation.setBridgeName(OvsdbBridgeName.getDefaultInstance("b"));
165         bridgeOld = ovsdbBridgeAugmentation.build();
166
167         removeHelper.removePortFromBridge(bridgeIid,bridgeOld,dataBroker);
168
169         BigInteger ovsdbDpId = BigInteger.valueOf(1);
170         BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(ovsdbDpId);
171         InstanceIdentifier<BridgeRefEntry> bridgeEntryId =
172                 InterfaceMetaUtils.getBridgeRefEntryIdentifier(bridgeRefEntryKey);
173
174         verify(mockWriteTx).delete(LogicalDatastoreType.OPERATIONAL,bridgeEntryId);
175     }
176
177     @Test
178     public void testUpdateBridgeReferenceEntry()
179     {
180         Optional<OvsdbBridgeAugmentation>expectedOvsdbBridgeAugmentation = Optional.of(bridgeNew);
181         Optional<BridgeEntry> expectedBridgeEntry = Optional.of(bridgeEntry);
182         Optional<Interface> expectedInterface = Optional.of(tunnelInterfaceEnabled);
183
184         doReturn(Futures.immediateCheckedFuture(expectedInterface)).when(mockReadTx).read(
185                 LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier);
186         doReturn(Futures.immediateCheckedFuture(expectedBridgeEntry)).when(mockReadTx).read(
187                 LogicalDatastoreType.CONFIGURATION,bridgeEntryIid);
188         doReturn(Futures.immediateCheckedFuture(expectedOvsdbBridgeAugmentation)).when(mockReadTx).read(
189                 LogicalDatastoreType.OPERATIONAL, bridgeIid);
190
191         OvsdbBridgeAugmentationBuilder ovsdbBridgeAugmentation = new OvsdbBridgeAugmentationBuilder(bridgeNew);
192         ovsdbBridgeAugmentation.setDatapathId(DatapathId.getDefaultInstance("00:00:00:00:00:00:00:01"));
193         ovsdbBridgeAugmentation.setBridgeName(OvsdbBridgeName.getDefaultInstance("a"));
194         bridgeNew = ovsdbBridgeAugmentation.build();
195
196         updateHelper.updateBridgeRefEntry(bridgeIid, bridgeNew, bridgeOld, dataBroker);
197     }
198
199     @Test
200     public void testUpdateTunnelState(){
201
202         List<InterfaceBfdStatus> interfaceBfdStatus = new ArrayList<InterfaceBfdStatus>();
203         interfaceBfdStatus.add(new InterfaceBfdStatusBuilder().setBfdStatusKey(SouthboundUtils.BFD_OP_STATE).setBfdStatusValue(SouthboundUtils.BFD_STATE_UP).build());
204
205         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = new InterfaceBuilder().setKey(new InterfaceKey(InterfaceManagerTestUtil.interfaceName)).build();
206         Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> expectedInterface = Optional.of(ifState);
207
208         doReturn(Futures.immediateCheckedFuture(expectedInterface)).when(mockReadTx).read(
209                 LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier);
210         updateHelper.updateTunnelState(dataBroker, newTerminationPoint);
211
212         //verify
213         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifStateId =
214             IfmUtil.buildStateInterfaceId(InterfaceManagerTestUtil.tunnelInterfaceName);
215         InterfaceBuilder ifaceBuilder = new InterfaceBuilder().setOperStatus(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Down);
216         ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(InterfaceManagerTestUtil.tunnelInterfaceName));
217         verify(mockWriteTx).merge(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build());
218
219     }
220 }