}
}
}
-// InstanceIdentifier<VpnInterface> interfaceId = VpnUtil.getVpnInterfaceIdentifier(intfName);
-// delete(LogicalDatastoreType.OPERATIONAL, interfaceId);
}
private <T extends DataObject> void delete(LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
}
private void removePrefixFromBGP(String rd, Adjacency nextHop) {
- //public void deletePrefix(String rd, String prefix) throws Exception;
try {
bgpManager.deletePrefix(rd, nextHop.getIpAddress());
} catch(Exception e) {
@Override
protected void update(InstanceIdentifier<VpnInterface> 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<Adjacency> oldAdjs = original.getAugmentation(Adjacencies.class).getAdjacency();
+ List<Adjacency> newAdjs = update.getAugmentation(Adjacencies.class).getAdjacency();
+ if(vpnNameChanged && newAdjs != null && !newAdjs.isEmpty()) {
+ long label = VpnConstants.INVALID_ID;
+ InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);
+ Optional<Adjacencies> adjacencies = read(LogicalDatastoreType.OPERATIONAL, path);
+ if (adjacencies.isPresent()) {
+ List<Adjacency> 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 <T extends DataObject> void asyncUpdate(LogicalDatastoreType datastoreType,
+ InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
+ WriteTransaction tx = broker.newWriteOnlyTransaction();
+ tx.merge(datastoreType, path, data, true);
+ Futures.addCallback(tx.submit(), callback);
}
private <T extends DataObject> void asyncWrite(LogicalDatastoreType datastoreType,
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;
private final DataBroker broker;
private final IBgpManager bgpManager;
private IdManagerService idManager;
+ private VpnInterfaceManager vpnInterfaceManager;
private final FibEntriesListener fibListener;
private static final FutureCallback<Void> DEFAULT_CALLBACK =
this.idManager = idManager;
}
+ public void setVpnInterfaceManager(VpnInterfaceManager vpnInterfaceManager) {
+ this.vpnInterfaceManager = vpnInterfaceManager;
+ }
+
@Override
protected void remove(InstanceIdentifier<VpnInstance> 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<VpnInstance> vpnIdentifier = VpnUtil.getVpnInstanceIdentifier(vpnName);
+ //Clean up vpn Interface
+ InstanceIdentifier<VpnInterfaces> vpnInterfacesId = InstanceIdentifier.builder(VpnInterfaces.class).build();
+ Optional<VpnInterfaces> optionalVpnInterfaces = read(LogicalDatastoreType.OPERATIONAL, vpnInterfacesId);
+
+ if(optionalVpnInterfaces.isPresent()) {
+ List<VpnInterface> 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();
} 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;