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.concepts.Builder;
91 import org.opendaylight.yangtools.yang.binding.ChildOf;
92 import org.opendaylight.yangtools.yang.binding.DataObject;
93 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
94 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
95 import org.slf4j.Logger;
96 import org.slf4j.LoggerFactory;
98 @SuppressWarnings("checkstyle:AbbreviationAsWordInName")
99 public class MDSALUtil {
101 private static final Logger LOG = LoggerFactory.getLogger(MDSALUtil.class);
103 public enum MdsalOp { CREATION_OP, UPDATE_OP, REMOVAL_OP }
105 public static final String NODE_PREFIX = "openflow";
106 public static final int GROUP_WEIGHT = 0;
107 public static final long WATCH_PORT = 0xffffffffL;
108 public static final long WATCH_GROUP = 0xffffffffL;
109 public static final String SEPARATOR = ":";
110 private static final Buckets EMPTY_BUCKETS = new BucketsBuilder().build();
111 private static final Instructions EMPTY_INSTRUCTIONS = new InstructionsBuilder().setInstruction(
112 new ArrayList<>()).build();
113 private static final Match EMPTY_MATCHES = new MatchBuilder().build();
115 public static FlowEntity buildFlowEntity(BigInteger dpnId, short tableId, String flowId, int priority,
116 String flowName, int idleTimeOut, int hardTimeOut, BigInteger cookie,
117 List<? extends MatchInfoBase> listMatchInfoBase, List<InstructionInfo> listInstructionInfo) {
119 FlowEntity flowEntity = new FlowEntity(dpnId);
121 flowEntity.setTableId(tableId);
122 flowEntity.setFlowId(flowId);
123 flowEntity.setPriority(priority);
124 flowEntity.setFlowName(flowName);
125 flowEntity.setIdleTimeOut(idleTimeOut);
126 flowEntity.setHardTimeOut(hardTimeOut);
127 flowEntity.setCookie(cookie);
128 flowEntity.setMatchInfoList(listMatchInfoBase);
129 flowEntity.setInstructionInfoList(listInstructionInfo);
134 // TODO: CHECK IF THIS IS USED
135 public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
136 int hardTimeOut, BigInteger cookie, List<? extends MatchInfoBase> listMatchInfoBase,
137 List<InstructionInfo> listInstructionInfo) {
138 return MDSALUtil.buildFlow(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie,
139 listMatchInfoBase, listInstructionInfo, true);
142 public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
143 int hardTimeOut, BigInteger cookie, List<? extends MatchInfoBase> listMatchInfoBase,
144 List<InstructionInfo> listInstructionInfo, boolean isStrict) {
145 FlowKey key = new FlowKey(new FlowId(flowId));
146 return new FlowBuilder().setMatch(buildMatches(listMatchInfoBase)).setKey(key)
147 .setPriority(priority).setInstructions(buildInstructions(listInstructionInfo))
148 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
149 .setFlowName(flowName).setTableId(tableId).setStrict(isStrict)
150 .setCookie(new FlowCookie(cookie)).build();
153 public static Flow buildFlow(short tableId, String flowId) {
154 return new FlowBuilder().setTableId(tableId).setId(new FlowId(flowId)).build();
157 public static Flow buildFlowNew(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
158 int hardTimeOut, BigInteger cookie, List<? extends MatchInfoBase> listMatchInfoBase,
159 List<Instruction> listInstructionInfo) {
160 return MDSALUtil.buildFlowNew(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie,
161 listMatchInfoBase, listInstructionInfo, true);
164 private static Flow buildFlowNew(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
165 int hardTimeOut, BigInteger cookie, List<? extends MatchInfoBase> listMatchInfoBase,
166 List<Instruction> listInstructionInfo, boolean isStrict) {
167 FlowKey key = new FlowKey(new FlowId(flowId));
168 return new FlowBuilder().setMatch(buildMatches(listMatchInfoBase)).setKey(key)
169 .setPriority(priority)
170 .setInstructions(new InstructionsBuilder().setInstruction(listInstructionInfo).build())
171 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
172 .setFlowName(flowName).setTableId(tableId).setStrict(isStrict)
173 .setCookie(new FlowCookie(cookie)).build();
176 public static GroupEntity buildGroupEntity(BigInteger dpnId, long groupId, String groupName, GroupTypes groupType,
177 List<BucketInfo> listBucketInfo) {
179 GroupEntity groupEntity = new GroupEntity(dpnId);
181 groupEntity.setGroupId(groupId);
182 groupEntity.setGroupName(groupName);
183 groupEntity.setGroupType(groupType);
184 groupEntity.setBucketInfoList(listBucketInfo);
189 public static Group buildGroup(long groupId, String groupName, GroupTypes groupType, Buckets buckets) {
190 GroupId groupIdentifier = new GroupId(groupId);
191 return new GroupBuilder().setGroupId(groupIdentifier).setKey(new GroupKey(groupIdentifier))
192 .setGroupName(groupName).setGroupType(groupType).setBuckets(buckets).build();
195 public static TransmitPacketInput getPacketOutDefault(List<ActionInfo> actionInfos, byte[] payload,
197 return new TransmitPacketInputBuilder()
198 .setAction(buildActions(actionInfos))
201 new NodeRef(InstanceIdentifier.builder(Nodes.class)
202 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
203 .setIngress(getDefaultNodeConnRef(dpnId)).setEgress(getDefaultNodeConnRef(dpnId)).build();
206 public static TransmitPacketInput getPacketOutFromController(List<ActionInfo> actionInfos, byte[] payload,
207 long dpnId, NodeConnectorRef egress) {
208 return new TransmitPacketInputBuilder()
209 .setAction(buildActions(actionInfos))
212 new NodeRef(InstanceIdentifier.builder(Nodes.class)
213 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
214 .setEgress(egress).build();
217 public static TransmitPacketInput getPacketOut(List<ActionInfo> actionInfos, byte[] payload, long dpnId,
218 NodeConnectorRef ingress) {
219 return new TransmitPacketInputBuilder()
220 .setAction(buildActions(actionInfos))
223 new NodeRef(InstanceIdentifier.builder(Nodes.class)
224 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
225 .setIngress(ingress).setEgress(ingress).build();
228 public static Action retrieveSetTunnelIdAction(BigInteger tunnelId, int actionKey) {
229 return new ActionBuilder().setAction(
230 new SetFieldCaseBuilder().setSetField(new SetFieldBuilder().setTunnel(new TunnelBuilder()
231 .setTunnelId(tunnelId).build()).build())
232 .build()).setKey(new ActionKey(actionKey)).build();
235 public static List<Action> buildActions(List<ActionInfo> actions) {
236 List<Action> actionsList = new ArrayList<>();
237 for (ActionInfo actionInfo : actions) {
238 actionsList.add(actionInfo.buildAction());
243 public static String longToIp(long ip, long mask) {
244 return ((ip & 0xFF000000) >> 3 * 8) + "."
245 + ((ip & 0x00FF0000) >> 2 * 8) + "."
246 + ((ip & 0x0000FF00) >> 8) + "."
248 + (mask == 0 ? "" : "/" + mask);
251 public static BigInteger getBigIntIpFromIpAddress(IpAddress ipAddr) {
252 String ipString = ipAddr.getIpv4Address().getValue();
253 int ipInt = InetAddresses.coerceToInteger(InetAddresses.forString(ipString));
254 return BigInteger.valueOf(ipInt & 0xffffffffL);
258 public static Bucket buildBucket(List<Action> actionsList, int weight, int bucketId, long watchPort,
260 return new BucketBuilder().setAction(actionsList).setWeight(weight).setWatchGroup(watchGroup)
261 .setWatchPort(watchPort).setBucketId(new BucketId(Long.valueOf(bucketId)))
262 .setKey(new BucketKey(new BucketId(Long.valueOf(bucketId)))).build();
265 public static Buckets buildBucketLists(List<Bucket> bucketList) {
266 return new BucketsBuilder().setBucket(bucketList).build();
269 protected static Buckets buildBuckets(List<BucketInfo> listBucketInfo) {
271 if (listBucketInfo != null) {
272 BucketsBuilder bucketsBuilder = new BucketsBuilder();
273 List<Bucket> bucketList = new ArrayList<>();
275 for (BucketInfo bucketInfo : listBucketInfo) {
276 BucketBuilder bucketBuilder = new BucketBuilder();
277 bucketBuilder.setAction(bucketInfo.buildActions());
278 bucketBuilder.setWeight(bucketInfo.getWeight());
279 bucketBuilder.setBucketId(new BucketId(index++));
280 bucketBuilder.setWeight(bucketInfo.getWeight()).setWatchPort(bucketInfo.getWatchPort())
281 .setWatchGroup(bucketInfo.getWatchGroup());
282 bucketList.add(bucketBuilder.build());
285 bucketsBuilder.setBucket(bucketList);
286 return bucketsBuilder.build();
289 return EMPTY_BUCKETS;
292 public static Instructions buildInstructions(List<InstructionInfo> listInstructionInfo) {
293 if (listInstructionInfo != null) {
294 List<Instruction> instructions = new ArrayList<>();
295 int instructionKey = 0;
297 for (InstructionInfo instructionInfo : listInstructionInfo) {
298 instructions.add(instructionInfo.buildInstruction(instructionKey));
302 return new InstructionsBuilder().setInstruction(instructions).build();
305 return EMPTY_INSTRUCTIONS;
308 public static Match buildMatches(List<? extends MatchInfoBase> listMatchInfoBase) {
309 if (listMatchInfoBase != null) {
310 MatchBuilder matchBuilder = new MatchBuilder();
311 Map<Class<?>, Object> mapMatchBuilder = new HashMap<>();
313 for (MatchInfoBase matchInfoBase : listMatchInfoBase) {
314 matchInfoBase.createInnerMatchBuilder(mapMatchBuilder);
317 for (MatchInfoBase matchInfoBase : listMatchInfoBase) {
318 matchInfoBase.setMatch(matchBuilder, mapMatchBuilder);
321 return matchBuilder.build();
324 return EMPTY_MATCHES;
327 // TODO: Check the port const
328 public static NodeConnectorRef getDefaultNodeConnRef(BigInteger dpId) {
329 return getNodeConnRef(NODE_PREFIX + SEPARATOR + dpId, "0xfffffffd");
332 public static NodeConnectorRef getNodeConnRef(BigInteger dpId, String port) {
333 return getNodeConnRef(NODE_PREFIX + SEPARATOR + dpId, port);
336 public static NodeConnectorRef getNodeConnRef(String sNodeId, String port) {
337 String sNodeConnectorKey;
341 NodeConnectorId nodeConnectorId;
342 NodeConnectorKey nodeConnectorKey;
343 InstanceIdentifierBuilder<Nodes> nodesInstanceIdentifierBuilder;
344 InstanceIdentifierBuilder<Node> nodeInstanceIdentifierBuilder;
345 InstanceIdentifierBuilder<NodeConnector> nodeConnectorInstanceIdentifierBuilder;
346 InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifier;
347 NodeConnectorRef nodeConnectorRef;
349 sbTmp = new StringBuilder();
351 sbTmp.append(sNodeId);
352 sbTmp.append(SEPARATOR);
355 sNodeConnectorKey = sbTmp.toString();
356 nodeConnectorId = new NodeConnectorId(sNodeConnectorKey);
357 nodeConnectorKey = new NodeConnectorKey(nodeConnectorId);
359 nodeId = new NodeId(sNodeId);
360 nodeKey = new NodeKey(nodeId);
362 nodesInstanceIdentifierBuilder = InstanceIdentifier.builder(Nodes.class);
363 nodeInstanceIdentifierBuilder = nodesInstanceIdentifierBuilder.child(Node.class, nodeKey);
364 nodeConnectorInstanceIdentifierBuilder = nodeInstanceIdentifierBuilder.child(
365 NodeConnector.class, nodeConnectorKey);
366 nodeConnectorInstanceIdentifier = nodeConnectorInstanceIdentifierBuilder.toInstance();
367 nodeConnectorRef = new NodeConnectorRef(nodeConnectorInstanceIdentifier);
368 return nodeConnectorRef;
371 public static BigInteger getDpnIdFromNodeName(NodeId nodeId) {
372 return getDpnIdFromNodeName(nodeId.getValue());
375 public static BigInteger getDpnIdFromNodeName(String mdsalNodeName) {
376 String dpId = mdsalNodeName.substring(mdsalNodeName.lastIndexOf(":") + 1);
377 return new BigInteger(dpId);
380 public static long getOfPortNumberFromPortName(NodeConnectorId nodeConnectorId) {
381 return getOfPortNumberFromPortName(nodeConnectorId.getValue());
384 public static long getDpnIdFromPortName(NodeConnectorId nodeConnectorId) {
386 String ofPortName = nodeConnectorId.getValue();
387 return Long.parseLong(ofPortName.substring(ofPortName.indexOf(":") + 1,
388 ofPortName.lastIndexOf(":")));
389 } catch (Exception e) {
390 LOG.error("NodeConnectorId not of expected format openflow:dpnid:portnum");
395 public static BigInteger getDpnId(String datapathId){
396 if (datapathId != null) {
397 String dpIdStr = datapathId.replace(":", "");
398 BigInteger dpnId = new BigInteger(dpIdStr, 16);
404 public static long getOfPortNumberFromPortName(String sMdsalPortName) {
405 String portNumber = sMdsalPortName.substring(sMdsalPortName.lastIndexOf(":") + 1);
406 return Long.parseLong(portNumber);
409 public static TransmitPacketInput getPacketOut(List<ActionInfo> actionInfos, byte[] payload, BigInteger dpnId,
410 NodeConnectorRef nodeConnRef) {
411 // TODO Auto-generated method stub
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 buildWriteActionsInstruction(List<Action> actions) {
448 WriteActions writeActions = new WriteActionsBuilder().setAction(actions).build();
449 WriteActionsCase writeActionsCase = new WriteActionsCaseBuilder().setWriteActions(writeActions).build();
450 InstructionBuilder instructionBuilder = new InstructionBuilder();
452 instructionBuilder.setInstruction(writeActionsCase);
453 instructionBuilder.setKey(new InstructionKey(0));
454 return instructionBuilder.build();
457 public static Instruction buildApplyActionsInstruction(List<Action> listAction, int instructionKey) {
458 ApplyActions applyActions = new ApplyActionsBuilder().setAction(listAction).build();
459 ApplyActionsCase applyActionsCase = new ApplyActionsCaseBuilder().setApplyActions(applyActions).build();
460 InstructionBuilder instructionBuilder = new InstructionBuilder();
462 instructionBuilder.setInstruction(applyActionsCase);
463 instructionBuilder.setKey(new InstructionKey(instructionKey));
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(DataBroker, LogicalDatastoreType, InstanceIdentifier, DataObject)}
547 public static <T extends DataObject> void syncWrite(DataBroker broker,
548 LogicalDatastoreType datastoreType, InstanceIdentifier<T> path,
551 SingleTransactionDataBroker.syncWrite(broker, datastoreType, path, data);
552 } catch (TransactionCommitFailedException e) {
553 LOG.error("Error writing to datastore (path, data) : ({}, {})", path, data);
554 throw new RuntimeException(e);
562 * {@link SingleTransactionDataBroker#syncUpdate(DataBroker, LogicalDatastoreType, InstanceIdentifier, DataObject)}
565 public static <T extends DataObject> void syncUpdate(DataBroker broker,
566 LogicalDatastoreType datastoreType, InstanceIdentifier<T> path,
569 SingleTransactionDataBroker.syncUpdate(broker, datastoreType, path, data);
570 } catch (TransactionCommitFailedException e) {
571 LOG.error("Error writing to datastore (path, data) : ({}, {})", path, data);
572 throw new RuntimeException(e);
580 * {@link SingleTransactionDataBroker#syncDelete(DataBroker, LogicalDatastoreType, InstanceIdentifier)}
583 public static <T extends DataObject> void syncDelete(DataBroker broker,
584 LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
586 SingleTransactionDataBroker.syncDelete(broker, datastoreType, path);
587 } catch (TransactionCommitFailedException e) {
588 LOG.error("Error deleting from datastore (path) : ({})", path, e);
589 throw new RuntimeException(e);
593 public static byte[] getMacAddressForNodeConnector(DataBroker broker,
594 InstanceIdentifier<NodeConnector> nodeConnectorId) {
595 Optional<NodeConnector> optNc = MDSALDataStoreUtils.read(broker,
596 LogicalDatastoreType.OPERATIONAL, nodeConnectorId);
597 if (optNc.isPresent()) {
598 NodeConnector nc = optNc.get();
599 FlowCapableNodeConnector fcnc = nc.getAugmentation(FlowCapableNodeConnector.class);
600 MacAddress macAddress = fcnc.getHardwareAddress();
601 return HexEncode.bytesFromHexString(macAddress.getValue());
606 public static NodeId getNodeIdFromNodeConnectorId(NodeConnectorId ncId) {
607 return new NodeId(ncId.getValue().substring(0,
608 ncId.getValue().lastIndexOf(":")));
611 public static String getInterfaceName(NodeConnectorRef ref, DataBroker dataBroker) {
612 NodeConnectorId nodeConnectorId = getNodeConnectorId(dataBroker, ref);
613 NodeId nodeId = getNodeIdFromNodeConnectorId(nodeConnectorId);
614 InstanceIdentifier<NodeConnector> ncIdentifier = InstanceIdentifier
615 .builder(Nodes.class)
616 .child(Node.class, new NodeKey(nodeId))
617 .child(NodeConnector.class,
618 new NodeConnectorKey(nodeConnectorId)).build();
619 return read(dataBroker, LogicalDatastoreType.OPERATIONAL, ncIdentifier).transform(
620 nc -> nc.getAugmentation(FlowCapableNodeConnector.class).getName()).orNull();
623 public static NodeConnectorId getNodeConnectorId(DataBroker dataBroker,
624 NodeConnectorRef ref) {
625 return ((Optional<NodeConnector>) read(dataBroker, LogicalDatastoreType.OPERATIONAL, ref.getValue())).transform(
626 NodeConnector::getId).orNull();
629 public static TransmitPacketInput getPacketOut(List<Action> actions, byte[] payload, BigInteger dpnId) {
630 NodeConnectorRef ncRef = getDefaultNodeConnRef(dpnId);
631 return new TransmitPacketInputBuilder()
635 new NodeRef(InstanceIdentifier.builder(Nodes.class)
636 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
637 .setIngress(ncRef).setEgress(ncRef).build();
640 public static Action createNxOfInPortAction(final int actionKey, final int inPortVal) {
641 NxRegLoad regLoad = new NxRegLoadBuilder()
642 .setDst(new DstBuilder().setDstChoice(new DstNxOfInPortCaseBuilder().setOfInPort(Boolean.TRUE).build())
643 .setStart(0).setEnd(15).build())
644 .setValue(BigInteger.valueOf(inPortVal)).build();
645 ActionBuilder abExt = new ActionBuilder();
646 abExt.setKey(new ActionKey(actionKey));
647 abExt.setOrder(actionKey);
648 abExt.setAction(new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder().setNxRegLoad(regLoad).build());
649 return abExt.build();
652 public static Action createPopVlanAction(final int actionKey) {
653 return new ActionBuilder().setAction(
654 new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
655 .setKey(new ActionKey(actionKey)).setOrder(actionKey).build();