fea7e624f69b7a55f19556fc85371f114b0a9737
[vpnservice.git] / mdsalutil / mdsalutil-api / src / main / java / org / opendaylight / vpnservice / mdsalutil / MDSALUtil.java
1 /*
2  * Copyright (c) 2013 Ericsson AB.  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
10 package org.opendaylight.vpnservice.mdsalutil;
11
12 import java.math.BigInteger;
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.List;
16 import java.util.Map;
17 import java.util.concurrent.ConcurrentHashMap;
18 import java.util.concurrent.LinkedBlockingQueue;
19
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
53 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
54 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
55
56 import com.google.common.base.Joiner;
57 import com.google.common.primitives.Bytes;
58 import com.google.common.primitives.Ints;
59
60 public class MDSALUtil {
61
62     public static final String NODE_PREFIX = "openflow";
63     public static final String SEPARATOR = ":";
64     private static final Buckets EMPTY_Buckets = new BucketsBuilder().build();
65     private static final Instructions EMPTY_Instructions = new InstructionsBuilder().setInstruction(
66             new ArrayList<Instruction>()).build();
67     private static final Match EMPTY_Matches = new MatchBuilder().build();
68
69     public static FlowEntity buildFlowEntity(long dpnId, short tableId, String flowId, int priority, String flowName,
70             int idleTimeOut, int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
71             List<InstructionInfo> listInstructionInfo) {
72
73         FlowEntity flowEntity = new FlowEntity(dpnId);
74
75         flowEntity.setTableId(tableId);
76         flowEntity.setFlowId(flowId);
77         flowEntity.setPriority(priority);
78         flowEntity.setFlowName(flowName);
79         flowEntity.setIdleTimeOut(idleTimeOut);
80         flowEntity.setHardTimeOut(hardTimeOut);
81         flowEntity.setCookie(cookie);
82         flowEntity.setMatchInfoList(listMatchInfo);
83         flowEntity.setInstructionInfoList(listInstructionInfo);
84
85         return flowEntity;
86     }
87
88     // TODO: CHECK IF THIS IS USED
89     public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
90             int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo, List<InstructionInfo> listInstructionInfo) {
91         return MDSALUtil.buildFlow(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie,
92                 listMatchInfo, listInstructionInfo, true);
93     }
94
95     public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
96             int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
97             List<InstructionInfo> listInstructionInfo, boolean isStrict) {
98         FlowKey key = new FlowKey(new FlowId(flowId));
99         return new FlowBuilder().setMatch(buildMatches(listMatchInfo)).setKey(key)
100                 .setPriority(Integer.valueOf(priority)).setInstructions(buildInstructions(listInstructionInfo))
101                 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
102                 .setFlowName(flowName).setTableId(Short.valueOf(tableId)).setStrict(isStrict)
103                 .setCookie(new FlowCookie(cookie)).build();
104     }
105
106     public static GroupEntity buildGroupEntity(long dpnId, long groupId, String groupName, GroupTypes groupType,
107             List<BucketInfo> listBucketInfo) {
108
109         GroupEntity groupEntity = new GroupEntity(dpnId);
110
111         groupEntity.setGroupId(groupId);
112         groupEntity.setGroupName(groupName);
113         groupEntity.setGroupType(groupType);
114         groupEntity.setBucketInfoList(listBucketInfo);
115
116         return groupEntity;
117     }
118
119     public static TransmitPacketInput getPacketOutDefault(List<ActionInfo> actionInfos, byte[] payload, long dpnId) {
120         return new TransmitPacketInputBuilder()
121                 .setAction(buildActions(actionInfos))
122                 .setPayload(payload)
123                 .setNode(
124                         new NodeRef(InstanceIdentifier.builder(Nodes.class)
125                                 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
126                 .setIngress(getDefaultNodeConnRef(dpnId)).setEgress(getDefaultNodeConnRef(dpnId)).build();
127     }
128
129     public static TransmitPacketInput getPacketOut(List<ActionInfo> actionInfos, byte[] payload, long dpnId,
130             NodeConnectorRef ingress) {
131         return new TransmitPacketInputBuilder()
132                 .setAction(buildActions(actionInfos))
133                 .setPayload(payload)
134                 .setNode(
135                         new NodeRef(InstanceIdentifier.builder(Nodes.class)
136                                 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
137                 .setIngress(ingress).setEgress(ingress).build();
138     }
139
140     private static List<Action> buildActions(List<ActionInfo> actions) {
141         List<Action> actionsList = new ArrayList<Action>();
142         for (ActionInfo actionInfo : actions) {
143             actionsList.add(actionInfo.buildAction());
144         }
145         return actionsList;
146     }
147
148     public static String longToIp(long ip, long mask) {
149         StringBuilder sb = new StringBuilder(15);
150         Joiner joiner = Joiner.on('.');
151
152         joiner.appendTo(sb, Bytes.asList(Ints.toByteArray((int) ip)));
153
154         sb.append("/" + mask);
155
156         return sb.toString();
157     }
158
159     protected static Buckets buildBuckets(List<BucketInfo> listBucketInfo) {
160         long i = 0;
161         if (listBucketInfo != null) {
162             BucketsBuilder bucketsBuilder = new BucketsBuilder();
163             List<Bucket> bucketList = new ArrayList<Bucket>();
164
165             for (BucketInfo bucketInfo : listBucketInfo) {
166                 BucketBuilder bucketBuilder = new BucketBuilder();
167                 List<Action> actionsList = new ArrayList<Action>();
168
169                 bucketInfo.buildAndAddActions(actionsList);
170                 bucketBuilder.setAction(actionsList);
171                 bucketBuilder.setWeight(bucketInfo.getWeight());
172                 bucketBuilder.setBucketId(new BucketId(i++));
173                 bucketBuilder.setWeight(bucketInfo.getWeight()).setWatchPort(bucketInfo.getWatchPort())
174                         .setWatchGroup(bucketInfo.getWatchGroup());
175                 bucketList.add(bucketBuilder.build());
176             }
177
178             bucketsBuilder.setBucket(bucketList);
179             return bucketsBuilder.build();
180         }
181
182         return EMPTY_Buckets;
183     }
184
185     protected static Instructions buildInstructions(List<InstructionInfo> listInstructionInfo) {
186         if (listInstructionInfo != null) {
187             List<Instruction> instructions = new ArrayList<Instruction>();
188             int instructionKey = 0;
189
190             for (InstructionInfo instructionInfo : listInstructionInfo) {
191                 instructions.add(instructionInfo.buildInstruction(instructionKey));
192                 instructionKey++;
193             }
194
195             return new InstructionsBuilder().setInstruction(instructions).build();
196         }
197
198         return EMPTY_Instructions;
199     }
200
201     protected static Match buildMatches(List<MatchInfo> listMatchInfo) {
202         if (listMatchInfo != null) {
203             MatchBuilder matchBuilder = new MatchBuilder();
204             Map<Class<?>, Object> mapMatchBuilder = new HashMap<Class<?>, Object>();
205
206             for (MatchInfo matchInfo : listMatchInfo) {
207                 matchInfo.createInnerMatchBuilder(mapMatchBuilder);
208             }
209
210             for (MatchInfo matchInfo : listMatchInfo) {
211                 matchInfo.setMatch(matchBuilder, mapMatchBuilder);
212             }
213
214             return matchBuilder.build();
215         }
216
217         return EMPTY_Matches;
218     }
219
220     // TODO: Check the port const
221     public static NodeConnectorRef getDefaultNodeConnRef(long nDpId) {
222         return getNodeConnRef(NODE_PREFIX + SEPARATOR + nDpId, "0xfffffffd");
223     }
224
225     public static NodeConnectorRef getNodeConnRef(long nDpId, String port) {
226         return getNodeConnRef(NODE_PREFIX + SEPARATOR + nDpId, port);
227     }
228
229     public static NodeConnectorRef getNodeConnRef(String sNodeId, String port) {
230         String sNodeConnectorKey;
231         StringBuilder sbTmp;
232         NodeId nodeId;
233         NodeKey nodeKey;
234         NodeConnectorId nodeConnectorId;
235         NodeConnectorKey nodeConnectorKey;
236         InstanceIdentifierBuilder<Nodes> nodesInstanceIdentifierBuilder;
237         InstanceIdentifierBuilder<Node> nodeInstanceIdentifierBuilder;
238         InstanceIdentifierBuilder<NodeConnector> nodeConnectorInstanceIdentifierBuilder;
239         InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifier;
240         NodeConnectorRef nodeConnectorRef;
241
242         sbTmp = new StringBuilder();
243
244         sbTmp.append(sNodeId);
245         sbTmp.append(SEPARATOR);
246         sbTmp.append(port);
247
248         sNodeConnectorKey = sbTmp.toString();
249         nodeConnectorId = new NodeConnectorId(sNodeConnectorKey);
250         nodeConnectorKey = new NodeConnectorKey(nodeConnectorId);
251
252         nodeId = new NodeId(sNodeId);
253         nodeKey = new NodeKey(nodeId);
254
255         nodesInstanceIdentifierBuilder = InstanceIdentifier.<Nodes> builder(Nodes.class);
256         nodeInstanceIdentifierBuilder = nodesInstanceIdentifierBuilder.<Node, NodeKey> child(Node.class, nodeKey);
257         nodeConnectorInstanceIdentifierBuilder = nodeInstanceIdentifierBuilder.<NodeConnector, NodeConnectorKey> child(
258                 NodeConnector.class, nodeConnectorKey);
259         nodeConnectorInstanceIdentifier = nodeConnectorInstanceIdentifierBuilder.toInstance();
260         nodeConnectorRef = new NodeConnectorRef(nodeConnectorInstanceIdentifier);
261         return nodeConnectorRef;
262     }
263
264     public static long getDpnIdFromNodeName(NodeId nodeId) {
265         return getDpnIdFromNodeName(nodeId.getValue());
266     }
267
268     public static long getDpnIdFromNodeName(String sMdsalNodeName) {
269         String sDpId = sMdsalNodeName.substring(sMdsalNodeName.lastIndexOf(":") + 1);
270         return Long.parseLong(sDpId);
271     }
272
273     public static long getOfPortNumberFromPortName(NodeConnectorId nodeConnectorId) {
274         return getOfPortNumberFromPortName(nodeConnectorId.getValue());
275     }
276
277     public static long getOfPortNumberFromPortName(String sMdsalPortName) {
278         String sPortNumber = sMdsalPortName.substring(sMdsalPortName.lastIndexOf(":") + 1);
279         return Long.parseLong(sPortNumber);
280     }
281 }