import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.locks.ReentrantLock;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Singleton;
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.utils.JvmGlobalLocks;
+import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.vpntargets.VpnTarget;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
private final DataBroker dataBroker;
private final VpnSubnetRouteHandler vpnSubnetRouteHandler;
private final VpnUtil vpnUtil;
+ private final IVpnManager vpnManager;
@Inject
public SubnetmapChangeListener(final DataBroker dataBroker, final VpnSubnetRouteHandler vpnSubnetRouteHandler,
- VpnUtil vpnUtil) {
+ VpnUtil vpnUtil, IVpnManager vpnManager) {
super(Subnetmap.class, SubnetmapChangeListener.class);
this.dataBroker = dataBroker;
this.vpnSubnetRouteHandler = vpnSubnetRouteHandler;
this.vpnUtil = vpnUtil;
+ this.vpnManager = vpnManager;
}
@PostConstruct
return;
}
if (subnetmap.getVpnId() != null) {
- if (subnetmap.getNetworkType().equals(NetworkType.VLAN)) {
+ if (NetworkType.VLAN.equals(subnetmap.getNetworkType())) {
vpnUtil.addRouterPortToElanDpnListForVlaninAllDpn(subnetmap.getVpnId().getValue());
}
}
elanInstanceName, subnetId.getValue());
return;
}
- if (subnetmap.getVpnId() != null) {
- boolean isBgpVpn = !subnetmap.getVpnId().equals(subnetmap.getRouterId());
+ Uuid vpnId = subnetmap.getVpnId();
+ if (vpnId != null) {
+ boolean isBgpVpn = !vpnId.equals(subnetmap.getRouterId());
LOG.info("SubnetMapChangeListener:add: subnetmap {} with elanTag {} to VPN {}", subnetmap, elanTag,
- subnetmap.getVpnId());
+ vpnId);
vpnSubnetRouteHandler.onSubnetAddedToVpn(subnetmap, isBgpVpn, elanTag);
+ if (isBgpVpn && subnetmap.getRouterId() == null) {
+ Set<VpnTarget> routeTargets = vpnManager.getRtListForVpn(vpnId.getValue());
+ if (!routeTargets.isEmpty()) {
+ // FIXME: separate this out somehow?
+ final ReentrantLock lock = JvmGlobalLocks.getLockForString(subnetmap.getSubnetIp());
+ lock.lock();
+ try {
+ vpnManager.updateRouteTargetsToSubnetAssociation(routeTargets, subnetmap.getSubnetIp(),
+ vpnId.getValue());
+ } finally {
+ lock.unlock();
+ }
+ }
+ }
}
}
return;
}
updateVlanDataEntry(subnetmapOriginal.getVpnId(), subnetmapUpdate.getVpnId(), subnetmapUpdate,
- subnetmapOriginal, elanTag, elanInstanceName);
+ subnetmapOriginal, elanInstanceName);
if (VpnUtil.getIsExternal(network)) {
LOG.debug("SubnetMapChangeListener:update: provider subnetwork {} is handling in "
+ "ExternalSubnetVpnInstanceListener", subnetId.getValue());
vpnSubnetRouteHandler.onSubnetDeletedFromVpn(subnetmapOriginal, true);
}
// subnet updated in VPN
- if (vpnIdOld != null && vpnIdNew != null && (!vpnIdNew.equals(vpnIdOld))) {
+ if (vpnIdOld != null && vpnIdNew != null && !vpnIdNew.equals(vpnIdOld)) {
vpnSubnetRouteHandler.onSubnetUpdatedInVpn(subnetmapUpdate, elanTag);
}
}
private void updateVlanDataEntry(Uuid vpnIdOld, Uuid vpnIdNew, Subnetmap subnetmapUpdate,
- Subnetmap subnetmapOriginal, Long elanTag, String elanInstanceName) {
+ Subnetmap subnetmapOriginal, String elanInstanceName) {
if (vpnIdNew != null && vpnIdOld == null) {
- if (elanInstanceName != null && subnetmapUpdate.getNetworkType().equals(NetworkType.VLAN)) {
+ if (elanInstanceName != null && NetworkType.VLAN.equals(subnetmapUpdate.getNetworkType())) {
vpnUtil.addRouterPortToElanDpnListForVlaninAllDpn(vpnIdNew.getValue());
}
}
if (vpnIdOld != null && vpnIdNew == null) {
- if (subnetmapOriginal.getNetworkType().equals(NetworkType.VLAN)) {
+ if (NetworkType.VLAN.equals(subnetmapOriginal.getNetworkType())) {
vpnUtil.removeRouterPortFromElanDpnListForVlanInAllDpn(elanInstanceName, subnetmapOriginal
.getRouterInterfacePortId().getValue(), vpnIdOld.getValue());
}
LogicalDatastoreType.CONFIGURATION, elanIdentifierId);
if (elanInstance.isPresent()) {
if (elanInstance.get().getElanTag() != null) {
- elanTag = elanInstance.get().getElanTag();
+ elanTag = elanInstance.get().getElanTag().toJava();
} else {
LOG.error("Notification failed because of failure in fetching elanTag for ElanInstance {}",
elanInstanceName);