2 * Copyright (c) 2016, 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.genius.interfacemanager.test;
10 import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
11 import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.OPERATIONAL;
13 import java.math.BigInteger;
14 import java.util.Arrays;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
17 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
18 import org.opendaylight.genius.datastoreutils.testutils.AsyncEventsWaiter;
19 import org.opendaylight.genius.datastoreutils.testutils.JobCoordinatorEventsWaiter;
20 import org.opendaylight.genius.interfacemanager.IfmConstants;
21 import org.opendaylight.genius.interfacemanager.IfmUtil;
22 import org.opendaylight.genius.interfacemanager.renderer.ovs.utilities.SouthboundUtils;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.Tunnel;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.flow.capable.port.State;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.flow.capable.port.StateBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlanBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfTunnel;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfTunnelBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefsBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelMonitoringTypeBfd;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
57 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
58 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
59 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
60 import org.slf4j.Logger;
61 import org.slf4j.LoggerFactory;
63 public class InterfaceManagerTestUtil {
64 private static final Logger LOG = LoggerFactory.getLogger(InterfaceManagerConfigurationTest.class);
65 public static final String PARENT_INTERFACE = "tap23701c04-7e";
66 public static final String INTERFACE_NAME = "23701c04-7e58-4c65-9425-78a80d49a218";
67 public static final String TUNNEL_INTERFACE_NAME = "tun414a856a7a4";
68 public static final String TRUNK_INTERFACE_NAME = "23701c04-7e58-4c65-9425-78a80d49a219";
70 public static final BigInteger DPN_ID_1 = BigInteger.valueOf(1);
71 public static final BigInteger DPN_ID_2 = BigInteger.valueOf(2);
72 public static final long PORT_NO_1 = 2;
74 public static final TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1"));
75 public static final NodeKey NODE_KEY = new NodeKey(new NodeId("openflow:1"));
77 static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface
78 buildStateInterface(String ifName, String dpnId, String portNo, String phyAddress,
79 Class<? extends InterfaceType> ifType) {
80 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
81 .ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder =
82 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
83 .ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder();
85 ifaceBuilder.setType(ifType);
87 ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(ifName));
88 ifaceBuilder.setOperStatus(
89 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
90 .ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Up);
91 ifaceBuilder.setLowerLayerIf(Arrays.asList("openflow:" + dpnId + ":" + portNo));
92 if (phyAddress != null) {
93 ifaceBuilder.setPhysAddress(
94 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress
95 .getDefaultInstance(phyAddress));
97 ifaceBuilder.setIfIndex(1);
98 return ifaceBuilder.build();
101 static Node buildInventoryDpnNode(BigInteger dpnId) {
102 NodeId nodeId = new NodeId("openflow:" + dpnId);
103 Node nodeDpn = new NodeBuilder().setId(nodeId).setKey(new NodeKey(nodeId)).build();
109 static org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector
110 buildFlowCapableNodeConnector(NodeConnectorId ncId, String portName, boolean isLive) {
111 NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder()
113 .setKey(new NodeConnectorKey(ncId));
114 ncBuilder.addAugmentation(FlowCapableNodeConnector.class,
115 buildFlowCapableNodeConnector(false, isLive,"AA:AA:AA:AA:AA:AA", portName));
116 return ncBuilder.build();
119 static FlowCapableNodeConnector buildFlowCapableNodeConnector(boolean isPortDown, boolean isLive,
120 String macAddress, String portName) {
121 PortConfig portConfig = new PortConfig(false, false, false, isPortDown);
122 State state = new StateBuilder().setBlocked(true).setLinkDown(false).setLive(isLive).build();
123 FlowCapableNodeConnectorBuilder fcNodeConnector = new FlowCapableNodeConnectorBuilder().setName(portName)
124 .setHardwareAddress(MacAddress.getDefaultInstance(macAddress)).setConfiguration(portConfig)
126 return fcNodeConnector.build();
129 static NodeConnectorId buildNodeConnectorId(BigInteger dpn, long portNo) {
130 return new NodeConnectorId(buildNodeConnectorString(dpn, portNo));
133 static String buildNodeConnectorString(BigInteger dpn, long portNo) {
134 return IfmConstants.OF_URI_PREFIX + dpn + IfmConstants.OF_URI_SEPARATOR + portNo;
137 static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector>
138 buildNodeConnectorInstanceIdentifier(BigInteger dpn, long portNo) {
139 NodeConnectorId nodeConnectorId = buildNodeConnectorId(dpn, portNo);
140 NodeId nodeId = IfmUtil.getNodeIdFromNodeConnectorId(nodeConnectorId);
141 InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector>
142 ncIdentifier = InstanceIdentifier.builder(Nodes.class).child(Node.class, new NodeKey(nodeId))
143 .child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector.class,
144 new NodeConnectorKey(nodeConnectorId)).build();
148 static Interface buildInterface(String ifName, String desc, boolean enabled, Object ifType,
149 String parentInterface, IfL2vlan.L2vlanMode l2vlanMode) {
150 InterfaceBuilder builder = new InterfaceBuilder().setKey(new InterfaceKey(ifName)).setName(ifName)
151 .setDescription(desc).setEnabled(enabled).setType((Class<? extends InterfaceType>) ifType);
152 ParentRefs parentRefs = new ParentRefsBuilder().setParentInterface(parentInterface).build();
153 builder.addAugmentation(ParentRefs.class, parentRefs);
154 if (ifType.equals(L2vlan.class)) {
155 IfL2vlanBuilder ifL2vlanBuilder = new IfL2vlanBuilder().setL2vlanMode(l2vlanMode);
156 if (IfL2vlan.L2vlanMode.TrunkMember.equals(l2vlanMode)) {
157 ifL2vlanBuilder.setVlanId(new VlanId(100));
159 ifL2vlanBuilder.setVlanId(VlanId.getDefaultInstance("0"));
161 builder.addAugmentation(IfL2vlan.class, ifL2vlanBuilder.build());
162 } else if (ifType.equals(IfTunnel.class)) {
163 IfTunnel tunnel = new IfTunnelBuilder().setTunnelDestination(null).setTunnelGateway(null)
164 .setTunnelSource(null).setTunnelInterfaceType(null).build();
165 builder.addAugmentation(IfTunnel.class, tunnel);
167 return builder.build();
170 static Interface buildTunnelInterface(BigInteger dpn, String ifName, String desc, boolean enabled,
171 Class<? extends TunnelTypeBase> tunType, String remoteIpStr,
173 InterfaceBuilder builder = new InterfaceBuilder().setKey(new InterfaceKey(ifName)).setName(ifName)
174 .setDescription(desc).setEnabled(enabled).setType(Tunnel.class);
175 ParentRefs parentRefs = new ParentRefsBuilder().setDatapathNodeIdentifier(dpn).build();
176 builder.addAugmentation(ParentRefs.class, parentRefs);
177 IpAddress remoteIp = new IpAddress(Ipv4Address.getDefaultInstance(remoteIpStr));
178 IpAddress localIp = new IpAddress(Ipv4Address.getDefaultInstance(localIpStr));
179 IfTunnel tunnel = new IfTunnelBuilder().setTunnelDestination(remoteIp).setTunnelGateway(localIp)
180 .setTunnelSource(localIp).setTunnelInterfaceType(tunType).setInternal(true).setMonitorEnabled(false)
182 builder.addAugmentation(IfTunnel.class, tunnel);
183 return builder.build();
186 static InstanceIdentifier<TerminationPoint> getTerminationPointId(InstanceIdentifier<?> bridgeIid,
188 InstanceIdentifier<TerminationPoint> tpIid = SouthboundUtils.createTerminationPointInstanceIdentifier(
189 InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(
190 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns
191 .yang.network.topology.rev131021.network.topology.topology.Node.class)), portName);
195 static void deleteInterfaceConfig(DataBroker dataBroker, String ifaceName) throws TransactionCommitFailedException {
196 InstanceIdentifier<Interface> vlanInterfaceEnabledInterfaceInstanceIdentifier = IfmUtil.buildId(
198 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
199 tx.delete(CONFIGURATION, vlanInterfaceEnabledInterfaceInstanceIdentifier);
200 tx.submit().checkedGet();
203 static void updateInterfaceAdminState(DataBroker dataBroker, String ifaceName, boolean isEnabled)
204 throws TransactionCommitFailedException {
205 InstanceIdentifier<Interface> vlanInterfaceEnabledInterfaceInstanceIdentifier = IfmUtil.buildId(ifaceName);
206 InterfaceBuilder builder = new InterfaceBuilder().setKey(new InterfaceKey(ifaceName)).setName(ifaceName)
207 .setEnabled(isEnabled);
208 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
209 tx.merge(CONFIGURATION, vlanInterfaceEnabledInterfaceInstanceIdentifier, builder.build());
210 tx.submit().checkedGet();
213 static void updateTunnelMonitoringAttributes(DataBroker dataBroker, String ifaceName)
214 throws TransactionCommitFailedException {
215 InstanceIdentifier<Interface> tunnelInstanceIdentifier = IfmUtil.buildId(ifaceName);
216 InterfaceBuilder builder = new InterfaceBuilder().setKey(new InterfaceKey(ifaceName)).setName(ifaceName);
217 IfTunnel tunnel = new IfTunnelBuilder().setMonitorProtocol(TunnelMonitoringTypeBfd.class)
218 .setMonitorEnabled(true).build();
219 builder.addAugmentation(IfTunnel.class, tunnel);
220 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
221 tx.merge(CONFIGURATION, tunnelInstanceIdentifier, builder.build());
222 tx.submit().checkedGet();
226 static void putInterfaceConfig(DataBroker dataBroker, String ifaceName, ParentRefs parentRefs,
227 Class<? extends InterfaceType> ifType)
228 throws TransactionCommitFailedException {
229 Interface interfaceInfo;
230 if (!Tunnel.class.equals(ifType)) {
231 interfaceInfo = InterfaceManagerTestUtil.buildInterface(ifaceName, ifaceName, true, ifType,
232 parentRefs.getParentInterface(), IfL2vlan.L2vlanMode.Trunk);
234 interfaceInfo = buildTunnelInterface(parentRefs.getDatapathNodeIdentifier(),ifaceName, ifaceName,
235 true, TunnelTypeVxlan.class, "1.1.1.1", "2.2.2.2");
237 InstanceIdentifier<Interface> interfaceInstanceIdentifier = IfmUtil.buildId(ifaceName);
238 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
239 tx.put(CONFIGURATION, interfaceInstanceIdentifier, interfaceInfo, true);
240 tx.submit().checkedGet();
243 static void putVlanInterfaceConfig(DataBroker dataBroker, String ifaceName, String parentRefs,
244 IfL2vlan.L2vlanMode l2vlanMode) throws TransactionCommitFailedException {
245 Interface interfaceInfo = InterfaceManagerTestUtil.buildInterface(ifaceName, ifaceName,
246 true, L2vlan.class, parentRefs, l2vlanMode);
247 InstanceIdentifier<Interface> interfaceInstanceIdentifier = IfmUtil.buildId(ifaceName);
248 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
249 tx.put(CONFIGURATION, interfaceInstanceIdentifier, interfaceInfo, true);
250 tx.submit().checkedGet();
253 static void createFlowCapableNodeConnector(DataBroker dataBroker, String interfaceName,
254 Class<? extends InterfaceType> ifType)
255 throws TransactionCommitFailedException {
256 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
257 BigInteger dpnId = Tunnel.class.equals(ifType) ? DPN_ID_2 : DPN_ID_1;
258 long portNo = Tunnel.class.equals(ifType) ? PORT_NO_1 : PORT_NO_1;
259 NodeConnector nodeConnector = InterfaceManagerTestUtil
260 .buildFlowCapableNodeConnector(buildNodeConnectorId(dpnId, portNo), interfaceName, true);
261 tx.put(OPERATIONAL,buildNodeConnectorInstanceIdentifier(dpnId, portNo), nodeConnector, true);
262 tx.submit().checkedGet();
265 static void updateFlowCapableNodeConnectorState(DataBroker dataBroker, String interfaceName,
266 Class<? extends InterfaceType> ifType, boolean isLive)
267 throws TransactionCommitFailedException {
268 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
269 BigInteger dpnId = Tunnel.class.equals(ifType) ? DPN_ID_2 : DPN_ID_1;
270 long portNo = Tunnel.class.equals(ifType) ? PORT_NO_1 : PORT_NO_1;
271 NodeConnector nodeConnector = InterfaceManagerTestUtil
272 .buildFlowCapableNodeConnector(buildNodeConnectorId(dpnId, portNo), interfaceName, isLive);
273 tx.merge(OPERATIONAL,buildNodeConnectorInstanceIdentifier(dpnId, portNo), nodeConnector, true);
274 tx.submit().checkedGet();
277 static void removeFlowCapableNodeConnectorState(DataBroker dataBroker, Class<? extends InterfaceType> ifType)
278 throws TransactionCommitFailedException {
279 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
280 BigInteger dpnId = Tunnel.class.equals(ifType) ? DPN_ID_2 : DPN_ID_1;
281 long portNo = Tunnel.class.equals(ifType) ? PORT_NO_1 : PORT_NO_1;
282 tx.delete(OPERATIONAL,buildNodeConnectorInstanceIdentifier(dpnId, portNo));
283 tx.submit().checkedGet();
287 static void removeNode(DataBroker dataBroker)
288 throws TransactionCommitFailedException {
289 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
290 InstanceIdentifier<Node> nodeInstanceIdentifier = InstanceIdentifier.builder(Nodes.class)
291 .child(Node.class, new NodeKey(IfmUtil.buildDpnNodeId(DPN_ID_2))).build();
292 tx.delete(OPERATIONAL,nodeInstanceIdentifier);
293 tx.submit().checkedGet();
296 static void waitTillOperationCompletes(JobCoordinatorEventsWaiter coordinatorEventsWaiter,
297 AsyncEventsWaiter asyncEventsWaiter) {
298 coordinatorEventsWaiter.awaitEventsConsumption();
299 asyncEventsWaiter.awaitEventsConsumption();