042b0ea19f28dd22f0e400f892d715692b59c79b
[vpnservice.git] / neutronvpn / neutronvpn-impl / src / main / java / org / opendaylight / vpnservice / neutronvpn / NeutronvpnUtils.java
1 /*
2  * Copyright (c) 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.neutronvpn;
10
11 import com.google.common.base.Optional;
12
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.Routers;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.Router;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.RouterKey;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkKey;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.LockManagerService;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.TimeUnits;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.TryLockInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.TryLockInputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.UnlockInput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.UnlockInputBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.NetworkMaps;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.NeutronPortData;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.Subnetmaps;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.VpnMaps;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.networkmaps.NetworkMap;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.networkmaps.NetworkMapKey;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data
41         .PortFixedipToPortName;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data
43         .PortFixedipToPortNameKey;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data
45         .PortNameToPortUuid;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data
47         .PortNameToPortUuidKey;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.subnetmaps.Subnetmap;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.subnetmaps.SubnetmapKey;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.vpnmaps.VpnMap;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.vpnmaps.VpnMapKey;
52 import org.opendaylight.yangtools.yang.binding.DataObject;
53 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
54 import org.opendaylight.yangtools.yang.common.RpcResult;
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
57
58 import java.util.ArrayList;
59 import java.util.List;
60 import java.util.concurrent.ExecutionException;
61 import java.util.concurrent.Future;
62
63 //import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.port.ext.rev151125.TrunkportExt;
64 //import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.port.ext.rev151125.TrunkportTypeBase;
65 //import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.port.ext.rev151125.TrunkportTypeSubport;
66
67 public class NeutronvpnUtils {
68
69     private static final Logger logger = LoggerFactory.getLogger(NeutronvpnUtils.class);
70
71     protected static Subnetmap getSubnetmap(DataBroker broker, Uuid subnetId) {
72         InstanceIdentifier id = buildSubnetMapIdentifier(subnetId);
73         Optional<Subnetmap> sn = read(broker, LogicalDatastoreType.CONFIGURATION, id);
74
75         if (sn.isPresent()) {
76             return sn.get();
77         }
78         return null;
79     }
80
81     protected static VpnMap getVpnMap(DataBroker broker, Uuid id) {
82         InstanceIdentifier<VpnMap> vpnMapIdentifier = InstanceIdentifier.builder(VpnMaps.class).child(VpnMap.class,
83                 new VpnMapKey(id)).build();
84         Optional<VpnMap> optionalVpnMap = read(broker, LogicalDatastoreType.CONFIGURATION, vpnMapIdentifier);
85         if (optionalVpnMap.isPresent()) {
86             return optionalVpnMap.get();
87         }
88         logger.error("getVpnMap failed, VPN {} not present", id.getValue());
89         return null;
90     }
91
92     protected static Uuid getVpnForNetwork(DataBroker broker, Uuid network) {
93         InstanceIdentifier<VpnMaps> vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build();
94         Optional<VpnMaps> optionalVpnMaps = read(broker, LogicalDatastoreType.CONFIGURATION, vpnMapsIdentifier);
95         if (optionalVpnMaps.isPresent()) {
96             VpnMaps vpnMaps = optionalVpnMaps.get();
97             List<VpnMap> allMaps = vpnMaps.getVpnMap();
98             for (VpnMap vpnMap : allMaps) {
99                 if (vpnMap.getNetworkIds().contains(network)) {
100                     return vpnMap.getVpnId();
101                 }
102             }
103         }
104         return null;
105     }
106
107     protected static Uuid getVpnForRouter(DataBroker broker, Uuid router) {
108         InstanceIdentifier<VpnMaps> vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build();
109         Optional<VpnMaps> optionalVpnMaps = read(broker, LogicalDatastoreType.CONFIGURATION, vpnMapsIdentifier);
110         if (optionalVpnMaps.isPresent()) {
111             VpnMaps vpnNets = optionalVpnMaps.get();
112             List<VpnMap> allMaps = vpnNets.getVpnMap();
113             if (router != null) {
114                 for (VpnMap vpnMap : allMaps) {
115                     if (router.equals(vpnMap.getRouterId())) {
116                         return vpnMap.getVpnId();
117                     }
118                 }
119             }
120         }
121         return null;
122     }
123
124     protected static Uuid getRouterforVpn(DataBroker broker, Uuid vpnId) {
125         InstanceIdentifier<VpnMap> vpnMapIdentifier = InstanceIdentifier.builder(VpnMaps.class)
126                 .child(VpnMap.class, new VpnMapKey(vpnId)).build();
127         Optional<VpnMap> optionalVpnMap = read(broker, LogicalDatastoreType.CONFIGURATION, vpnMapIdentifier);
128         if (optionalVpnMap.isPresent()) {
129             VpnMap vpnMap = optionalVpnMap.get();
130             return vpnMap.getRouterId();
131         }
132         return null;
133     }
134
135     protected static Uuid getNeutronPortIdfromPortName(DataBroker broker, String portname) {
136         InstanceIdentifier id = buildPortNameToPortUuidIdentifier(portname);
137         Optional<PortNameToPortUuid> portNameToPortUuidData = read(broker, LogicalDatastoreType.CONFIGURATION, id);
138         if (portNameToPortUuidData.isPresent()) {
139             return portNameToPortUuidData.get().getPortId();
140         }
141         return null;
142     }
143
144     protected static String getNeutronPortNamefromPortFixedIp(DataBroker broker, String fixedIp) {
145         InstanceIdentifier id = buildFixedIpToPortNameIdentifier(fixedIp);
146         Optional<PortFixedipToPortName> portFixedipToPortNameData = read(broker, LogicalDatastoreType.CONFIGURATION,
147                 id);
148         if (portFixedipToPortNameData.isPresent()) {
149             return portFixedipToPortNameData.get().getPortName();
150         }
151         return null;
152     }
153
154     protected static List<Uuid> getSubnetIdsFromNetworkId(DataBroker broker, Uuid networkId) {
155         InstanceIdentifier id = buildNetworkMapIdentifier(networkId);
156         Optional<NetworkMap> optionalNetworkMap = read(broker, LogicalDatastoreType.CONFIGURATION, id);
157         if (optionalNetworkMap.isPresent()) {
158             return optionalNetworkMap.get().getSubnetIdList();
159         }
160         return null;
161     }
162
163     //TODO
164     //Will be done once integrated with TrunkPort Extensions
165     protected static int getVlanFromNeutronPort(Port port) {
166         int vlanId = 0;
167         /*
168         TrunkportExt trunkportExt = port.getAugmentation(TrunkportExt.class);
169         if (trunkportExt != null) {
170             Class<? extends TrunkportTypeBase> trunkportType = trunkportExt.getType();
171             if (trunkportType != null && trunkportType.isAssignableFrom(TrunkportTypeSubport.class)) {
172                 vlanId = trunkportExt.getVid();
173             }
174         }
175         */
176         return vlanId;
177     }
178
179     protected static Router getNeutronRouter(DataBroker broker, Uuid routerId) {
180
181         InstanceIdentifier<Router> inst = InstanceIdentifier.create(Neutron.class).child(Routers.class).child(Router
182                 .class, new RouterKey(routerId));
183         Optional<Router> rtr = read(broker, LogicalDatastoreType.CONFIGURATION, inst);
184         if (rtr.isPresent()) {
185             return rtr.get();
186         }
187         return null;
188     }
189
190     protected static Network getNeutronNetwork(DataBroker broker, Uuid networkId) {
191         logger.debug("getNeutronNetwork for {}", networkId.getValue());
192         InstanceIdentifier<Network> inst = InstanceIdentifier.create(Neutron.class).child(Networks.class).child
193                 (Network.class, new NetworkKey(networkId));
194         Optional<Network> net = read(broker, LogicalDatastoreType.CONFIGURATION, inst);
195         if (net.isPresent()) {
196             return net.get();
197         }
198         return null;
199     }
200
201     protected static List<Uuid> getNeutronRouterSubnetIds(DataBroker broker, Uuid routerId) {
202         logger.info("getNeutronRouterSubnetIds for {}", routerId.getValue());
203
204         List<Uuid> subnetNames = new ArrayList<Uuid>();
205         Router router = getNeutronRouter(broker, routerId);
206         if (router != null) {
207             List<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.router
208                     .Interfaces> ifs = router.getInterfaces();
209             if (!ifs.isEmpty()) {
210                 for (org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers
211                         .router.Interfaces iff : ifs) {
212                     subnetNames.add(iff.getSubnetId());
213                 }
214             }
215         }
216         logger.info("returning from getNeutronRouterSubnetIds for {}", routerId.getValue());
217         return subnetNames;
218     }
219
220     protected static String uuidToTapPortName(Uuid id) {
221         String tapId = id.getValue().substring(0, 11);
222         return new StringBuilder().append("tap").append(tapId).toString();
223     }
224
225     protected static void lockVpnInterface(LockManagerService lockManager, String vpnInterfaceName) {
226         TryLockInput input = new TryLockInputBuilder().setLockName(vpnInterfaceName).setTime(5L).setTimeUnit
227                 (TimeUnits.Milliseconds).build();
228         Future<RpcResult<Void>> result = lockManager.tryLock(input);
229         try {
230             if ((result != null) && (result.get().isSuccessful())) {
231                 logger.debug("Acquired lock for vpninterface {}", vpnInterfaceName);
232             } else {
233                 throw new RuntimeException(String.format("Unable to getLock for vpninterface %s", vpnInterfaceName));
234             }
235         } catch (InterruptedException | ExecutionException e) {
236             logger.error("Unable to getLock for vpninterface {}", vpnInterfaceName);
237             throw new RuntimeException(String.format("Unable to getLock for vpninterface %s", vpnInterfaceName), e
238                     .getCause());
239         }
240     }
241
242     protected static void unlockVpnInterface(LockManagerService lockManager, String vpnInterfaceName) {
243         UnlockInput input = new UnlockInputBuilder().setLockName(vpnInterfaceName).build();
244         Future<RpcResult<Void>> result = lockManager.unlock(input);
245         try {
246             if ((result != null) && (result.get().isSuccessful())) {
247                 logger.debug("Unlocked vpninterface{}", vpnInterfaceName);
248             } else {
249                 logger.debug("Unable to unlock vpninterface {}", vpnInterfaceName);
250             }
251         } catch (InterruptedException | ExecutionException e) {
252             logger.error("Unable to unlock vpninterface {}", vpnInterfaceName);
253             throw new RuntimeException(String.format("Unable to unlock vpninterface %s", vpnInterfaceName), e
254                     .getCause());
255         }
256     }
257
258     protected static Short getIPPrefixFromPort(DataBroker broker, Port port) {
259         Short prefix = new Short((short) 0);
260         String cidr = "";
261         try {
262             Uuid subnetUUID = port.getFixedIps().get(0).getSubnetId();
263
264             org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets
265                     .SubnetKey subnetkey = new org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets
266                     .rev150712.subnets.attributes.subnets.SubnetKey(subnetUUID);
267             InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets
268                     .attributes.subnets.Subnet> subnetidentifier = InstanceIdentifier.create(Neutron.class).child(org
269                     .opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.Subnets
270                     .class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets
271                     .attributes.subnets.Subnet.class, subnetkey);
272             Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes
273                     .subnets.Subnet> subnet = read(broker, LogicalDatastoreType.CONFIGURATION, subnetidentifier);
274
275             if (subnet.isPresent()) {
276                 cidr = subnet.get().getCidr();
277                 // Extract the prefix length from cidr
278                 String[] parts = cidr.split("/");
279                 if ((parts.length == 2)) {
280                     prefix = Short.valueOf(parts[1]);
281                     return prefix;
282                 } else {
283                     logger.trace("Could not retrieve prefix from subnet CIDR");
284                     System.out.println("Could not retrieve prefix from subnet CIDR");
285                 }
286             } else {
287                 logger.trace("Unable to read on subnet datastore");
288             }
289         } catch (Exception e) {
290             logger.trace("Failed to retrieve IP prefix from port : ", e);
291             System.out.println("Failed to retrieve IP prefix from port : " + e.getMessage());
292         }
293         return null;
294     }
295
296     static InstanceIdentifier<PortNameToPortUuid> buildPortNameToPortUuidIdentifier(String portname) {
297         InstanceIdentifier<PortNameToPortUuid> id = InstanceIdentifier.builder(NeutronPortData.class).child
298                 (PortNameToPortUuid.class, new PortNameToPortUuidKey(portname)).build();
299         return id;
300     }
301
302     static InstanceIdentifier<PortFixedipToPortName> buildFixedIpToPortNameIdentifier(String fixedIp) {
303         InstanceIdentifier<PortFixedipToPortName> id = InstanceIdentifier.builder(NeutronPortData.class).child
304                 (PortFixedipToPortName.class, new PortFixedipToPortNameKey(fixedIp)).build();
305         return id;
306     }
307
308     static InstanceIdentifier<NetworkMap> buildNetworkMapIdentifier(Uuid networkId) {
309         InstanceIdentifier<NetworkMap> id = InstanceIdentifier.builder(NetworkMaps.class).child(NetworkMap.class, new
310                 NetworkMapKey(networkId)).build();
311         return id;
312     }
313
314     static InstanceIdentifier<Subnetmap> buildSubnetMapIdentifier(Uuid subnetId) {
315         InstanceIdentifier<Subnetmap> id = InstanceIdentifier.builder(Subnetmaps.class).child(Subnetmap.class, new
316                 SubnetmapKey(subnetId)).build();
317         return id;
318     }
319
320     static InstanceIdentifier<Interface> buildVlanInterfaceIdentifier(String interfaceName) {
321         InstanceIdentifier<Interface> id = InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new
322                 InterfaceKey(interfaceName)).build();
323         return id;
324     }
325
326     static <T extends DataObject> Optional<T> read(DataBroker broker, LogicalDatastoreType datastoreType,
327                                                    InstanceIdentifier<T> path) {
328
329         ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
330
331         Optional<T> result = Optional.absent();
332         try {
333             result = tx.read(datastoreType, path).get();
334         } catch (Exception e) {
335             throw new RuntimeException(e);
336         }
337
338         return result;
339     }
340
341 }