Upgrade ietf-{inet,yang}-types to 2013-07-15
[vpnservice.git] / mdsalutil / mdsalutil-api / src / main / java / org / opendaylight / vpnservice / mdsalutil / MDSALUtil.java
1 /*
2  * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.vpnservice.mdsalutil;
10
11 import java.math.BigInteger;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.concurrent.ConcurrentHashMap;
17 import java.util.concurrent.ExecutionException;
18 import java.util.concurrent.LinkedBlockingQueue;
19
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.rev130715.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.SetFieldCaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCase;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActions;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.actions._case.WriteActions;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.actions._case.WriteActionsBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadataBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
79 import org.opendaylight.yangtools.yang.binding.DataObject;
80 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
81 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
82 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
83 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
84 import org.slf4j.Logger;
85 import org.slf4j.LoggerFactory;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
87 import org.opendaylight.controller.liblldp.HexEncode;
88
89 import com.google.common.base.Joiner;
90 import com.google.common.base.Optional;
91 import com.google.common.primitives.Bytes;
92 import com.google.common.primitives.Ints;
93 import com.google.common.util.concurrent.CheckedFuture;
94
95 public class MDSALUtil {
96
97     public enum MdsalOp {  CREATION_OP, UPDATE_OP, REMOVAL_OP };
98
99     public static final String NODE_PREFIX = "openflow";
100     public static final int GROUP_WEIGHT = 0;
101     public static final long WATCH_PORT = 0xffffffffL;
102     public static final long WATCH_GROUP = 0xffffffffL;
103     public static final String SEPARATOR = ":";
104     private static final Buckets EMPTY_Buckets = new BucketsBuilder().build();
105     private static final Instructions EMPTY_Instructions = new InstructionsBuilder().setInstruction(
106             new ArrayList<Instruction>()).build();
107     private static final Match EMPTY_Matches = new MatchBuilder().build();
108     private static final Logger logger = LoggerFactory.getLogger(MDSALUtil.class);
109
110     public static FlowEntity buildFlowEntity(BigInteger dpnId, short tableId, String flowId, int priority, String flowName,
111             int idleTimeOut, int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
112             List<InstructionInfo> listInstructionInfo) {
113
114         FlowEntity flowEntity = new FlowEntity(dpnId);
115
116         flowEntity.setTableId(tableId);
117         flowEntity.setFlowId(flowId);
118         flowEntity.setPriority(priority);
119         flowEntity.setFlowName(flowName);
120         flowEntity.setIdleTimeOut(idleTimeOut);
121         flowEntity.setHardTimeOut(hardTimeOut);
122         flowEntity.setCookie(cookie);
123         flowEntity.setMatchInfoList(listMatchInfo);
124         flowEntity.setInstructionInfoList(listInstructionInfo);
125
126         return flowEntity;
127     }
128
129     // TODO: CHECK IF THIS IS USED
130     public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
131             int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo, List<InstructionInfo> listInstructionInfo) {
132         return MDSALUtil.buildFlow(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie,
133                 listMatchInfo, listInstructionInfo, true);
134     }
135
136     public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
137             int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
138             List<InstructionInfo> listInstructionInfo, boolean isStrict) {
139         FlowKey key = new FlowKey(new FlowId(flowId));
140         return new FlowBuilder().setMatch(buildMatches(listMatchInfo)).setKey(key)
141                 .setPriority(Integer.valueOf(priority)).setInstructions(buildInstructions(listInstructionInfo))
142                 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
143                 .setFlowName(flowName).setTableId(Short.valueOf(tableId)).setStrict(isStrict)
144                 .setCookie(new FlowCookie(cookie)).build();
145     }
146
147     public static Flow buildFlow(short tableId, String flowId) {
148         return new FlowBuilder().setTableId(tableId).setId(new FlowId(flowId)).build();
149     }
150
151     public static Flow buildFlowNew(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
152                                  int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo, List<Instruction> listInstructionInfo) {
153         return MDSALUtil.buildFlowNew(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie,
154                 listMatchInfo, listInstructionInfo, true);
155     }
156
157     private static Flow buildFlowNew(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
158                                   int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
159                                   List<Instruction> listInstructionInfo, boolean isStrict) {
160         FlowKey key = new FlowKey(new FlowId(flowId));
161         return new FlowBuilder().setMatch(buildMatches(listMatchInfo)).setKey(key)
162                 .setPriority(Integer.valueOf(priority)).setInstructions(new InstructionsBuilder().setInstruction(listInstructionInfo).build())
163                 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
164                 .setFlowName(flowName).setTableId(Short.valueOf(tableId)).setStrict(isStrict)
165                 .setCookie(new FlowCookie(cookie)).build();
166     }
167
168     public static GroupEntity buildGroupEntity(BigInteger dpnId, long groupId, String groupName, GroupTypes groupType,
169             List<BucketInfo> listBucketInfo) {
170
171         GroupEntity groupEntity = new GroupEntity(dpnId);
172
173         groupEntity.setGroupId(groupId);
174         groupEntity.setGroupName(groupName);
175         groupEntity.setGroupType(groupType);
176         groupEntity.setBucketInfoList(listBucketInfo);
177
178         return groupEntity;
179     }
180
181     public static Group buildGroup(long groupId, String groupName, GroupTypes groupType, Buckets buckets) {
182         GroupId groupIdentifier = new GroupId(groupId);
183         return new GroupBuilder().setGroupId(groupIdentifier).setKey(new GroupKey(groupIdentifier)).setGroupName(groupName)
184                 .setGroupType(groupType).setBuckets(buckets).build();
185     }
186
187     public static TransmitPacketInput getPacketOutDefault(List<ActionInfo> actionInfos, byte[] payload, BigInteger dpnId) {
188         return new TransmitPacketInputBuilder()
189                 .setAction(buildActions(actionInfos))
190                 .setPayload(payload)
191                 .setNode(
192                         new NodeRef(InstanceIdentifier.builder(Nodes.class)
193                                 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
194                 .setIngress(getDefaultNodeConnRef(dpnId)).setEgress(getDefaultNodeConnRef(dpnId)).build();
195     }
196
197     public static TransmitPacketInput getPacketOut(List<ActionInfo> actionInfos, byte[] payload, long dpnId,
198             NodeConnectorRef ingress) {
199         return new TransmitPacketInputBuilder()
200                 .setAction(buildActions(actionInfos))
201                 .setPayload(payload)
202                 .setNode(
203                         new NodeRef(InstanceIdentifier.builder(Nodes.class)
204                                 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
205                 .setIngress(ingress).setEgress(ingress).build();
206     }
207
208     public static Action retrieveSetTunnelIdAction(BigInteger tunnelId, int actionKey) {
209         return new ActionBuilder().setAction(
210                 new SetFieldCaseBuilder().setSetField(new SetFieldBuilder().setTunnel(new TunnelBuilder()
211                 .setTunnelId(tunnelId).build()).build())
212                 .build()).setKey(new ActionKey(actionKey)).build();
213     }
214
215     public static List<Action> buildActions(List<ActionInfo> actions) {
216         List<Action> actionsList = new ArrayList<Action>();
217         for (ActionInfo actionInfo : actions) {
218             actionsList.add(actionInfo.buildAction());
219         }
220         return actionsList;
221     }
222
223     public static String longToIp(long ip, long mask) {
224         StringBuilder sb = new StringBuilder(15);
225         Joiner joiner = Joiner.on('.');
226
227         joiner.appendTo(sb, Bytes.asList(Ints.toByteArray((int) ip)));
228
229         sb.append("/" + mask);
230
231         return sb.toString();
232     }
233
234
235     public static Bucket buildBucket(List<Action> actionsList, int weight, int bucketId, long watchPort, long watchGroup) {
236         return  new BucketBuilder().setAction(actionsList).setWeight(weight)
237                 .setWatchGroup(watchGroup).setWatchPort(watchPort).setBucketId(new BucketId(Long.valueOf(bucketId))).setKey(new BucketKey(new BucketId(Long.valueOf(bucketId)))).build();
238
239     }
240
241     public static Buckets buildBucketLists(List<Bucket> bucketList) {
242         return new BucketsBuilder().setBucket(bucketList).build();
243     }
244
245     protected static Buckets buildBuckets(List<BucketInfo> listBucketInfo) {
246         long i = 0;
247         if (listBucketInfo != null) {
248             BucketsBuilder bucketsBuilder = new BucketsBuilder();
249             List<Bucket> bucketList = new ArrayList<Bucket>();
250
251             for (BucketInfo bucketInfo : listBucketInfo) {
252                 BucketBuilder bucketBuilder = new BucketBuilder();
253                 List<Action> actionsList = new ArrayList<Action>();
254
255                 bucketInfo.buildAndAddActions(actionsList);
256                 bucketBuilder.setAction(actionsList);
257                 bucketBuilder.setWeight(bucketInfo.getWeight());
258                 bucketBuilder.setBucketId(new BucketId(i++));
259                 bucketBuilder.setWeight(bucketInfo.getWeight()).setWatchPort(bucketInfo.getWatchPort())
260                         .setWatchGroup(bucketInfo.getWatchGroup());
261                 bucketList.add(bucketBuilder.build());
262             }
263
264             bucketsBuilder.setBucket(bucketList);
265             return bucketsBuilder.build();
266         }
267
268         return EMPTY_Buckets;
269     }
270
271     public static Instructions buildInstructions(List<InstructionInfo> listInstructionInfo) {
272         if (listInstructionInfo != null) {
273             List<Instruction> instructions = new ArrayList<Instruction>();
274             int instructionKey = 0;
275
276             for (InstructionInfo instructionInfo : listInstructionInfo) {
277                 instructions.add(instructionInfo.buildInstruction(instructionKey));
278                 instructionKey++;
279             }
280
281             return new InstructionsBuilder().setInstruction(instructions).build();
282         }
283
284         return EMPTY_Instructions;
285     }
286
287     public static Match buildMatches(List<MatchInfo> listMatchInfo) {
288         if (listMatchInfo != null) {
289             MatchBuilder matchBuilder = new MatchBuilder();
290             Map<Class<?>, Object> mapMatchBuilder = new HashMap<Class<?>, Object>();
291
292             for (MatchInfo matchInfo : listMatchInfo) {
293                 matchInfo.createInnerMatchBuilder(mapMatchBuilder);
294             }
295
296             for (MatchInfo matchInfo : listMatchInfo) {
297                 matchInfo.setMatch(matchBuilder, mapMatchBuilder);
298             }
299
300             return matchBuilder.build();
301         }
302
303         return EMPTY_Matches;
304     }
305
306     // TODO: Check the port const
307     public static NodeConnectorRef getDefaultNodeConnRef(BigInteger nDpId) {
308         return getNodeConnRef(NODE_PREFIX + SEPARATOR + nDpId, "0xfffffffd");
309     }
310
311     public static NodeConnectorRef getNodeConnRef(BigInteger nDpId, String port) {
312         return getNodeConnRef(NODE_PREFIX + SEPARATOR + nDpId, port);
313     }
314
315     public static NodeConnectorRef getNodeConnRef(String sNodeId, String port) {
316         String sNodeConnectorKey;
317         StringBuilder sbTmp;
318         NodeId nodeId;
319         NodeKey nodeKey;
320         NodeConnectorId nodeConnectorId;
321         NodeConnectorKey nodeConnectorKey;
322         InstanceIdentifierBuilder<Nodes> nodesInstanceIdentifierBuilder;
323         InstanceIdentifierBuilder<Node> nodeInstanceIdentifierBuilder;
324         InstanceIdentifierBuilder<NodeConnector> nodeConnectorInstanceIdentifierBuilder;
325         InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifier;
326         NodeConnectorRef nodeConnectorRef;
327
328         sbTmp = new StringBuilder();
329
330         sbTmp.append(sNodeId);
331         sbTmp.append(SEPARATOR);
332         sbTmp.append(port);
333
334         sNodeConnectorKey = sbTmp.toString();
335         nodeConnectorId = new NodeConnectorId(sNodeConnectorKey);
336         nodeConnectorKey = new NodeConnectorKey(nodeConnectorId);
337
338         nodeId = new NodeId(sNodeId);
339         nodeKey = new NodeKey(nodeId);
340
341         nodesInstanceIdentifierBuilder = InstanceIdentifier.<Nodes> builder(Nodes.class);
342         nodeInstanceIdentifierBuilder = nodesInstanceIdentifierBuilder.<Node, NodeKey> child(Node.class, nodeKey);
343         nodeConnectorInstanceIdentifierBuilder = nodeInstanceIdentifierBuilder.<NodeConnector, NodeConnectorKey> child(
344                 NodeConnector.class, nodeConnectorKey);
345         nodeConnectorInstanceIdentifier = nodeConnectorInstanceIdentifierBuilder.toInstance();
346         nodeConnectorRef = new NodeConnectorRef(nodeConnectorInstanceIdentifier);
347         return nodeConnectorRef;
348     }
349
350     public static BigInteger getDpnIdFromNodeName(NodeId nodeId) {
351         return getDpnIdFromNodeName(nodeId.getValue());
352     }
353
354     public static BigInteger getDpnIdFromNodeName(String sMdsalNodeName) {
355         String sDpId = sMdsalNodeName.substring(sMdsalNodeName.lastIndexOf(":") + 1);
356         return new BigInteger(sDpId);
357     }
358
359     public static long getOfPortNumberFromPortName(NodeConnectorId nodeConnectorId) {
360         return getOfPortNumberFromPortName(nodeConnectorId.getValue());
361     }
362
363     public static long getDpnIdFromPortName(NodeConnectorId nodeConnectorId) {
364         String ofPortName = nodeConnectorId.getValue();
365         return Long.parseLong(ofPortName.substring(ofPortName.indexOf(":")+1,
366                 ofPortName.lastIndexOf(":")));
367     }
368
369     public static long getOfPortNumberFromPortName(String sMdsalPortName) {
370         String sPortNumber = sMdsalPortName.substring(sMdsalPortName.lastIndexOf(":") + 1);
371         return Long.parseLong(sPortNumber);
372     }
373
374     public static TransmitPacketInput getPacketOut(List<ActionInfo> actionInfos, byte[] payload, BigInteger dpnId,
375                     NodeConnectorRef nodeConnRef) {
376         // TODO Auto-generated method stub
377         return null;
378     }
379
380     public static Instruction buildAndGetPopVlanActionInstruction(int actionKey, int instructionKey) {
381         Action popVlanAction = new ActionBuilder().setAction(
382                 new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
383                 .setKey(new ActionKey(actionKey)).build();
384         List<Action> listAction = new ArrayList<Action> ();
385         listAction.add(popVlanAction);
386         return buildApplyActionsInstruction(listAction, instructionKey);
387     }
388
389     public static Instruction buildApplyActionsInstruction(List<Action> actions) {
390         return buildApplyActionsInstruction(actions, 0);
391     }
392
393     public static Instruction buildApplyActionsInstruction(List<Action> listAction, int instructionKey) {
394         ApplyActions applyActions = new ApplyActionsBuilder().setAction(listAction).build();
395         ApplyActionsCase applyActionsCase = new ApplyActionsCaseBuilder().setApplyActions(applyActions).build();
396         InstructionBuilder instructionBuilder = new InstructionBuilder();
397
398         instructionBuilder.setInstruction(applyActionsCase);
399         instructionBuilder.setKey(new InstructionKey(instructionKey));
400         return instructionBuilder.build();
401     }
402
403     public static List<Instruction> buildInstructionsDrop() {
404         return buildInstructionsDrop(0);
405     }
406
407     public static List<Instruction> buildInstructionsDrop(int instructionKey) {
408         List<Instruction> mkInstructions = new ArrayList<Instruction>();
409         List <Action> actionsInfos = new ArrayList <Action> ();
410         actionsInfos.add(new ActionInfo(ActionType.drop_action, new String[]{}).buildAction());
411         mkInstructions.add(getWriteActionsInstruction(actionsInfos, instructionKey));
412         return mkInstructions;
413     }
414
415
416     public static Instruction getWriteActionsInstruction(List<Action> listAction, int instructionKey) {
417         WriteActions writeActions = new WriteActionsBuilder().setAction(listAction).build();
418         WriteActionsCase writeActionsCase = new WriteActionsCaseBuilder().setWriteActions(writeActions).build();
419         InstructionBuilder instructionBuilder = new InstructionBuilder();
420
421         instructionBuilder.setInstruction(writeActionsCase);
422         instructionBuilder.setKey(new InstructionKey(instructionKey));
423         return instructionBuilder.build();
424     }
425
426     public static Action buildAction(int actionKey, int instruction) {
427         return new ActionBuilder().setAction(
428                 new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
429                 .setKey(new ActionKey(actionKey)).build();
430     }
431
432     public static Instruction buildAndGetWriteMetadaInstruction(BigInteger metadata,
433                                                                 BigInteger mask, int instructionKey) {
434         return new InstructionBuilder()
435                 .setInstruction(
436                         new WriteMetadataCaseBuilder().setWriteMetadata(
437                                 new WriteMetadataBuilder().setMetadata(metadata).setMetadataMask(mask).build())
438                                 .build()).setKey(new InstructionKey(instructionKey)).build();
439     }
440
441     public static Instruction buildAndGetGotoTableInstruction(short tableId, int instructionKey) {
442         return new InstructionBuilder()
443             .setInstruction(
444                 new GoToTableCaseBuilder().setGoToTable(
445                     new GoToTableBuilder().setTableId(tableId).build()).build())
446             .setKey(new InstructionKey(instructionKey)).build();
447     }
448
449     public static <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
450                                                           InstanceIdentifier<T> path, DataBroker broker) {
451
452         ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
453
454         Optional<T> result = Optional.absent();
455         try {
456             result = tx.read(datastoreType, path).get();
457         } catch (Exception e) {
458             logger.error("An error occured while reading data from the path {} with the exception {}", path, e);
459         }
460         return result;
461     }
462
463     public static <T extends DataObject> Optional<T> read(DataBroker broker,
464                                                           LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
465
466         ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
467
468         Optional<T> result = Optional.absent();
469         try {
470             result = tx.read(datastoreType, path).get();
471         } catch (Exception e) {
472             throw new RuntimeException(e);
473         }
474         return result;
475     }
476
477     public static <T extends DataObject> void syncWrite(DataBroker broker,
478                                                         LogicalDatastoreType datastoreType, InstanceIdentifier<T> path,
479                                                         T data) {
480         WriteTransaction tx = broker.newWriteOnlyTransaction();
481         tx.put(datastoreType, path, data, true);
482         CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
483         try {
484             futures.get();
485         } catch (InterruptedException | ExecutionException e) {
486             logger.error("Error writing to datastore (path, data) : ({}, {})", path, data);
487             throw new RuntimeException(e.getMessage());
488         }
489     }
490
491     public static <T extends DataObject> void syncUpdate(DataBroker broker,
492                                                          LogicalDatastoreType datastoreType, InstanceIdentifier<T> path,
493                                                          T data) {
494         WriteTransaction tx = broker.newWriteOnlyTransaction();
495         tx.merge(datastoreType, path, data, true);
496         CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
497         try {
498             futures.get();
499         } catch (InterruptedException | ExecutionException e) {
500             logger.error("Error writing to datastore (path, data) : ({}, {})", path, data);
501             throw new RuntimeException(e.getMessage());
502         }
503     }
504
505     public static <T extends DataObject> void syncDelete(DataBroker broker,
506                                                          LogicalDatastoreType datastoreType, InstanceIdentifier<T> obj) {
507         WriteTransaction tx = broker.newWriteOnlyTransaction();
508         tx.delete(datastoreType, obj);
509         CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
510         try {
511             futures.get();
512         } catch (InterruptedException | ExecutionException e) {
513             logger.error("Error deleting from datastore (path) : ({})", obj);
514             throw new RuntimeException(e.getMessage());
515         }
516     }
517
518     public static byte[] getMacAddressForNodeConnector(DataBroker broker,
519             InstanceIdentifier<NodeConnector> nodeConnectorId)  {
520         Optional<NodeConnector> optNc = MDSALDataStoreUtils.read(broker,
521                 LogicalDatastoreType.OPERATIONAL, nodeConnectorId);
522         if(optNc.isPresent()) {
523             NodeConnector nc = optNc.get();
524             FlowCapableNodeConnector fcnc = nc.getAugmentation(FlowCapableNodeConnector.class);
525             MacAddress macAddress = fcnc.getHardwareAddress();
526             return HexEncode.bytesFromHexString(macAddress.getValue());
527         }
528         return null;
529     }
530
531     public static NodeId getNodeIdFromNodeConnectorId(NodeConnectorId ncId) {
532         return new NodeId(ncId.getValue().substring(0,
533                 ncId.getValue().lastIndexOf(":")));
534     }
535
536     public static String getInterfaceName(NodeConnectorRef ref, DataBroker dataBroker) {
537         NodeConnectorId nodeConnectorId = getNodeConnectorId(dataBroker, ref);
538         NodeId nodeId = getNodeIdFromNodeConnectorId(nodeConnectorId);
539         InstanceIdentifier<NodeConnector> ncIdentifier = InstanceIdentifier
540                 .builder(Nodes.class)
541                 .child(Node.class, new NodeKey(nodeId))
542                 .child(NodeConnector.class,
543                         new NodeConnectorKey(nodeConnectorId)).build();
544
545         Optional<NodeConnector> nodeConnectorOptional = read(
546                 dataBroker,
547                 LogicalDatastoreType.OPERATIONAL, ncIdentifier);
548         if (!nodeConnectorOptional.isPresent()) {
549             return null;
550         }
551         NodeConnector nc = nodeConnectorOptional.get();
552         FlowCapableNodeConnector fc = nc
553                 .getAugmentation(FlowCapableNodeConnector.class);
554         return fc.getName();
555     }
556
557     public static NodeConnectorId getNodeConnectorId(DataBroker dataBroker,
558             NodeConnectorRef ref) {
559         Optional<NodeConnector> nc = (Optional<NodeConnector>) read(
560                 dataBroker,
561                 LogicalDatastoreType.OPERATIONAL, ref.getValue());
562         if(nc.isPresent()){
563             return nc.get().getId();
564         }
565         return null;
566     }
567
568     public static TransmitPacketInput getPacketOut(List<Action> actions, byte[] payload, BigInteger dpnId) {
569         NodeConnectorRef ncRef = getDefaultNodeConnRef(dpnId);
570         return new TransmitPacketInputBuilder()
571                 .setAction(actions)
572                 .setPayload(payload)
573                 .setNode(
574                         new NodeRef(InstanceIdentifier.builder(Nodes.class)
575                                 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
576                 .setIngress(ncRef).setEgress(ncRef).build();
577     }
578
579 }
580