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 java.math.BigInteger;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
16 import java.util.concurrent.ExecutionException;
18 import org.opendaylight.controller.liblldp.HexEncode;
19 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
20 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
21 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
22 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
23 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCase;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActions;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.actions._case.WriteActions;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.actions._case.WriteActionsBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadataBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
80 import org.opendaylight.yangtools.yang.binding.DataObject;
81 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
82 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
83 import org.slf4j.Logger;
84 import org.slf4j.LoggerFactory;
86 import com.google.common.base.Joiner;
87 import com.google.common.base.Optional;
88 import com.google.common.primitives.Bytes;
89 import com.google.common.primitives.Ints;
90 import com.google.common.util.concurrent.CheckedFuture;
92 public class MDSALUtil {
94 public enum MdsalOp { CREATION_OP, UPDATE_OP, REMOVAL_OP };
96 public static final String NODE_PREFIX = "openflow";
97 public static final int GROUP_WEIGHT = 0;
98 public static final long WATCH_PORT = 0xffffffffL;
99 public static final long WATCH_GROUP = 0xffffffffL;
100 public static final String SEPARATOR = ":";
101 private static final Buckets EMPTY_Buckets = new BucketsBuilder().build();
102 private static final Instructions EMPTY_Instructions = new InstructionsBuilder().setInstruction(
103 new ArrayList<Instruction>()).build();
104 private static final Match EMPTY_Matches = new MatchBuilder().build();
105 private static final Logger logger = LoggerFactory.getLogger(MDSALUtil.class);
107 public static FlowEntity buildFlowEntity(BigInteger dpnId, short tableId, String flowId, int priority, String flowName,
108 int idleTimeOut, int hardTimeOut, BigInteger cookie, List<? extends MatchInfoBase> listMatchInfoBase,
109 List<InstructionInfo> listInstructionInfo) {
111 FlowEntity flowEntity = new FlowEntity(dpnId);
113 flowEntity.setTableId(tableId);
114 flowEntity.setFlowId(flowId);
115 flowEntity.setPriority(priority);
116 flowEntity.setFlowName(flowName);
117 flowEntity.setIdleTimeOut(idleTimeOut);
118 flowEntity.setHardTimeOut(hardTimeOut);
119 flowEntity.setCookie(cookie);
120 flowEntity.setMatchInfoList(listMatchInfoBase);
121 flowEntity.setInstructionInfoList(listInstructionInfo);
126 // TODO: CHECK IF THIS IS USED
127 public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
128 int hardTimeOut, BigInteger cookie, List<? extends MatchInfoBase> listMatchInfoBase, List<InstructionInfo> listInstructionInfo) {
129 return MDSALUtil.buildFlow(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie,
130 listMatchInfoBase, listInstructionInfo, true);
133 public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
134 int hardTimeOut, BigInteger cookie, List<? extends MatchInfoBase> listMatchInfoBase,
135 List<InstructionInfo> listInstructionInfo, boolean isStrict) {
136 FlowKey key = new FlowKey(new FlowId(flowId));
137 return new FlowBuilder().setMatch(buildMatches(listMatchInfoBase)).setKey(key)
138 .setPriority(Integer.valueOf(priority)).setInstructions(buildInstructions(listInstructionInfo))
139 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
140 .setFlowName(flowName).setTableId(Short.valueOf(tableId)).setStrict(isStrict)
141 .setCookie(new FlowCookie(cookie)).build();
144 public static Flow buildFlow(short tableId, String flowId) {
145 return new FlowBuilder().setTableId(tableId).setId(new FlowId(flowId)).build();
148 public static Flow buildFlowNew(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
149 int hardTimeOut, BigInteger cookie, List<? extends MatchInfoBase> listMatchInfoBase, List<Instruction> listInstructionInfo) {
150 return MDSALUtil.buildFlowNew(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie,
151 listMatchInfoBase, listInstructionInfo, true);
154 private static Flow buildFlowNew(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
155 int hardTimeOut, BigInteger cookie, List<? extends MatchInfoBase> listMatchInfoBase,
156 List<Instruction> listInstructionInfo, boolean isStrict) {
157 FlowKey key = new FlowKey(new FlowId(flowId));
158 return new FlowBuilder().setMatch(buildMatches(listMatchInfoBase)).setKey(key)
159 .setPriority(Integer.valueOf(priority)).setInstructions(new InstructionsBuilder().setInstruction(listInstructionInfo).build())
160 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
161 .setFlowName(flowName).setTableId(Short.valueOf(tableId)).setStrict(isStrict)
162 .setCookie(new FlowCookie(cookie)).build();
165 public static GroupEntity buildGroupEntity(BigInteger dpnId, long groupId, String groupName, GroupTypes groupType,
166 List<BucketInfo> listBucketInfo) {
168 GroupEntity groupEntity = new GroupEntity(dpnId);
170 groupEntity.setGroupId(groupId);
171 groupEntity.setGroupName(groupName);
172 groupEntity.setGroupType(groupType);
173 groupEntity.setBucketInfoList(listBucketInfo);
178 public static Group buildGroup(long groupId, String groupName, GroupTypes groupType, Buckets buckets) {
179 GroupId groupIdentifier = new GroupId(groupId);
180 return new GroupBuilder().setGroupId(groupIdentifier).setKey(new GroupKey(groupIdentifier)).setGroupName(groupName)
181 .setGroupType(groupType).setBuckets(buckets).build();
184 public static TransmitPacketInput getPacketOutDefault(List<ActionInfo> actionInfos, byte[] payload, BigInteger dpnId) {
185 return new TransmitPacketInputBuilder()
186 .setAction(buildActions(actionInfos))
189 new NodeRef(InstanceIdentifier.builder(Nodes.class)
190 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
191 .setIngress(getDefaultNodeConnRef(dpnId)).setEgress(getDefaultNodeConnRef(dpnId)).build();
194 public static TransmitPacketInput getPacketOut(List<ActionInfo> actionInfos, byte[] payload, long dpnId,
195 NodeConnectorRef ingress) {
196 return new TransmitPacketInputBuilder()
197 .setAction(buildActions(actionInfos))
200 new NodeRef(InstanceIdentifier.builder(Nodes.class)
201 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
202 .setIngress(ingress).setEgress(ingress).build();
205 public static Action retrieveSetTunnelIdAction(BigInteger tunnelId, int actionKey) {
206 return new ActionBuilder().setAction(
207 new SetFieldCaseBuilder().setSetField(new SetFieldBuilder().setTunnel(new TunnelBuilder()
208 .setTunnelId(tunnelId).build()).build())
209 .build()).setKey(new ActionKey(actionKey)).build();
212 public static List<Action> buildActions(List<ActionInfo> actions) {
213 List<Action> actionsList = new ArrayList<>();
214 for (ActionInfo actionInfo : actions) {
215 actionsList.add(actionInfo.buildAction());
220 public static String longToIp(long ip, long mask) {
221 StringBuilder sb = new StringBuilder(15);
222 Joiner joiner = Joiner.on('.');
224 joiner.appendTo(sb, Bytes.asList(Ints.toByteArray((int) ip)));
226 sb.append("/" + mask);
228 return sb.toString();
232 public static Bucket buildBucket(List<Action> actionsList, int weight, int bucketId, long watchPort, long watchGroup) {
233 return new BucketBuilder().setAction(actionsList).setWeight(weight)
234 .setWatchGroup(watchGroup).setWatchPort(watchPort).setBucketId(new BucketId(Long.valueOf(bucketId))).setKey(new BucketKey(new BucketId(Long.valueOf(bucketId)))).build();
238 public static Buckets buildBucketLists(List<Bucket> bucketList) {
239 return new BucketsBuilder().setBucket(bucketList).build();
242 protected static Buckets buildBuckets(List<BucketInfo> listBucketInfo) {
244 if (listBucketInfo != null) {
245 BucketsBuilder bucketsBuilder = new BucketsBuilder();
246 List<Bucket> bucketList = new ArrayList<>();
248 for (BucketInfo bucketInfo : listBucketInfo) {
249 BucketBuilder bucketBuilder = new BucketBuilder();
250 bucketBuilder.setAction(bucketInfo.buildActions());
251 bucketBuilder.setWeight(bucketInfo.getWeight());
252 bucketBuilder.setBucketId(new BucketId(i++));
253 bucketBuilder.setWeight(bucketInfo.getWeight()).setWatchPort(bucketInfo.getWatchPort())
254 .setWatchGroup(bucketInfo.getWatchGroup());
255 bucketList.add(bucketBuilder.build());
258 bucketsBuilder.setBucket(bucketList);
259 return bucketsBuilder.build();
262 return EMPTY_Buckets;
265 public static Instructions buildInstructions(List<InstructionInfo> listInstructionInfo) {
266 if (listInstructionInfo != null) {
267 List<Instruction> instructions = new ArrayList<>();
268 int instructionKey = 0;
270 for (InstructionInfo instructionInfo : listInstructionInfo) {
271 instructions.add(instructionInfo.buildInstruction(instructionKey));
275 return new InstructionsBuilder().setInstruction(instructions).build();
278 return EMPTY_Instructions;
281 public static Match buildMatches(List<? extends MatchInfoBase> listMatchInfoBase) {
282 if (listMatchInfoBase != null) {
283 MatchBuilder matchBuilder = new MatchBuilder();
284 Map<Class<?>, Object> mapMatchBuilder = new HashMap<>();
286 for (MatchInfoBase MatchInfoBase : listMatchInfoBase) {
287 MatchInfoBase.createInnerMatchBuilder(mapMatchBuilder);
290 for (MatchInfoBase MatchInfoBase : listMatchInfoBase) {
291 MatchInfoBase.setMatch(matchBuilder, mapMatchBuilder);
294 return matchBuilder.build();
297 return EMPTY_Matches;
300 // TODO: Check the port const
301 public static NodeConnectorRef getDefaultNodeConnRef(BigInteger nDpId) {
302 return getNodeConnRef(NODE_PREFIX + SEPARATOR + nDpId, "0xfffffffd");
305 public static NodeConnectorRef getNodeConnRef(BigInteger nDpId, String port) {
306 return getNodeConnRef(NODE_PREFIX + SEPARATOR + nDpId, port);
309 public static NodeConnectorRef getNodeConnRef(String sNodeId, String port) {
310 String sNodeConnectorKey;
314 NodeConnectorId nodeConnectorId;
315 NodeConnectorKey nodeConnectorKey;
316 InstanceIdentifierBuilder<Nodes> nodesInstanceIdentifierBuilder;
317 InstanceIdentifierBuilder<Node> nodeInstanceIdentifierBuilder;
318 InstanceIdentifierBuilder<NodeConnector> nodeConnectorInstanceIdentifierBuilder;
319 InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifier;
320 NodeConnectorRef nodeConnectorRef;
322 sbTmp = new StringBuilder();
324 sbTmp.append(sNodeId);
325 sbTmp.append(SEPARATOR);
328 sNodeConnectorKey = sbTmp.toString();
329 nodeConnectorId = new NodeConnectorId(sNodeConnectorKey);
330 nodeConnectorKey = new NodeConnectorKey(nodeConnectorId);
332 nodeId = new NodeId(sNodeId);
333 nodeKey = new NodeKey(nodeId);
335 nodesInstanceIdentifierBuilder = InstanceIdentifier.<Nodes> builder(Nodes.class);
336 nodeInstanceIdentifierBuilder = nodesInstanceIdentifierBuilder.<Node, NodeKey> child(Node.class, nodeKey);
337 nodeConnectorInstanceIdentifierBuilder = nodeInstanceIdentifierBuilder.<NodeConnector, NodeConnectorKey> child(
338 NodeConnector.class, nodeConnectorKey);
339 nodeConnectorInstanceIdentifier = nodeConnectorInstanceIdentifierBuilder.toInstance();
340 nodeConnectorRef = new NodeConnectorRef(nodeConnectorInstanceIdentifier);
341 return nodeConnectorRef;
344 public static BigInteger getDpnIdFromNodeName(NodeId nodeId) {
345 return getDpnIdFromNodeName(nodeId.getValue());
348 public static BigInteger getDpnIdFromNodeName(String sMdsalNodeName) {
349 String sDpId = sMdsalNodeName.substring(sMdsalNodeName.lastIndexOf(":") + 1);
350 return new BigInteger(sDpId);
353 public static long getOfPortNumberFromPortName(NodeConnectorId nodeConnectorId) {
354 return getOfPortNumberFromPortName(nodeConnectorId.getValue());
357 public static long getDpnIdFromPortName(NodeConnectorId nodeConnectorId) {
359 String ofPortName = nodeConnectorId.getValue();
360 return Long.parseLong(ofPortName.substring(ofPortName.indexOf(":")+1,
361 ofPortName.lastIndexOf(":")));
362 } catch (Exception e) {
363 logger.error("NodeConnectorId not of expected format openflow:dpnid:portnum");
368 public static long getOfPortNumberFromPortName(String sMdsalPortName) {
369 String sPortNumber = sMdsalPortName.substring(sMdsalPortName.lastIndexOf(":") + 1);
370 return Long.parseLong(sPortNumber);
373 public static TransmitPacketInput getPacketOut(List<ActionInfo> actionInfos, byte[] payload, BigInteger dpnId,
374 NodeConnectorRef nodeConnRef) {
375 // TODO Auto-generated method stub
379 public static Instruction buildAndGetPopVlanActionInstruction(int actionKey, int instructionKey) {
380 Action popVlanAction = new ActionBuilder().setAction(
381 new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
382 .setKey(new ActionKey(actionKey)).build();
383 List<Action> listAction = new ArrayList<> ();
384 listAction.add(popVlanAction);
385 return buildApplyActionsInstruction(listAction, instructionKey);
388 public static Instruction buildApplyActionsInstruction(List<Action> actions) {
389 return buildApplyActionsInstruction(actions, 0);
392 public static Instruction buildApplyActionsInstruction(List<Action> listAction, int instructionKey) {
393 ApplyActions applyActions = new ApplyActionsBuilder().setAction(listAction).build();
394 ApplyActionsCase applyActionsCase = new ApplyActionsCaseBuilder().setApplyActions(applyActions).build();
395 InstructionBuilder instructionBuilder = new InstructionBuilder();
397 instructionBuilder.setInstruction(applyActionsCase);
398 instructionBuilder.setKey(new InstructionKey(instructionKey));
399 return instructionBuilder.build();
402 public static List<Instruction> buildInstructionsDrop() {
403 return buildInstructionsDrop(0);
406 public static List<Instruction> buildInstructionsDrop(int instructionKey) {
407 List<Instruction> mkInstructions = new ArrayList<>();
408 List <Action> actionsInfos = new ArrayList <> ();
409 actionsInfos.add(new ActionInfo(ActionType.drop_action, new String[]{}).buildAction());
410 mkInstructions.add(getWriteActionsInstruction(actionsInfos, instructionKey));
411 return mkInstructions;
415 public static Instruction getWriteActionsInstruction(List<Action> listAction, int instructionKey) {
416 WriteActions writeActions = new WriteActionsBuilder().setAction(listAction).build();
417 WriteActionsCase writeActionsCase = new WriteActionsCaseBuilder().setWriteActions(writeActions).build();
418 InstructionBuilder instructionBuilder = new InstructionBuilder();
420 instructionBuilder.setInstruction(writeActionsCase);
421 instructionBuilder.setKey(new InstructionKey(instructionKey));
422 return instructionBuilder.build();
425 public static Action buildAction(int actionKey, int instruction) {
426 return new ActionBuilder().setAction(
427 new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
428 .setKey(new ActionKey(actionKey)).build();
431 public static Instruction buildAndGetWriteMetadaInstruction(BigInteger metadata,
432 BigInteger mask, int instructionKey) {
433 return new InstructionBuilder()
435 new WriteMetadataCaseBuilder().setWriteMetadata(
436 new WriteMetadataBuilder().setMetadata(metadata).setMetadataMask(mask).build())
437 .build()).setKey(new InstructionKey(instructionKey)).build();
440 public static Instruction buildAndGetGotoTableInstruction(short tableId, int instructionKey) {
441 return new InstructionBuilder()
443 new GoToTableCaseBuilder().setGoToTable(
444 new GoToTableBuilder().setTableId(tableId).build()).build())
445 .setKey(new InstructionKey(instructionKey)).build();
448 public static <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
449 InstanceIdentifier<T> path, DataBroker broker) {
451 ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
453 Optional<T> result = Optional.absent();
455 result = tx.read(datastoreType, path).get();
456 } catch (Exception e) {
457 logger.error("An error occured while reading data from the path {} with the exception {}", path, e);
462 public static <T extends DataObject> Optional<T> read(DataBroker broker,
463 LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
465 ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
467 Optional<T> result = Optional.absent();
469 result = tx.read(datastoreType, path).get();
470 } catch (Exception e) {
471 throw new RuntimeException(e);
476 public static <T extends DataObject> void syncWrite(DataBroker broker,
477 LogicalDatastoreType datastoreType, InstanceIdentifier<T> path,
479 WriteTransaction tx = broker.newWriteOnlyTransaction();
480 tx.put(datastoreType, path, data, true);
481 CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
484 } catch (InterruptedException | ExecutionException e) {
485 logger.error("Error writing to datastore (path, data) : ({}, {})", path, data);
486 throw new RuntimeException(e.getMessage());
490 public static <T extends DataObject> void syncUpdate(DataBroker broker,
491 LogicalDatastoreType datastoreType, InstanceIdentifier<T> path,
493 WriteTransaction tx = broker.newWriteOnlyTransaction();
494 tx.merge(datastoreType, path, data, true);
495 CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
498 } catch (InterruptedException | ExecutionException e) {
499 logger.error("Error writing to datastore (path, data) : ({}, {})", path, data);
500 throw new RuntimeException(e.getMessage());
504 public static <T extends DataObject> void syncDelete(DataBroker broker,
505 LogicalDatastoreType datastoreType, InstanceIdentifier<T> obj) {
506 WriteTransaction tx = broker.newWriteOnlyTransaction();
507 tx.delete(datastoreType, obj);
508 CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
511 } catch (InterruptedException | ExecutionException e) {
512 logger.error("Error deleting from datastore (path) : ({})", obj);
513 throw new RuntimeException(e.getMessage());
517 public static byte[] getMacAddressForNodeConnector(DataBroker broker,
518 InstanceIdentifier<NodeConnector> nodeConnectorId) {
519 Optional<NodeConnector> optNc = MDSALDataStoreUtils.read(broker,
520 LogicalDatastoreType.OPERATIONAL, nodeConnectorId);
521 if(optNc.isPresent()) {
522 NodeConnector nc = optNc.get();
523 FlowCapableNodeConnector fcnc = nc.getAugmentation(FlowCapableNodeConnector.class);
524 MacAddress macAddress = fcnc.getHardwareAddress();
525 return HexEncode.bytesFromHexString(macAddress.getValue());
530 public static NodeId getNodeIdFromNodeConnectorId(NodeConnectorId ncId) {
531 return new NodeId(ncId.getValue().substring(0,
532 ncId.getValue().lastIndexOf(":")));
535 public static String getInterfaceName(NodeConnectorRef ref, DataBroker dataBroker) {
536 NodeConnectorId nodeConnectorId = getNodeConnectorId(dataBroker, ref);
537 NodeId nodeId = getNodeIdFromNodeConnectorId(nodeConnectorId);
538 InstanceIdentifier<NodeConnector> ncIdentifier = InstanceIdentifier
539 .builder(Nodes.class)
540 .child(Node.class, new NodeKey(nodeId))
541 .child(NodeConnector.class,
542 new NodeConnectorKey(nodeConnectorId)).build();
544 Optional<NodeConnector> nodeConnectorOptional = read(
546 LogicalDatastoreType.OPERATIONAL, ncIdentifier);
547 if (!nodeConnectorOptional.isPresent()) {
550 NodeConnector nc = nodeConnectorOptional.get();
551 FlowCapableNodeConnector fc = nc
552 .getAugmentation(FlowCapableNodeConnector.class);
556 public static NodeConnectorId getNodeConnectorId(DataBroker dataBroker,
557 NodeConnectorRef ref) {
558 Optional<NodeConnector> nc = (Optional<NodeConnector>) read(
560 LogicalDatastoreType.OPERATIONAL, ref.getValue());
562 return nc.get().getId();
567 public static TransmitPacketInput getPacketOut(List<Action> actions, byte[] payload, BigInteger dpnId) {
568 NodeConnectorRef ncRef = getDefaultNodeConnRef(dpnId);
569 return new TransmitPacketInputBuilder()
573 new NodeRef(InstanceIdentifier.builder(Nodes.class)
574 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
575 .setIngress(ncRef).setEgress(ncRef).build();