2 * Copyright (c) 2016 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
9 package org.opendaylight.genius.mdsalutil;
11 import com.google.common.base.Optional;
12 import com.google.common.net.InetAddresses;
13 import java.math.BigInteger;
14 import java.util.ArrayList;
15 import java.util.HashMap;
16 import java.util.List;
18 import org.opendaylight.controller.liblldp.HexEncode;
19 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
20 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
21 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
22 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
23 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
24 import org.opendaylight.genius.mdsalutil.actions.ActionDrop;
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.yang.types.rev130715.MacAddress;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCase;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActions;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.actions._case.WriteActions;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.actions._case.WriteActionsBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadataBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg6;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxOfInPortCaseBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoad;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.Dst;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
90 import org.opendaylight.yangtools.yang.binding.DataObject;
91 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
92 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
93 import org.slf4j.Logger;
94 import org.slf4j.LoggerFactory;
96 @SuppressWarnings("checkstyle:AbbreviationAsWordInName")
97 public class MDSALUtil {
99 private static final Logger LOG = LoggerFactory.getLogger(MDSALUtil.class);
101 public enum MdsalOp { CREATION_OP, UPDATE_OP, REMOVAL_OP }
103 public static final String NODE_PREFIX = "openflow";
104 public static final int GROUP_WEIGHT = 0;
105 public static final long WATCH_PORT = 0xffffffffL;
106 public static final long WATCH_GROUP = 0xffffffffL;
107 public static final String SEPARATOR = ":";
108 private static final Buckets EMPTY_BUCKETS = new BucketsBuilder().build();
109 private static final Instructions EMPTY_INSTRUCTIONS = new InstructionsBuilder().setInstruction(
110 new ArrayList<>()).build();
111 private static final Match EMPTY_MATCHES = new MatchBuilder().build();
113 public static FlowEntity buildFlowEntity(BigInteger dpnId, short tableId, String flowId, int priority,
114 String flowName, int idleTimeOut, int hardTimeOut, BigInteger cookie,
115 List<? extends MatchInfoBase> listMatchInfoBase, List<InstructionInfo> listInstructionInfo) {
117 FlowEntityBuilder builder = new FlowEntityBuilder()
121 .setPriority(priority)
122 .setFlowName(flowName)
123 .setIdleTimeOut(idleTimeOut)
124 .setHardTimeOut(hardTimeOut)
126 if (listMatchInfoBase != null) {
127 builder.addAllMatchInfoList(listMatchInfoBase);
129 if (listInstructionInfo != null) {
130 builder.addAllInstructionInfoList(listInstructionInfo);
132 return builder.build();
135 // TODO: CHECK IF THIS IS USED
136 public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
137 int hardTimeOut, BigInteger cookie, List<? extends MatchInfoBase> listMatchInfoBase,
138 List<InstructionInfo> listInstructionInfo) {
139 return MDSALUtil.buildFlow(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie,
140 listMatchInfoBase, listInstructionInfo, true);
143 public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
144 int hardTimeOut, BigInteger cookie, List<? extends MatchInfoBase> listMatchInfoBase,
145 List<InstructionInfo> listInstructionInfo, boolean isStrict) {
146 FlowKey key = new FlowKey(new FlowId(flowId));
147 return new FlowBuilder().setMatch(buildMatches(listMatchInfoBase)).setKey(key)
148 .setPriority(priority).setInstructions(buildInstructions(listInstructionInfo))
149 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
150 .setFlowName(flowName).setTableId(tableId).setStrict(isStrict)
151 .setCookie(new FlowCookie(cookie)).build();
154 public static Flow buildFlow(short tableId, String flowId) {
155 return new FlowBuilder().setTableId(tableId).setId(new FlowId(flowId)).build();
158 public static Flow buildFlowNew(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
159 int hardTimeOut, BigInteger cookie, List<? extends MatchInfoBase> listMatchInfoBase,
160 List<Instruction> listInstructionInfo) {
161 return MDSALUtil.buildFlowNew(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie,
162 listMatchInfoBase, listInstructionInfo, true);
165 private static Flow buildFlowNew(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
166 int hardTimeOut, BigInteger cookie, List<? extends MatchInfoBase> listMatchInfoBase,
167 List<Instruction> listInstructionInfo, boolean isStrict) {
168 FlowKey key = new FlowKey(new FlowId(flowId));
169 return new FlowBuilder().setMatch(buildMatches(listMatchInfoBase)).setKey(key)
170 .setPriority(priority)
171 .setInstructions(new InstructionsBuilder().setInstruction(listInstructionInfo).build())
172 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
173 .setFlowName(flowName).setTableId(tableId).setStrict(isStrict)
174 .setCookie(new FlowCookie(cookie)).build();
177 public static GroupEntity buildGroupEntity(BigInteger dpnId, long groupId, String groupName, GroupTypes groupType,
178 List<BucketInfo> listBucketInfo) {
180 GroupEntity groupEntity = new GroupEntity(dpnId);
182 groupEntity.setGroupId(groupId);
183 groupEntity.setGroupName(groupName);
184 groupEntity.setGroupType(groupType);
185 groupEntity.setBucketInfoList(listBucketInfo);
190 public static Group buildGroup(long groupId, String groupName, GroupTypes groupType, Buckets buckets) {
191 GroupId groupIdentifier = new GroupId(groupId);
192 return new GroupBuilder().setGroupId(groupIdentifier).setKey(new GroupKey(groupIdentifier))
193 .setGroupName(groupName).setGroupType(groupType).setBuckets(buckets).build();
196 public static TransmitPacketInput getPacketOutDefault(List<ActionInfo> actionInfos, byte[] payload,
198 return new TransmitPacketInputBuilder()
199 .setAction(buildActions(actionInfos))
202 new NodeRef(InstanceIdentifier.builder(Nodes.class)
203 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
204 .setIngress(getDefaultNodeConnRef(dpnId)).setEgress(getDefaultNodeConnRef(dpnId)).build();
207 public static TransmitPacketInput getPacketOutFromController(List<ActionInfo> actionInfos, byte[] payload,
208 long dpnId, NodeConnectorRef egress) {
209 return new TransmitPacketInputBuilder()
210 .setAction(buildActions(actionInfos))
213 new NodeRef(InstanceIdentifier.builder(Nodes.class)
214 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
215 .setEgress(egress).build();
218 public static TransmitPacketInput getPacketOut(List<ActionInfo> actionInfos, byte[] payload, long dpnId,
219 NodeConnectorRef ingress) {
220 return new TransmitPacketInputBuilder()
221 .setAction(buildActions(actionInfos))
224 new NodeRef(InstanceIdentifier.builder(Nodes.class)
225 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
226 .setIngress(ingress).setEgress(ingress).build();
229 public static TransmitPacketInput getPacketOut(List<ActionInfo> actionInfos, byte[] payload, BigInteger dpnId,
230 NodeConnectorRef nodeConnRef) {
231 // TODO Auto-generated method stub
235 public static TransmitPacketInput getPacketOut(List<Action> actions, byte[] payload, BigInteger dpnId) {
236 NodeConnectorRef ncRef = getDefaultNodeConnRef(dpnId);
237 return new TransmitPacketInputBuilder()
241 new NodeRef(InstanceIdentifier.builder(Nodes.class)
242 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
243 .setIngress(ncRef).setEgress(ncRef).build();
246 public static Action retrieveSetTunnelIdAction(BigInteger tunnelId, int actionKey) {
247 return new ActionBuilder().setAction(
248 new SetFieldCaseBuilder().setSetField(new SetFieldBuilder().setTunnel(new TunnelBuilder()
249 .setTunnelId(tunnelId).build()).build())
250 .build()).setKey(new ActionKey(actionKey)).build();
253 public static List<Action> buildActions(List<ActionInfo> actions) {
254 List<Action> actionsList = new ArrayList<>();
255 for (ActionInfo actionInfo : actions) {
256 actionsList.add(actionInfo.buildAction());
261 public static String longToIp(long ip, long mask) {
262 return ((ip & 0xFF000000) >> 3 * 8) + "."
263 + ((ip & 0x00FF0000) >> 2 * 8) + "."
264 + ((ip & 0x0000FF00) >> 8) + "."
266 + (mask == 0 ? "" : "/" + mask);
269 public static BigInteger getBigIntIpFromIpAddress(IpAddress ipAddr) {
270 String ipString = ipAddr.getIpv4Address().getValue();
271 int ipInt = InetAddresses.coerceToInteger(InetAddresses.forString(ipString));
272 return BigInteger.valueOf(ipInt & 0xffffffffL);
276 public static Bucket buildBucket(List<Action> actionsList, int weight, int bucketId, long watchPort,
278 return new BucketBuilder().setAction(actionsList).setWeight(weight).setWatchGroup(watchGroup)
279 .setWatchPort(watchPort).setBucketId(new BucketId(Long.valueOf(bucketId)))
280 .setKey(new BucketKey(new BucketId(Long.valueOf(bucketId)))).build();
283 public static Buckets buildBucketLists(List<Bucket> bucketList) {
284 return new BucketsBuilder().setBucket(bucketList).build();
287 protected static Buckets buildBuckets(List<BucketInfo> listBucketInfo) {
289 if (listBucketInfo != null) {
290 BucketsBuilder bucketsBuilder = new BucketsBuilder();
291 List<Bucket> bucketList = new ArrayList<>();
293 for (BucketInfo bucketInfo : listBucketInfo) {
294 BucketBuilder bucketBuilder = new BucketBuilder();
295 bucketBuilder.setAction(bucketInfo.buildActions());
296 bucketBuilder.setWeight(bucketInfo.getWeight());
297 bucketBuilder.setBucketId(new BucketId(index++));
298 bucketBuilder.setWeight(bucketInfo.getWeight()).setWatchPort(bucketInfo.getWatchPort())
299 .setWatchGroup(bucketInfo.getWatchGroup());
300 bucketList.add(bucketBuilder.build());
303 bucketsBuilder.setBucket(bucketList);
304 return bucketsBuilder.build();
307 return EMPTY_BUCKETS;
310 public static Instructions buildInstructions(List<InstructionInfo> listInstructionInfo) {
311 if (listInstructionInfo != null) {
312 List<Instruction> instructions = new ArrayList<>();
313 int instructionKey = 0;
315 for (InstructionInfo instructionInfo : listInstructionInfo) {
316 instructions.add(instructionInfo.buildInstruction(instructionKey));
320 return new InstructionsBuilder().setInstruction(instructions).build();
323 return EMPTY_INSTRUCTIONS;
326 public static Match buildMatches(List<? extends MatchInfoBase> listMatchInfoBase) {
327 if (listMatchInfoBase != null) {
328 MatchBuilder matchBuilder = new MatchBuilder();
329 Map<Class<?>, Object> mapMatchBuilder = new HashMap<>();
331 for (MatchInfoBase matchInfoBase : listMatchInfoBase) {
332 matchInfoBase.createInnerMatchBuilder(mapMatchBuilder);
335 for (MatchInfoBase matchInfoBase : listMatchInfoBase) {
336 matchInfoBase.setMatch(matchBuilder, mapMatchBuilder);
339 return matchBuilder.build();
342 return EMPTY_MATCHES;
345 // TODO: Check the port const
346 public static NodeConnectorRef getDefaultNodeConnRef(BigInteger dpId) {
347 return getNodeConnRef(NODE_PREFIX + SEPARATOR + dpId, "0xfffffffd");
350 public static NodeConnectorRef getNodeConnRef(BigInteger dpId, String port) {
351 return getNodeConnRef(NODE_PREFIX + SEPARATOR + dpId, port);
354 public static NodeConnectorRef getNodeConnRef(String nodeId, String port) {
355 StringBuilder sb = new StringBuilder();
357 sb.append(SEPARATOR);
359 String nodeConnectorKeyAsString = sb.toString();
360 NodeConnectorId nodeConnectorId = new NodeConnectorId(nodeConnectorKeyAsString);
361 NodeConnectorKey nodeConnectorKey = new NodeConnectorKey(nodeConnectorId);
363 NodeKey nodeKey = new NodeKey(new NodeId(nodeId));
364 InstanceIdentifierBuilder<Node> nodeInstanceIdentifierBuilder
365 = InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey);
366 InstanceIdentifierBuilder<NodeConnector> nodeConnectorInstanceIdentifierBuilder
367 = nodeInstanceIdentifierBuilder.child(NodeConnector.class, nodeConnectorKey);
368 InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifier
369 = nodeConnectorInstanceIdentifierBuilder.toInstance();
370 NodeConnectorRef nodeConnectorRef = new NodeConnectorRef(nodeConnectorInstanceIdentifier);
371 return nodeConnectorRef;
374 public static BigInteger getDpnIdFromNodeName(NodeId nodeId) {
375 return getDpnIdFromNodeName(nodeId.getValue());
378 public static BigInteger getDpnIdFromNodeName(String mdsalNodeName) {
379 String dpId = mdsalNodeName.substring(mdsalNodeName.lastIndexOf(":") + 1);
380 return new BigInteger(dpId);
383 public static long getOfPortNumberFromPortName(NodeConnectorId nodeConnectorId) {
384 return getOfPortNumberFromPortName(nodeConnectorId.getValue());
387 public static long getOfPortNumberFromPortName(String mdsalPortName) {
388 String portNumber = mdsalPortName.substring(mdsalPortName.lastIndexOf(":") + 1);
389 return Long.parseLong(portNumber);
392 public static long getDpnIdFromPortName(NodeConnectorId nodeConnectorId) {
393 if (nodeConnectorId == null || nodeConnectorId.getValue() == null) {
397 String ofPortName = nodeConnectorId.getValue();
398 return Long.parseLong(ofPortName.substring(ofPortName.indexOf(":") + 1,
399 ofPortName.lastIndexOf(":")));
400 } catch (NumberFormatException | IndexOutOfBoundsException e) {
401 LOG.error("NodeConnectorId not of expected format openflow:dpnid:portnum");
406 public static BigInteger getDpnId(String datapathId) {
407 if (datapathId != null) {
408 String dpIdStr = datapathId.replace(":", "");
409 BigInteger dpnId = new BigInteger(dpIdStr, 16);
415 public static Instruction buildAndGetPopVlanActionInstruction(int actionKey, int instructionKey) {
416 Action popVlanAction = new ActionBuilder().setAction(
417 new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
418 .setKey(new ActionKey(actionKey)).build();
419 List<Action> listAction = new ArrayList<>();
420 listAction.add(popVlanAction);
421 return buildApplyActionsInstruction(listAction, instructionKey);
424 public static Instruction buildAndGetSetReg6ActionInstruction(int actionKey, int instructionKey,
425 int startOffSet, int endOffSet, long value) {
426 NxRegLoadBuilder nxRegLoadBuilder = new NxRegLoadBuilder();
427 Dst dst = new DstBuilder()
428 .setDstChoice(new DstNxRegCaseBuilder().setNxReg(NxmNxReg6.class).build())
429 .setStart(startOffSet)
432 nxRegLoadBuilder.setDst(dst);
433 nxRegLoadBuilder.setValue(new BigInteger(Long.toString(value)));
434 ActionBuilder ab = new ActionBuilder();
435 ab.setAction(new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder()
436 .setNxRegLoad(nxRegLoadBuilder.build()).build());
437 ab.setKey(new ActionKey(actionKey));
438 List<Action> listAction = new ArrayList<>();
439 listAction.add(ab.build());
440 return buildApplyActionsInstruction(listAction, instructionKey);
443 public static Instruction buildApplyActionsInstruction(List<Action> actions) {
444 return buildApplyActionsInstruction(actions, 0);
447 public static Instruction buildApplyActionsInstruction(List<Action> listAction, int instructionKey) {
448 ApplyActions applyActions = new ApplyActionsBuilder().setAction(listAction).build();
449 ApplyActionsCase applyActionsCase = new ApplyActionsCaseBuilder().setApplyActions(applyActions).build();
450 InstructionBuilder instructionBuilder = new InstructionBuilder();
452 instructionBuilder.setInstruction(applyActionsCase);
453 instructionBuilder.setKey(new InstructionKey(instructionKey));
454 return instructionBuilder.build();
457 public static Instruction buildWriteActionsInstruction(List<Action> actions) {
458 WriteActions writeActions = new WriteActionsBuilder().setAction(actions).build();
459 WriteActionsCase writeActionsCase = new WriteActionsCaseBuilder().setWriteActions(writeActions).build();
460 InstructionBuilder instructionBuilder = new InstructionBuilder();
462 instructionBuilder.setInstruction(writeActionsCase);
463 instructionBuilder.setKey(new InstructionKey(0));
464 return instructionBuilder.build();
467 public static List<Instruction> buildInstructionsDrop() {
468 return buildInstructionsDrop(0);
471 public static List<Instruction> buildInstructionsDrop(int instructionKey) {
472 List<Instruction> mkInstructions = new ArrayList<>();
473 List<Action> actionsInfos = new ArrayList<>();
474 actionsInfos.add(new ActionDrop().buildAction());
475 mkInstructions.add(getWriteActionsInstruction(actionsInfos, instructionKey));
476 return mkInstructions;
480 public static Instruction getWriteActionsInstruction(List<Action> listAction, int instructionKey) {
481 WriteActions writeActions = new WriteActionsBuilder().setAction(listAction).build();
482 WriteActionsCase writeActionsCase = new WriteActionsCaseBuilder().setWriteActions(writeActions).build();
483 InstructionBuilder instructionBuilder = new InstructionBuilder();
485 instructionBuilder.setInstruction(writeActionsCase);
486 instructionBuilder.setKey(new InstructionKey(instructionKey));
487 return instructionBuilder.build();
490 public static Action buildAction(int actionKey, int instruction) {
491 return new ActionBuilder().setAction(
492 new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
493 .setKey(new ActionKey(actionKey)).build();
496 public static Instruction buildAndGetWriteMetadaInstruction(BigInteger metadata,
497 BigInteger mask, int instructionKey) {
498 return new InstructionBuilder()
500 new WriteMetadataCaseBuilder().setWriteMetadata(
501 new WriteMetadataBuilder().setMetadata(metadata).setMetadataMask(mask).build())
502 .build()).setKey(new InstructionKey(instructionKey)).build();
505 public static Instruction buildAndGetGotoTableInstruction(short tableId, int instructionKey) {
506 return new InstructionBuilder()
508 new GoToTableCaseBuilder().setGoToTable(
509 new GoToTableBuilder().setTableId(tableId).build()).build())
510 .setKey(new InstructionKey(instructionKey)).build();
515 * @deprecated Use {@link SingleTransactionDataBroker#syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(
516 * DataBroker, LogicalDatastoreType, InstanceIdentifier)}
519 public static <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
520 InstanceIdentifier<T> path, DataBroker broker) {
521 return SingleTransactionDataBroker
522 .syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker, datastoreType, path);
527 * @deprecated Use {@link SingleTransactionDataBroker#syncReadOptional(
528 * DataBroker, LogicalDatastoreType, InstanceIdentifier)}
531 public static <T extends DataObject> Optional<T> read(DataBroker broker, LogicalDatastoreType datastoreType,
532 InstanceIdentifier<T> path) {
534 return SingleTransactionDataBroker.syncReadOptional(broker, datastoreType, path);
535 } catch (ReadFailedException e) {
536 throw new RuntimeException(e);
544 * {@link SingleTransactionDataBroker#syncWrite(
545 * DataBroker, LogicalDatastoreType, InstanceIdentifier, DataObject)}
548 public static <T extends DataObject> void syncWrite(DataBroker broker,
549 LogicalDatastoreType datastoreType, InstanceIdentifier<T> path,
552 SingleTransactionDataBroker.syncWrite(broker, datastoreType, path, data);
553 } catch (TransactionCommitFailedException e) {
554 LOG.error("Error writing to datastore (path, data) : ({}, {})", path, data);
555 throw new RuntimeException(e);
563 * {@link SingleTransactionDataBroker#syncUpdate(
564 * DataBroker, LogicalDatastoreType, InstanceIdentifier, DataObject)}
567 public static <T extends DataObject> void syncUpdate(DataBroker broker,
568 LogicalDatastoreType datastoreType, InstanceIdentifier<T> path,
571 SingleTransactionDataBroker.syncUpdate(broker, datastoreType, path, data);
572 } catch (TransactionCommitFailedException e) {
573 LOG.error("Error writing to datastore (path, data) : ({}, {})", path, data);
574 throw new RuntimeException(e);
582 * {@link SingleTransactionDataBroker#syncDelete(DataBroker, LogicalDatastoreType, InstanceIdentifier)}
585 public static <T extends DataObject> void syncDelete(DataBroker broker,
586 LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
588 SingleTransactionDataBroker.syncDelete(broker, datastoreType, path);
589 } catch (TransactionCommitFailedException e) {
590 LOG.error("Error deleting from datastore (path) : ({})", path, e);
591 throw new RuntimeException(e);
595 public static byte[] getMacAddressForNodeConnector(DataBroker broker,
596 InstanceIdentifier<NodeConnector> nodeConnectorId) {
597 Optional<NodeConnector> optNc = MDSALDataStoreUtils.read(broker,
598 LogicalDatastoreType.OPERATIONAL, nodeConnectorId);
599 if (optNc.isPresent()) {
600 NodeConnector nc = optNc.get();
601 FlowCapableNodeConnector fcnc = nc.getAugmentation(FlowCapableNodeConnector.class);
602 MacAddress macAddress = fcnc.getHardwareAddress();
603 return HexEncode.bytesFromHexString(macAddress.getValue());
608 public static NodeId getNodeIdFromNodeConnectorId(NodeConnectorId ncId) {
609 return new NodeId(ncId.getValue().substring(0,
610 ncId.getValue().lastIndexOf(":")));
613 public static String getInterfaceName(NodeConnectorRef ref, DataBroker dataBroker) {
614 NodeConnectorId nodeConnectorId = getNodeConnectorId(dataBroker, ref);
615 NodeId nodeId = getNodeIdFromNodeConnectorId(nodeConnectorId);
616 InstanceIdentifier<NodeConnector> ncIdentifier = InstanceIdentifier
617 .builder(Nodes.class)
618 .child(Node.class, new NodeKey(nodeId))
619 .child(NodeConnector.class,
620 new NodeConnectorKey(nodeConnectorId)).build();
621 return read(dataBroker, LogicalDatastoreType.OPERATIONAL, ncIdentifier).transform(
622 nc -> nc.getAugmentation(FlowCapableNodeConnector.class).getName()).orNull();
625 public static NodeConnectorId getNodeConnectorId(DataBroker dataBroker,
626 NodeConnectorRef ref) {
627 return ((Optional<NodeConnector>) read(dataBroker, LogicalDatastoreType.OPERATIONAL, ref.getValue())).transform(
628 NodeConnector::getId).orNull();
631 public static Action createNxOfInPortAction(final int actionKey, final int inPortVal) {
632 NxRegLoad regLoad = new NxRegLoadBuilder()
633 .setDst(new DstBuilder().setDstChoice(new DstNxOfInPortCaseBuilder().setOfInPort(Boolean.TRUE).build())
634 .setStart(0).setEnd(15).build())
635 .setValue(BigInteger.valueOf(inPortVal)).build();
636 ActionBuilder abExt = new ActionBuilder();
637 abExt.setKey(new ActionKey(actionKey));
638 abExt.setOrder(actionKey);
639 abExt.setAction(new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder().setNxRegLoad(regLoad).build());
640 return abExt.build();
643 public static Action createPopVlanAction(final int actionKey) {
644 return new ActionBuilder().setAction(
645 new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
646 .setKey(new ActionKey(actionKey)).setOrder(actionKey).build();