Enhancing junits of interface-manager phase5
[genius.git] / interfacemanager / interfacemanager-impl / src / test / java / org / opendaylight / genius / interfacemanager / test / InterfaceManagerTestUtil.java
1 /*
2  * Copyright (c) 2016, 2017 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.genius.interfacemanager.test;
9
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;
12
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;
62
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";
69
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;
73
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"));
76
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();
84         if (ifType != null) {
85             ifaceBuilder.setType(ifType);
86         }
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));
96         }
97         ifaceBuilder.setIfIndex(1);
98         return ifaceBuilder.build();
99     }
100
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();
104
105         return nodeDpn;
106     }
107
108
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()
112                 .setId(ncId)
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();
117     }
118
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)
125                 .setState(state);
126         return fcNodeConnector.build();
127     }
128
129     static NodeConnectorId buildNodeConnectorId(BigInteger dpn, long portNo) {
130         return new NodeConnectorId(buildNodeConnectorString(dpn, portNo));
131     }
132
133     static String buildNodeConnectorString(BigInteger dpn, long portNo) {
134         return IfmConstants.OF_URI_PREFIX + dpn + IfmConstants.OF_URI_SEPARATOR + portNo;
135     }
136
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();
145         return ncIdentifier;
146     }
147
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));
158             } else {
159                 ifL2vlanBuilder.setVlanId(VlanId.getDefaultInstance("0"));
160             }
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);
166         }
167         return builder.build();
168     }
169
170     static Interface buildTunnelInterface(BigInteger dpn, String ifName, String desc, boolean enabled,
171                                           Class<? extends TunnelTypeBase> tunType, String remoteIpStr,
172                                           String localIpStr) {
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)
181                 .build();
182         builder.addAugmentation(IfTunnel.class, tunnel);
183         return builder.build();
184     }
185
186     static InstanceIdentifier<TerminationPoint> getTerminationPointId(InstanceIdentifier<?> bridgeIid,
187                                                                       String portName) {
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);
192         return tpIid;
193     }
194
195     static void deleteInterfaceConfig(DataBroker dataBroker, String ifaceName) throws TransactionCommitFailedException {
196         InstanceIdentifier<Interface> vlanInterfaceEnabledInterfaceInstanceIdentifier = IfmUtil.buildId(
197                 ifaceName);
198         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
199         tx.delete(CONFIGURATION, vlanInterfaceEnabledInterfaceInstanceIdentifier);
200         tx.submit().checkedGet();
201     }
202
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();
211     }
212
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();
223     }
224
225
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);
233         } else {
234             interfaceInfo = buildTunnelInterface(parentRefs.getDatapathNodeIdentifier(),ifaceName, ifaceName,
235                     true, TunnelTypeVxlan.class, "1.1.1.1", "2.2.2.2");
236         }
237         InstanceIdentifier<Interface> interfaceInstanceIdentifier = IfmUtil.buildId(ifaceName);
238         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
239         tx.put(CONFIGURATION, interfaceInstanceIdentifier, interfaceInfo, true);
240         tx.submit().checkedGet();
241     }
242
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();
251     }
252
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();
263     }
264
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();
275     }
276
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();
284     }
285
286
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();
294     }
295
296     static void waitTillOperationCompletes(JobCoordinatorEventsWaiter coordinatorEventsWaiter,
297                                            AsyncEventsWaiter asyncEventsWaiter) {
298         coordinatorEventsWaiter.awaitEventsConsumption();
299         asyncEventsWaiter.awaitEventsConsumption();
300     }
301 }