[VOL-2363] Fixed Cleanup of AAA Sessions on Device Remove event

Change-Id: I1e941fa14586ff0489fa702ba79f7835ca71eea3
diff --git a/app/src/main/java/org/opencord/aaa/impl/AaaManager.java b/app/src/main/java/org/opencord/aaa/impl/AaaManager.java
index f14cf66..1a246f4 100644
--- a/app/src/main/java/org/opencord/aaa/impl/AaaManager.java
+++ b/app/src/main/java/org/opencord/aaa/impl/AaaManager.java
@@ -18,6 +18,7 @@
 import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
 import static org.slf4j.LoggerFactory.getLogger;
 
+import com.google.common.collect.Sets;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
@@ -26,6 +27,8 @@
 import java.util.HashSet;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Set;
+import java.util.Map.Entry;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.felix.scr.annotations.Component;
@@ -960,28 +963,56 @@
                     PortNumber portNumber = event.port().number();
                     String sessionId = devId.toString() + portNumber.toString();
 
-                    StateMachine stateMachine = StateMachine.lookupStateMachineBySessionId(sessionId);
-                    if (stateMachine != null) {
-                        stateMachine.setSessionTerminateReason(
-                                StateMachine.SessionTerminationReasons.PORT_REMOVED.getReason());
-                    }
-                    //pushing captured machine stats to kafka
-                    AaaSupplicantMachineStats obj = aaaSupplicantStatsManager.getSupplicantStats(stateMachine);
-                    aaaSupplicantStatsManager.getMachineStatsDelegate()
-                            .notify(new AaaMachineStatisticsEvent(AaaMachineStatisticsEvent.Type.STATS_UPDATE, obj));
+                    log.info("Received PORT_REMOVED event. Clearing AAA Session with Id {}", sessionId);
+                    flushStateMachineSession(sessionId,
+                            StateMachine.SessionTerminationReasons.PORT_REMOVED.getReason());
 
-                    Map<String, StateMachine> sessionIdMap = StateMachine.sessionIdMap();
-                    StateMachine removed = sessionIdMap.remove(sessionId);
-                    if (removed != null) {
-                        StateMachine.deleteStateMachineMapping(removed);
+                    break;
+
+                case DEVICE_REMOVED:
+                    DeviceId deviceId = event.subject().id();
+                    log.info("Received DEVICE_REMOVED event for {}", deviceId);
+
+                    Set<String> associatedSessions = Sets.newHashSet();
+                    for (Entry<String, StateMachine> stateMachineEntry : StateMachine.sessionIdMap().entrySet()) {
+                        ConnectPoint cp = stateMachineEntry.getValue().supplicantConnectpoint();
+                        if (cp != null && cp.deviceId().toString().equals(deviceId.toString())) {
+                            associatedSessions.add(stateMachineEntry.getKey());
+                        }
+                    }
+
+                    for (String session : associatedSessions) {
+                        log.info("Clearing AAA Session {} associated with Removed Device", session);
+                        flushStateMachineSession(session,
+                               StateMachine.SessionTerminationReasons.DEVICE_REMOVED.getReason());
                     }
 
                     break;
+
                 default:
                     return;
             }
         }
+
+        private void flushStateMachineSession(String sessionId, String terminationReason) {
+            StateMachine stateMachine = StateMachine.lookupStateMachineBySessionId(sessionId);
+            if (stateMachine != null) {
+                stateMachine.setSessionTerminateReason(terminationReason);
+            }
+
+            //pushing captured machine stats to kafka
+            AaaSupplicantMachineStats obj = aaaSupplicantStatsManager.getSupplicantStats(stateMachine);
+            aaaSupplicantStatsManager.getMachineStatsDelegate()
+                   .notify(new AaaMachineStatisticsEvent(AaaMachineStatisticsEvent.Type.STATS_UPDATE, obj));
+
+            Map<String, StateMachine> sessionIdMap = StateMachine.sessionIdMap();
+            StateMachine removed = sessionIdMap.remove(sessionId);
+            if (removed != null) {
+                StateMachine.deleteStateMachineMapping(removed);
+            }
+        }
     }
+
     private class AuthenticationStatisticsEventPublisher implements Runnable {
         private final Logger log = getLogger(getClass());
         public void run() {
@@ -1041,4 +1072,4 @@
         }
 
     }
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/org/opencord/aaa/impl/StateMachine.java b/app/src/main/java/org/opencord/aaa/impl/StateMachine.java
index 16543df..2c0d29f 100644
--- a/app/src/main/java/org/opencord/aaa/impl/StateMachine.java
+++ b/app/src/main/java/org/opencord/aaa/impl/StateMachine.java
@@ -89,7 +89,8 @@
     public enum SessionTerminationReasons {
         SUPPLICANT_LOGOFF("SUPPLICANT_LOGOFF"),
         TIME_OUT("TIME_OUT"),
-        PORT_REMOVED("PORT_REMOVED");
+        PORT_REMOVED("PORT_REMOVED"),
+        DEVICE_REMOVED("DEVICE_REMOVED");
 
         private final String reason;