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