MRI version bump for Aluminium
[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.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
11 import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.OPERATIONAL;
12
13 import java.math.BigInteger;
14 import java.util.ArrayList;
15 import java.util.Arrays;
16 import java.util.List;
17 import java.util.concurrent.ExecutionException;
18 import org.awaitility.core.ConditionTimeoutException;
19 import org.opendaylight.genius.datastoreutils.testutils.AsyncEventsWaiter;
20 import org.opendaylight.genius.datastoreutils.testutils.JobCoordinatorCountedEventsWaiter;
21 import org.opendaylight.genius.interfacemanager.IfmConstants;
22 import org.opendaylight.genius.interfacemanager.IfmUtil;
23 import org.opendaylight.genius.interfacemanager.renderer.ovs.utilities.SouthboundUtils;
24 import org.opendaylight.genius.mdsalutil.MDSALUtil;
25 import org.opendaylight.genius.mdsalutil.MetaDataUtil;
26 import org.opendaylight.genius.mdsalutil.NwConstants;
27 import org.opendaylight.mdsal.binding.api.DataBroker;
28 import org.opendaylight.mdsal.binding.api.WriteTransaction;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.Tunnel;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.flow.capable.port.State;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.flow.capable.port.StateBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlanBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfTunnel;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfTunnelBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefsBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelMonitoringTypeBfd;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceBindings;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceModeIngress;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceTypeFlowBased;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.StypeOpenflow;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.StypeOpenflowBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.ServicesInfo;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.ServicesInfoKey;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServices;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServicesBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServicesKey;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
75 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
76 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
77 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
78 import org.opendaylight.yangtools.yang.common.Uint64;
79 import org.slf4j.Logger;
80 import org.slf4j.LoggerFactory;
81
82 public final class InterfaceManagerTestUtil {
83     private static final Logger LOG = LoggerFactory.getLogger(InterfaceManagerConfigurationTest.class);
84     public static final String PARENT_INTERFACE = "tap23701c04-7e";
85     public static final String DEVICE_PORT = "eth0";
86     public static final String PARENT_INTERFACE_1 = "tap23701c04-7f";
87     public static final String PARENT_INTERFACE_2 = "tap23702c04-7f";
88     public static final String INTERFACE_NAME = "23701c04-7e58-4c65-9425-78a80d49a218";
89     public static final String INTERFACE_NAME_1 = "23701c04-7e58-4c65-9425-78a80d49a220";
90     public static final String INTERFACE_NAME_2 = "23701c04-7e58-4c65-9425-78a80d49a221";
91     public static final String TUNNEL_INTERFACE_NAME = "tun414a856a7a4";
92     public static final String TRUNK_INTERFACE_NAME = "23701c04-7e58-4c65-9425-78a80d49a219";
93
94     public static final Uint64 DPN_ID_1 = Uint64.ONE;
95     public static final Uint64 DPN_ID_2 = Uint64.valueOf(2);
96     public static final long PORT_NO_1 = 2;
97
98     public static final TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1"));
99     public static final NodeKey NODE_KEY = new NodeKey(new NodeId("openflow:1"));
100
101     private InterfaceManagerTestUtil() {
102
103     }
104
105     static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface
106         buildStateInterface(String ifName, String dpnId, String portNo, String phyAddress,
107                             Class<? extends InterfaceType> ifType) {
108         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
109                 .ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder =
110                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
111                         .ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder();
112         if (ifType != null) {
113             ifaceBuilder.setType(ifType);
114         }
115         ifaceBuilder.withKey(IfmUtil.getStateInterfaceKeyFromName(ifName));
116         ifaceBuilder.setOperStatus(
117                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
118                         .ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Up);
119         ifaceBuilder.setLowerLayerIf(Arrays.asList("openflow:" + dpnId + ":" + portNo));
120         if (phyAddress != null) {
121             ifaceBuilder.setPhysAddress(
122                     org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress
123                             .getDefaultInstance(phyAddress));
124         }
125         ifaceBuilder.setIfIndex(1);
126         return ifaceBuilder.build();
127     }
128
129     static Node buildInventoryDpnNode(Uint64 dpnId) {
130         NodeId nodeId = new NodeId("openflow:" + dpnId);
131         Node nodeDpn = new NodeBuilder().setId(nodeId).withKey(new NodeKey(nodeId)).build();
132
133         return nodeDpn;
134     }
135
136
137     static org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector
138         buildFlowCapableNodeConnector(NodeConnectorId ncId, String portName, boolean isLive) {
139         NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder()
140                 .setId(ncId)
141                 .withKey(new NodeConnectorKey(ncId));
142         ncBuilder.addAugmentation(FlowCapableNodeConnector.class,
143                 buildFlowCapableNodeConnector(false, isLive,"AA:AA:AA:AA:AA:AA", portName));
144         return ncBuilder.build();
145     }
146
147     static FlowCapableNodeConnector buildFlowCapableNodeConnector(boolean isPortDown, boolean isLive,
148                                                                   String macAddress, String portName) {
149         PortConfig portConfig = new PortConfig(false, false, false, isPortDown);
150         State state = new StateBuilder().setBlocked(true).setLinkDown(false).setLive(isLive).build();
151         FlowCapableNodeConnectorBuilder fcNodeConnector = new FlowCapableNodeConnectorBuilder().setName(portName)
152                 .setHardwareAddress(MacAddress.getDefaultInstance(macAddress)).setConfiguration(portConfig)
153                 .setState(state);
154         return fcNodeConnector.build();
155     }
156
157     static NodeConnectorId buildNodeConnectorId(Uint64 dpn, long portNo) {
158         return new NodeConnectorId(buildNodeConnectorString(dpn, portNo));
159     }
160
161     static String buildNodeConnectorString(Uint64 dpn, long portNo) {
162         return IfmConstants.OF_URI_PREFIX + dpn + IfmConstants.OF_URI_SEPARATOR + portNo;
163     }
164
165     static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector>
166         buildNodeConnectorInstanceIdentifier(Uint64 dpn, long portNo) {
167         NodeConnectorId nodeConnectorId = buildNodeConnectorId(dpn, portNo);
168         NodeId nodeId = IfmUtil.getNodeIdFromNodeConnectorId(nodeConnectorId);
169         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector>
170                 ncIdentifier = InstanceIdentifier.builder(Nodes.class).child(Node.class, new NodeKey(nodeId))
171                 .child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector.class,
172                         new NodeConnectorKey(nodeConnectorId)).build();
173         return ncIdentifier;
174     }
175
176     static Interface buildInterface(String ifName, String desc, boolean enabled, Object ifType,
177                                            String parentInterface, IfL2vlan.L2vlanMode l2vlanMode) {
178         InterfaceBuilder builder = new InterfaceBuilder().withKey(new InterfaceKey(ifName)).setName(ifName)
179                 .setDescription(desc).setEnabled(enabled).setType((Class<? extends InterfaceType>) ifType);
180         ParentRefs parentRefs = new ParentRefsBuilder().setParentInterface(parentInterface).build();
181         builder.addAugmentation(ParentRefs.class, parentRefs);
182         if (ifType.equals(L2vlan.class)) {
183             IfL2vlanBuilder ifL2vlanBuilder = new IfL2vlanBuilder().setL2vlanMode(l2vlanMode);
184             if (IfL2vlan.L2vlanMode.TrunkMember.equals(l2vlanMode)) {
185                 ifL2vlanBuilder.setVlanId(new VlanId(100));
186             } else {
187                 ifL2vlanBuilder.setVlanId(VlanId.getDefaultInstance("0"));
188             }
189             builder.addAugmentation(IfL2vlan.class, ifL2vlanBuilder.build());
190         } else if (ifType.equals(IfTunnel.class)) {
191             IfTunnel tunnel = new IfTunnelBuilder().setTunnelDestination(null).setTunnelGateway(null)
192                     .setTunnelSource(null).setTunnelInterfaceType(null).build();
193             builder.addAugmentation(IfTunnel.class, tunnel);
194         }
195         return builder.build();
196     }
197
198     static Interface buildTunnelInterface(BigInteger dpn, String ifName, String desc, boolean enabled,
199                                           Class<? extends TunnelTypeBase> tunType, String remoteIpStr,
200                                           String localIpStr) {
201         InterfaceBuilder builder = new InterfaceBuilder().withKey(new InterfaceKey(ifName)).setName(ifName)
202                 .setDescription(desc).setEnabled(enabled).setType(Tunnel.class);
203         ParentRefs parentRefs = new ParentRefsBuilder().setDatapathNodeIdentifier(dpn).build();
204         builder.addAugmentation(ParentRefs.class, parentRefs);
205         IpAddress remoteIp = new IpAddress(Ipv4Address.getDefaultInstance(remoteIpStr));
206         IpAddress localIp = new IpAddress(Ipv4Address.getDefaultInstance(localIpStr));
207         IfTunnel tunnel = new IfTunnelBuilder().setTunnelDestination(remoteIp).setTunnelGateway(localIp)
208                 .setTunnelSource(localIp).setTunnelInterfaceType(tunType).setInternal(true).setMonitorEnabled(false)
209                 .build();
210         builder.addAugmentation(IfTunnel.class, tunnel);
211         return builder.build();
212     }
213
214     static InstanceIdentifier<TerminationPoint> getTerminationPointId(InstanceIdentifier<?> bridgeIid,
215                                                                       String portName) {
216         InstanceIdentifier<TerminationPoint> tpIid = SouthboundUtils.createTerminationPointInstanceIdentifier(
217                 InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(
218                         org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns
219                         .yang.network.topology.rev131021.network.topology.topology.Node.class)), portName);
220         return tpIid;
221     }
222
223     static void deleteInterfaceConfig(DataBroker dataBroker, String ifaceName)
224             throws ExecutionException, InterruptedException {
225         InstanceIdentifier<Interface> vlanInterfaceEnabledInterfaceInstanceIdentifier = IfmUtil.buildId(
226                 ifaceName);
227         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
228         tx.delete(CONFIGURATION, vlanInterfaceEnabledInterfaceInstanceIdentifier);
229         tx.commit().get();
230     }
231
232     static void updateInterfaceAdminState(DataBroker dataBroker, String ifaceName, boolean isEnabled)
233             throws ExecutionException, InterruptedException {
234         InstanceIdentifier<Interface> vlanInterfaceEnabledInterfaceInstanceIdentifier = IfmUtil.buildId(ifaceName);
235         InterfaceBuilder builder = new InterfaceBuilder().withKey(new InterfaceKey(ifaceName)).setName(ifaceName)
236             .setEnabled(isEnabled);
237         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
238         tx.merge(CONFIGURATION, vlanInterfaceEnabledInterfaceInstanceIdentifier, builder.build());
239         tx.commit().get();
240     }
241
242     static void updateTunnelMonitoringAttributes(DataBroker dataBroker, String ifaceName)
243             throws ExecutionException, InterruptedException {
244         InstanceIdentifier<Interface> tunnelInstanceIdentifier = IfmUtil.buildId(ifaceName);
245         InterfaceBuilder builder = new InterfaceBuilder().withKey(new InterfaceKey(ifaceName)).setName(ifaceName);
246         IfTunnel tunnel = new IfTunnelBuilder().setMonitorProtocol(TunnelMonitoringTypeBfd.class)
247             .setMonitorEnabled(true).build();
248         builder.addAugmentation(IfTunnel.class, tunnel);
249         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
250         tx.merge(CONFIGURATION, tunnelInstanceIdentifier, builder.build());
251         tx.commit().get();
252     }
253
254
255     static void putInterfaceConfig(DataBroker dataBroker, String ifaceName, ParentRefs parentRefs,
256                                           Class<? extends InterfaceType> ifType)
257             throws ExecutionException, InterruptedException {
258         Interface interfaceInfo;
259         if (!Tunnel.class.equals(ifType)) {
260             interfaceInfo = InterfaceManagerTestUtil.buildInterface(ifaceName, ifaceName, true, ifType,
261                     parentRefs.getParentInterface(), IfL2vlan.L2vlanMode.Trunk);
262         } else {
263             interfaceInfo = buildTunnelInterface(parentRefs.getDatapathNodeIdentifier().toJava(),ifaceName, ifaceName,
264                     true, TunnelTypeVxlan.class, "1.1.1.1", "2.2.2.2");
265         }
266         InstanceIdentifier<Interface> interfaceInstanceIdentifier = IfmUtil.buildId(ifaceName);
267         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
268         tx.mergeParentStructurePut(CONFIGURATION, interfaceInstanceIdentifier, interfaceInfo);
269         tx.commit().get();
270     }
271
272     static void putVlanInterfaceConfig(DataBroker dataBroker, String ifaceName, String parentRefs,
273                                               IfL2vlan.L2vlanMode l2vlanMode)
274             throws ExecutionException, InterruptedException {
275         Interface interfaceInfo = InterfaceManagerTestUtil.buildInterface(ifaceName, ifaceName,
276                 true, L2vlan.class, parentRefs, l2vlanMode);
277         InstanceIdentifier<Interface> interfaceInstanceIdentifier = IfmUtil.buildId(ifaceName);
278         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
279         tx.mergeParentStructurePut(CONFIGURATION, interfaceInstanceIdentifier, interfaceInfo);
280         tx.commit().get();
281     }
282
283     static void createFlowCapableNodeConnector(DataBroker dataBroker, String interfaceName,
284                                                Class<? extends InterfaceType> ifType)
285             throws ExecutionException, InterruptedException {
286         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
287         Uint64 dpnId = Tunnel.class.equals(ifType) ? DPN_ID_2 : DPN_ID_1;
288         long portNo = Tunnel.class.equals(ifType) ? PORT_NO_1 : PORT_NO_1;
289         NodeConnector nodeConnector = InterfaceManagerTestUtil
290                 .buildFlowCapableNodeConnector(buildNodeConnectorId(dpnId, portNo), interfaceName, true);
291         tx.mergeParentStructurePut(OPERATIONAL,buildNodeConnectorInstanceIdentifier(dpnId, portNo), nodeConnector);
292         tx.commit().get();
293     }
294
295     static void updateFlowCapableNodeConnectorState(DataBroker dataBroker, String interfaceName,
296             Class<? extends InterfaceType> ifType, boolean isLive) throws ExecutionException, InterruptedException {
297         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
298         Uint64 dpnId = Tunnel.class.equals(ifType) ? DPN_ID_2 : DPN_ID_1;
299         long portNo = Tunnel.class.equals(ifType) ? PORT_NO_1 : PORT_NO_1;
300         NodeConnector nodeConnector = InterfaceManagerTestUtil
301             .buildFlowCapableNodeConnector(buildNodeConnectorId(dpnId, portNo), interfaceName, isLive);
302         tx.mergeParentStructureMerge(OPERATIONAL,buildNodeConnectorInstanceIdentifier(dpnId, portNo), nodeConnector);
303         tx.commit().get();
304     }
305
306     static void removeFlowCapableNodeConnectorState(DataBroker dataBroker, Class<? extends InterfaceType> ifType)
307             throws ExecutionException, InterruptedException {
308         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
309         Uint64 dpnId = Tunnel.class.equals(ifType) ? DPN_ID_2 : DPN_ID_1;
310         long portNo = Tunnel.class.equals(ifType) ? PORT_NO_1 : PORT_NO_1;
311         tx.delete(OPERATIONAL,buildNodeConnectorInstanceIdentifier(dpnId, portNo));
312         tx.commit().get();
313     }
314
315
316     static void removeNode(DataBroker dataBroker) throws ExecutionException, InterruptedException {
317         WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
318         InstanceIdentifier<Node> nodeInstanceIdentifier = InstanceIdentifier.builder(Nodes.class)
319             .child(Node.class, new NodeKey(IfmUtil.buildDpnNodeId(DPN_ID_2))).build();
320         tx.delete(OPERATIONAL,nodeInstanceIdentifier);
321         tx.commit().get();
322     }
323
324     static void waitTillOperationCompletes(JobCoordinatorCountedEventsWaiter coordinatorEventsWaiter,
325                                            AsyncEventsWaiter asyncEventsWaiter) {
326         coordinatorEventsWaiter.awaitJobsConsumption(0);
327         asyncEventsWaiter.awaitEventsConsumption();
328     }
329
330     static void waitTillOperationCompletes(String testDescription,
331                                            JobCoordinatorCountedEventsWaiter coordinatorEventsWaiter,
332                                            int expectedJobCount,
333                                            AsyncEventsWaiter asyncEventsWaiter) {
334         try {
335             coordinatorEventsWaiter.awaitJobsConsumption(expectedJobCount);
336             asyncEventsWaiter.awaitEventsConsumption();
337         } catch (ConditionTimeoutException e) {
338             LOG.error("{} failed on awaiting events consumption", testDescription);
339             throw e;
340         }
341     }
342
343     static BoundServices buildServicesInfo(String serviceName, short serviceIndex) {
344         int instructionKey = 0;
345         List<Instruction> instructions = new ArrayList<>();
346         instructions.add(MDSALUtil.buildAndGetWriteMetadaInstruction(MetaDataUtil.getElanTagMetadata(1),
347             MetaDataUtil.METADATA_MASK_SERVICE, ++instructionKey));
348
349         List<Action> actions = new ArrayList<>();
350         instructions.add(MDSALUtil.buildApplyActionsInstruction(actions, ++instructionKey));
351         instructions.add(MDSALUtil.buildAndGetGotoTableInstruction(NwConstants.ELAN_BASE_TABLE,
352             ++instructionKey));
353
354         BoundServices serviceInfo = InterfaceManagerTestUtil.getBoundServices(serviceName, serviceIndex,
355             serviceIndex, NwConstants.COOKIE_ELAN_INGRESS_TABLE, instructions);
356         return serviceInfo;
357     }
358
359     static BoundServices getBoundServices(String serviceName, short servicePriority, int flowPriority,
360                                           Uint64 cookie, List<Instruction> instructions) {
361         StypeOpenflowBuilder augBuilder = new StypeOpenflowBuilder().setFlowCookie(cookie).setFlowPriority(flowPriority)
362             .setInstruction(instructions);
363         return new BoundServicesBuilder().withKey(new BoundServicesKey(servicePriority)).setServiceName(serviceName)
364             .setServicePriority(servicePriority).setServiceType(ServiceTypeFlowBased.class)
365             .addAugmentation(StypeOpenflow.class, augBuilder.build()).build();
366     }
367
368     static InstanceIdentifier<BoundServices> buildServiceId(String vpnInterfaceName, short serviceIndex) {
369         return InstanceIdentifier.builder(ServiceBindings.class)
370             .child(ServicesInfo.class, new ServicesInfoKey(vpnInterfaceName, ServiceModeIngress.class))
371             .child(BoundServices.class, new BoundServicesKey(serviceIndex)).build();
372     }
373 }