import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.base.Optional;
+
public class IpvcListener extends UnimgrDataTreeChangeListener<Ipvc> implements IUniAwareService {
private static final Logger Log = LoggerFactory.getLogger(IpvcListener.class);
private final IUniPortManager uniPortManager;
Log.error("Ipvc {} hasn't been created as required, Nothing to disconnect", ipvcSerId);
return;
}
- String vpnName = operIpvcVpn.getVpnId();
- synchronized (vpnName.intern()) {
- WriteTransaction tx = MdsalUtils.createTransaction(dataBroker);
- removeUnis(ipvcId, operIpvcVpn, toRemove, tx);
- MdsalUtils.commitTransaction(tx);
- }
+ removeUnis(ipvcId, operIpvcVpn, toRemove);
}
+
}
private void addIpvc(DataTreeModification<Ipvc> newDataObject) {
Log.error("Ipvc {} hasn't been created as required", ipvc.getIpvcId());
return;
}
- String vpnName = operIpvcVpn.getVpnId();
-
- synchronized (vpnName.intern()) {
- // remove elan/vpn interfaces
- // must be in different transactios
- WriteTransaction tx = MdsalUtils.createTransaction(dataBroker);
- removeUnis(ipvcId, operIpvcVpn, ipvc.getUnis().getUni(), tx);
- MdsalUtils.commitTransaction(tx);
- // Let to work for listeners
- // TODO : change to listener
- NetvirtUtils.safeSleep();
+ removeUnis(ipvcId, operIpvcVpn, ipvc.getUnis().getUni());
+ NetvirtUtils.safeSleep();
+ String vpnId = operIpvcVpn.getVpnId();
+ synchronized (vpnId.intern()) {
WriteTransaction txvpn = MdsalUtils.createTransaction(dataBroker);
NetvirtVpnUtils.removeVpnInstance(operIpvcVpn.getVpnId(), txvpn);
MefServicesUtils.removeOperIpvcVpn(ipvcId, txvpn);
}
}
- private void removeUnis(InstanceIdentifier<Ipvc> ipvcId, IpvcVpn operIpvcVpn, List<Uni> uniToRemove,
- WriteTransaction tx) {
+ private void removeUnis(InstanceIdentifier<Ipvc> ipvcId, IpvcVpn operIpvcVpn, List<Uni> uniToRemove) {
if (uniToRemove == null) {
Log.trace("No UNI's to remove");
}
removeDirectSubnet(uni, ipUni);
subnetManager.unAssignIpUniNetworks(uni.getUniId(), ipUni.getIpUniId(), ipvcId);
- removeInterfaces(ipvcId, operIpvcVpn, uni, ipUni, tx);
+ removeInterfaces(ipvcId, operIpvcVpn, uni, ipUni);
}
updateQos(uniToRemove);
}
WriteTransaction txRemove = MdsalUtils.createTransaction(dataBroker);
List<Uni> uniToRemove = new ArrayList<>(originalUni);
uniToRemove.removeIf(u -> updateUniIds.contains(u.getKey()));
- removeUnis(ipvcId, operIpvcVpn, uniToRemove, txRemove);
+ removeUnis(ipvcId, operIpvcVpn, uniToRemove);
MdsalUtils.commitTransaction(txRemove);
}
+
List<Uni> uniToCreate = new ArrayList<>(updateUni);
uniToCreate.removeIf(u -> originalUniIds.contains(u.getKey()));
createUnis(vpnName, ipvcId, uniToCreate, rd);
}
}
-
private String createElanInterface(String vpnName, InstanceIdentifier<Ipvc> ipvcId, String uniId, String elanName,
Long vlan, IpAddress ipAddress, WriteTransaction tx, Long segmentationId) {
Log.info("Adding elan instance: " + elanName);
IpUni ipUni, String interfaceName, String elanName, WriteTransaction tx) {
Log.info("Adding vpn interface: " + interfaceName);
-
NetvirtVpnUtils.createUpdateVpnInterface(vpnName, interfaceName, ipUni.getIpAddress(),
uni.getMacAddress().getValue(), true, null, elanName, tx);
-
Log.info("Finished working on vpn instance {} interface () ", vpnName, interfaceName);
}
MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, path, subnet.build());
}
- private void removeInterfaces(InstanceIdentifier<Ipvc> ipvcId, IpvcVpn ipvcVpn, Uni uniInService, IpUni ipUni,
- WriteTransaction tx) {
+ private void removeInterfaces(InstanceIdentifier<Ipvc> ipvcId, IpvcVpn ipvcVpn, Uni uniInService, IpUni ipUni) {
String uniId = uniInService.getUniId().getValue();
String vpnName = ipvcVpn.getVpnId();
VpnElans vpnElans = MefServicesUtils.findVpnElanForNetwork(new Identifier45(uniId), ipUni.getIpUniId(),
return;
}
- NetvirtVpnUtils.removeVpnInterfaceAdjacencies(dataBroker, vpnName, vpnElans.getElanPort());
- // TODO : change to listener
- NetvirtUtils.safeSleep();
- uniQosManager.unMapUniPortBandwidthLimits(uniId, vpnElans.getElanPort());
- removeElan(vpnElans, uniId, ipUni, tx);
- // record Uni bw limits
- removeVpnInterface(vpnName, vpnElans, uniId, ipUni, tx);
- MefServicesUtils.removeOperIpvcElan(dataBroker, ipvcId, ipvcVpn.getVpnId(), uniInService.getUniId(),
- uniInService.getIpUniId(), vpnElans.getElanId(), vpnElans.getElanPort());
+ synchronized (vpnName.intern()) {
+ uniQosManager.unMapUniPortBandwidthLimits(uniId, vpnElans.getElanPort());
+ NetvirtVpnUtils.removeLearnedVpnVipToPort(dataBroker, vpnName, vpnElans.getElanPort());
+ removeVpnInterface(vpnName, vpnElans, uniId, ipUni);
+ }
+ waitForInterfaceDpnClean(vpnName, ipvcVpn.getVrfId(), vpnElans.getElanPort());
+
+ synchronized (vpnName.intern()) {
+ removeElan(vpnElans, uniId, ipUni);
+ MefServicesUtils.removeOperIpvcElan(dataBroker, ipvcId, ipvcVpn.getVpnId(), uniInService.getUniId(),
+ uniInService.getIpUniId(), vpnElans.getElanId(), vpnElans.getElanPort());
+ }
+ }
+
+ private void waitForInterfaceDpnClean(String vpnName, String rd, String interfaceName) {
+ InstanceIdentifier<VpnInstanceOpDataEntry> vpnId = NetvirtVpnUtils.getVpnInstanceOpDataIdentifier(rd);
+ DataWaitGetter<VpnInstanceOpDataEntry> getInterfByName = (vpn) -> {
+ if (vpn.getVpnToDpnList() == null)
+ return null;
+ for (VpnToDpnList is : vpn.getVpnToDpnList()) {
+ if (is.getVpnInterfaces() == null)
+ continue;
+ for (VpnInterfaces i : is.getVpnInterfaces()) {
+ if (i.getInterfaceName().equals(interfaceName))
+ return interfaceName;
+ }
+ }
+ return null;
+ };
+
+ int retryCount = 2;
+ Optional<VpnInstanceOpDataEntry> vpnOper = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, vpnId);
+ if (vpnOper.isPresent() && vpnOper.get().getVpnToDpnList() != null) {
+ for (VpnToDpnList vpnList : vpnOper.get().getVpnToDpnList()) {
+ if (vpnList.getVpnInterfaces() != null) {
+ retryCount = retryCount + 2 * vpnList.getVpnInterfaces().size();
+ }
+ }
+ }
+
+ @SuppressWarnings("resource")
+ DataWaitListener<VpnInstanceOpDataEntry> vpnInstanceWaiter = new DataWaitListener<>(dataBroker, vpnId,
+ retryCount, LogicalDatastoreType.OPERATIONAL, getInterfByName);
+ if (!vpnInstanceWaiter.waitForClean()) {
+ String errorMessage = String.format("Fail to wait for vpn to dpn list clean-up %s", vpnName);
+ Log.error(errorMessage);
+ throw new UnsupportedOperationException(errorMessage);
+ }
}
- private void removeElan(VpnElans vpnElans, String uniId, IpUni ipUni, WriteTransaction tx) {
+ private void removeElan(VpnElans vpnElans, String uniId, IpUni ipUni) {
+ WriteTransaction tx = MdsalUtils.createTransaction(dataBroker);
+
Long vlan = ipUni.getVlan() != null ? Long.valueOf(ipUni.getVlan().getValue()) : 0;
Log.info("Removing trunk interface for uni {} vlan: {}", uniId, vlan);
uniPortManager.removeCeVlan(uniId, vlan);
NetvirtVpnUtils.unregisterDirectSubnetForVpn(dataBroker, new Uuid(elanName));
NetvirtUtils.deleteElanInterface(interfaceName, tx);
NetvirtUtils.deleteElanInstance(elanName, tx);
+ MdsalUtils.commitTransaction(tx);
}
private void removeVpnInterface(String vpnName, VpnElans vpnElans, String uniId, IpUni ipUni, WriteTransaction tx) {
String interfaceName = vpnElans.getElanPort();
- Log.info("Removing vpn interface: " + interfaceName);
NetvirtVpnUtils.removeVpnInterface(interfaceName, tx);
NetvirtVpnUtils.removeVpnPortFixedIp(vpnName, ipUni.getIpAddress(), tx);
- Log.info("Finished working on vpn instance: " + vpnName);
+ }
+
+ private void removeVpnInterface(String vpnName, VpnElans vpnElans, String uniId, IpUni ipUni) {
+ Log.info("Removing vpn interface: " + vpnElans.getElanPort());
+ WriteTransaction tx = MdsalUtils.createTransaction(dataBroker);
+ removeVpnInterface(vpnName, vpnElans, uniId, ipUni, tx);
+ MdsalUtils.commitTransaction(tx);
+ Log.info("Finished working on vpn interface: " + vpnElans.getElanPort());
}
private void removeDirectSubnet(Uni uni, IpUni ipUni) {
}
}
- public static void removeVpnInterfaceAdjacencies(DataBroker dataBroker, String vpnName, String interfaceName) {
+ public static void removeLearnedVpnVipToPort(DataBroker dataBroker, String vpnName, String interfaceName) {
InstanceIdentifier<VpnInterface> identifier = getVpnInterfaceInstanceIdentifier(interfaceName);
InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);
adjacenciesList.forEach(a -> {
String ipStr = getIpAddressFromPrefix(a.getIpAddress());
InstanceIdentifier<LearntVpnVipToPort> id = getLearntVpnVipToPortIdentifier(vpnName, ipStr);
- MdsalUtils.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+ if (MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id).isPresent()) {
+ MdsalUtils.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+ }
});
int waitCount = adjacenciesList.isEmpty() ? 2 : 2 * adjacenciesList.size();
.child(VpnInterface.class, new VpnInterfaceKey(interfaceName)).build();
}
+ public static void cleanVpnInterfaceInstanceOpt(DataBroker dataBroker, String vpnName) {
+ InstanceIdentifier<VpnInterfaces> path = InstanceIdentifier.builder(VpnInterfaces.class).build();
+
+ Optional<VpnInterfaces> opt = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
+ if (!opt.isPresent() || opt.get().getVpnInterface() == null) {
+ return;
+ }
+
+ for (VpnInterface interf : opt.get().getVpnInterface()) {
+ if (interf.getVpnInstanceName().equals(vpnName) && interf.isScheduledForRemove()) {
+ InstanceIdentifier<VpnInterface> interfId = path.child(VpnInterface.class,
+ new VpnInterfaceKey(interf.getKey()));
+ MdsalUtils.delete(dataBroker, LogicalDatastoreType.OPERATIONAL, interfId);
+ }
+ }
+ }
+
public static void createVpnPortFixedIp(DataBroker dataBroker, String vpnName, String portName, IpPrefix ipAddress,
MacAddress macAddress) {
String fixedIpPrefix = ipPrefixToString(ipAddress);
InstanceIdentifier<ElanInstance> elanIdentifierId = NetvirtUtils.getElanInstanceInstanceIdentifier(subnetName);
@SuppressWarnings("resource") // AutoCloseable
- DataWaitListener<ElanInstance> elanTagWaiter = new DataWaitListener<>(dataBroker, elanIdentifierId,
- 10, LogicalDatastoreType.CONFIGURATION, el -> el.getElanTag());
+ DataWaitListener<ElanInstance> elanTagWaiter = new DataWaitListener<>(dataBroker, elanIdentifierId, 10,
+ LogicalDatastoreType.CONFIGURATION, el -> el.getElanTag());
if (!elanTagWaiter.waitForData()) {
logger.error("Trying to add invalid elan {} to vpn {}", subnetName, vpnName);
return;
Optional<ElanInstance> elanInstance = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
elanIdentifierId);
if (!elanInstance.isPresent()) {
- logger.error("Trying to add invalid elan {} to vpn {}", subnetName, vpnName);
+ logger.error("Trying to remove invalid elan {} to vpn {}", subnetName, vpnName);
return;
}
Long elanTag = elanInstance.get().getElanTag() != null ? elanInstance.get().getElanTag()