You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by is...@apache.org on 2014/10/26 17:25:29 UTC

[1/2] git commit: initial app unsubscription changes

Repository: stratos
Updated Branches:
  refs/heads/4.0.0-grouping 6f7baa85e -> 4f59f4b8b


initial app unsubscription changes


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/4f59f4b8
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/4f59f4b8
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/4f59f4b8

Branch: refs/heads/4.0.0-grouping
Commit: 4f59f4b8bdbb4d9aeab043ea6544f9654ab2c634
Parents: 87d77a2
Author: Isuru Haththotuwa <is...@apache.org>
Authored: Sun Oct 26 21:47:35 2014 +0530
Committer: Isuru Haththotuwa <is...@apache.org>
Committed: Sun Oct 26 21:54:59 2014 +0530

----------------------------------------------------------------------
 .../grouping/topic/StatusEventPublisher.java    |  23 ++-
 .../AutoscalerTopologyEventReceiver.java        | 141 ++++++++-----------
 .../stratos/autoscaler/monitor/Monitor.java     |   7 +-
 .../monitor/ParentComponentMonitor.java         |  20 +--
 .../monitor/application/ApplicationMonitor.java |  40 +++---
 .../status/checker/StatusChecker.java           |  13 +-
 .../ApplicationStatusTopicReceiver.java         |   4 +-
 .../impl/CloudControllerServiceImpl.java        |   4 +-
 .../controller/topology/TopologyBuilder.java    | 129 ++++++++---------
 .../topology/TopologyEventPublisher.java        |  20 +++
 .../topology/ApplicationTerminatedEvent.java    |  12 +-
 .../topology/ApplicationTerminatingEvent.java   |  12 +-
 ...StatusClusterTerminatedMessageProcessor.java |   2 +-
 .../ApplicationTerminatingMessageProcessor.java |  10 +-
 .../topology/ClusterTerminatedProcessor.java    |  16 +--
 .../topology/ClusterTerminatingProcessor.java   |  16 +--
 .../topology/GroupTerminatedProcessor.java      |   4 +-
 17 files changed, 243 insertions(+), 230 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/topic/StatusEventPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/topic/StatusEventPublisher.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/topic/StatusEventPublisher.java
index 0800b14..c0c64ac 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/topic/StatusEventPublisher.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/topic/StatusEventPublisher.java
@@ -10,6 +10,7 @@ import org.apache.stratos.messaging.event.application.status.*;
 import org.apache.stratos.messaging.event.application.status.ApplicationActivatedEvent;
 import org.apache.stratos.messaging.event.application.status.ApplicationInactivatedEvent;
 import org.apache.stratos.messaging.event.application.status.ApplicationTerminatedEvent;
+import org.apache.stratos.messaging.event.application.status.ApplicationTerminatingEvent;
 import org.apache.stratos.messaging.event.application.status.ClusterActivatedEvent;
 import org.apache.stratos.messaging.event.application.status.ClusterInActivateEvent;
 import org.apache.stratos.messaging.event.application.status.ClusterMaintenanceModeEvent;
@@ -72,9 +73,10 @@ public class StatusEventPublisher {
                     " [cluster]: " + clusterId);
         }
         //TODO
-        /*ClusterActivatedEvent clusterActivatedEvent = new ClusterActivatedEvent(appId, serviceName, clusterId);
+        AppStatusClusterTerminatingEvent appStatusClusterTerminatingEvent =
+                new AppStatusClusterTerminatingEvent(appId, serviceName, clusterId);
 
-        publishEvent(clusterActivatedEvent);*/
+        publishEvent(appStatusClusterTerminatingEvent);
     }
 
     public static void sendClusterTerminatedEvent(String appId, String serviceName, String clusterId) {
@@ -83,10 +85,11 @@ public class StatusEventPublisher {
             log.info("Publishing Cluster in-activate event for [application]: " + appId +
                     " [cluster]: " + clusterId);
         }
-        //TODO
-       /* Cluster clusterActivatedEvent = new ClusterActivatedEvent(appId, serviceName, clusterId);
 
-        publishEvent(clusterActivatedEvent);*/
+        AppStatusClusterTerminatedEvent appStatusClusterTerminatedEvent =
+                new AppStatusClusterTerminatedEvent(appId, serviceName, clusterId);
+
+        publishEvent(appStatusClusterTerminatedEvent);
     }
 
     public static void sendGroupActivatedEvent(String appId, String groupId) {
@@ -156,6 +159,16 @@ public class StatusEventPublisher {
         publishEvent(applicationInActivatedEvent);
     }
 
+    public static void sendApplicationTerminatingEvent (String appId) {
+        if (log.isInfoEnabled()) {
+            log.info("Publishing Application terminated event for [application]: " + appId);
+        }
+
+        ApplicationTerminatingEvent applicationTerminatingEvent = new ApplicationTerminatingEvent(appId);
+
+        publishEvent(applicationTerminatingEvent);
+    }
+
     public static void sendApplicationTerminatedEvent (String appId, Set<ClusterDataHolder> clusterData) {
         if (log.isInfoEnabled()) {
             log.info("Publishing Application terminated event for [application]: " + appId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
index 2f7cca4..654d5b2 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
@@ -41,7 +41,6 @@ import org.apache.stratos.messaging.event.topology.*;
 import org.apache.stratos.messaging.event.topology.ApplicationActivatedEvent;
 import org.apache.stratos.messaging.event.topology.ApplicationCreatedEvent;
 import org.apache.stratos.messaging.event.topology.ClusterActivatedEvent;
-import org.apache.stratos.messaging.event.topology.ClusterInActivateEvent;
 import org.apache.stratos.messaging.event.topology.GroupActivatedEvent;
 import org.apache.stratos.messaging.listener.topology.*;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyEventReceiver;
@@ -204,9 +203,9 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
 
                 log.info("[ClusterInActivateEvent] Received: " + event.getClass());
 
-                ClusterTerminatedEvent clusterInactivateEvent = (ClusterTerminatedEvent) event;
-                String appId = clusterInactivateEvent.getAppId();
-                String clusterId = clusterInactivateEvent.getClusterId();
+                ClusterTerminatingEvent clusterTerminatingEvent = (ClusterTerminatingEvent) event;
+                String appId = clusterTerminatingEvent.getAppId();
+                String clusterId = clusterTerminatingEvent.getClusterId();
                 AbstractClusterMonitor clusterMonitor =
                         (AbstractClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId);
 
@@ -224,9 +223,9 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
 
                 log.info("[ClusterInActivateEvent] Received: " + event.getClass());
 
-                ClusterTerminatedEvent clusterInactivateEvent = (ClusterTerminatedEvent) event;
-                String appId = clusterInactivateEvent.getAppId();
-                String clusterId = clusterInactivateEvent.getClusterId();
+                ClusterTerminatedEvent clusterTerminatedEvent = (ClusterTerminatedEvent) event;
+                String appId = clusterTerminatedEvent.getAppId();
+                String clusterId = clusterTerminatedEvent.getClusterId();
                 AbstractClusterMonitor clusterMonitor =
                         (AbstractClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId);
 
@@ -328,78 +327,17 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
             }
         });
 
-//        topologyEventReceiver.addEventListener(new ApplicationUndeployedEventListener() {
-//            @Override
-//            protected void onEvent(Event event) {
-//
-//                log.info("[ApplicationUndeployedEvent] Received: " + event.getClass());
-//
-//                ApplicationUndeployedEvent applicationUndeployedEvent = (ApplicationUndeployedEvent) event;
-//
-//                // acquire reead locks for application and relevant clusters
-//                TopologyManager.acquireReadLockForApplication(applicationUndeployedEvent.getApplicationId());
-//                Set<ClusterDataHolder> clusterDataHolders = applicationUndeployedEvent.getClusterData();
-//                if (clusterDataHolders != null) {
-//                    for (ClusterDataHolder clusterData : clusterDataHolders) {
-//                        TopologyManager.acquireReadLockForCluster(clusterData.getServiceType(),
-//                                clusterData.getClusterId());
-//                    }
-//                }
-//
-//                try {
-//                    ApplicationMonitor appMonitor = AutoscalerContext.getInstance().
-//                            getAppMonitor(applicationUndeployedEvent.getApplicationId());
-//
-//                    if (appMonitor != null) {
-//                        // update the status as Terminating
-//                        appMonitor.setStatus(ApplicationStatus.Terminating);
-//
-//                        List<String> clusters = appMonitor.
-//                                findClustersOfApplication(applicationUndeployedEvent.getApplicationId());
-//
-//                        for (String clusterId : clusters) {
-//                            //stopping the cluster monitor and remove it from the AS
-//                            ClusterMonitor clusterMonitor =
-//                                    ((ClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId));
-//                            if (clusterMonitor != null) {
-//                                clusterMonitor.setDestroyed(true);
-//                                clusterMonitor.terminateAllMembers();
-//                                clusterMonitor.setStatus(ClusterStatus.Terminating);
-//                            } else {
-//                                log.warn("No Cluster Monitor found for cluster id " + clusterId);
-//                            }
-//                        }
-//
-//                    } else {
-//                        log.warn("Application Monitor cannot be found for the undeployed [application] "
-//                                + applicationUndeployedEvent.getApplicationId());
-//                    }
-//
-//                } finally {
-//                    if (clusterDataHolders != null) {
-//                        for (ClusterDataHolder clusterData : clusterDataHolders) {
-//                            TopologyManager.releaseReadLockForCluster(clusterData.getServiceType(),
-//                                    clusterData.getClusterId());
-//                        }
-//                    }
-//                    TopologyManager.
-//                            releaseReadLockForApplication(applicationUndeployedEvent.getApplicationId());
-//                }
-//            }
-//        });
-
-
-        topologyEventReceiver.addEventListener(new ApplicationTerminatingEventListener() {
+        topologyEventReceiver.addEventListener(new ApplicationUndeployedEventListener() {
             @Override
             protected void onEvent(Event event) {
 
-                log.info("[ApplicationTerminatingEvent] Received: " + event.getClass());
+                log.info("[ApplicationUndeployedEvent] Received: " + event.getClass());
 
-                ApplicationTerminatingEvent appTerminatingEvent = (ApplicationTerminatingEvent) event;
+                ApplicationUndeployedEvent applicationUndeployedEvent = (ApplicationUndeployedEvent) event;
 
                 // acquire reead locks for application and relevant clusters
-                TopologyManager.acquireReadLockForApplication(appTerminatingEvent.getAppId());
-                Set<ClusterDataHolder> clusterDataHolders = appTerminatingEvent.getClusterData();
+                TopologyManager.acquireReadLockForApplication(applicationUndeployedEvent.getApplicationId());
+                Set<ClusterDataHolder> clusterDataHolders = applicationUndeployedEvent.getClusterData();
                 if (clusterDataHolders != null) {
                     for (ClusterDataHolder clusterData : clusterDataHolders) {
                         TopologyManager.acquireReadLockForCluster(clusterData.getServiceType(),
@@ -409,31 +347,31 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
 
                 try {
                     ApplicationMonitor appMonitor = AutoscalerContext.getInstance().
-                            getAppMonitor(appTerminatingEvent.getAppId());
+                            getAppMonitor(applicationUndeployedEvent.getApplicationId());
 
                     if (appMonitor != null) {
                         // update the status as Terminating
                         appMonitor.setStatus(ApplicationStatus.Terminating);
 
-                        List<String> clusters = appMonitor.
-                                findClustersOfApplication(appTerminatingEvent.getAppId());
+//                        List<String> clusters = appMonitor.
+//                                findClustersOfApplication(applicationUndeployedEvent.getApplicationId());
 
-                        for (String clusterId : clusters) {
+                        for (ClusterDataHolder clusterData : clusterDataHolders) {
                             //stopping the cluster monitor and remove it from the AS
                             ClusterMonitor clusterMonitor =
-                                    ((ClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId));
+                                    ((ClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterData.getClusterId()));
                             if (clusterMonitor != null) {
                                 clusterMonitor.setDestroyed(true);
                                 clusterMonitor.terminateAllMembers();
                                 clusterMonitor.setStatus(ClusterStatus.Terminating);
                             } else {
-                                log.warn("No Cluster Monitor found for cluster id " + clusterId);
+                                log.warn("No Cluster Monitor found for cluster id " + clusterData.getClusterId());
                             }
                         }
 
                     } else {
                         log.warn("Application Monitor cannot be found for the undeployed [application] "
-                                + appTerminatingEvent.getAppId());
+                                + applicationUndeployedEvent.getApplicationId());
                     }
 
                 } finally {
@@ -444,6 +382,38 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
                         }
                     }
                     TopologyManager.
+                            releaseReadLockForApplication(applicationUndeployedEvent.getApplicationId());
+                }
+            }
+        });
+
+
+        topologyEventReceiver.addEventListener(new ApplicationTerminatingEventListener() {
+            @Override
+            protected void onEvent(Event event) {
+
+                log.info("[ApplicationTerminatingEvent] Received: " + event.getClass());
+
+                ApplicationTerminatingEvent appTerminatingEvent = (ApplicationTerminatingEvent) event;
+
+                // acquire reead locks for application and relevant clusters
+                TopologyManager.acquireReadLockForApplication(appTerminatingEvent.getAppId());
+
+                try {
+                    ApplicationMonitor appMonitor = AutoscalerContext.getInstance().
+                            getAppMonitor(appTerminatingEvent.getAppId());
+
+                    if (appMonitor != null) {
+                        // update the status as Terminating
+                        appMonitor.setStatus(ApplicationStatus.Terminating);
+
+                    } else {
+                        log.warn("Application Monitor cannot be found for the undeployed [application] "
+                                + appTerminatingEvent.getAppId());
+                    }
+
+                } finally {
+                    TopologyManager.
                             releaseReadLockForApplication(appTerminatingEvent.getAppId());
                 }
             }
@@ -472,12 +442,13 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
                     ApplicationMonitor monitor = AutoscalerContext.getInstance().
                             getAppMonitor(applicationRemovedEvent.getApplicationId());
                     if (monitor != null) {
-                        List<String> clusters = monitor.
-                                findClustersOfApplication(applicationRemovedEvent.getApplicationId());
-                        for (String clusterId : clusters) {
+                        //List<String> clusters = monitor.
+                        //        findClustersOfApplication(applicationRemovedEvent.getApplicationId());
+                        for (ClusterDataHolder clusterData : clusterDataHolders) {
                             //stopping the cluster monitor and remove it from the AS
-                            ((ClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId)).setDestroyed(true);
-                            AutoscalerContext.getInstance().removeMonitor(clusterId);
+                            ((ClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterData.getClusterId())).
+                                    setDestroyed(true);
+                            AutoscalerContext.getInstance().removeMonitor(clusterData.getClusterId());
                         }
                         //removing the application monitor
                         AutoscalerContext.getInstance().

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
index 1ac0893..7199ee8 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
@@ -73,7 +73,7 @@ public abstract class Monitor implements EventHandler {
         this.appId = parent.getAppId();
     }
 
-    public boolean hasMonitors() {
+    public boolean hasActiveMonitors() {
         boolean hasMonitor = false;
         if(this.aliasToActiveMonitorsMap != null ) {
             hasMonitor = true;
@@ -81,6 +81,11 @@ public abstract class Monitor implements EventHandler {
         return hasMonitor;
     }
 
+    public boolean hasMonitors () {
+
+        return this.aliasToActiveMonitorsMap != null || this.aliasToInActiveMonitorsMap != null;
+    }
+
     public boolean isHasDependent() {
         return hasDependent;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java
index 26eff1d..4eb4bcb 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java
@@ -20,7 +20,6 @@ package org.apache.stratos.autoscaler.monitor;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.autoscaler.AutoscalerContext;
 import org.apache.stratos.autoscaler.exception.DependencyBuilderException;
 import org.apache.stratos.autoscaler.exception.PartitionValidationException;
 import org.apache.stratos.autoscaler.exception.PolicyValidationException;
@@ -96,16 +95,19 @@ public abstract class ParentComponentMonitor extends Monitor {
 
         Monitor monitor = this.aliasToInActiveMonitorsMap.get(idOfEvent);
         if (monitor != null) {
-            for (Monitor monitor1 : monitor.getAliasToActiveMonitorsMap().values()) {
-                if (monitor.hasMonitors()) {
-                    StatusEventPublisher.sendGroupTerminatingEvent(this.appId, monitor1.getId());
-                } else {
-                    StatusEventPublisher.sendClusterTerminatingEvent(this.appId,
-                            ((AbstractClusterMonitor) monitor1).getServiceId(), monitor.getId());
+            // check if aliasToActiveMonitors are null (in case of a Cluster Monitor)
+            if (monitor.getAliasToActiveMonitorsMap() != null) {
+                for (Monitor monitor1 : monitor.getAliasToActiveMonitorsMap().values()) {
+                    if (monitor.hasActiveMonitors()) {
+                        StatusEventPublisher.sendGroupTerminatingEvent(this.appId, monitor1.getId());
+                    } else {
+                        StatusEventPublisher.sendClusterTerminatingEvent(this.appId,
+                                ((AbstractClusterMonitor) monitor1).getServiceId(), monitor.getId());
+                    }
                 }
             }
         } else {
-            log.warn("Active Monitor not found for the id " + idOfEvent);
+            log.warn("Inactive Monitor not found for the id " + idOfEvent);
         }
     }
 
@@ -123,7 +125,7 @@ public abstract class ParentComponentMonitor extends Monitor {
                 monitor = this.aliasToActiveMonitorsMap.
                         get(terminationContext.getId());
                 //start to kill it
-                if (monitor.hasMonitors()) {
+                if (monitor.hasActiveMonitors()) {
                     //it is a group
                     StatusEventPublisher.sendGroupTerminatingEvent(this.appId, terminationContext.getId());
                 } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java
index deb0950..45530c5 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java
@@ -61,26 +61,26 @@ public class ApplicationMonitor extends ParentComponentMonitor {
      * @param appId the application which contains the clusters
      * @return all the clusters of the application
      */
-    public List<String> findClustersOfApplication(String appId) {
-        List<String> clusters = new ArrayList<String>();
-        Set<ClusterDataHolder> clusterData;
-
-        TopologyManager.acquireReadLockForApplication(appId);
-        try {
-            clusterData = TopologyManager.getTopology().getApplication(appId).getClusterDataRecursively();
-
-        } finally {
-            TopologyManager.releaseReadLockForApplication(appId);
-        }
-
-        if (clusterData != null) {
-            for (ClusterDataHolder clusterDataHolder : clusterData) {
-                clusters.add(clusterDataHolder.getClusterId());
-            }
-        }
-
-        return clusters;
-    }
+//    public List<String> findClustersOfApplication(String appId) {
+//        List<String> clusters = new ArrayList<String>();
+//        Set<ClusterDataHolder> clusterData;
+//
+//        TopologyManager.acquireReadLockForApplication(appId);
+//        try {
+//            clusterData = TopologyManager.getTopology().getApplication(appId).getClusterDataRecursively();
+//
+//        } finally {
+//            TopologyManager.releaseReadLockForApplication(appId);
+//        }
+//
+//        if (clusterData != null) {
+//            for (ClusterDataHolder clusterDataHolder : clusterData) {
+//                clusters.add(clusterDataHolder.getClusterId());
+//            }
+//        }
+//
+//        return clusters;
+//    }
 
     /**
      * Find the cluster monitor by traversing recursively in the hierarchical monitors.

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
index 7aef08e..7019d0b 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
@@ -82,6 +82,9 @@ public class StatusChecker {
             //TODO
             StatusEventPublisher.sendClusterCreatedEvent(monitor.getAppId(), monitor.getServiceId(),
                     monitor.getClusterId());
+        } else {
+            StatusEventPublisher.sendClusterTerminatedEvent(monitor.getAppId(), monitor.getServiceId(),
+                    monitor.getClusterId());
         }
         // TODO if cluster was in terminating, then send terminated event.
     }
@@ -264,9 +267,9 @@ public class StatusChecker {
                     clusterData.isEmpty() && groupStatus == GroupStatus.Inactive ||
                     groupStatus == GroupStatus.Inactive && clusterStatus == ClusterStatus.Inactive) {
                     //send the in activation event
-                if (parent instanceof Application) {
-                    //send application activated event
-                    log.info("sending app in-active : " + appId);
+                    if (parent instanceof Application) {
+                        //send application activated event
+                        log.info("sending app in-active : " + appId);
                     StatusEventPublisher.sendApplicationInactivatedEvent(appId);
                 } else if (parent instanceof Group) {
                     //send activation to the parent
@@ -294,12 +297,12 @@ public class StatusChecker {
                 if (parent instanceof Application) {
                     //send application activated event
                     log.info("sending app terminating: " + appId);
-                    StatusEventPublisher.sendApplicationTerminatedEvent(appId, parent.getClusterDataRecursively());
+                    StatusEventPublisher.sendApplicationTerminatingEvent(appId);
                     //StatusEventPublisher.sendApp(appId);
                 } else if (parent instanceof Group) {
                     //send activation to the parent
                     log.info("sending group terminating : " + parent.getUniqueIdentifier());
-                    StatusEventPublisher.sendGroupTerminatedEvent(appId, parent.getUniqueIdentifier());
+                    StatusEventPublisher.sendGroupTerminatingEvent(appId, parent.getUniqueIdentifier());
                 }
             } else {
                 log.warn("Clusters/groups not found in this [component] " + appId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/status/receiver/ApplicationStatusTopicReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/status/receiver/ApplicationStatusTopicReceiver.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/status/receiver/ApplicationStatusTopicReceiver.java
index 5aa4467..1a62fef 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/status/receiver/ApplicationStatusTopicReceiver.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/application/status/receiver/ApplicationStatusTopicReceiver.java
@@ -74,14 +74,14 @@ public class ApplicationStatusTopicReceiver implements Runnable {
         statusEventReceiver.addEventListener(new AppStatusClusterTerminatedEventListener() {
             @Override
             protected void onEvent(Event event) {
-                TopologyBuilder.handleClusterTerminatedEvent((ClusterActivatedEvent) event);
+                TopologyBuilder.handleClusterTerminatedEvent((AppStatusClusterTerminatedEvent) event);
             }
         });
 
         statusEventReceiver.addEventListener(new AppStatusClusterTerminatingEventListener(){
             @Override
             protected void onEvent(Event event) {
-                TopologyBuilder.handleClusterTerminatingEvent((ClusterActivatedEvent) event);
+                TopologyBuilder.handleClusterTerminatingEvent((AppStatusClusterTerminatingEvent) event);
             }
         });
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
index 2fbf89a..0b322f8 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
@@ -1415,9 +1415,7 @@ public class CloudControllerServiceImpl implements CloudControllerService {
     @Override
     public void unDeployApplicationDefinition(String applicationId, int tenantId, String tenantDomain) throws ApplicationDefinitionException {
 
-        TopologyBuilder.handleApplicationUndeployed(dataHolder, applicationId, tenantId, tenantDomain);
-
-        //persist();
+        TopologyBuilder.handleApplicationUndeployed(applicationId);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
index d245a6f..4d929b1 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
@@ -678,8 +678,7 @@ public class TopologyBuilder {
         }
     }
 
-    public static synchronized void handleApplicationUndeployed(FasterLookUpDataHolder dataHolder,
-                                                                String applicationId, int tenantId, String tenantDomain) {
+    public static synchronized void handleApplicationUndeployed(String applicationId) {
 
         Set<ClusterDataHolder> clusterData;
 
@@ -702,7 +701,6 @@ public class TopologyBuilder {
             }
             // for now anyway update the status forcefully
             application.setStatus(ApplicationStatus.Terminating);
-            log.info("Application " + applicationId + "'s status updated to " + ApplicationStatus.Terminating);
 
             // update all the Clusters' statuses to 'Terminating'
             clusterData = application.getClusterDataRecursively();
@@ -730,6 +728,13 @@ public class TopologyBuilder {
                 }
             }
 
+            // update all Group's statuses to 'Terminating'
+            if (application.getGroups() != null) {
+                updateGroupStatusesRecursively(GroupStatus.Terminating, application.getGroups());
+            }
+
+            TopologyManager.updateTopology(topology);
+
         } finally {
             TopologyManager.releaseWriteLock();
         }
@@ -934,10 +939,9 @@ public class TopologyBuilder {
 
     public static void handleApplicationTerminatingEvent(ApplicationTerminatingEvent event) {
 
-        Set<ClusterDataHolder> clusterData;
         String applicationId = event.getAppId();
 
-        // update the Application and Cluster Statuses as 'Terminating'
+        // update the Application Status as 'Terminating'
         TopologyManager.acquireWriteLock();
 
         try {
@@ -958,44 +962,12 @@ public class TopologyBuilder {
             application.setStatus(ApplicationStatus.Terminating);
             log.info("Application " + applicationId + "'s status updated to " + ApplicationStatus.Terminating);
 
-            // update all the Clusters' statuses to 'Terminating'
-            clusterData = application.getClusterDataRecursively();
-            for (ClusterDataHolder clusterDataHolder : clusterData) {
-                Service service = topology.getService(clusterDataHolder.getServiceType());
-                if (service != null) {
-                    Cluster aCluster = service.getCluster(clusterDataHolder.getClusterId());
-                    if (aCluster != null) {
-                        // validate state transition
-                        if (!aCluster.isStateTransitionValid(ClusterStatus.Terminating)) {
-                            log.error("Invalid state transfer from " + aCluster.getStatus() + " to "
-                                    + ClusterStatus.Terminating);
-                        }
-                        // for now anyway update the status forcefully
-                        aCluster.setStatus(ClusterStatus.Terminating);
-
-                    } else {
-                        log.warn("Unable to find Cluster with cluster id " + clusterDataHolder.getClusterId() +
-                                " in Topology");
-                    }
-
-                } else {
-                    log.warn("Unable to update cluster with cluster id: " + clusterDataHolder.getClusterId() + " from Topology, " +
-                            " associated Service [ " + clusterDataHolder.getServiceType() + " ] not found");
-                }
-            }
-
-            // update all Group's statuses to 'Terminating'
-            if (application.getGroups() != null) {
-                updateGroupStatusesRecursively(GroupStatus.Terminating, application.getGroups());
-            }
-
         } finally {
             TopologyManager.releaseWriteLock();
         }
 
         TopologyEventPublisher.sendApplicationTerminatingEvent(
-                new org.apache.stratos.messaging.event.topology.ApplicationTerminatingEvent(
-                        applicationId, clusterData));
+                new org.apache.stratos.messaging.event.topology.ApplicationTerminatingEvent(applicationId));
     }
 
     private static void updateGroupStatusesRecursively (GroupStatus groupStatus, Collection<Group> groups) {
@@ -1015,30 +987,6 @@ public class TopologyBuilder {
     }
 
     public static void handleApplicationTerminatedEvent(ApplicationTerminatedEvent event) {
-//        Topology topology = TopologyManager.getTopology();
-//        Application application = topology.getApplication(event.getAppId());
-//        //update the status of the Group
-//        if (application == null) {
-//            log.warn(String.format("Application %s does not exist",
-//                    event.getAppId()));
-//            return;
-//        }
-//
-//        org.apache.stratos.messaging.event.topology.ApplicationTerminatedEvent applicationTerminatedEvent =
-//                new org.apache.stratos.messaging.event.topology.ApplicationTerminatedEvent(
-//                        event.getAppId());
-//        try {
-//            TopologyManager.acquireWriteLock();
-//            application.setStatus(ApplicationStatus.Terminated);
-//            log.info("Application terminated adding status started for Topology");
-//
-//            TopologyManager.updateTopology(topology);
-//        } finally {
-//            TopologyManager.releaseWriteLock();
-//        }
-//        //publishing data
-//        TopologyEventPublisher.sendApplicationTerminatedEvent(applicationTerminatedEvent);
-
 
      Topology topology = TopologyManager.getTopology();
 
@@ -1051,6 +999,13 @@ public class TopologyBuilder {
 
             } else {
                 Application application = topology.getApplication(event.getAppId());
+
+                if (!application.isStateTransitionValid(ApplicationStatus.Terminated)) {
+                    log.error("Invalid status change from " + application.getStatus() + " to " + ApplicationStatus.Terminated);
+                }
+                // forcefully set status for now
+                application.setStatus(ApplicationStatus.Terminated);
+
                 int tenantId = application.getTenantId();
                 String tenantDomain = application.getTenantDomain();
                 Set<ClusterDataHolder> clusterData = application.getClusterDataRecursively();
@@ -1201,11 +1156,57 @@ public class TopologyBuilder {
         TopologyEventPublisher.sendGroupTerminatingEvent(groupTerminatingTopologyEvent);
     }
 
-    public static void handleClusterTerminatedEvent(ClusterActivatedEvent event) {
+    public static void handleClusterTerminatedEvent(AppStatusClusterTerminatedEvent event) {
+
+        TopologyManager.acquireWriteLock();
+
+        try {
+            Topology topology = TopologyManager.getTopology();
+            Cluster cluster = topology.getService(event.getServiceName()).
+                    getCluster(event.getClusterId());
+
+            if (!cluster.isStateTransitionValid(ClusterStatus.Terminated)) {
+                log.error("Invalid state transfer from " + cluster.getStatus() + " to " +
+                        ClusterStatus.Terminated);
+            }
+            // forcefully update status
+            cluster.setStatus(ClusterStatus.Terminated);
+
+            TopologyManager.updateTopology(topology);
+        } finally {
+            TopologyManager.releaseWriteLock();
+        }
+
+        ClusterTerminatedEvent clusterTerminatedEvent = new ClusterTerminatedEvent(event.getAppId(),
+                event.getServiceName(), event.getClusterId());
 
+        TopologyEventPublisher.sendClusterTerminatedEvent(clusterTerminatedEvent);
     }
 
-    public static void handleClusterTerminatingEvent(ClusterActivatedEvent event) {
+    public static void handleClusterTerminatingEvent(AppStatusClusterTerminatingEvent event) {
+
+        TopologyManager.acquireWriteLock();
+
+        try {
+            Topology topology = TopologyManager.getTopology();
+            Cluster cluster = topology.getService(event.getServiceName()).
+                    getCluster(event.getClusterId());
+
+            if (!cluster.isStateTransitionValid(ClusterStatus.Terminating)) {
+                log.error("Invalid state transfer from " + cluster.getStatus() + " to " +
+                        ClusterStatus.Terminating);
+            }
+            // forcefully update status
+            cluster.setStatus(ClusterStatus.Terminating);
+
+            TopologyManager.updateTopology(topology);
+        } finally {
+            TopologyManager.releaseWriteLock();
+        }
+
+        ClusterTerminatingEvent clusterTerminaingEvent = new ClusterTerminatingEvent(event.getAppId(),
+                event.getServiceName(), event.getClusterId());
 
+        TopologyEventPublisher.sendClusterTerminatingEvent(clusterTerminaingEvent);
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
index 3c6277d..cd13111 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyEventPublisher.java
@@ -297,4 +297,24 @@ public class TopologyEventPublisher {
         }
         publishEvent(groupTerminatingTopologyEvent);
     }
+
+    public static void sendClusterTerminatingEvent (ClusterTerminatingEvent clusterTerminatingEvent) {
+
+        if(log.isInfoEnabled()) {
+            log.info(String.format("Publishing Cluster terminating event: [appId] %s [cluster id] %s",
+                    clusterTerminatingEvent.getAppId(), clusterTerminatingEvent.getClusterId()));
+        }
+
+        publishEvent(clusterTerminatingEvent);
+    }
+
+    public static void sendClusterTerminatedEvent (ClusterTerminatedEvent clusterTerminatedEvent) {
+
+        if(log.isInfoEnabled()) {
+            log.info(String.format("Publishing Cluster terminated event: [appId] %s [cluster id] %s",
+                    clusterTerminatedEvent.getAppId(), clusterTerminatedEvent.getClusterId()));
+        }
+
+        publishEvent(clusterTerminatedEvent);
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatedEvent.java
index 441b902..6607a02 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatedEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatedEvent.java
@@ -18,17 +18,27 @@
  */
 package org.apache.stratos.messaging.event.topology;
 
+import org.apache.stratos.messaging.domain.topology.ClusterDataHolder;
+
+import java.util.Set;
+
 /**
  * This event will be sent to Topology upon termination of application
  */
 public class ApplicationTerminatedEvent extends TopologyEvent {
     private final String appId;
+    private final Set<ClusterDataHolder> clusterData;
 
-    public ApplicationTerminatedEvent(String appId) {
+    public ApplicationTerminatedEvent(String appId, Set<ClusterDataHolder> clusterData) {
         this.appId = appId;
+        this.clusterData = clusterData;
     }
 
     public String getAppId() {
         return appId;
     }
+
+    public Set<ClusterDataHolder> getClusterData() {
+        return clusterData;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatingEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatingEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatingEvent.java
index c718f08..48fde61 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatingEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatingEvent.java
@@ -18,28 +18,18 @@
  */
 package org.apache.stratos.messaging.event.topology;
 
-import org.apache.stratos.messaging.domain.topology.ClusterDataHolder;
-
-import java.util.Set;
-
 /**
  * This event will be sent to Topology upon terminating of application
  */
 public class ApplicationTerminatingEvent extends TopologyEvent {
 
     private final String appId;
-    private Set<ClusterDataHolder> clusterData;
 
-    public ApplicationTerminatingEvent(String appId, Set<ClusterDataHolder> clusterData) {
+    public ApplicationTerminatingEvent(String appId) {
         this.appId = appId;
-        this.clusterData = clusterData;
     }
 
     public String getAppId() {
         return appId;
     }
-
-    public Set<ClusterDataHolder> getClusterData() {
-        return clusterData;
-    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/status/AppStatusClusterTerminatedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/status/AppStatusClusterTerminatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/status/AppStatusClusterTerminatedMessageProcessor.java
index a5bed11..6cdde51 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/status/AppStatusClusterTerminatedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/status/AppStatusClusterTerminatedMessageProcessor.java
@@ -39,7 +39,7 @@ public class AppStatusClusterTerminatedMessageProcessor extends MessageProcessor
     public boolean process(String type, String message, Object object) {
         if (AppStatusClusterTerminatedEvent.class.getName().equals(type)) {
             // Parse complete message and build event
-            ClusterTerminatedEvent event = (ClusterTerminatedEvent) Util.
+            AppStatusClusterTerminatedEvent event = (AppStatusClusterTerminatedEvent) Util.
                                                 jsonToObject(message, AppStatusClusterTerminatedEvent.class);
 
             if(log.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationTerminatingMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationTerminatingMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationTerminatingMessageProcessor.java
index cb6e887..6ad43d8 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationTerminatingMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationTerminatingMessageProcessor.java
@@ -23,7 +23,7 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.messaging.domain.topology.Application;
 import org.apache.stratos.messaging.domain.topology.ApplicationStatus;
 import org.apache.stratos.messaging.domain.topology.Topology;
-import org.apache.stratos.messaging.event.topology.ApplicationInactivatedEvent;
+import org.apache.stratos.messaging.event.topology.ApplicationTerminatingEvent;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
 import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
@@ -48,14 +48,14 @@ public class ApplicationTerminatingMessageProcessor extends MessageProcessor {
     public boolean process(String type, String message, Object object) {
         Topology topology = (Topology) object;
 
-        if (ApplicationInactivatedEvent.class.getName().equals(type)) {
+        if (ApplicationTerminatingEvent.class.getName().equals(type)) {
             // Return if topology has not been initialized
             if (!topology.isInitialized())
                 return false;
 
             // Parse complete message and build event
-            ApplicationInactivatedEvent event = (ApplicationInactivatedEvent) Util.
-                    jsonToObject(message, ApplicationInactivatedEvent.class);
+            ApplicationTerminatingEvent event = (ApplicationTerminatingEvent) Util.
+                    jsonToObject(message, ApplicationTerminatingEvent.class);
 
             TopologyUpdater.acquireWriteLockForApplication(event.getAppId());
 
@@ -76,7 +76,7 @@ public class ApplicationTerminatingMessageProcessor extends MessageProcessor {
         }
     }
 
-    private boolean doProcess (ApplicationInactivatedEvent event, Topology topology) {
+    private boolean doProcess (ApplicationTerminatingEvent event, Topology topology) {
 
         // Validate event against the existing topology
         Application application = topology.getApplication(event.getAppId());

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterTerminatedProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterTerminatedProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterTerminatedProcessor.java
index 0536011..98599d3 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterTerminatedProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterTerminatedProcessor.java
@@ -24,7 +24,7 @@ import org.apache.stratos.messaging.domain.topology.Cluster;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.domain.topology.Service;
 import org.apache.stratos.messaging.domain.topology.Topology;
-import org.apache.stratos.messaging.event.topology.ClusterActivatedEvent;
+import org.apache.stratos.messaging.event.topology.ClusterTerminatedEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
@@ -48,15 +48,15 @@ public class ClusterTerminatedProcessor extends MessageProcessor {
 
         Topology topology = (Topology) object;
 
-        if (ClusterActivatedEvent.class.getName().equals(type)) {
+        if (ClusterTerminatedEvent.class.getName().equals(type)) {
             // Return if topology has not been initialized
             if (!topology.isInitialized()) {
                 return false;
             }
 
             // Parse complete message and build event
-            ClusterActivatedEvent event = (ClusterActivatedEvent) Util.
-                    jsonToObject(message, ClusterActivatedEvent.class);
+            ClusterTerminatedEvent event = (ClusterTerminatedEvent) Util.
+                    jsonToObject(message, ClusterTerminatedEvent.class);
 
             TopologyUpdater.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
             try {
@@ -76,7 +76,7 @@ public class ClusterTerminatedProcessor extends MessageProcessor {
         }
     }
 
-    private boolean doProcess(ClusterActivatedEvent event, Topology topology) {
+    private boolean doProcess(ClusterTerminatedEvent event, Topology topology) {
 
         // Apply service filter
         if (TopologyServiceFilter.getInstance().isActive()) {
@@ -118,10 +118,10 @@ public class ClusterTerminatedProcessor extends MessageProcessor {
             }
         } else {
             // Apply changes to the topology
-            if (!cluster.isStateTransitionValid(ClusterStatus.Active)) {
-                log.error("Invalid State Transition from " + cluster.getStatus() + " to " + ClusterStatus.Active);
+            if (!cluster.isStateTransitionValid(ClusterStatus.Terminated)) {
+                log.error("Invalid State Transition from " + cluster.getStatus() + " to " + ClusterStatus.Terminated);
             }
-            cluster.setStatus(ClusterStatus.Active);
+            cluster.setStatus(ClusterStatus.Terminated);
 
         }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterTerminatingProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterTerminatingProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterTerminatingProcessor.java
index 1ed2671..cd30618 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterTerminatingProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterTerminatingProcessor.java
@@ -24,7 +24,7 @@ import org.apache.stratos.messaging.domain.topology.Cluster;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.domain.topology.Service;
 import org.apache.stratos.messaging.domain.topology.Topology;
-import org.apache.stratos.messaging.event.topology.ClusterActivatedEvent;
+import org.apache.stratos.messaging.event.topology.ClusterTerminatingEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
@@ -48,15 +48,15 @@ public class ClusterTerminatingProcessor extends MessageProcessor {
 
         Topology topology = (Topology) object;
 
-        if (ClusterActivatedEvent.class.getName().equals(type)) {
+        if (ClusterTerminatingEvent.class.getName().equals(type)) {
             // Return if topology has not been initialized
             if (!topology.isInitialized()) {
                 return false;
             }
 
             // Parse complete message and build event
-            ClusterActivatedEvent event = (ClusterActivatedEvent) Util.
-                    jsonToObject(message, ClusterActivatedEvent.class);
+            ClusterTerminatingEvent event = (ClusterTerminatingEvent) Util.
+                    jsonToObject(message, ClusterTerminatingEvent.class);
 
             TopologyUpdater.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
             try {
@@ -76,7 +76,7 @@ public class ClusterTerminatingProcessor extends MessageProcessor {
         }
     }
 
-    private boolean doProcess(ClusterActivatedEvent event, Topology topology) {
+    private boolean doProcess(ClusterTerminatingEvent event, Topology topology) {
 
         // Apply service filter
         if (TopologyServiceFilter.getInstance().isActive()) {
@@ -118,10 +118,10 @@ public class ClusterTerminatingProcessor extends MessageProcessor {
             }
         } else {
             // Apply changes to the topology
-            if (!cluster.isStateTransitionValid(ClusterStatus.Active)) {
-                log.error("Invalid State Transition from " + cluster.getStatus() + " to " + ClusterStatus.Active);
+            if (!cluster.isStateTransitionValid(ClusterStatus.Terminating)) {
+                log.error("Invalid State Transition from " + cluster.getStatus() + " to " + ClusterStatus.Terminating);
             }
-            cluster.setStatus(ClusterStatus.Active);
+            cluster.setStatus(ClusterStatus.Terminating);
 
         }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/4f59f4b8/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupTerminatedProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupTerminatedProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupTerminatedProcessor.java
index 5e96709..5a308ba 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupTerminatedProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupTerminatedProcessor.java
@@ -93,8 +93,8 @@ public class GroupTerminatedProcessor extends MessageProcessor {
             }
         } else {
             // Apply changes to the topology
-            if (!group.isStateTransitionValid(GroupStatus.Terminating)) {
-                log.error("Invalid State Transition from " + group.getStatus() + " to " + GroupStatus.Active);
+            if (!group.isStateTransitionValid(GroupStatus.Terminated)) {
+                log.error("Invalid State Transition from " + group.getStatus() + " to " + GroupStatus.Terminated);
             }
             group.setStatus(GroupStatus.Terminated);
 


[2/2] git commit: removing unwanted event ApplicationUndeployed from the flow

Posted by is...@apache.org.
removing unwanted event ApplicationUndeployed from the flow


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/87d77a2d
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/87d77a2d
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/87d77a2d

Branch: refs/heads/4.0.0-grouping
Commit: 87d77a2dfa8d9ac9ca0f53f119fcabdedffb4159
Parents: 6f7baa8
Author: Isuru Haththotuwa <is...@apache.org>
Authored: Fri Oct 24 17:42:37 2014 +0530
Committer: Isuru Haththotuwa <is...@apache.org>
Committed: Sun Oct 26 21:54:59 2014 +0530

----------------------------------------------------------------------
 .../AutoscalerTopologyEventReceiver.java        | 85 ++++++++++++++++---
 .../controller/topology/TopologyBuilder.java    | 88 ++++++++++++++++----
 .../topology/ApplicationTerminatingEvent.java   | 13 ++-
 3 files changed, 159 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/87d77a2d/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
index 63f9079..2f7cca4 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java
@@ -38,6 +38,11 @@ import org.apache.stratos.autoscaler.status.checker.StatusChecker;
 import org.apache.stratos.messaging.domain.topology.*;
 import org.apache.stratos.messaging.event.Event;
 import org.apache.stratos.messaging.event.topology.*;
+import org.apache.stratos.messaging.event.topology.ApplicationActivatedEvent;
+import org.apache.stratos.messaging.event.topology.ApplicationCreatedEvent;
+import org.apache.stratos.messaging.event.topology.ClusterActivatedEvent;
+import org.apache.stratos.messaging.event.topology.ClusterInActivateEvent;
+import org.apache.stratos.messaging.event.topology.GroupActivatedEvent;
 import org.apache.stratos.messaging.listener.topology.*;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyEventReceiver;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
@@ -323,17 +328,78 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
             }
         });
 
-        topologyEventReceiver.addEventListener(new ApplicationUndeployedEventListener() {
+//        topologyEventReceiver.addEventListener(new ApplicationUndeployedEventListener() {
+//            @Override
+//            protected void onEvent(Event event) {
+//
+//                log.info("[ApplicationUndeployedEvent] Received: " + event.getClass());
+//
+//                ApplicationUndeployedEvent applicationUndeployedEvent = (ApplicationUndeployedEvent) event;
+//
+//                // acquire reead locks for application and relevant clusters
+//                TopologyManager.acquireReadLockForApplication(applicationUndeployedEvent.getApplicationId());
+//                Set<ClusterDataHolder> clusterDataHolders = applicationUndeployedEvent.getClusterData();
+//                if (clusterDataHolders != null) {
+//                    for (ClusterDataHolder clusterData : clusterDataHolders) {
+//                        TopologyManager.acquireReadLockForCluster(clusterData.getServiceType(),
+//                                clusterData.getClusterId());
+//                    }
+//                }
+//
+//                try {
+//                    ApplicationMonitor appMonitor = AutoscalerContext.getInstance().
+//                            getAppMonitor(applicationUndeployedEvent.getApplicationId());
+//
+//                    if (appMonitor != null) {
+//                        // update the status as Terminating
+//                        appMonitor.setStatus(ApplicationStatus.Terminating);
+//
+//                        List<String> clusters = appMonitor.
+//                                findClustersOfApplication(applicationUndeployedEvent.getApplicationId());
+//
+//                        for (String clusterId : clusters) {
+//                            //stopping the cluster monitor and remove it from the AS
+//                            ClusterMonitor clusterMonitor =
+//                                    ((ClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId));
+//                            if (clusterMonitor != null) {
+//                                clusterMonitor.setDestroyed(true);
+//                                clusterMonitor.terminateAllMembers();
+//                                clusterMonitor.setStatus(ClusterStatus.Terminating);
+//                            } else {
+//                                log.warn("No Cluster Monitor found for cluster id " + clusterId);
+//                            }
+//                        }
+//
+//                    } else {
+//                        log.warn("Application Monitor cannot be found for the undeployed [application] "
+//                                + applicationUndeployedEvent.getApplicationId());
+//                    }
+//
+//                } finally {
+//                    if (clusterDataHolders != null) {
+//                        for (ClusterDataHolder clusterData : clusterDataHolders) {
+//                            TopologyManager.releaseReadLockForCluster(clusterData.getServiceType(),
+//                                    clusterData.getClusterId());
+//                        }
+//                    }
+//                    TopologyManager.
+//                            releaseReadLockForApplication(applicationUndeployedEvent.getApplicationId());
+//                }
+//            }
+//        });
+
+
+        topologyEventReceiver.addEventListener(new ApplicationTerminatingEventListener() {
             @Override
             protected void onEvent(Event event) {
 
-                log.info("[ApplicationUndeployedEvent] Received: " + event.getClass());
+                log.info("[ApplicationTerminatingEvent] Received: " + event.getClass());
 
-                ApplicationUndeployedEvent applicationUndeployedEvent = (ApplicationUndeployedEvent) event;
+                ApplicationTerminatingEvent appTerminatingEvent = (ApplicationTerminatingEvent) event;
 
                 // acquire reead locks for application and relevant clusters
-                TopologyManager.acquireReadLockForApplication(applicationUndeployedEvent.getApplicationId());
-                Set<ClusterDataHolder> clusterDataHolders = applicationUndeployedEvent.getClusterData();
+                TopologyManager.acquireReadLockForApplication(appTerminatingEvent.getAppId());
+                Set<ClusterDataHolder> clusterDataHolders = appTerminatingEvent.getClusterData();
                 if (clusterDataHolders != null) {
                     for (ClusterDataHolder clusterData : clusterDataHolders) {
                         TopologyManager.acquireReadLockForCluster(clusterData.getServiceType(),
@@ -343,14 +409,14 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
 
                 try {
                     ApplicationMonitor appMonitor = AutoscalerContext.getInstance().
-                            getAppMonitor(applicationUndeployedEvent.getApplicationId());
+                            getAppMonitor(appTerminatingEvent.getAppId());
 
                     if (appMonitor != null) {
                         // update the status as Terminating
                         appMonitor.setStatus(ApplicationStatus.Terminating);
 
                         List<String> clusters = appMonitor.
-                                findClustersOfApplication(applicationUndeployedEvent.getApplicationId());
+                                findClustersOfApplication(appTerminatingEvent.getAppId());
 
                         for (String clusterId : clusters) {
                             //stopping the cluster monitor and remove it from the AS
@@ -367,7 +433,7 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
 
                     } else {
                         log.warn("Application Monitor cannot be found for the undeployed [application] "
-                                + applicationUndeployedEvent.getApplicationId());
+                                + appTerminatingEvent.getAppId());
                     }
 
                 } finally {
@@ -378,12 +444,11 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
                         }
                     }
                     TopologyManager.
-                            releaseReadLockForApplication(applicationUndeployedEvent.getApplicationId());
+                            releaseReadLockForApplication(appTerminatingEvent.getAppId());
                 }
             }
         });
 
-
         topologyEventReceiver.addEventListener(new ApplicationRemovedEventListener() {
             @Override
             protected void onEvent(Event event) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/87d77a2d/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
index 80315ea..d245a6f 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyBuilder.java
@@ -933,29 +933,85 @@ public class TopologyBuilder {
     }
 
     public static void handleApplicationTerminatingEvent(ApplicationTerminatingEvent event) {
-        Topology topology = TopologyManager.getTopology();
-        Application application = topology.getApplication(event.getAppId());
-        //update the status of the Group
-        if (application == null) {
-            log.warn(String.format("Application %s does not exist",
-                    event.getAppId()));
-            return;
-        }
 
-        org.apache.stratos.messaging.event.topology.ApplicationTerminatingEvent applicationTerminatingEvent =
-                new org.apache.stratos.messaging.event.topology.ApplicationTerminatingEvent(
-                        event.getAppId());
+        Set<ClusterDataHolder> clusterData;
+        String applicationId = event.getAppId();
+
+        // update the Application and Cluster Statuses as 'Terminating'
+        TopologyManager.acquireWriteLock();
+
         try {
-            TopologyManager.acquireWriteLock();
+
+            Topology topology = TopologyManager.getTopology();
+
+            if (!topology.applicationExists(applicationId)) {
+                log.warn("Application with id [ " + applicationId + " ] doesn't exist in Topology");
+                return;
+            }
+
+            Application application = topology.getApplication(applicationId);
+            // check and update application status to 'Terminating'
+            if (!application.isStateTransitionValid(ApplicationStatus.Terminating)) {
+                log.error("Invalid state transfer from " + application.getStatus() + " to " + ApplicationStatus.Terminating);
+            }
+            // for now anyway update the status forcefully
             application.setStatus(ApplicationStatus.Terminating);
-            log.info("Application terminating adding status started for Topology");
+            log.info("Application " + applicationId + "'s status updated to " + ApplicationStatus.Terminating);
+
+            // update all the Clusters' statuses to 'Terminating'
+            clusterData = application.getClusterDataRecursively();
+            for (ClusterDataHolder clusterDataHolder : clusterData) {
+                Service service = topology.getService(clusterDataHolder.getServiceType());
+                if (service != null) {
+                    Cluster aCluster = service.getCluster(clusterDataHolder.getClusterId());
+                    if (aCluster != null) {
+                        // validate state transition
+                        if (!aCluster.isStateTransitionValid(ClusterStatus.Terminating)) {
+                            log.error("Invalid state transfer from " + aCluster.getStatus() + " to "
+                                    + ClusterStatus.Terminating);
+                        }
+                        // for now anyway update the status forcefully
+                        aCluster.setStatus(ClusterStatus.Terminating);
+
+                    } else {
+                        log.warn("Unable to find Cluster with cluster id " + clusterDataHolder.getClusterId() +
+                                " in Topology");
+                    }
+
+                } else {
+                    log.warn("Unable to update cluster with cluster id: " + clusterDataHolder.getClusterId() + " from Topology, " +
+                            " associated Service [ " + clusterDataHolder.getServiceType() + " ] not found");
+                }
+            }
+
+            // update all Group's statuses to 'Terminating'
+            if (application.getGroups() != null) {
+                updateGroupStatusesRecursively(GroupStatus.Terminating, application.getGroups());
+            }
 
-            TopologyManager.updateTopology(topology);
         } finally {
             TopologyManager.releaseWriteLock();
         }
-        //publishing data
-        TopologyEventPublisher.sendApplicationTerminatingEvent(applicationTerminatingEvent);
+
+        TopologyEventPublisher.sendApplicationTerminatingEvent(
+                new org.apache.stratos.messaging.event.topology.ApplicationTerminatingEvent(
+                        applicationId, clusterData));
+    }
+
+    private static void updateGroupStatusesRecursively (GroupStatus groupStatus, Collection<Group> groups) {
+
+        for (Group group : groups) {
+            if (!group.isStateTransitionValid(groupStatus)) {
+                log.error("Invalid state transfer from " + group.getStatus() + " to " + groupStatus);
+            }
+            // force update for now
+            group.setStatus(groupStatus);
+
+            // go recursively and update
+            if (group.getGroups() != null) {
+                updateGroupStatusesRecursively(groupStatus, group.getGroups());
+            }
+        }
     }
 
     public static void handleApplicationTerminatedEvent(ApplicationTerminatedEvent event) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/87d77a2d/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatingEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatingEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatingEvent.java
index e1fbc02..c718f08 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatingEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ApplicationTerminatingEvent.java
@@ -18,17 +18,28 @@
  */
 package org.apache.stratos.messaging.event.topology;
 
+import org.apache.stratos.messaging.domain.topology.ClusterDataHolder;
+
+import java.util.Set;
+
 /**
  * This event will be sent to Topology upon terminating of application
  */
 public class ApplicationTerminatingEvent extends TopologyEvent {
+
     private final String appId;
+    private Set<ClusterDataHolder> clusterData;
 
-    public ApplicationTerminatingEvent(String appId) {
+    public ApplicationTerminatingEvent(String appId, Set<ClusterDataHolder> clusterData) {
         this.appId = appId;
+        this.clusterData = clusterData;
     }
 
     public String getAppId() {
         return appId;
     }
+
+    public Set<ClusterDataHolder> getClusterData() {
+        return clusterData;
+    }
 }
\ No newline at end of file