import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
import org.opendaylight.netvirt.elanmanager.api.IElanService;
+import org.opendaylight.netvirt.fibmanager.api.FibHelper;
import org.opendaylight.netvirt.fibmanager.api.L3VPNTransportTypes;
import org.opendaylight.netvirt.vpnmanager.api.VpnExtraRouteHelper;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
private static final long WAIT_TIME_TO_ACQUIRE_LOCK = 3000L;
private static final int SELECT_GROUP_WEIGHT = 1;
private static final int RETRY_COUNT = 6;
- private static final String NEXTHOPMANAGER_JOB_KEY_PREFIX = "NextHopManager";
private final DataBroker dataBroker;
private final ManagedNewTransactionRunner txRunner;
public void createDcGwLoadBalancingGroup(Uint64 dpnId, String destinationIp,
Class<? extends TunnelTypeBase> tunnelType) {
- jobCoordinator.enqueueJob(getJobKey(dpnId), () -> {
+ jobCoordinator.enqueueJob(FibHelper.getJobKeyForDcGwLoadBalancingGroup(dpnId), () -> {
List<ListenableFuture<Void>> futures = new ArrayList<>();
futures.add(txRunner.callWithNewReadWriteTransactionAndSubmit(OPERATIONAL, operationalTx -> {
synchronized (getDcGateWaySyncKey(destinationIp)) {
}, RETRY_COUNT);
}
- private String getJobKey(Uint64 dpnId) {
- return new StringBuilder().append(NEXTHOPMANAGER_JOB_KEY_PREFIX).append(dpnId).toString();
- }
-
private String getDcGateWaySyncKey(String destinationIp) {
String mutex = new StringBuilder().append("L3vpncDcGateWay").append(destinationIp).toString();
return mutex.intern();
*/
public void removeDcGwLoadBalancingGroup(Uint64 dpnId,
String destinationIp) {
- jobCoordinator.enqueueJob(getJobKey(dpnId), () -> {
+ jobCoordinator.enqueueJob(FibHelper.getJobKeyForDcGwLoadBalancingGroup(dpnId), () -> {
List<String> availableDcGws = fibUtil.getL3VpnDcGateWays();
if (availableDcGws.contains(destinationIp)) {
availableDcGws.remove(destinationIp);
*/
public void updateDcGwLoadBalancingGroup(Uint64 dpnId, String destinationIp,
boolean isTunnelUp, Class<? extends TunnelTypeBase> tunnelType) {
- jobCoordinator.enqueueJob(getJobKey(dpnId), () -> {
+ jobCoordinator.enqueueJob(FibHelper.getJobKeyForDcGwLoadBalancingGroup(dpnId), () -> {
List<String> availableDcGws = fibUtil.getL3VpnDcGateWays();
if (availableDcGws.contains(destinationIp)) {
availableDcGws.remove(destinationIp);
import com.google.common.util.concurrent.ListenableFuture;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import org.opendaylight.genius.mdsalutil.NwConstants;
import org.opendaylight.genius.utils.JvmGlobalLocks;
import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.netvirt.fibmanager.api.FibHelper;
import org.opendaylight.netvirt.fibmanager.api.IFibManager;
import org.opendaylight.netvirt.vpnmanager.api.InterfaceUtils;
import org.opendaylight.netvirt.vpnmanager.api.VpnExtraRouteHelper;
private final VpnSubnetRouteHandler vpnSubnetRouteHandler;
private final JobCoordinator jobCoordinator;
private final VpnUtil vpnUtil;
+ private static final int RETRY_COUNT = 3;
protected enum UpdateRouteAction {
ADVERTISE_ROUTE, WITHDRAW_ROUTE
}
}
}
+ /*
+ * Program the BGP routes of all the VPNs which have footprint on the source DPN.
+ *
+ * DC-GW LB groups are programmed in DJC Jobs, so DJC with same key is used here to make sure
+ * groups are programmed first, then only BGP routes are programmed.
+ */
+ jobCoordinator.enqueueJob(FibHelper.getJobKeyForDcGwLoadBalancingGroup(srcDpnId), () -> {
+ listVpnName.forEach(vpnName -> {
+ Uint32 vpnId = vpnUtil.getVpnId(vpnName);
+ final String vrfId = vpnIdRdMap.get(vpnId);
+ if ((tunnelAction == TunnelAction.TUNNEL_EP_ADD)
+ && (tunTypeVal == VpnConstants.ITMTunnelLocType.External.getValue())) {
+ fibManager.populateExternalRoutesOnDpn(srcDpnId, vpnId, vrfId,
+ srcTepIp, destTepIp);
+ }
+ });
+ return Collections.emptyList();
+ },RETRY_COUNT);
} catch (RuntimeException e) {
LOG.error("handleTunnelEventForDpn: Unable to handle the tunnel event for srcDpnId {} srcTepIp {}"
+ " remoteDpnId {} destTepIp {}", srcDpnId, srcTepIp, remoteDpnId, destTepIp, e);