2 * Copyright © 2017 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.netvirt.elanmanager.tests;
10 import com.google.common.collect.Lists;
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.Comparator;
14 import java.util.HashMap;
15 import java.util.List;
17 import java.util.concurrent.ExecutionException;
18 import java.util.concurrent.TimeUnit;
19 import javax.inject.Inject;
20 import org.apache.commons.lang3.tuple.ImmutablePair;
21 import org.apache.commons.lang3.tuple.Pair;
22 import org.awaitility.Awaitility;
23 import org.awaitility.core.ConditionFactory;
24 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
25 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
26 import org.opendaylight.genius.mdsalutil.MDSALUtil;
27 import org.opendaylight.genius.testutils.TestInterfaceManager;
28 import org.opendaylight.genius.testutils.interfacemanager.TunnelInterfaceDetails;
29 import org.opendaylight.genius.testutils.itm.ItmRpcTestImpl;
30 import org.opendaylight.mdsal.binding.api.DataBroker;
31 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
32 import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
33 import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
34 import org.opendaylight.netvirt.elan.internal.ElanInstanceManager;
35 import org.opendaylight.netvirt.elan.utils.ElanUtils;
36 import org.opendaylight.netvirt.elanmanager.api.ElanHelper;
37 import org.opendaylight.netvirt.elanmanager.tests.utils.InterfaceHelper;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.Ordered;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Instruction;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActions;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterfaceBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterfaceKey;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.elan._interface.StaticMacEntries;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.elan._interface.StaticMacEntriesBuilder;
71 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
72 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
73 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
74 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
75 import org.opendaylight.yangtools.yang.binding.DataObject;
76 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
77 import org.opendaylight.yangtools.yang.common.Uint32;
78 import org.opendaylight.yangtools.yang.common.Uint64;
80 public class ElanServiceTestBase {
82 protected @Inject DataBroker dataBroker;
83 protected @Inject TestInterfaceManager interfaceMgr;
84 protected @Inject ItmRpcTestImpl itmRpc;
85 protected @Inject ElanInstanceManager elanInstanceManager;
86 protected @Inject ElanInstanceCache elanInstanceCache;
87 protected @Inject SingleTransactionDataBroker singleTxdataBroker;
88 protected @Inject OdlInterfaceRpcService odlInterfaceRpcService;
89 public static final String ELAN1 = "34701c04-1118-4c65-9425-78a80d49a211";
90 public static final Uint32 ELAN1_SEGMENT_ID = Uint32.valueOf(100L);
92 protected static final Uint64 DPN1_ID = Uint64.valueOf("1").intern();
93 protected static final Uint64 DPN2_ID = Uint64.valueOf("2").intern();
94 protected static final Uint64 DPN3_ID = Uint64.valueOf("3").intern();
96 protected static final String DPN1_ID_STR = "1";
97 protected static final String DPN2_ID_STR = "2";
98 protected static final String DPN3_ID_STR = "3";
100 protected static final String DPN1_TEPIP = "192.168.56.30";
101 protected static final String DPN2_TEPIP = "192.168.56.40";
102 protected static final String DPN3_TEPIP = "192.168.56.50";
103 protected static final String TOR1_TEPIP = "192.168.56.60";
104 protected static final String TOR2_TEPIP = "192.168.56.70";
105 public static final String DCGW_TEPIP = "192.168.56.80";
107 protected static final String DPN1MAC1 = "10:00:00:00:00:01";
108 protected static final String DPN1MAC2 = "10:00:00:00:00:02";
110 protected static final String DPN2MAC1 = "10:00:00:00:00:03";
111 protected static final String DPN2MAC2 = "10:00:00:00:00:04";
113 protected static final String DPN3MAC1 = "10:00:00:00:00:05";
114 protected static final String DPN3MAC2 = "10:00:00:00:00:06";
116 protected static final String TOR1_MAC1 = "10:00:00:00:00:07";
117 protected static final String TOR1_IP1 = "10.0.0.1";
118 protected static final String TOR1_MAC2 = "10:00:00:00:00:08";
119 protected static final String TOR1_IP2 = "10.0.0.2";
121 protected static final String TOR2_MAC1 = "10:00:00:00:00:09";
122 protected static final String TOR2_MAC2 = "10:00:00:00:00:10";
124 protected static final String DPN1_TO_DPN2TNL_MAC = "91:00:00:00:00:01";
125 protected static final String DPN1_TO_TOR1TNL_MAC = "91:00:00:00:00:02";
126 protected static final String DPN1_TO_DCGWTNL_MAC = "91:00:00:00:00:03";
127 protected static final String DPN1_TO_DPN3_TNL_MAC = "91:00:00:00:00:04";
129 protected static final String DPN2_TO_DPN1_TNL_MAC = "92:00:00:00:00:01";
130 protected static final String DPN2_TO_TOR1_TNL_MAC = "92:00:00:00:00:02";
131 protected static final String DPN2_TO_DCGW_TNL_MAC = "92:00:00:00:00:03";
132 protected static final String DPN2_TO_DPN3_TNL_MAC = "92:00:00:00:00:04";
134 protected static final String DPN3_TO_DPN1_TNL_MAC = "93:00:00:00:00:01";
135 protected static final String DPN3_TO_DPN2_TNL_MAC = "93:00:00:00:00:02";
136 protected static final String DPN3_TO_TOR1_TNL_MAC = "93:00:00:00:00:03";
138 protected static final String DPN1_TO_TOR2_TNL_MAC = "94:00:00:00:00:01";
139 protected static final String DPN2_TO_TOR2_TNL_MAC = "94:00:00:00:00:02";
140 protected static final String DPN3_TO_TOR2_TNL_MAC = "94:00:00:00:00:03";
143 protected static final String DPN1IP1 = "10.0.0.11";
144 protected static final String DPN1IP2 = "10.0.0.12";
145 protected static final String DPN2IP1 = "10.0.0.13";
146 protected static final String DPN2IP2 = "10.0.0.14";
147 protected static final String DPN3IP1 = "10.0.0.15";
148 protected static final String DPN3IP2 = "10.0.0.16";
150 protected static final String EVPNRECVMAC1 = "10:00:00:00:00:51";
151 protected static final String EVPNRECVMAC2 = "10:00:00:00:00:52";
153 protected static final String EVPNRECVIP1 = "192.168.122.51";
154 protected static final String EVPNRECVIP2 = "192.168.122.52";
156 protected static final String TOR1_NODE_ID = "hwvtep://uuid/34701c04-1118-4c65-9425-78a80d49a211";
157 protected static final String TOR2_NODE_ID = "hwvtep://uuid/34701c04-1118-4c65-9425-78a80d49a212";
159 protected static final String L2GW1 = "l2gw1";
160 protected static final String L2GW2 = "l2gw2";
161 protected static final String L2GW_CONN1 = "l2gwConnection1";
162 protected static final String L2GW_CONN2 = "l2gwConnection2";
163 protected static final String PS1 = "ps1";
164 protected static final String PS2 = "ps2";
166 protected static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params
167 .xml.ns.yang.network.topology.rev131021.network.topology.topology.Node>
168 TOR1_NODE_IID = createInstanceIdentifier(TOR1_NODE_ID);
169 protected static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params
170 .xml.ns.yang.network.topology.rev131021.network.topology.topology.Node>
171 TOR2_NODE_IID = createInstanceIdentifier(TOR2_NODE_ID);
173 protected static final String DCGWID = DCGW_TEPIP;
175 public static final String RD = "100:1";
176 public static final String EVPN1 = "evpn1";
178 protected static Map<String, Pair<InterfaceInfo, String>> ELAN_INTERFACES = new HashMap<>();
179 protected static Map<String, TunnelInterfaceDetails> EXTN_INTFS = new HashMap<>();
182 //Adding elan dpn macs
183 /*ELAN1+":"+DPN1MAC1 ->
184 (vlanInterfaceInfo(String interfaceName, BigInteger dpId, int portNo, int lportTag, String mac), vmPrefix)*/
185 ELAN_INTERFACES.put(ELAN1 + ":" + DPN1MAC1 ,
186 ImmutablePair.of(InterfaceHelper
187 .buildVlanInterfaceInfo("23701c04-1118-4c65-9425-78a80d49a211",
188 DPN1_ID, 1, 10, DPN1MAC1), DPN1IP1));
190 ELAN_INTERFACES.put(ELAN1 + ":" + DPN1MAC2 ,
191 ImmutablePair.of(InterfaceHelper
192 .buildVlanInterfaceInfo("23701c04-1218-4c65-9425-78a80d49a211",
193 DPN1_ID, 2, 11, DPN1MAC2), DPN1IP2));
195 ELAN_INTERFACES.put(ELAN1 + ":" + DPN2MAC1 ,
196 ImmutablePair.of(InterfaceHelper
197 .buildVlanInterfaceInfo("23701c04-2118-4c65-9425-78a80d49a211",
198 DPN2_ID, 3, 12, DPN2MAC1), DPN2IP1));
200 ELAN_INTERFACES.put(ELAN1 + ":" + DPN2MAC2 ,
201 ImmutablePair.of(InterfaceHelper
202 .buildVlanInterfaceInfo("23701c04-2218-4c65-9425-78a80d49a211",
203 DPN2_ID, 4, 13, DPN2MAC2), DPN2IP2));
205 ELAN_INTERFACES.put(ELAN1 + ":" + DPN3MAC1 ,
206 ImmutablePair.of(InterfaceHelper
207 .buildVlanInterfaceInfo("23701c04-3118-4c65-9425-78a80d49a211",
208 DPN3_ID, 5, 14, DPN3MAC1), DPN3IP1));
210 ELAN_INTERFACES.put(ELAN1 + ":" + DPN3MAC2 ,
211 ImmutablePair.of(InterfaceHelper
212 .buildVlanInterfaceInfo("23701c04-3218-4c65-9425-78a80d49a211",
213 DPN3_ID, 6, 15, DPN3MAC2), DPN3IP2));
215 //Adding the external tunnel interfaces
216 EXTN_INTFS.put(DPN1_ID_STR + ":" + DPN2_ID_STR, new TunnelInterfaceDetails(DPN1_TEPIP, DPN2_TEPIP, true,
217 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-10", DPN1_ID, 5, 14, DPN1_TO_DPN2TNL_MAC)));
219 EXTN_INTFS.put(DPN1_ID_STR + ":" + TOR1_NODE_ID, new TunnelInterfaceDetails(DPN1_TEPIP, TOR1_TEPIP, true,
220 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-12", DPN1_ID, 6, 15, DPN1_TO_TOR1TNL_MAC)));
221 EXTN_INTFS.put(DPN1_ID_STR + ":" + TOR1_TEPIP, EXTN_INTFS.get(DPN1_ID_STR + ":" + TOR1_NODE_ID));
223 EXTN_INTFS.put(DPN2_ID_STR + ":" + DPN1_ID_STR, new TunnelInterfaceDetails(DPN2_TEPIP, DPN1_TEPIP, true,
224 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-11", DPN2_ID, 7, 16, DPN2_TO_DPN1_TNL_MAC)));
226 EXTN_INTFS.put(DPN2_ID_STR + ":" + TOR1_NODE_ID, new TunnelInterfaceDetails(DPN2_TEPIP, TOR1_TEPIP, true,
227 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-13", DPN2_ID, 8, 17, DPN2_TO_TOR1_TNL_MAC)));
228 EXTN_INTFS.put(DPN2_ID_STR + ":" + TOR1_TEPIP, EXTN_INTFS.get(DPN2_ID_STR + ":" + TOR1_NODE_ID));
230 EXTN_INTFS.put(DPN1_ID_STR + ":" + DPN3_ID_STR, new TunnelInterfaceDetails(DPN1_TEPIP, DPN3_TEPIP, true,
231 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-14", DPN1_ID, 9, 18, DPN1_TO_DPN3_TNL_MAC)));
233 EXTN_INTFS.put(DPN3_ID_STR + ":" + DPN1_ID_STR, new TunnelInterfaceDetails(DPN3_TEPIP, DPN1_TEPIP, true,
234 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-15", DPN3_ID, 10, 19, DPN3_TO_DPN1_TNL_MAC)));
236 EXTN_INTFS.put(DPN3_ID_STR + ":" + DPN2_ID_STR, new TunnelInterfaceDetails(DPN3_TEPIP, DPN2_TEPIP, true,
237 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-16", DPN3_ID, 11, 20, DPN3_TO_DPN2_TNL_MAC)));
239 EXTN_INTFS.put(DPN2_ID_STR + ":" + DPN3_ID_STR, new TunnelInterfaceDetails(DPN2_TEPIP, DPN3_TEPIP, true,
240 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-17", DPN2_ID, 12, 21, DPN2_TO_DPN3_TNL_MAC)));
242 EXTN_INTFS.put(DPN3_ID_STR + ":" + TOR1_NODE_ID, new TunnelInterfaceDetails(DPN3_TEPIP, TOR1_TEPIP, true,
243 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-18", DPN3_ID, 13, 22, DPN3_TO_TOR1_TNL_MAC)));
244 EXTN_INTFS.put(DPN3_ID_STR + ":" + TOR1_TEPIP, EXTN_INTFS.get(DPN3_ID_STR + ":" + TOR1_NODE_ID));
246 EXTN_INTFS.put(DPN1_ID_STR + ":" + TOR2_NODE_ID, new TunnelInterfaceDetails(DPN1_TEPIP, TOR2_TEPIP, true,
247 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-19", DPN1_ID, 14, 23, DPN1_TO_TOR2_TNL_MAC)));
248 EXTN_INTFS.put(DPN1_ID_STR + ":" + TOR2_TEPIP, EXTN_INTFS.get(DPN1_ID_STR + ":" + TOR2_NODE_ID));
250 EXTN_INTFS.put(DPN2_ID_STR + ":" + TOR2_NODE_ID, new TunnelInterfaceDetails(DPN2_TEPIP, TOR2_TEPIP, true,
251 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-20", DPN2_ID, 15, 24, DPN2_TO_TOR2_TNL_MAC)));
252 EXTN_INTFS.put(DPN2_ID_STR + ":" + TOR2_TEPIP, EXTN_INTFS.get(DPN2_ID_STR + ":" + TOR2_NODE_ID));
254 EXTN_INTFS.put(DPN3_ID_STR + ":" + TOR2_NODE_ID, new TunnelInterfaceDetails(DPN3_TEPIP, TOR2_TEPIP, true,
255 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-21", DPN3_ID, 16, 25, DPN3_TO_TOR2_TNL_MAC)));
256 EXTN_INTFS.put(DPN3_ID_STR + ":" + TOR2_TEPIP, EXTN_INTFS.get(DPN3_ID_STR + ":" + TOR2_NODE_ID));
258 EXTN_INTFS.put(DPN1_ID_STR + ":" + DCGWID, new TunnelInterfaceDetails(DPN1_TEPIP, DCGW_TEPIP, true,
259 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-22", DPN1_ID, 17, 26, DPN1_TO_DCGWTNL_MAC)));
261 EXTN_INTFS.put(DPN2_ID_STR + ":" + DCGWID, new TunnelInterfaceDetails(DPN2_TEPIP, DCGWID, true,
262 InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-23", DPN2_ID, 18, 27, DPN2_TO_DCGW_TNL_MAC)));
266 protected ConditionFactory getAwaiter() {
267 return Awaitility.await("TestableListener")
268 .atMost(30, TimeUnit.SECONDS)//TODO constant
269 .pollInterval(100, TimeUnit.MILLISECONDS);
272 void awaitForData(LogicalDatastoreType dsType, InstanceIdentifier<? extends DataObject> iid) {
273 getAwaiter().until(() -> MDSALUtil.read(dataBroker, dsType, iid).isPresent());
276 void awaitForDataDelete(LogicalDatastoreType dsType, InstanceIdentifier<? extends DataObject> iid) {
277 getAwaiter().until(() -> !MDSALUtil.read(dataBroker, dsType, iid).isPresent());
280 Flow getFlowWithoutCookie(Flow flow) {
281 FlowBuilder flowBuilder = new FlowBuilder(flow);
282 return flowBuilder.setCookie(null).build();
285 Flow getSortedActions(Flow flow) {
286 FlowBuilder flowBuilder = new FlowBuilder(flow);
287 Instructions instructions = flowBuilder.getInstructions();
288 InstructionsBuilder builder = new InstructionsBuilder();
289 InstructionBuilder instructionBuilder = new InstructionBuilder(
290 new ArrayList<Instruction>(instructions.getInstruction().values()).get(0));
291 instructionBuilder.setInstruction(sortActions(instructionBuilder.getInstruction()));
292 builder.setInstruction(Lists.newArrayList(instructionBuilder.build()));
293 return flowBuilder.setInstructions(builder.build()).build();
296 org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.Instruction
297 sortActions(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.Instruction input) {
298 if (input instanceof ApplyActionsCase) {
299 List<Action> action = new ArrayList<Action>(((ApplyActionsCase)input)
300 .getApplyActions().getAction().values());
301 action.sort(Comparator.comparing(Ordered::getOrder));
303 ApplyActions actions = new ApplyActionsBuilder().setAction(action).build();
304 return new ApplyActionsCaseBuilder().setApplyActions(actions).build();
309 protected static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology
310 .rev131021.network.topology.topology.Node> createInstanceIdentifier(String nodeIdString) {
311 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId nodeId
312 = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network
313 .topology.rev131021.NodeId(new Uri(nodeIdString));
314 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology
315 .topology.NodeKey nodeKey = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
316 .network.topology.rev131021.network.topology.topology.NodeKey(nodeId);
317 TopologyKey topoKey = new TopologyKey(new TopologyId(new Uri("hwvtep:1")));
318 return InstanceIdentifier.builder(NetworkTopology.class)
319 .child(Topology.class, topoKey)
320 .child(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang
321 .network.topology.rev131021.network.topology.topology.Node.class, nodeKey)
326 protected void setupItm() throws ExecutionException, InterruptedException {
327 /*Add tap port and tunnel ports in DPN1 and DPN2*/
328 interfaceMgr.addInterfaceInfo(ELAN_INTERFACES.get(ELAN1 + ":" + DPN1MAC1).getLeft());
329 interfaceMgr.addInterfaceInfo(ELAN_INTERFACES.get(ELAN1 + ":" + DPN1MAC2).getLeft());
330 interfaceMgr.addInterfaceInfo(ELAN_INTERFACES.get(ELAN1 + ":" + DPN2MAC1).getLeft());
331 interfaceMgr.addInterfaceInfo(ELAN_INTERFACES.get(ELAN1 + ":" + DPN2MAC2).getLeft());
332 interfaceMgr.addInterfaceInfo(ELAN_INTERFACES.get(ELAN1 + ":" + DPN3MAC1).getLeft());
333 interfaceMgr.addInterfaceInfo(ELAN_INTERFACES.get(ELAN1 + ":" + DPN3MAC2).getLeft());
335 interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN1_ID_STR + ":" + DPN2_ID_STR));
336 interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN2_ID_STR + ":" + DPN1_ID_STR));
337 interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN1_ID_STR + ":" + DPN3_ID_STR));
338 interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN3_ID_STR + ":" + DPN1_ID_STR));
339 interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN2_ID_STR + ":" + DPN3_ID_STR));
340 interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN3_ID_STR + ":" + DPN2_ID_STR));
342 interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN1_ID_STR + ":" + TOR1_NODE_ID));
343 interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN2_ID_STR + ":" + TOR1_NODE_ID));
344 interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN3_ID_STR + ":" + TOR1_NODE_ID));
345 interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN1_ID_STR + ":" + TOR2_NODE_ID));
346 interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN2_ID_STR + ":" + TOR2_NODE_ID));
347 interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN3_ID_STR + ":" + TOR2_NODE_ID));
349 /*Add DPN1 and DPN2 TEPs*/
350 itmRpc.addDpn(DPN1_ID, DPN1_TEPIP);
351 itmRpc.addDpn(DPN2_ID, DPN2_TEPIP);
352 itmRpc.addDpn(DPN3_ID, DPN3_TEPIP);
354 /*add external interface*/
355 itmRpc.addInterface(DPN1_ID,
356 DPN2_TEPIP, EXTN_INTFS.get(DPN1_ID_STR + ":" + DPN2_ID_STR).getInterfaceInfo().getInterfaceName());
357 itmRpc.addInterface(DPN2_ID,
358 DPN1_TEPIP, EXTN_INTFS.get(DPN2_ID_STR + ":" + DPN1_ID_STR).getInterfaceInfo().getInterfaceName());
359 itmRpc.addInterface(DPN1_ID,
360 DPN3_TEPIP, EXTN_INTFS.get(DPN1_ID_STR + ":" + DPN3_ID_STR).getInterfaceInfo().getInterfaceName());
361 itmRpc.addInterface(DPN3_ID,
362 DPN1_TEPIP, EXTN_INTFS.get(DPN3_ID_STR + ":" + DPN1_ID_STR).getInterfaceInfo().getInterfaceName());
363 itmRpc.addInterface(DPN2_ID,
364 DPN3_TEPIP, EXTN_INTFS.get(DPN2_ID_STR + ":" + DPN3_ID_STR).getInterfaceInfo().getInterfaceName());
365 itmRpc.addInterface(DPN3_ID,
366 DPN2_TEPIP, EXTN_INTFS.get(DPN3_ID_STR + ":" + DPN2_ID_STR).getInterfaceInfo().getInterfaceName());
369 itmRpc.addL2GwInterface(DPN1_ID,
370 DCGWID, EXTN_INTFS.get(DPN1_ID_STR + ":" + DCGWID).getInterfaceInfo().getInterfaceName());
371 itmRpc.addL2GwInterface(DPN1_ID,
372 TOR1_NODE_ID, EXTN_INTFS.get(DPN1_ID_STR + ":" + TOR1_NODE_ID).getInterfaceInfo().getInterfaceName());
373 itmRpc.addL2GwInterface(DPN2_ID,
374 TOR1_NODE_ID, EXTN_INTFS.get(DPN2_ID_STR + ":" + TOR1_NODE_ID).getInterfaceInfo().getInterfaceName());
375 itmRpc.addL2GwInterface(DPN3_ID,
376 TOR1_NODE_ID, EXTN_INTFS.get(DPN3_ID_STR + ":" + TOR1_NODE_ID).getInterfaceInfo().getInterfaceName());
377 itmRpc.addL2GwInterface(DPN1_ID,
378 TOR2_NODE_ID, EXTN_INTFS.get(DPN1_ID_STR + ":" + TOR2_NODE_ID).getInterfaceInfo().getInterfaceName());
379 itmRpc.addL2GwInterface(DPN2_ID,
380 TOR2_NODE_ID, EXTN_INTFS.get(DPN2_ID_STR + ":" + TOR2_NODE_ID).getInterfaceInfo().getInterfaceName());
381 itmRpc.addL2GwInterface(DPN3_ID,
382 TOR2_NODE_ID, EXTN_INTFS.get(DPN3_ID_STR + ":" + TOR2_NODE_ID).getInterfaceInfo().getInterfaceName());
387 protected InstanceIdentifier<Flow> getFlowIid(short tableId, FlowId flowid, Uint64 dpnId) {
389 FlowKey flowKey = new FlowKey(new FlowId(flowid));
391 new NodeId("openflow:" + dpnId);
393 new NodeBuilder().setId(nodeId).withKey(new NodeKey(nodeId)).build();
394 return InstanceIdentifier.builder(Nodes.class)
396 nodeDpn.key()).augmentation(FlowCapableNode.class)
397 .child(Table.class, new TableKey(tableId)).child(Flow.class, flowKey).build();
401 protected void createElanInstance(String elan1, Uint32 elan1SegmentId) {
402 ElanInstance elanInstance = ExpectedObjects.createElanInstance(elan1, elan1SegmentId);
403 MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
404 ElanHelper.getElanInstanceConfigurationDataPath(elan1), elanInstance);
407 public void addElanInterface(String elanInstanceName, InterfaceInfo interfaceInfo, String prefix) {
408 ElanInstance existingElanInstance = elanInstanceCache.get(elanInstanceName).orElse(null);
409 String interfaceName = interfaceInfo.getInterfaceName();
411 if (existingElanInstance != null) {
412 ElanInterfaceBuilder elanInterfaceBuilder = new ElanInterfaceBuilder()
413 .setElanInstanceName(elanInstanceName)
414 .setName(interfaceName)
415 .withKey(new ElanInterfaceKey(interfaceName));
417 StaticMacEntriesBuilder staticMacEntriesBuilder = new StaticMacEntriesBuilder();
418 List<StaticMacEntries> staticMacEntries = new ArrayList<>();
419 List<PhysAddress> physAddressList = Collections.singletonList(
420 new PhysAddress(interfaceInfo.getMacAddress()));
421 for (PhysAddress physAddress : physAddressList) {
422 staticMacEntries.add(staticMacEntriesBuilder.setMacAddress(physAddress)
423 .setIpPrefix(new IpAddress(new Ipv4Address(prefix))).build());
425 elanInterfaceBuilder.setStaticMacEntries(staticMacEntries);
426 ElanInterface elanInterface = elanInterfaceBuilder.build();
428 MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
429 ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName), elanInterface);
433 public void deleteElanInterface(InterfaceInfo interfaceInfo) throws TransactionCommitFailedException {
434 String interfaceName = interfaceInfo.getInterfaceName();
435 singleTxdataBroker.syncDelete(LogicalDatastoreType.CONFIGURATION,
436 ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName));