2 * Copyright (c) 2015 - 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.vpnservice.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.ConcurrentHashMap;
17 import java.util.concurrent.ExecutionException;
18 import java.util.concurrent.LinkedBlockingQueue;
20 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
21 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
22 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActions;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadataBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
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.NodeConnectorKey;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
72 import org.opendaylight.yangtools.yang.binding.DataObject;
73 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
74 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
75 import org.opendaylight.yangtools.yang.binding.DataObject;
76 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
77 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
78 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
79 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
80 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
81 import org.slf4j.Logger;
82 import org.slf4j.LoggerFactory;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
84 import org.opendaylight.controller.liblldp.HexEncode;
85 import com.google.common.base.Joiner;
86 import com.google.common.base.Optional;
87 import com.google.common.primitives.Bytes;
88 import com.google.common.primitives.Ints;
89 import com.google.common.util.concurrent.CheckedFuture;
91 public class MDSALUtil {
93 public static final String NODE_PREFIX = "openflow";
94 public static final int GROUP_WEIGHT = 0;
95 public static final long WATCH_PORT = 0xffffffffL;
96 public static final long WATCH_GROUP = 0xffffffffL;
97 public static final String SEPARATOR = ":";
98 private static final Buckets EMPTY_Buckets = new BucketsBuilder().build();
99 private static final Instructions EMPTY_Instructions = new InstructionsBuilder().setInstruction(
100 new ArrayList<Instruction>()).build();
101 private static final Match EMPTY_Matches = new MatchBuilder().build();
102 private static final Logger logger = LoggerFactory.getLogger(MDSALUtil.class);
104 public static FlowEntity buildFlowEntity(BigInteger dpnId, short tableId, String flowId, int priority, String flowName,
105 int idleTimeOut, int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
106 List<InstructionInfo> listInstructionInfo) {
108 FlowEntity flowEntity = new FlowEntity(dpnId);
110 flowEntity.setTableId(tableId);
111 flowEntity.setFlowId(flowId);
112 flowEntity.setPriority(priority);
113 flowEntity.setFlowName(flowName);
114 flowEntity.setIdleTimeOut(idleTimeOut);
115 flowEntity.setHardTimeOut(hardTimeOut);
116 flowEntity.setCookie(cookie);
117 flowEntity.setMatchInfoList(listMatchInfo);
118 flowEntity.setInstructionInfoList(listInstructionInfo);
123 // TODO: CHECK IF THIS IS USED
124 public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
125 int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo, List<InstructionInfo> listInstructionInfo) {
126 return MDSALUtil.buildFlow(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie,
127 listMatchInfo, listInstructionInfo, true);
130 public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
131 int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
132 List<InstructionInfo> listInstructionInfo, boolean isStrict) {
133 FlowKey key = new FlowKey(new FlowId(flowId));
134 return new FlowBuilder().setMatch(buildMatches(listMatchInfo)).setKey(key)
135 .setPriority(Integer.valueOf(priority)).setInstructions(buildInstructions(listInstructionInfo))
136 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
137 .setFlowName(flowName).setTableId(Short.valueOf(tableId)).setStrict(isStrict)
138 .setCookie(new FlowCookie(cookie)).build();
141 public static Flow buildFlowNew(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
142 int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo, List<Instruction> listInstructionInfo) {
143 return MDSALUtil.buildFlowNew(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie,
144 listMatchInfo, listInstructionInfo, true);
147 private static Flow buildFlowNew(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
148 int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
149 List<Instruction> listInstructionInfo, boolean isStrict) {
150 FlowKey key = new FlowKey(new FlowId(flowId));
151 return new FlowBuilder().setMatch(buildMatches(listMatchInfo)).setKey(key)
152 .setPriority(Integer.valueOf(priority)).setInstructions(new InstructionsBuilder().setInstruction(listInstructionInfo).build())
153 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
154 .setFlowName(flowName).setTableId(Short.valueOf(tableId)).setStrict(isStrict)
155 .setCookie(new FlowCookie(cookie)).build();
158 public static GroupEntity buildGroupEntity(BigInteger dpnId, long groupId, String groupName, GroupTypes groupType,
159 List<BucketInfo> listBucketInfo) {
161 GroupEntity groupEntity = new GroupEntity(dpnId);
163 groupEntity.setGroupId(groupId);
164 groupEntity.setGroupName(groupName);
165 groupEntity.setGroupType(groupType);
166 groupEntity.setBucketInfoList(listBucketInfo);
171 public static Group buildGroup(long groupId, String groupName, GroupTypes groupType, Buckets buckets) {
172 GroupId groupIdentifier = new GroupId(groupId);
173 return new GroupBuilder().setGroupId(groupIdentifier).setKey(new GroupKey(groupIdentifier)).setGroupName(groupName)
174 .setGroupType(groupType).setBuckets(buckets).build();
177 public static TransmitPacketInput getPacketOutDefault(List<ActionInfo> actionInfos, byte[] payload, BigInteger dpnId) {
178 return new TransmitPacketInputBuilder()
179 .setAction(buildActions(actionInfos))
182 new NodeRef(InstanceIdentifier.builder(Nodes.class)
183 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
184 .setIngress(getDefaultNodeConnRef(dpnId)).setEgress(getDefaultNodeConnRef(dpnId)).build();
187 public static TransmitPacketInput getPacketOut(List<ActionInfo> actionInfos, byte[] payload, long dpnId,
188 NodeConnectorRef ingress) {
189 return new TransmitPacketInputBuilder()
190 .setAction(buildActions(actionInfos))
193 new NodeRef(InstanceIdentifier.builder(Nodes.class)
194 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
195 .setIngress(ingress).setEgress(ingress).build();
198 public static List<Action> buildActions(List<ActionInfo> actions) {
199 List<Action> actionsList = new ArrayList<Action>();
200 for (ActionInfo actionInfo : actions) {
201 actionsList.add(actionInfo.buildAction());
206 public static String longToIp(long ip, long mask) {
207 StringBuilder sb = new StringBuilder(15);
208 Joiner joiner = Joiner.on('.');
210 joiner.appendTo(sb, Bytes.asList(Ints.toByteArray((int) ip)));
212 sb.append("/" + mask);
214 return sb.toString();
218 public static Bucket buildBucket(List<Action> actionsList, int weight, int bucketId, long watchPort, long watchGroup) {
219 return new BucketBuilder().setAction(actionsList).setWeight(weight)
220 .setWatchGroup(watchGroup).setWatchPort(watchPort).setBucketId(new BucketId(Long.valueOf(bucketId))).setKey(new BucketKey(new BucketId(Long.valueOf(bucketId)))).build();
224 public static Buckets buildBucketLists(List<Bucket> bucketList) {
225 return new BucketsBuilder().setBucket(bucketList).build();
228 protected static Buckets buildBuckets(List<BucketInfo> listBucketInfo) {
230 if (listBucketInfo != null) {
231 BucketsBuilder bucketsBuilder = new BucketsBuilder();
232 List<Bucket> bucketList = new ArrayList<Bucket>();
234 for (BucketInfo bucketInfo : listBucketInfo) {
235 BucketBuilder bucketBuilder = new BucketBuilder();
236 List<Action> actionsList = new ArrayList<Action>();
238 bucketInfo.buildAndAddActions(actionsList);
239 bucketBuilder.setAction(actionsList);
240 bucketBuilder.setWeight(bucketInfo.getWeight());
241 bucketBuilder.setBucketId(new BucketId(i++));
242 bucketBuilder.setWeight(bucketInfo.getWeight()).setWatchPort(bucketInfo.getWatchPort())
243 .setWatchGroup(bucketInfo.getWatchGroup());
244 bucketList.add(bucketBuilder.build());
247 bucketsBuilder.setBucket(bucketList);
248 return bucketsBuilder.build();
251 return EMPTY_Buckets;
254 protected static Instructions buildInstructions(List<InstructionInfo> listInstructionInfo) {
255 if (listInstructionInfo != null) {
256 List<Instruction> instructions = new ArrayList<Instruction>();
257 int instructionKey = 0;
259 for (InstructionInfo instructionInfo : listInstructionInfo) {
260 instructions.add(instructionInfo.buildInstruction(instructionKey));
264 return new InstructionsBuilder().setInstruction(instructions).build();
267 return EMPTY_Instructions;
270 public static Match buildMatches(List<MatchInfo> listMatchInfo) {
271 if (listMatchInfo != null) {
272 MatchBuilder matchBuilder = new MatchBuilder();
273 Map<Class<?>, Object> mapMatchBuilder = new HashMap<Class<?>, Object>();
275 for (MatchInfo matchInfo : listMatchInfo) {
276 matchInfo.createInnerMatchBuilder(mapMatchBuilder);
279 for (MatchInfo matchInfo : listMatchInfo) {
280 matchInfo.setMatch(matchBuilder, mapMatchBuilder);
283 return matchBuilder.build();
286 return EMPTY_Matches;
289 // TODO: Check the port const
290 public static NodeConnectorRef getDefaultNodeConnRef(BigInteger nDpId) {
291 return getNodeConnRef(NODE_PREFIX + SEPARATOR + nDpId, "0xfffffffd");
294 public static NodeConnectorRef getNodeConnRef(BigInteger nDpId, String port) {
295 return getNodeConnRef(NODE_PREFIX + SEPARATOR + nDpId, port);
298 public static NodeConnectorRef getNodeConnRef(String sNodeId, String port) {
299 String sNodeConnectorKey;
303 NodeConnectorId nodeConnectorId;
304 NodeConnectorKey nodeConnectorKey;
305 InstanceIdentifierBuilder<Nodes> nodesInstanceIdentifierBuilder;
306 InstanceIdentifierBuilder<Node> nodeInstanceIdentifierBuilder;
307 InstanceIdentifierBuilder<NodeConnector> nodeConnectorInstanceIdentifierBuilder;
308 InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifier;
309 NodeConnectorRef nodeConnectorRef;
311 sbTmp = new StringBuilder();
313 sbTmp.append(sNodeId);
314 sbTmp.append(SEPARATOR);
317 sNodeConnectorKey = sbTmp.toString();
318 nodeConnectorId = new NodeConnectorId(sNodeConnectorKey);
319 nodeConnectorKey = new NodeConnectorKey(nodeConnectorId);
321 nodeId = new NodeId(sNodeId);
322 nodeKey = new NodeKey(nodeId);
324 nodesInstanceIdentifierBuilder = InstanceIdentifier.<Nodes> builder(Nodes.class);
325 nodeInstanceIdentifierBuilder = nodesInstanceIdentifierBuilder.<Node, NodeKey> child(Node.class, nodeKey);
326 nodeConnectorInstanceIdentifierBuilder = nodeInstanceIdentifierBuilder.<NodeConnector, NodeConnectorKey> child(
327 NodeConnector.class, nodeConnectorKey);
328 nodeConnectorInstanceIdentifier = nodeConnectorInstanceIdentifierBuilder.toInstance();
329 nodeConnectorRef = new NodeConnectorRef(nodeConnectorInstanceIdentifier);
330 return nodeConnectorRef;
333 public static BigInteger getDpnIdFromNodeName(NodeId nodeId) {
334 return getDpnIdFromNodeName(nodeId.getValue());
337 public static BigInteger getDpnIdFromNodeName(String sMdsalNodeName) {
338 String sDpId = sMdsalNodeName.substring(sMdsalNodeName.lastIndexOf(":") + 1);
339 return new BigInteger(sDpId);
342 public static long getOfPortNumberFromPortName(NodeConnectorId nodeConnectorId) {
343 return getOfPortNumberFromPortName(nodeConnectorId.getValue());
346 public static long getDpnIdFromPortName(NodeConnectorId nodeConnectorId) {
347 String ofPortName = nodeConnectorId.getValue();
348 return Long.parseLong(ofPortName.substring(ofPortName.indexOf(":")+1,
349 ofPortName.lastIndexOf(":")));
352 public static long getOfPortNumberFromPortName(String sMdsalPortName) {
353 String sPortNumber = sMdsalPortName.substring(sMdsalPortName.lastIndexOf(":") + 1);
354 return Long.parseLong(sPortNumber);
357 public static TransmitPacketInput getPacketOut(List<ActionInfo> actionInfos, byte[] payload, BigInteger dpnId,
358 NodeConnectorRef nodeConnRef) {
359 // TODO Auto-generated method stub
363 public static Instruction buildAndGetPopVlanActionInstruction(int actionKey, int instructionKey) {
364 Action popVlanAction = new ActionBuilder().setAction(
365 new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
366 .setKey(new ActionKey(actionKey)).build();
367 List<Action> listAction = new ArrayList<Action> ();
368 listAction.add(popVlanAction);
369 ApplyActions applyActions = new ApplyActionsBuilder().setAction(listAction).build();
370 ApplyActionsCase applyActionsCase = new ApplyActionsCaseBuilder().setApplyActions(applyActions).build();
371 InstructionBuilder instructionBuilder = new InstructionBuilder();
373 instructionBuilder.setInstruction(applyActionsCase);
374 instructionBuilder.setKey(new InstructionKey(instructionKey));
375 return instructionBuilder.build();
378 public static Action buildAction(int actionKey, int instruction) {
379 return new ActionBuilder().setAction(
380 new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
381 .setKey(new ActionKey(actionKey)).build();
384 public static Instruction buildAndGetWriteMetadaInstruction(BigInteger metadata,
385 BigInteger mask, int instructionKey) {
386 return new InstructionBuilder()
388 new WriteMetadataCaseBuilder().setWriteMetadata(
389 new WriteMetadataBuilder().setMetadata(metadata).setMetadataMask(mask).build())
390 .build()).setKey(new InstructionKey(instructionKey)).build();
393 public static Instruction buildAndGetGotoTableInstruction(short tableId, int instructionKey) {
394 return new InstructionBuilder()
396 new GoToTableCaseBuilder().setGoToTable(
397 new GoToTableBuilder().setTableId(tableId).build()).build())
398 .setKey(new InstructionKey(instructionKey)).build();
401 public static <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
402 InstanceIdentifier<T> path, DataBroker broker) {
404 ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
406 Optional<T> result = Optional.absent();
408 result = tx.read(datastoreType, path).get();
409 } catch (Exception e) {
410 logger.error("An error occured while reading data from the path {} with the exception {}", path, e);
415 public static <T extends DataObject> Optional<T> read(DataBroker broker,
416 LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
418 ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
420 Optional<T> result = Optional.absent();
422 result = tx.read(datastoreType, path).get();
423 } catch (Exception e) {
424 throw new RuntimeException(e);
429 public static <T extends DataObject> void syncWrite(DataBroker broker,
430 LogicalDatastoreType datastoreType, InstanceIdentifier<T> path,
432 WriteTransaction tx = broker.newWriteOnlyTransaction();
433 tx.put(datastoreType, path, data, true);
434 CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
437 } catch (InterruptedException | ExecutionException e) {
438 logger.error("Error writing to datastore (path, data) : ({}, {})", path, data);
439 throw new RuntimeException(e.getMessage());
443 public static <T extends DataObject> void syncUpdate(DataBroker broker,
444 LogicalDatastoreType datastoreType, InstanceIdentifier<T> path,
446 WriteTransaction tx = broker.newWriteOnlyTransaction();
447 tx.merge(datastoreType, path, data, true);
448 CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
451 } catch (InterruptedException | ExecutionException e) {
452 logger.error("Error writing to datastore (path, data) : ({}, {})", path, data);
453 throw new RuntimeException(e.getMessage());
457 public static <T extends DataObject> void syncDelete(DataBroker broker,
458 LogicalDatastoreType datastoreType, InstanceIdentifier<T> obj) {
459 WriteTransaction tx = broker.newWriteOnlyTransaction();
460 tx.delete(datastoreType, obj);
461 CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
464 } catch (InterruptedException | ExecutionException e) {
465 logger.error("Error deleting from datastore (path) : ({})", obj);
466 throw new RuntimeException(e.getMessage());
470 public static byte[] getMacAddressForNodeConnector(DataBroker broker,
471 InstanceIdentifier<NodeConnector> nodeConnectorId) {
472 Optional<NodeConnector> optNc = MDSALDataStoreUtils.read(broker,
473 LogicalDatastoreType.OPERATIONAL, nodeConnectorId);
474 if(optNc.isPresent()) {
475 NodeConnector nc = optNc.get();
476 FlowCapableNodeConnector fcnc = nc.getAugmentation(FlowCapableNodeConnector.class);
477 MacAddress macAddress = fcnc.getHardwareAddress();
478 return HexEncode.bytesFromHexString(macAddress.getValue());
483 public static NodeId getNodeIdFromNodeConnectorId(NodeConnectorId ncId) {
484 return new NodeId(ncId.getValue().substring(0,
485 ncId.getValue().lastIndexOf(":")));
488 public static String getInterfaceName(NodeConnectorRef ref, DataBroker dataBroker) {
489 NodeConnectorId nodeConnectorId = getNodeConnectorId(dataBroker, ref);
490 NodeId nodeId = getNodeIdFromNodeConnectorId(nodeConnectorId);
491 InstanceIdentifier<NodeConnector> ncIdentifier = InstanceIdentifier
492 .builder(Nodes.class)
493 .child(Node.class, new NodeKey(nodeId))
494 .child(NodeConnector.class,
495 new NodeConnectorKey(nodeConnectorId)).build();
497 Optional<NodeConnector> nodeConnectorOptional = read(
499 LogicalDatastoreType.OPERATIONAL, ncIdentifier);
500 if (!nodeConnectorOptional.isPresent()) {
503 NodeConnector nc = nodeConnectorOptional.get();
504 FlowCapableNodeConnector fc = nc
505 .getAugmentation(FlowCapableNodeConnector.class);
509 public static NodeConnectorId getNodeConnectorId(DataBroker dataBroker,
510 NodeConnectorRef ref) {
511 Optional<NodeConnector> nc = (Optional<NodeConnector>) read(
513 LogicalDatastoreType.OPERATIONAL, ref.getValue());
515 return nc.get().getId();
520 public static TransmitPacketInput getPacketOut(List<Action> actions, byte[] payload, BigInteger dpnId) {
521 NodeConnectorRef ncRef = getDefaultNodeConnRef(dpnId);
522 return new TransmitPacketInputBuilder()
526 new NodeRef(InstanceIdentifier.builder(Nodes.class)
527 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
528 .setIngress(ncRef).setEgress(ncRef).build();