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