2 * Copyright (c) 2015 - 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.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.NeutronPortData;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.Subnetmaps;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.VpnMaps;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data
38 .PortFixedipToPortName;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data
40 .PortFixedipToPortNameKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data
44 .PortNameToPortUuidKey;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.subnetmaps.Subnetmap;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.subnetmaps.SubnetmapKey;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.vpnmaps.VpnMap;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.vpnmaps.VpnMapKey;
49 import org.opendaylight.yangtools.yang.binding.DataObject;
50 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
51 import org.opendaylight.yangtools.yang.common.RpcResult;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
55 import java.util.ArrayList;
56 import java.util.List;
57 import java.util.concurrent.ExecutionException;
58 import java.util.concurrent.Future;
60 //import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.port.ext.rev151125.TrunkportExt;
61 //import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.port.ext.rev151125.TrunkportTypeBase;
62 //import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.port.ext.rev151125.TrunkportTypeSubport;
64 public class NeutronvpnUtils {
66 private static final Logger logger = LoggerFactory.getLogger(NeutronvpnUtils.class);
68 protected static Subnetmap getSubnetmap(DataBroker broker, Uuid subnetId) {
69 InstanceIdentifier<Subnetmap> id = InstanceIdentifier.builder(Subnetmaps.class).
70 child(Subnetmap.class, new SubnetmapKey(subnetId)).build();
71 Optional<Subnetmap> sn = read(broker, LogicalDatastoreType.CONFIGURATION, id);
79 protected static VpnMap getVpnMap(DataBroker broker, Uuid id) {
80 InstanceIdentifier<VpnMap> vpnMapIdentifier = InstanceIdentifier.builder(VpnMaps.class)
81 .child(VpnMap.class, new VpnMapKey(id)).build();
82 Optional<VpnMap> optionalVpnMap = read(broker, LogicalDatastoreType.CONFIGURATION,
84 if (optionalVpnMap.isPresent()) {
85 return optionalVpnMap.get();
87 logger.error("getVpnMap failed, VPN {} not present", id.getValue());
91 protected static Uuid getVpnForNetwork(DataBroker broker, Uuid network) {
92 InstanceIdentifier<VpnMaps> vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build();
93 Optional<VpnMaps> optionalVpnMaps = read(broker, LogicalDatastoreType.CONFIGURATION,
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();
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,
111 if (optionalVpnMaps.isPresent()) {
112 VpnMaps vpnNets = optionalVpnMaps.get();
113 List<VpnMap> allMaps = vpnNets.getVpnMap();
114 if (router != null) {
115 for (VpnMap vpnMap : allMaps) {
116 if (router.equals(vpnMap.getRouterId())) {
117 return vpnMap.getVpnId();
125 protected static Uuid getRouterforVpn(DataBroker broker, Uuid vpnId) {
126 InstanceIdentifier<VpnMap> vpnMapIdentifier = InstanceIdentifier.builder(VpnMaps.class)
127 .child(VpnMap.class, new VpnMapKey(vpnId)).build();
128 Optional<VpnMap> optionalVpnMap = read(broker, LogicalDatastoreType.CONFIGURATION,
130 if (optionalVpnMap.isPresent()) {
131 VpnMap vpnMap = optionalVpnMap.get();
132 return vpnMap.getRouterId();
137 protected static Uuid getNeutronPortIdfromPortName(DataBroker broker, String portname) {
138 InstanceIdentifier id = buildPortNameToPortUuidIdentifier(portname);
139 Optional<PortNameToPortUuid> portNameToPortUuidData = read(broker, LogicalDatastoreType.CONFIGURATION, id);
140 if (portNameToPortUuidData.isPresent()) {
141 return portNameToPortUuidData.get().getPortId();
146 protected static String getNeutronPortNamefromPortFixedIp(DataBroker broker, String fixedIp) {
147 InstanceIdentifier id = buildFixedIpToPortNameIdentifier(fixedIp);
148 Optional<PortFixedipToPortName> portFixedipToPortNameData = read(broker, LogicalDatastoreType.CONFIGURATION,
150 if (portFixedipToPortNameData.isPresent()) {
151 return portFixedipToPortNameData.get().getPortName();
157 //Will be done once integrated with TrunkPort Extensions
158 protected static int getVlanFromNeutronPort(Port port) {
161 TrunkportExt trunkportExt = port.getAugmentation(TrunkportExt.class);
162 if (trunkportExt != null) {
163 Class<? extends TrunkportTypeBase> trunkportType = trunkportExt.getType();
164 if (trunkportType != null && trunkportType.isAssignableFrom(TrunkportTypeSubport.class)) {
165 vlanId = trunkportExt.getVid();
172 protected static Router getNeutronRouter(DataBroker broker, Uuid routerId) {
174 InstanceIdentifier<Router> inst = InstanceIdentifier.create(Neutron.class).
175 child(Routers.class).child(Router.class, new RouterKey(routerId));
177 Optional<Router> rtr = read(broker, LogicalDatastoreType.CONFIGURATION, inst);
178 if (rtr.isPresent()) {
184 protected static Network getNeutronNetwork(DataBroker broker, Uuid networkId) {
185 logger.debug("getNeutronNetwork for {}", networkId.getValue());
186 InstanceIdentifier<Network> inst = InstanceIdentifier.create(Neutron.class).
187 child(Networks.class).child(Network.class, new NetworkKey(networkId));
189 Optional<Network> net = read(broker, LogicalDatastoreType.CONFIGURATION, inst);
190 if (net.isPresent()) {
196 protected static List<Uuid> getNeutronNetworkSubnetIds(DataBroker broker, Uuid networkId) {
198 logger.debug("getNeutronNetworkSubnetIds for {}", networkId.getValue());
199 Network network = getNeutronNetwork(broker, networkId);
200 if (network != null) {
202 //return network.getSubnets();
204 logger.debug("returning from getNeutronNetworkSubnetIds for {}", networkId.getValue());
209 protected static List<Uuid> getNeutronRouterSubnetIds(DataBroker broker, Uuid routerId) {
210 logger.info("getNeutronRouterSubnetIds for {}", routerId.getValue());
212 List<Uuid> subnetNames = new ArrayList<Uuid>();
213 Router router = getNeutronRouter(broker, routerId);
214 if (router != null) {
215 List<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.router
216 .Interfaces> ifs = router.getInterfaces();
217 if (!ifs.isEmpty()) {
218 for (org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers
219 .router.Interfaces iff : ifs) {
220 subnetNames.add(iff.getSubnetId());
224 logger.info("returning from getNeutronRouterSubnetIds for {}", routerId.getValue());
228 protected static String uuidToTapPortName(Uuid id) {
229 String tapId = id.getValue().substring(0, 11);
230 return new StringBuilder().append("tap").append(tapId).toString();
233 protected static void lockVpnInterface(LockManagerService lockManager, String vpnInterfaceName) {
234 TryLockInput input = new TryLockInputBuilder().setLockName(vpnInterfaceName).setTime(5L).setTimeUnit
235 (TimeUnits.Milliseconds).build();
236 Future<RpcResult<Void>> result = lockManager.tryLock(input);
238 if ((result != null) && (result.get().isSuccessful())) {
239 logger.debug("Acquired lock for vpninterface {}", vpnInterfaceName);
241 throw new RuntimeException(String.format("Unable to getLock for vpninterface %s", vpnInterfaceName));
243 } catch (InterruptedException | ExecutionException e) {
244 logger.error("Unable to getLock for vpninterface {}", vpnInterfaceName);
245 throw new RuntimeException(String.format("Unable to getLock for vpninterface %s", vpnInterfaceName), e
250 protected static void unlockVpnInterface(LockManagerService lockManager, String vpnInterfaceName) {
251 UnlockInput input = new UnlockInputBuilder().setLockName(vpnInterfaceName).build();
252 Future<RpcResult<Void>> result = lockManager.unlock(input);
254 if ((result != null) && (result.get().isSuccessful())) {
255 logger.debug("Unlocked vpninterface{}", vpnInterfaceName);
257 logger.debug("Unable to unlock vpninterface {}", vpnInterfaceName);
259 } catch (InterruptedException | ExecutionException e) {
260 logger.error("Unable to unlock vpninterface {}", vpnInterfaceName);
261 throw new RuntimeException(String.format("Unable to unlock vpninterface %s", vpnInterfaceName), e
266 static InstanceIdentifier<PortNameToPortUuid> buildPortNameToPortUuidIdentifier(String portname) {
267 InstanceIdentifier<PortNameToPortUuid> id =
268 InstanceIdentifier.builder(NeutronPortData.class).child(PortNameToPortUuid.class, new
269 PortNameToPortUuidKey(portname)).build();
273 static InstanceIdentifier<PortFixedipToPortName> buildFixedIpToPortNameIdentifier(String fixedIp) {
274 InstanceIdentifier<PortFixedipToPortName> id =
275 InstanceIdentifier.builder(NeutronPortData.class).child(PortFixedipToPortName.class, new
276 PortFixedipToPortNameKey(fixedIp)).build();
280 static InstanceIdentifier<Interface> buildVlanInterfaceIdentifier(String interfaceName) {
281 InstanceIdentifier<Interface> id = InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new
282 InterfaceKey(interfaceName)).build();
286 static <T extends DataObject> Optional<T> read(DataBroker broker, LogicalDatastoreType datastoreType,
287 InstanceIdentifier<T> path) {
289 ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
291 Optional<T> result = Optional.absent();
293 result = tx.read(datastoreType, path).get();
294 } catch (Exception e) {
295 throw new RuntimeException(e);