add a delete vBNG feature
Change-Id: I21ce31d645be31320d06c36795e6b044f11924ab
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationManager.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationManager.java
index 3a8dace..c449eef 100644
--- a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationManager.java
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationManager.java
@@ -182,6 +182,27 @@
return ipAddressMap.containsValue(ipAddress);
}
+ @Override
+ public IpAddress recycleAssignedPublicIpAddress(IpAddress
+ privateIpAddress) {
+ IpAddress publicIpAddress = ipAddressMap.remove(privateIpAddress);
+ if (publicIpAddress == null) {
+ return null;
+ }
+
+ Iterator<Entry<IpPrefix, Boolean>> prefixes =
+ localPublicIpPrefixes.entrySet().iterator();
+ while (prefixes.hasNext()) {
+ Entry<IpPrefix, Boolean> prefixEntry = prefixes.next();
+ if (prefixEntry.getKey().contains(publicIpAddress)
+ && !prefixEntry.getValue()) {
+ updateIpPrefixStatus(prefixEntry.getKey(), true);
+ }
+ }
+
+ return publicIpAddress;
+ }
+
/**
* Generates a new IP address base on a given IP address plus a number to
* increase.
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationService.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationService.java
index ac498dc..c905020 100644
--- a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationService.java
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationService.java
@@ -61,4 +61,14 @@
* @return the assigned public IP address if it exists, otherwise null
*/
IpAddress getAssignedPublicIpAddress(IpAddress privateIpAddress);
+
+ /**
+ * Recycles the public IP address assigned for a private IP address, and
+ * at the same time deletes the mapping entry from this private IP address
+ * to the public IP address.
+ *
+ * @param privateIpAddress a private IP address
+ * @return the assigned public IP address if it exists, otherwise null
+ */
+ IpAddress recycleAssignedPublicIpAddress(IpAddress privateIpAddress);
}
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngManager.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngManager.java
index f440c5d..6b2e943 100644
--- a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngManager.java
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngManager.java
@@ -91,7 +91,6 @@
private HostListener hostListener;
private IpAddress nextHopIpAddress;
-
@Activate
public void activate() {
appId = coreService.registerApplication(APP_NAME);
@@ -133,6 +132,47 @@
return publicIpAddress;
}
+ @Override
+ public IpAddress deleteVbng(IpAddress privateIpAddress) {
+ // Recycle the public IP address assigned to this private IP address.
+ // Recycling will also delete the mapping entry from the private IP
+ // address to public IP address.
+ IpAddress assignedPublicIpAddress = vbngConfigurationService
+ .recycleAssignedPublicIpAddress(privateIpAddress);
+ if (assignedPublicIpAddress == null) {
+ return null;
+ }
+
+ // Remove the private IP address from privateIpAddressSet
+ privateIpAddressSet.remove(privateIpAddress);
+
+ // Remove intents
+ removeForwardingPaths(privateIpAddress);
+
+ return assignedPublicIpAddress;
+ }
+
+ /**
+ * Removes the forwarding paths in both two directions between host
+ * configured with private IP and next hop.
+ *
+ * @param privateIp the private IP address of a local host
+ */
+ private void removeForwardingPaths(IpAddress privateIp) {
+ PointToPointIntent toNextHopIntent =
+ p2pIntentsFromHost.remove(privateIp);
+ if (toNextHopIntent != null) {
+ intentService.withdraw(toNextHopIntent);
+ //intentService.purge(toNextHopIntent);
+ }
+ PointToPointIntent toLocalHostIntent =
+ p2pIntentsToHost.remove(privateIp);
+ if (toLocalHostIntent != null) {
+ intentService.withdraw(toLocalHostIntent);
+ //intentService.purge(toLocalHostIntent);
+ }
+ }
+
/**
* Sets up forwarding paths in both two directions between host configured
* with private IP and next hop.
@@ -207,7 +247,7 @@
localHost.mac(),
localHostConnectPoint,
nextHopConnectPoint);
- p2pIntentsToHost.put(nextHopIpAddress, toLocalHostIntent);
+ p2pIntentsToHost.put(privateIp, toLocalHostIntent);
intentService.submit(toLocalHostIntent);
}
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngResource.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngResource.java
index 9436981..2b0cd98 100644
--- a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngResource.java
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngResource.java
@@ -17,6 +17,7 @@
import static org.slf4j.LoggerFactory.getLogger;
+import javax.ws.rs.DELETE;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@@ -35,13 +36,13 @@
@POST
@Path("{privateip}")
- public String privateIpNotification(@PathParam("privateip")
+ public String privateIpAddNotification(@PathParam("privateip")
String privateIp) {
if (privateIp == null) {
- log.info("Private IP address is null");
+ log.info("Private IP address to add is null");
return "0";
}
- log.info("Received a private IP address : {}", privateIp);
+ log.info("Received a private IP address : {} to add", privateIp);
IpAddress privateIpAddress = IpAddress.valueOf(privateIp);
VbngService vbngService = get(VbngService.class);
@@ -56,4 +57,28 @@
return "0";
}
}
+
+ @DELETE
+ @Path("{privateip}")
+ public String privateIpDeleteNotification(@PathParam("privateip")
+ String privateIp) {
+ if (privateIp == null) {
+ log.info("Private IP address to delete is null");
+ return "0";
+ }
+ log.info("Received a private IP address : {} to delete", privateIp);
+ IpAddress privateIpAddress = IpAddress.valueOf(privateIp);
+
+ VbngService vbngService = get(VbngService.class);
+
+ IpAddress assignedPublicIpAddress = null;
+ // Delete a virtual BNG
+ assignedPublicIpAddress = vbngService.deleteVbng(privateIpAddress);
+
+ if (assignedPublicIpAddress != null) {
+ return assignedPublicIpAddress.toString();
+ } else {
+ return "0";
+ }
+ }
}
\ No newline at end of file
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngService.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngService.java
index 4ac7606..c27f86f 100644
--- a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngService.java
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngService.java
@@ -36,4 +36,13 @@
*/
IpAddress createVbng(IpAddress privateIpAddress);
+ /**
+ * Deletes a virtual BNG.
+ *
+ * @param privateIpAddress a private IP address
+ * @return the public address assigned for this private IP address if the
+ * virtual BGN exists and is deleted, otherwise return null if
+ * there is no vBNG for this private IP address
+ */
+ IpAddress deleteVbng(IpAddress privateIpAddress);
}