ONOS-4403 Remove intents using appId when apps get deactivated.
Change-Id: Ieaea8aeff2f2c29287a3e2eea33654fa22d38c09
diff --git a/apps/routing-api/src/main/java/org/onosproject/routing/IntentSynchronizationService.java b/apps/routing-api/src/main/java/org/onosproject/routing/IntentSynchronizationService.java
index f9cf7f9..8f97264 100644
--- a/apps/routing-api/src/main/java/org/onosproject/routing/IntentSynchronizationService.java
+++ b/apps/routing-api/src/main/java/org/onosproject/routing/IntentSynchronizationService.java
@@ -16,6 +16,7 @@
package org.onosproject.routing;
+import org.onosproject.core.ApplicationId;
import org.onosproject.net.intent.Intent;
/**
@@ -48,4 +49,12 @@
* @param intent intent to withdraw
*/
void withdraw(Intent intent);
+
+ /**
+ * Withdraws intents by app Id.
+ *
+ * @param applicationId the Id of the application that created the intents
+ * to be removed
+ */
+ void removeIntentsByAppId(ApplicationId applicationId);
}
diff --git a/apps/routing/src/main/java/org/onosproject/routing/impl/IntentSynchronizer.java b/apps/routing/src/main/java/org/onosproject/routing/impl/IntentSynchronizer.java
index 288c930..3b47256 100644
--- a/apps/routing/src/main/java/org/onosproject/routing/impl/IntentSynchronizer.java
+++ b/apps/routing/src/main/java/org/onosproject/routing/impl/IntentSynchronizer.java
@@ -143,6 +143,28 @@
}
@Override
+ public void removeIntentsByAppId(ApplicationId appId) {
+ if (!isElectedLeader) {
+ // Only leader will withdraw intents
+ return;
+ }
+
+ log.debug("Withdrawing intents for app {}...",
+ appId);
+
+ intents.entrySet()
+ .stream()
+ .filter(intent -> intent.getValue().appId().equals(appId))
+ .forEach(intent -> {
+ log.debug("Intent Synchronizer withdrawing intent: {}",
+ intent);
+ intentService.withdraw(intent.getValue());
+ intents.remove(intent.getKey(), intent.getValue());
+ log.info("Tried to clean intents for app: {}", appId);
+ });
+ }
+
+ @Override
public void submit(Intent intent) {
synchronized (this) {
intents.put(intent.key(), intent);
diff --git a/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java b/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java
index cd4be3d..3366d91 100644
--- a/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java
+++ b/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java
@@ -89,9 +89,9 @@
interfaceService);
peerConnectivity.start();
- // TODO fix removing intents
- applicationService.registerDeactivateHook(appId,
- intentSynchronizerAdmin::removeIntents);
+ applicationService.registerDeactivateHook(appId, () -> {
+ intentSynchronizer.removeIntentsByAppId(appId);
+ });
log.info("SDN-IP started");
}
diff --git a/apps/vpls/src/main/java/org/onosproject/vpls/Vpls.java b/apps/vpls/src/main/java/org/onosproject/vpls/Vpls.java
index 4898f91..2622bc8 100644
--- a/apps/vpls/src/main/java/org/onosproject/vpls/Vpls.java
+++ b/apps/vpls/src/main/java/org/onosproject/vpls/Vpls.java
@@ -92,8 +92,9 @@
intentService,
intentSynchronizer);
- applicationService.registerDeactivateHook(appId,
- intentSynchronizerAdmin::removeIntents);
+ applicationService.registerDeactivateHook(appId, () -> {
+ intentSynchronizer.removeIntentsByAppId(appId);
+ });
hostService.addListener(hostListener);
interfaceService.addListener(interfaceListener);
diff --git a/apps/vpls/src/test/java/org/onosproject/vpls/VplsTest.java b/apps/vpls/src/test/java/org/onosproject/vpls/VplsTest.java
index 18d1d03..981ea9b 100644
--- a/apps/vpls/src/test/java/org/onosproject/vpls/VplsTest.java
+++ b/apps/vpls/src/test/java/org/onosproject/vpls/VplsTest.java
@@ -666,12 +666,14 @@
@Override
public void modifyPrimary(boolean isPrimary) {
-
}
@Override
public void removeIntents() {
+ }
+ @Override
+ public void removeIntentsByAppId(ApplicationId applicationId) {
}
}