Merge "Vpnmanager and fibmanager changes 1. Merge fib and nexthop manager 2. Integrat...
[vpnservice.git] / interfacemgr / interfacemgr-impl / src / main / java / org / opendaylight / vpnservice / interfacemgr / IfmUtil.java
1 /*
2  * Copyright (c) 2015 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 package org.opendaylight.vpnservice.interfacemgr;
9
10 import java.math.BigInteger;
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.concurrent.ExecutionException;
14 import java.util.concurrent.Future;
15
16 import com.google.common.base.Optional;
17 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
18 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
19 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCase;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadata;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdInputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdPools;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.ReleaseIdInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.ReleaseIdInputBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.id.pools.IdPool;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.id.pools.IdPoolKey;
39 import org.opendaylight.yangtools.yang.binding.DataObject;
40 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
41 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
42 import org.opendaylight.yangtools.yang.common.RpcResult;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46 public class IfmUtil {
47     private static final Logger LOG = LoggerFactory.getLogger(IfmUtil.class);
48     private static final int INVALID_ID = 0;
49     public static String getDpnFromNodeConnectorId(NodeConnectorId portId) {
50         /*
51          * NodeConnectorId is of form 'openflow:dpnid:portnum'
52          */
53         String[] split = portId.getValue().split(IfmConstants.OF_URI_SEPARATOR);
54         return split[1];
55     }
56
57     public static String getPortNoFromNodeConnectorId(NodeConnectorId portId) {
58         /*
59          * NodeConnectorId is of form 'openflow:dpnid:portnum'
60          */
61         String[] split = portId.getValue().split(IfmConstants.OF_URI_SEPARATOR);
62         return split[2];
63     }
64
65     public static NodeId buildDpnNodeId(BigInteger dpnId) {
66         return new NodeId(IfmConstants.OF_URI_PREFIX + dpnId);
67     }
68
69     public static InstanceIdentifier<Interface> buildId(String interfaceName) {
70         //TODO Make this generic and move to AbstractDataChangeListener or Utils.
71         InstanceIdentifierBuilder<Interface> idBuilder =
72                 InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey(interfaceName));
73         InstanceIdentifier<Interface> id = idBuilder.build();
74         return id;
75     }
76
77     public static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> buildStateInterfaceId(String interfaceName) {
78         InstanceIdentifierBuilder<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> idBuilder =
79                 InstanceIdentifier.builder(InterfacesState.class)
80                 .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.class,
81                         new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey(interfaceName));
82         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> id = idBuilder.build();
83         return id;
84     }
85
86     public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey getStateInterfaceKeyFromName(
87                     String name) {
88         return new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey(name);
89     }
90
91     public static InstanceIdentifier<IdPool> getPoolId(String poolName){
92         InstanceIdentifier.InstanceIdentifierBuilder<IdPool> idBuilder =
93                         InstanceIdentifier.builder(IdPools.class).child(IdPool.class, new IdPoolKey(poolName));
94         InstanceIdentifier<IdPool> id = idBuilder.build();
95         return id;
96     }
97
98     public static List<String> getPortNameAndSuffixFromInterfaceName(String intfName) {
99         List<String> strList = new ArrayList<>(2);
100         int index = intfName.indexOf(":");
101         if (index != -1) {
102             strList.add(0, intfName.substring(0, index));
103             strList.add(1, intfName.substring(index));
104         }
105         return strList;
106     }
107
108     public static List<String> getDpIdPortNameAndSuffixFromInterfaceName(String intfName) {
109         List<String> strList = new ArrayList<>(3);
110         int index1 = intfName.indexOf(":");
111         if (index1 != -1) {
112             int index2 = intfName.indexOf(":", index1 + 1 );
113             strList.add(0, intfName.substring(0, index1));
114             if (index2 != -1) {
115                 strList.add(1, intfName.substring(index1, index2));
116                 strList.add(2, intfName.substring(index2));
117             } else {
118                 strList.add(1, intfName.substring(index1));
119                 strList.add(2, "");
120             }
121         }
122         return strList;
123     }
124
125     public static <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
126                                                           InstanceIdentifier<T> path, DataBroker broker) {
127
128         ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
129
130         Optional<T> result = Optional.absent();
131         try {
132             result = tx.read(datastoreType, path).get();
133         } catch (Exception e) {
134             throw new RuntimeException(e);
135         }
136
137         return result;
138     }
139
140     public static NodeId getNodeIdFromNodeConnectorId(NodeConnectorId ncId) {
141         return new NodeId(ncId.getValue().substring(0,ncId.getValue().lastIndexOf(":")));
142     }
143
144     public static BigInteger[] mergeOpenflowMetadataWriteInstructions(List<Instruction> instructions) {
145         BigInteger metadata = new BigInteger("0", 16);
146         BigInteger metadataMask = new BigInteger("0", 16);
147         if (instructions != null && !instructions.isEmpty()) {
148             // check if metadata write instruction is present
149             for (Instruction instruction : instructions) {
150                 org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.Instruction actualInstruction = instruction.getInstruction();
151                 if (actualInstruction instanceof WriteMetadataCase) {
152                     WriteMetadataCase writeMetaDataInstruction = (WriteMetadataCase) actualInstruction ;
153                     WriteMetadata availableMetaData = writeMetaDataInstruction.getWriteMetadata();
154                     metadata = metadata.or(availableMetaData.getMetadata());
155                     metadataMask = metadataMask.or(availableMetaData.getMetadataMask());
156                 }
157             }
158         }
159         return new BigInteger[] { metadata, metadataMask };
160     }
161
162     public static Integer allocateId(IdManagerService idManager, String poolName, String idKey) {
163         AllocateIdInput getIdInput = new AllocateIdInputBuilder()
164                 .setPoolName(poolName)
165                 .setIdKey(idKey).build();
166         try {
167             Future<RpcResult<AllocateIdOutput>> result = idManager.allocateId(getIdInput);
168             RpcResult<AllocateIdOutput> rpcResult = result.get();
169             if(rpcResult.isSuccessful()) {
170                 return rpcResult.getResult().getIdValue().intValue();
171             } else {
172                 LOG.warn("RPC Call to Get Unique Id returned with Errors {}", rpcResult.getErrors());
173             }
174         } catch (InterruptedException | ExecutionException e) {
175             LOG.warn("Exception when getting Unique Id",e);
176         }
177         return INVALID_ID;
178     }
179
180     public static void releaseId(IdManagerService idManager, String poolName, String idKey) {
181         ReleaseIdInput idInput = new ReleaseIdInputBuilder()
182                 .setPoolName(poolName)
183                 .setIdKey(idKey).build();
184         try {
185             Future<RpcResult<Void>> result = idManager.releaseId(idInput);
186             RpcResult<Void> rpcResult = result.get();
187             if(!rpcResult.isSuccessful()) {
188                 LOG.warn("RPC Call to release Id {} with Key {} returned with Errors {}",
189                         idKey, rpcResult.getErrors());
190             }
191         } catch (InterruptedException | ExecutionException e) {
192             LOG.warn("Exception when releasing Id for key {}", idKey, e);
193         }
194     }
195
196     public static BigInteger getDpnId(DatapathId datapathId){
197         if (datapathId != null) {
198             String dpIdStr = datapathId.getValue().replace(":", "");
199             return new BigInteger(dpIdStr, 16);
200         }
201         return null;
202     }
203 }