From 8e7149129d3918e86e9b8c7866c8df0d22d536d4 Mon Sep 17 00:00:00 2001 From: Sasidharan Sambasivam Date: Tue, 26 May 2015 13:34:15 +0530 Subject: [PATCH] Fix for bug 3357, handled update on vpn interface Change-Id: I656d0fc51c32c4c7135b05452412604fd2af9566 Signed-off-by: Sasidharan Sambasivam --- .../vpnservice/VpnInterfaceManager.java | 54 +++++++++++++++++-- .../opendaylight/vpnservice/VpnManager.java | 26 ++++++++- .../vpnservice/VpnserviceProvider.java | 1 + 3 files changed, 75 insertions(+), 6 deletions(-) diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java index 0f29dea1..e2101882 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java @@ -395,8 +395,6 @@ public class VpnInterfaceManager extends AbstractDataChangeListener interfaceId = VpnUtil.getVpnInterfaceIdentifier(intfName); -// delete(LogicalDatastoreType.OPERATIONAL, interfaceId); } private void delete(LogicalDatastoreType datastoreType, InstanceIdentifier path) { @@ -436,7 +434,6 @@ public class VpnInterfaceManager extends AbstractDataChangeListener identifier, VpnInterface original, VpnInterface update) { - // TODO Auto-generated method stub + LOG.trace("Update VPN Interface {} , original {}, update {}", + identifier, original, update); + String vpnName = original.getVpnInstanceName(); + + boolean vpnNameChanged = false; + String rd = getRouteDistinguisher(vpnName); + String newRd = rd; + if(!vpnName.equals(update.getVpnInstanceName())) { + //VPN for this interface got changed. + //Remove the interface from old VPN and add it to new VPN + String newVpnName = update.getVpnInstanceName(); + newRd = getRouteDistinguisher(newVpnName); + if(newRd.equals("")) { + LOG.warn("VPN Instance {} not found. Update operation aborted", newVpnName); + return; + } + vpnNameChanged = true; + LOG.debug("New VPN Name for the interface {} is {}", newVpnName, original.getName()); + } + + BigInteger dpnId = interfaceManager.getDpnForInterface(original.getName()); + String nextHopIp = interfaceManager.getEndpointIpForDpn(dpnId); + //List oldAdjs = original.getAugmentation(Adjacencies.class).getAdjacency(); + List newAdjs = update.getAugmentation(Adjacencies.class).getAdjacency(); + if(vpnNameChanged && newAdjs != null && !newAdjs.isEmpty()) { + long label = VpnConstants.INVALID_ID; + InstanceIdentifier path = identifier.augmentation(Adjacencies.class); + Optional adjacencies = read(LogicalDatastoreType.OPERATIONAL, path); + if (adjacencies.isPresent()) { + List nextHops = adjacencies.get().getAdjacency(); + for(Adjacency nextHop : nextHops) { + label = nextHop.getLabel(); + if(label == VpnConstants.INVALID_ID) { + //Generate label using ID Manager + label = getUniqueId(nextHop.getIpAddress()); + } + removePrefixFromBGP(rd, nextHop); + updatePrefixToBGP(newRd, nextHop, nextHopIp, label); + } + asyncUpdate(LogicalDatastoreType.OPERATIONAL, identifier, update, DEFAULT_CALLBACK); + } + } else { + LOG.debug("No Update information is available for VPN Interface to proceed"); + } + } + protected void asyncUpdate(LogicalDatastoreType datastoreType, + InstanceIdentifier path, T data, FutureCallback callback) { + WriteTransaction tx = broker.newWriteOnlyTransaction(); + tx.merge(datastoreType, path, data, true); + Futures.addCallback(tx.submit(), callback); } private void asyncWrite(LogicalDatastoreType datastoreType, diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java index 3689cbbe..435130c3 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java @@ -26,9 +26,11 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnAfConfig; +import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces; import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance; import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances; import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstanceBuilder; +import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInstance1; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInstance1Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.FibEntries; @@ -52,6 +54,7 @@ public class VpnManager extends AbstractDataChangeListener implemen private final DataBroker broker; private final IBgpManager bgpManager; private IdManagerService idManager; + private VpnInterfaceManager vpnInterfaceManager; private final FibEntriesListener fibListener; private static final FutureCallback DEFAULT_CALLBACK = @@ -95,11 +98,30 @@ public class VpnManager extends AbstractDataChangeListener implemen this.idManager = idManager; } + public void setVpnInterfaceManager(VpnInterfaceManager vpnInterfaceManager) { + this.vpnInterfaceManager = vpnInterfaceManager; + } + @Override protected void remove(InstanceIdentifier identifier, VpnInstance del) { - LOG.trace("Remove event - Key: {}, value: {}", identifier, del); + LOG.trace("Remove VPN event - Key: {}, value: {}", identifier, del); String vpnName = del.getVpnInstanceName(); InstanceIdentifier vpnIdentifier = VpnUtil.getVpnInstanceIdentifier(vpnName); + //Clean up vpn Interface + InstanceIdentifier vpnInterfacesId = InstanceIdentifier.builder(VpnInterfaces.class).build(); + Optional optionalVpnInterfaces = read(LogicalDatastoreType.OPERATIONAL, vpnInterfacesId); + + if(optionalVpnInterfaces.isPresent()) { + List vpnInterfaces = optionalVpnInterfaces.get().getVpnInterface(); + for(VpnInterface vpnInterface : vpnInterfaces) { + if(vpnInterface.getVpnInstanceName().equals(vpnName)) { + LOG.debug("VpnInterface {} will be removed from VPN {}", vpnInterface.getName(), vpnName); + vpnInterfaceManager.remove( + VpnUtil.getVpnInterfaceIdentifier(vpnInterface.getName()), vpnInterface); + } + } + } + delete(LogicalDatastoreType.OPERATIONAL, vpnIdentifier); String rd = del.getIpv4Family().getRouteDistinguisher(); @@ -219,7 +241,7 @@ public class VpnManager extends AbstractDataChangeListener implemen } else { LOG.warn("RPC Call to Get Unique Id returned with Errors {}", rpcResult.getErrors()); } - } catch (NullPointerException | InterruptedException | ExecutionException e) { + } catch (InterruptedException | ExecutionException e) { LOG.warn("Exception when getting Unique Id",e); } return 0; diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java index 9acdc36c..a5198ba7 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java @@ -51,6 +51,7 @@ public class VpnserviceProvider implements BindingAwareProvider, IVpnManager, vpnInterfaceManager.setMdsalManager(mdsalManager); vpnInterfaceManager.setInterfaceManager(interfaceManager); vpnInterfaceManager.setIdManager(idManager); + vpnManager.setVpnInterfaceManager(vpnInterfaceManager); createIdPool(); } catch (Exception e) { LOG.error("Error initializing services", e); -- 2.36.6