X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=vpnmanager%2Fimpl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetvirt%2Fvpnmanager%2FVpnOpStatusListener.java;h=502d2308a44258bb9b324cad493ebcddb9955287;hb=2f0569ed75ef8a1fb60f992d19c8bbdf92ff45bf;hp=643ffea158a173333b70ed15f8008a5c69cabbc9;hpb=335f9a5f21565ea871cdfb545f95fa9193451433;p=netvirt.git diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnOpStatusListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnOpStatusListener.java index 643ffea158..502d2308a4 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnOpStatusListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnOpStatusListener.java @@ -9,7 +9,6 @@ package org.opendaylight.netvirt.vpnmanager; import static java.util.Collections.emptyList; -import com.google.common.base.Optional; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -17,23 +16,27 @@ import com.google.common.util.concurrent.MoreExecutors; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import javax.annotation.PostConstruct; +import java.util.Optional; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.locks.ReentrantLock; +import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Singleton; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; -import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase; import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker; import org.opendaylight.genius.infra.Datastore; import org.opendaylight.genius.infra.ManagedNewTransactionRunner; import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl; import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager; +import org.opendaylight.genius.utils.JvmGlobalLocks; import org.opendaylight.genius.utils.SystemPropertyReader; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; +import org.opendaylight.infrautils.utils.concurrent.Executors; +import org.opendaylight.mdsal.binding.api.DataBroker; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.netvirt.bgpmanager.api.IBgpManager; import org.opendaylight.netvirt.fibmanager.api.IFibManager; import org.opendaylight.netvirt.vpnmanager.api.VpnExtraRouteHelper; +import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener; import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3nexthop.rev150409.L3nexthop; @@ -45,11 +48,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.vpntargets.VpnTarget; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.to.extraroutes.Vpn; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Uint32; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton -public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase { +public class VpnOpStatusListener extends AbstractAsyncDataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(VpnOpStatusListener.class); private final DataBroker dataBroker; private final ManagedNewTransactionRunner txRunner; @@ -66,7 +70,9 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase getWildCardPath() { - return InstanceIdentifier.create(VpnInstanceOpData.class).child(VpnInstanceOpDataEntry.class); + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } - @Override - protected VpnOpStatusListener getDataTreeChangeListener() { - return VpnOpStatusListener.this; - } @Override - protected void remove(InstanceIdentifier identifier, VpnInstanceOpDataEntry value) { + public void remove(InstanceIdentifier identifier, VpnInstanceOpDataEntry value) { LOG.info("remove: Ignoring vpn Op {} with rd {}", value.getVpnInstanceName(), value.getVrfId()); } @Override @SuppressWarnings("checkstyle:IllegalCatch") - protected void update(InstanceIdentifier identifier, + public void update(InstanceIdentifier identifier, VpnInstanceOpDataEntry original, VpnInstanceOpDataEntry update) { LOG.info("update: Processing update for vpn {} with rd {}", update.getVpnInstanceName(), update.getVrfId()); if (update.getVpnState() == VpnInstanceOpDataEntry.VpnState.PendingDelete @@ -110,7 +113,7 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase rds = update.getRd(); String primaryRd = update.getVrfId(); - final long vpnId = vpnUtil.getVpnId(vpnName); + final Uint32 vpnId = vpnUtil.getVpnId(vpnName); jobCoordinator.enqueueJob("VPN-" + update.getVpnInstanceName(), () -> { // Two transactions are used, one for operational, one for config; we only submit the config // transaction if the operational transaction succeeds @@ -122,22 +125,33 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase bgpManager.deleteVrf( rd, false, AddressFamily.L2VPN)); } - if (update.isIpv4Configured()) { + if (update.getIpAddressFamilyConfigured() + == VpnInstanceOpDataEntry.IpAddressFamilyConfigured.Ipv4) { rds.parallelStream().forEach(rd -> bgpManager.deleteVrf( rd, false, AddressFamily.IPV4)); } - if (update.isIpv6Configured()) { + if (update.getIpAddressFamilyConfigured() + == VpnInstanceOpDataEntry.IpAddressFamilyConfigured.Ipv6) { rds.parallelStream().forEach(rd -> bgpManager.deleteVrf( rd, false, AddressFamily.IPV6)); } + if (update.getIpAddressFamilyConfigured() + == VpnInstanceOpDataEntry.IpAddressFamilyConfigured.Ipv4AndIpv6) { + rds.parallelStream() + .forEach(rd -> bgpManager.deleteVrf( + rd, false, AddressFamily.IPV4)); + rds.parallelStream() + .forEach(rd -> bgpManager.deleteVrf( + rd, false, AddressFamily.IPV6)); + } } InstanceIdentifier vpnToExtraroute = VpnExtraRouteHelper.getVpnToExtrarouteVpnIdentifier(vpnName); - Optional optVpnToExtraroute = Optional.absent(); + Optional optVpnToExtraroute = Optional.empty(); try { optVpnToExtraroute = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL, vpnToExtraroute); - } catch (ReadFailedException e) { + } catch (InterruptedException | ExecutionException e) { LOG.error("update: Failed to read VpnToExtraRoute for vpn {}", vpnName); } if (optVpnToExtraroute.isPresent()) { @@ -147,11 +161,11 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase optPrefixToIntf = Optional.absent(); + Optional optPrefixToIntf = Optional.empty(); try { optPrefixToIntf = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL, VpnUtil.getPrefixToInterfaceIdentifier(vpnId)); - } catch (ReadFailedException e) { + } catch (InterruptedException | ExecutionException e) { LOG.error("update: Failed to read PrefixToInterface for vpn {}", vpnName); } if (optPrefixToIntf.isPresent()) { @@ -160,11 +174,11 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase vpnNextHops = InstanceIdentifier.builder(L3nexthop.class).child( VpnNexthops.class, new VpnNexthopsKey(vpnId)).build(); - Optional optL3nexthopForVpnId = Optional.absent(); + Optional optL3nexthopForVpnId = Optional.empty(); try { optL3nexthopForVpnId = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.OPERATIONAL, vpnNextHops); - } catch (ReadFailedException e) { + } catch (InterruptedException | ExecutionException e) { LOG.error("update: Failed to read VpnNextHops for vpn {}", vpnName); } if (optL3nexthopForVpnId.isPresent()) { @@ -186,8 +200,13 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase importRTList = rd.equals(primaryRd) ? irtList : emptyList(); LOG.info("VpnOpStatusListener.update: updating BGPVPN for vpn {} with RD {}" - + " Type is {}, IPv4 is {}, IPv6 is {}, iRT {}", vpnName, primaryRd, update.getType(), - update.isIpv4Configured(), update.isIpv6Configured(), importRTList); - if (update.getType() == VpnInstanceOpDataEntry.Type.L2) { - bgpManager.addVrf(rd, importRTList, ertList, AddressFamily.L2VPN); - } - if (!original.isIpv4Configured() && update.isIpv4Configured()) { - bgpManager.addVrf(rd, importRTList, ertList, AddressFamily.IPV4); - } else if (original.isIpv4Configured() && !update.isIpv4Configured()) { - bgpManager.deleteVrf(rd, false, AddressFamily.IPV4); - } - if (!original.isIpv6Configured() && update.isIpv6Configured()) { - bgpManager.addVrf(rd, importRTList, ertList, AddressFamily.IPV6); - } else if (original.isIpv6Configured() && !update.isIpv6Configured()) { - bgpManager.deleteVrf(rd, false, AddressFamily.IPV6); + + " Type is {}, IPtype is {}, iRT {}", vpnName, primaryRd, update.getType(), + update.getIpAddressFamilyConfigured(), importRTList); + int ipValue = VpnUtil.getIpFamilyValueToRemove(original,update); + switch (ipValue) { + case 4: + bgpManager.deleteVrf(rd, false, AddressFamily.IPV4); + break; + case 6: + bgpManager.deleteVrf(rd, false, AddressFamily.IPV6); + break; + case 10: + bgpManager.deleteVrf(rd, false, AddressFamily.IPV4); + bgpManager.deleteVrf(rd, false, AddressFamily.IPV6); + break; + default: + break; } /* Update vrf entry with newly added RD list. VPN does not support for * deleting existing RDs */ if (original.getRd().size() != update.getRd().size()) { - if (update.isIpv4Configured()) { - bgpManager.addVrf(rd, importRTList, ertList, AddressFamily.IPV4); - } - if (update.isIpv6Configured()) { - bgpManager.addVrf(rd, importRTList, ertList, AddressFamily.IPV6); + ipValue = VpnUtil.getIpFamilyValueToAdd(original,update); + switch (ipValue) { + case 4: + bgpManager.addVrf(rd, importRTList, ertList, AddressFamily.IPV4); + break; + case 6: + bgpManager.addVrf(rd, importRTList, ertList, AddressFamily.IPV6); + break; + case 10: + bgpManager.addVrf(rd, importRTList, ertList, AddressFamily.IPV4); + bgpManager.addVrf(rd, importRTList, ertList, AddressFamily.IPV6); + break; + default: + break; } } } catch (RuntimeException e) { @@ -288,7 +318,7 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase identifier, + public void add(final InstanceIdentifier identifier, final VpnInstanceOpDataEntry value) { LOG.debug("add: Ignoring vpn Op {} with rd {}", value.getVpnInstanceName(), value.getVrfId()); }