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.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
11 import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.OPERATIONAL;
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;
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";
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;
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"));
101 private InterfaceManagerTestUtil() {
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);
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));
125 ifaceBuilder.setIfIndex(1);
126 return ifaceBuilder.build();
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();
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()
141 .withKey(new NodeConnectorKey(ncId));
142 ncBuilder.addAugmentation(buildFlowCapableNodeConnector(false, isLive,"AA:AA:AA:AA:AA:AA", portName));
143 return ncBuilder.build();
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)
153 return fcNodeConnector.build();
156 static NodeConnectorId buildNodeConnectorId(Uint64 dpn, long portNo) {
157 return new NodeConnectorId(buildNodeConnectorString(dpn, portNo));
160 static String buildNodeConnectorString(Uint64 dpn, long portNo) {
161 return IfmConstants.OF_URI_PREFIX + dpn + IfmConstants.OF_URI_SEPARATOR + portNo;
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();
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)) {
182 if (IfL2vlan.L2vlanMode.TrunkMember.equals(l2vlanMode)) {
183 vlanId = Uint16.valueOf(100);
185 vlanId = Uint16.ZERO;
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());
194 return builder.build();
197 static Interface buildTunnelInterface(Uint64 dpn, String ifName, String desc, boolean enabled,
198 Class<? extends TunnelTypeBase> tunType, String remoteIpStr,
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)
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)
214 .setMonitorEnabled(false)
219 static InstanceIdentifier<TerminationPoint> getTerminationPointId(InstanceIdentifier<?> bridgeIid,
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);
228 static void deleteInterfaceConfig(DataBroker dataBroker, String ifaceName)
229 throws ExecutionException, InterruptedException {
230 InstanceIdentifier<Interface> vlanInterfaceEnabledInterfaceInstanceIdentifier = IfmUtil.buildId(
232 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
233 tx.delete(CONFIGURATION, vlanInterfaceEnabledInterfaceInstanceIdentifier);
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());
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))
254 .addAugmentation(new IfTunnelBuilder()
255 .setMonitorProtocol(TunnelMonitoringTypeBfd.class)
256 .setMonitorEnabled(true)
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);
270 interfaceInfo = buildTunnelInterface(parentRefs.getDatapathNodeIdentifier(), ifaceName, ifaceName,
271 true, TunnelTypeVxlan.class, "1.1.1.1", "2.2.2.2");
273 InstanceIdentifier<Interface> interfaceInstanceIdentifier = IfmUtil.buildId(ifaceName);
274 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
275 tx.mergeParentStructurePut(CONFIGURATION, interfaceInstanceIdentifier, interfaceInfo);
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);
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);
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);
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));
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);
331 static void waitTillOperationCompletes(JobCoordinatorCountedEventsWaiter coordinatorEventsWaiter,
332 AsyncEventsWaiter asyncEventsWaiter) {
333 coordinatorEventsWaiter.awaitJobsConsumption(0);
334 asyncEventsWaiter.awaitEventsConsumption();
337 static void waitTillOperationCompletes(String testDescription,
338 JobCoordinatorCountedEventsWaiter coordinatorEventsWaiter,
339 int expectedJobCount,
340 AsyncEventsWaiter asyncEventsWaiter) {
342 coordinatorEventsWaiter.awaitJobsConsumption(expectedJobCount);
343 asyncEventsWaiter.awaitEventsConsumption();
344 } catch (ConditionTimeoutException e) {
345 LOG.error("{} failed on awaiting events consumption", testDescription);
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));
356 List<Action> actions = new ArrayList<>();
357 instructions.add(MDSALUtil.buildApplyActionsInstruction(actions, ++instructionKey));
358 instructions.add(MDSALUtil.buildAndGetGotoTableInstruction(NwConstants.ELAN_BASE_TABLE,
361 BoundServices serviceInfo = InterfaceManagerTestUtil.getBoundServices(serviceName, serviceIndex,
362 serviceIndex, NwConstants.COOKIE_ELAN_INGRESS_TABLE, instructions);
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();
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();