2 * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
9 package org.opendaylight.vpnservice.neutronvpn;
11 import com.google.common.base.Optional;
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.binding.rev150712.PortBindingExtension;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.Routers;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.Router;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.RouterKey;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkKey;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.neutron.networks.network.Segments;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.Subnets;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.SubnetKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.LockManagerService;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.TimeUnits;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.TryLockInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.TryLockInputBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.UnlockInput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.lockmanager.rev150819.UnlockInputBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.NetworkMaps;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.NeutronPortData;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.Subnetmaps;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.VpnMaps;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.networkmaps.NetworkMap;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.networkmaps.NetworkMapKey;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data
54 .PortFixedipToPortName;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data
56 .PortFixedipToPortNameKey;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.subnetmaps.Subnetmap;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.subnetmaps.SubnetmapKey;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.vpnmaps.VpnMap;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.vpnmaps.VpnMapKey;
61 import org.opendaylight.yangtools.yang.binding.DataObject;
62 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
63 import org.opendaylight.yangtools.yang.common.RpcResult;
64 import org.slf4j.Logger;
65 import org.slf4j.LoggerFactory;
67 import java.util.ArrayList;
68 import java.util.List;
69 import java.util.concurrent.ExecutionException;
70 import java.util.concurrent.Future;
72 public class NeutronvpnUtils {
74 private static final Logger logger = LoggerFactory.getLogger(NeutronvpnUtils.class);
75 public static final String VNIC_TYPE_NORMAL = "normal";
77 protected static Subnetmap getSubnetmap(DataBroker broker, Uuid subnetId) {
78 InstanceIdentifier id = buildSubnetMapIdentifier(subnetId);
79 Optional<Subnetmap> sn = read(broker, LogicalDatastoreType.CONFIGURATION, id);
87 protected static VpnMap getVpnMap(DataBroker broker, Uuid id) {
88 InstanceIdentifier<VpnMap> vpnMapIdentifier = InstanceIdentifier.builder(VpnMaps.class).child(VpnMap.class,
89 new VpnMapKey(id)).build();
90 Optional<VpnMap> optionalVpnMap = read(broker, LogicalDatastoreType.CONFIGURATION, vpnMapIdentifier);
91 if (optionalVpnMap.isPresent()) {
92 return optionalVpnMap.get();
94 logger.error("getVpnMap failed, VPN {} not present", id.getValue());
98 protected static Uuid getVpnForNetwork(DataBroker broker, Uuid network) {
99 InstanceIdentifier<VpnMaps> vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build();
100 Optional<VpnMaps> optionalVpnMaps = read(broker, LogicalDatastoreType.CONFIGURATION, vpnMapsIdentifier);
101 if (optionalVpnMaps.isPresent() && optionalVpnMaps.get().getVpnMap() != null) {
102 List<VpnMap> allMaps = optionalVpnMaps.get().getVpnMap();
103 for (VpnMap vpnMap : allMaps) {
104 List<Uuid> netIds = vpnMap.getNetworkIds();
105 if ((netIds != null) && (netIds.contains(network))) {
106 return vpnMap.getVpnId();
113 // true for external vpn, false for internal vpn
114 protected static Uuid getVpnForRouter(DataBroker broker, Uuid routerId, Boolean externalVpn) {
115 InstanceIdentifier<VpnMaps> vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build();
116 Optional<VpnMaps> optionalVpnMaps = read(broker, LogicalDatastoreType.CONFIGURATION,
118 if (optionalVpnMaps.isPresent() && optionalVpnMaps.get().getVpnMap() != null) {
119 List<VpnMap> allMaps = optionalVpnMaps.get().getVpnMap();
120 if (routerId != null) {
121 for (VpnMap vpnMap : allMaps) {
122 if (routerId.equals(vpnMap.getRouterId())) {
123 if (externalVpn == true) {
124 if (!routerId.equals(vpnMap.getVpnId())) {
125 return vpnMap.getVpnId();
128 if (routerId.equals(vpnMap.getVpnId())) {
129 return vpnMap.getVpnId();
139 protected static Uuid getRouterforVpn(DataBroker broker, Uuid vpnId) {
140 InstanceIdentifier<VpnMap> vpnMapIdentifier = InstanceIdentifier.builder(VpnMaps.class)
141 .child(VpnMap.class, new VpnMapKey(vpnId)).build();
142 Optional<VpnMap> optionalVpnMap = read(broker, LogicalDatastoreType.CONFIGURATION, vpnMapIdentifier);
143 if (optionalVpnMap.isPresent()) {
144 VpnMap vpnMap = optionalVpnMap.get();
145 return vpnMap.getRouterId();
150 protected static String getNeutronPortNamefromPortFixedIp(DataBroker broker, String fixedIp) {
151 InstanceIdentifier id = buildFixedIpToPortNameIdentifier(fixedIp);
152 Optional<PortFixedipToPortName> portFixedipToPortNameData = read(broker, LogicalDatastoreType.CONFIGURATION,
154 if (portFixedipToPortNameData.isPresent()) {
155 return portFixedipToPortNameData.get().getPortName();
160 protected static List<Uuid> getSubnetIdsFromNetworkId(DataBroker broker, Uuid networkId) {
161 InstanceIdentifier id = buildNetworkMapIdentifier(networkId);
162 Optional<NetworkMap> optionalNetworkMap = read(broker, LogicalDatastoreType.CONFIGURATION, id);
163 if (optionalNetworkMap.isPresent()) {
164 return optionalNetworkMap.get().getSubnetIdList();
169 protected static Router getNeutronRouter(DataBroker broker, Uuid routerId) {
171 InstanceIdentifier<Router> inst = InstanceIdentifier.create(Neutron.class).child(Routers.class).child(Router
172 .class, new RouterKey(routerId));
173 Optional<Router> rtr = read(broker, LogicalDatastoreType.CONFIGURATION, inst);
174 if (rtr.isPresent()) {
180 protected static Network getNeutronNetwork(DataBroker broker, Uuid networkId) {
181 logger.debug("getNeutronNetwork for {}", networkId.getValue());
182 InstanceIdentifier<Network> inst = InstanceIdentifier.create(Neutron.class).child(Networks.class).child
183 (Network.class, new NetworkKey(networkId));
184 Optional<Network> net = read(broker, LogicalDatastoreType.CONFIGURATION, inst);
185 if (net.isPresent()) {
191 protected static List<Uuid> getNeutronRouterSubnetIds(DataBroker broker, Uuid routerId) {
192 logger.info("getNeutronRouterSubnetIds for {}", routerId.getValue());
194 List<Uuid> subnetIdList = new ArrayList<Uuid>();
195 Router router = getNeutronRouter(broker, routerId);
196 if (router != null) {
197 List<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.router
198 .Interfaces> interfacesList = router.getInterfaces();
199 if (interfacesList != null) {
200 for (org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers
201 .router.Interfaces interfaces : interfacesList) {
202 subnetIdList.add(interfaces.getSubnetId());
206 logger.info("returning from getNeutronRouterSubnetIds for {}", routerId.getValue());
210 protected static Port getNeutronPort(DataBroker broker, Uuid portId) {
211 logger.debug("getNeutronPort for {}", portId.getValue());
212 InstanceIdentifier<Port> inst = InstanceIdentifier.create(Neutron.class).child(Ports.class).child(Port.class,
213 new PortKey(portId));
214 Optional<Port> port = read(broker, LogicalDatastoreType.CONFIGURATION, inst);
215 if (port.isPresent()) {
221 protected static String uuidToTapPortName(Uuid id) {
222 String tapId = id.getValue().substring(0, 11);
223 return new StringBuilder().append("tap").append(tapId).toString();
226 protected static boolean lock(LockManagerService lockManager, String lockName) {
227 TryLockInput input = new TryLockInputBuilder().setLockName(lockName).setTime(5L).setTimeUnit
228 (TimeUnits.Milliseconds).build();
229 boolean islockAcquired = false;
231 Future<RpcResult<Void>> result = lockManager.tryLock(input);
232 if ((result != null) && (result.get().isSuccessful())) {
233 logger.debug("Acquired lock for {}", lockName);
234 islockAcquired = true;
236 logger.error("Unable to acquire lock for {}", lockName);
238 } catch (InterruptedException | ExecutionException e) {
239 logger.error("Unable to acquire lock for {}", lockName);
240 throw new RuntimeException(String.format("Unable to acquire lock for %s", lockName), e.getCause());
242 return islockAcquired;
245 protected static boolean unlock(LockManagerService lockManager, String lockName) {
246 UnlockInput input = new UnlockInputBuilder().setLockName(lockName).build();
247 boolean islockAcquired = false;
249 Future<RpcResult<Void>> result = lockManager.unlock(input);
250 if ((result != null) && (result.get().isSuccessful())) {
251 logger.debug("Unlocked {}", lockName);
252 islockAcquired = true;
254 logger.error("Unable to unlock {}", lockName);
256 } catch (InterruptedException | ExecutionException e) {
257 logger.error("Unable to unlock {}", lockName);
258 throw new RuntimeException(String.format("Unable to unlock %s", lockName), e.getCause());
260 return islockAcquired;
263 protected static Short getIPPrefixFromPort(DataBroker broker, Port port) {
264 Short prefix = new Short((short) 0);
267 Uuid subnetUUID = port.getFixedIps().get(0).getSubnetId();
269 SubnetKey subnetkey = new SubnetKey(subnetUUID);
270 InstanceIdentifier<Subnet> subnetidentifier = InstanceIdentifier.create(Neutron.class).child(Subnets
271 .class).child(Subnet.class, subnetkey);
272 Optional<Subnet> subnet = read(broker, LogicalDatastoreType.CONFIGURATION,subnetidentifier);
273 if (subnet.isPresent()) {
274 cidr = subnet.get().getCidr();
275 // Extract the prefix length from cidr
276 String[] parts = cidr.split("/");
277 if ((parts.length == 2)) {
278 prefix = Short.valueOf(parts[1]);
281 logger.trace("Could not retrieve prefix from subnet CIDR");
282 System.out.println("Could not retrieve prefix from subnet CIDR");
285 logger.trace("Unable to read on subnet datastore");
287 } catch (Exception e) {
288 logger.error("Failed to retrieve IP prefix from port : ", e);
289 System.out.println("Failed to retrieve IP prefix from port : " + e.getMessage());
294 static InstanceIdentifier<PortFixedipToPortName> buildFixedIpToPortNameIdentifier(String fixedIp) {
295 InstanceIdentifier<PortFixedipToPortName> id = InstanceIdentifier.builder(NeutronPortData.class).child
296 (PortFixedipToPortName.class, new PortFixedipToPortNameKey(fixedIp)).build();
300 static InstanceIdentifier<NetworkMap> buildNetworkMapIdentifier(Uuid networkId) {
301 InstanceIdentifier<NetworkMap> id = InstanceIdentifier.builder(NetworkMaps.class).child(NetworkMap.class, new
302 NetworkMapKey(networkId)).build();
306 static InstanceIdentifier<VpnInterface> buildVpnInterfaceIdentifier(String ifName) {
307 InstanceIdentifier<VpnInterface> id = InstanceIdentifier.builder(VpnInterfaces.class).
308 child(VpnInterface.class, new VpnInterfaceKey(ifName)).build();
312 static InstanceIdentifier<Subnetmap> buildSubnetMapIdentifier(Uuid subnetId) {
313 InstanceIdentifier<Subnetmap> id = InstanceIdentifier.builder(Subnetmaps.class).child(Subnetmap.class, new
314 SubnetmapKey(subnetId)).build();
318 static InstanceIdentifier<Interface> buildVlanInterfaceIdentifier(String interfaceName) {
319 InstanceIdentifier<Interface> id = InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new
320 InterfaceKey(interfaceName)).build();
324 static <T extends DataObject> Optional<T> read(DataBroker broker, LogicalDatastoreType datastoreType,
325 InstanceIdentifier<T> path) {
327 ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
329 Optional<T> result = Optional.absent();
331 result = tx.read(datastoreType, path).get();
332 } catch (Exception e) {
333 throw new RuntimeException(e);