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