You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by re...@apache.org on 2015/09/16 08:35:41 UTC

[1/3] stratos git commit: improving force undeployment

Repository: stratos
Updated Branches:
  refs/heads/stratos-4.1.x b5d1020da -> 70eaa362d


improving force undeployment


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

Branch: refs/heads/stratos-4.1.x
Commit: 45228ba3739e53f9cddcbf1b8484b98192bb5ce9
Parents: 21e6c20
Author: reka <rt...@gmail.com>
Authored: Wed Sep 16 10:48:04 2015 +0530
Committer: reka <rt...@gmail.com>
Committed: Wed Sep 16 10:49:03 2015 +0530

----------------------------------------------------------------------
 .../stratos/autoscaler/monitor/Monitor.java     |   3 +-
 .../monitor/component/ApplicationMonitor.java   |  45 ++---
 .../monitor/component/GroupMonitor.java         |  69 +++----
 .../component/ParentComponentMonitor.java       |   4 +
 .../services/impl/AutoscalerServiceImpl.java    | 183 +++++++++++--------
 .../stratos/autoscaler/util/AutoscalerUtil.java |  38 ++++
 .../activemq-data/testBroker/KahaDB/db-1.log    | Bin 0 -> 33030144 bytes
 .../activemq-data/testBroker/KahaDB/db.data     | Bin 0 -> 49152 bytes
 .../activemq-data/testBroker/KahaDB/db.redo     | Bin 0 -> 49240 bytes
 .../application/ApplicationUpdateTest.java      |   7 +-
 10 files changed, 209 insertions(+), 140 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/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 170d99f..c58ec41 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
@@ -22,6 +22,7 @@ import org.apache.stratos.autoscaler.monitor.component.ParentComponentMonitor;
 import org.apache.stratos.messaging.domain.instance.Instance;
 
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Abstract class for the monitoring functionality in Autoscaler.
@@ -38,7 +39,7 @@ public abstract class Monitor implements EventHandler, Runnable {
     //monitors map, key=InstanceId and value=ClusterInstance/GroupInstance/ApplicationInstance
     protected Map<String, Instance> instanceIdToInstanceMap;
     public Monitor() {
-        this.instanceIdToInstanceMap = new HashMap<String, Instance>();
+        this.instanceIdToInstanceMap = new ConcurrentHashMap<String, Instance>();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
index 70ee9d4..e15b795 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
@@ -445,30 +445,33 @@ public class ApplicationMonitor extends ParentComponentMonitor {
                     removeInstanceFromFromInactiveMap(childId, instanceId);
                     removeInstanceFromFromTerminatingMap(childId, instanceId);
 
-                    ApplicationInstance instance = (ApplicationInstance) instanceIdToInstanceMap.get(instanceId);
-                    if (instance != null) {
-                        if (isTerminating() || instance.getStatus() == ApplicationStatus.Terminating ||
-                                instance.getStatus() == ApplicationStatus.Terminated) {
-                            ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id,
-                                    appId, instanceId);
-                        } else {
-                            Monitor monitor = getMonitor(childId);
-                            boolean active = false;
-                            if (monitor instanceof GroupMonitor) {
-                                //Checking whether the Group is still active in case the faulty member
-                                // identified after scaling up
-                                active = verifyGroupStatus(childId, instanceId, GroupStatus.Active);
-                            }
-                            if (!active) {
-                                onChildTerminatedEvent(childId, instanceId);
+                    //If application is forcefully un-deployed, no need to handle here.
+                    if(!force) {
+                        ApplicationInstance instance = (ApplicationInstance) instanceIdToInstanceMap.get(instanceId);
+                        if (instance != null) {
+                            if (isTerminating() || instance.getStatus() == ApplicationStatus.Terminating ||
+                                    instance.getStatus() == ApplicationStatus.Terminated) {
+                                ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id,
+                                        appId, instanceId);
                             } else {
-                                log.info("[Group Instance] " + instanceId + " is still active " +
-                                        "upon termination of the [child ] " + childId);
+                                Monitor monitor = getMonitor(childId);
+                                boolean active = false;
+                                if (monitor instanceof GroupMonitor) {
+                                    //Checking whether the Group is still active in case the faulty member
+                                    // identified after scaling up
+                                    active = verifyGroupStatus(childId, instanceId, GroupStatus.Active);
+                                }
+                                if (!active) {
+                                    onChildTerminatedEvent(childId, instanceId);
+                                } else {
+                                    log.info("[Group Instance] " + instanceId + " is still active " +
+                                            "upon termination of the [child ] " + childId);
+                                }
                             }
+                        } else {
+                            log.warn("The required instance cannot be found in the the [GroupMonitor] " +
+                                    id);
                         }
-                    } else {
-                        log.warn("The required instance cannot be found in the the [GroupMonitor] " +
-                                id);
                     }
                 }
             }

http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
index bc3052a..3136ed0 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
@@ -504,43 +504,48 @@ public class GroupMonitor extends ParentComponentMonitor {
         removeInstanceFromFromInactiveMap(childId, instanceId);
         removeInstanceFromFromTerminatingMap(childId, instanceId);
 
-        GroupInstance instance = (GroupInstance) instanceIdToInstanceMap.get(instanceId);
-        if (instance != null) {
-            // If this parent instance is terminating, then based on child notification,
-            // it has to decide its state rather than starting a the children recovery
-
-            ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().
-                    getAppMonitor(appId);
-            //In case if the group instance is not in terminating while application is
-            // terminating, changing the status to terminating
-            if (applicationMonitor.isTerminating() && instance.getStatus().getCode() < 3) {
-                //Sending group instance terminating event
-                ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId);
-            }
+        // If this parent instance is terminating, then based on child notification,
+        // it has to decide its state rather than starting a the children recovery
+
+        ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().
+                getAppMonitor(appId);
+        //If application is forcefully un-deployed, no need to handle here.
+        if(!applicationMonitor.isForce()) {
+            GroupInstance instance = (GroupInstance) instanceIdToInstanceMap.get(instanceId);
+            if (instance != null) {
+
+                //In case if the group instance is not in terminating while application is
+                // terminating, changing the status to terminating
+                if (applicationMonitor.isTerminating() && instance.getStatus().getCode() < 3) {
+                    //Sending group instance terminating event
+                    ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId);
+                }
 
-            if (instance.getStatus() == GroupStatus.Terminating ||
-                    instance.getStatus() == GroupStatus.Terminated) {
-                ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id,
-                        appId, instanceId);
-            } else {
-                //Checking whether the child who notified is still active.
-                // If it is active(scale down case), no need to act upon it.
-                // Otherwise act upon Termination and see whether it is required to start
-                // instance again based on termination behavior
-                boolean active = verifyGroupStatus(childId, instanceId, GroupStatus.Active);
-                if (!active) {
-                    onChildTerminatedEvent(childId, instanceId);
+                if (instance.getStatus() == GroupStatus.Terminating ||
+                        instance.getStatus() == GroupStatus.Terminated) {
+                    ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id,
+                            appId, instanceId);
                 } else {
-                    log.info("[Group Instance] " + instanceId + " for [application] " + appId +
-                            " is still active upon termination" +
-                            " of the [child] " + childId);
+                    //Checking whether the child who notified is still active.
+                    // If it is active(scale down case), no need to act upon it.
+                    // Otherwise act upon Termination and see whether it is required to start
+                    // instance again based on termination behavior
+                    boolean active = verifyGroupStatus(childId, instanceId, GroupStatus.Active);
+                    if (!active) {
+                        onChildTerminatedEvent(childId, instanceId);
+                    } else {
+                        log.info("[Group Instance] " + instanceId + " for [application] " + appId +
+                                " is still active upon termination" +
+                                " of the [child] " + childId);
+                    }
                 }
+            } else {
+                log.warn("The required [instance] " + instanceId + " for [application] " + appId +
+                        " cannot be found in the the [GroupMonitor] " +
+                        id + " upon termination of the [child] " + childId);
             }
-        } else {
-            log.warn("The required [instance] " + instanceId + " for [application] " + appId +
-                    " cannot be found in the the [GroupMonitor] " +
-                    id + " upon termination of the [child] " + childId);
         }
+
     }
 
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
index 98e97cf..f05827a 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
@@ -1062,4 +1062,8 @@ public abstract class ParentComponentMonitor extends Monitor {
             return stringBuilder.toString();
         }
     }
+
+    public void removeMonitor(String id) {
+        this.aliasToActiveChildMonitorsMap.remove(id);
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
index d9023f7..605367f 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
@@ -41,8 +41,10 @@ import org.apache.stratos.autoscaler.exception.application.InvalidApplicationPol
 import org.apache.stratos.autoscaler.exception.application.InvalidServiceGroupException;
 import org.apache.stratos.autoscaler.exception.application.UnremovableApplicationException;
 import org.apache.stratos.autoscaler.exception.policy.*;
+import org.apache.stratos.autoscaler.monitor.Monitor;
 import org.apache.stratos.autoscaler.monitor.cluster.ClusterMonitor;
 import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor;
+import org.apache.stratos.autoscaler.monitor.component.GroupMonitor;
 import org.apache.stratos.autoscaler.pojo.Dependencies;
 import org.apache.stratos.autoscaler.pojo.ServiceGroup;
 import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
@@ -70,6 +72,7 @@ import org.apache.stratos.manager.service.stub.domain.application.signup.Artifac
 import org.apache.stratos.messaging.domain.application.Application;
 import org.apache.stratos.messaging.domain.application.ClusterDataHolder;
 import org.apache.stratos.messaging.domain.instance.ClusterInstance;
+import org.apache.stratos.messaging.domain.instance.Instance;
 import org.apache.stratos.messaging.domain.topology.Cluster;
 import org.apache.stratos.messaging.domain.topology.Member;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
@@ -251,8 +254,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
                 application = ApplicationHolder.getApplications().getApplication(applicationId);
                 application.setApplicationPolicyId(applicationPolicyId);
                 ApplicationHolder.persistApplication(application);
-            }
-            finally {
+            } finally {
                 ApplicationHolder.releaseWriteLock();
             }
 
@@ -277,8 +279,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
                     applicationId);
 
             return true;
-        }
-        catch (Exception e) {
+        } catch (Exception e) {
             ApplicationContext applicationContext = RegistryManager.getInstance().
                     getApplicationContext(applicationId);
             if (applicationContext != null) {
@@ -359,8 +360,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
                             applicationContext.getApplicationId()));
                 }
             }
-        }
-        catch (Exception e) {
+        } catch (Exception e) {
             String message =
                     "Could not add application signup: [application-id]" + applicationContext.getApplicationId();
             log.error(message, e);
@@ -410,8 +410,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
                 }
             }
 
-        }
-        catch (Exception e) {
+        } catch (Exception e) {
             String message = "Could not remove application signup(s)";
             log.error(message, e);
             throw new RuntimeException(message, e);
@@ -481,10 +480,10 @@ public class AutoscalerServiceImpl implements AutoscalerService {
             return false;
         }
 
-        boolean applicationSignUpExists =false;
+        boolean applicationSignUpExists = false;
 
         ApplicationContext applicationContext = RegistryManager.getInstance().getApplicationContext(applicationId);
-        if(applicationContext.isMultiTenant()){
+        if (applicationContext.isMultiTenant()) {
             StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance();
             ApplicationSignUp applicationSignUps[] = serviceClient.getApplicationSignUps(applicationId);
 
@@ -564,8 +563,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
             if (log.isInfoEnabled()) {
                 log.info("Application undeployment process started: [application-id] " + applicationId);
             }
-        }
-        catch (Exception e) {
+        } catch (Exception e) {
             String message = "Could not start application undeployment process: [application-id] " + applicationId;
             log.error(message, e);
             throw new RuntimeException(message, e);
@@ -600,8 +598,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
 
             ApplicationBuilder.handleApplicationRemoval(applicationId);
             log.info(String.format("Application deleted successfully: [application-id] %s", applicationId));
-        }
-        catch (Exception e) {
+        } catch (Exception e) {
             String message = String.format("Could not delete application: [application-id] %s", applicationId);
             log.error(message, e);
             throw new RuntimeException(message, e);
@@ -745,8 +742,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
 
         try {
             RegistryManager.getInstance().updateServiceGroup(cartridgeGroup);
-        }
-        catch (org.wso2.carbon.registry.core.exceptions.RegistryException e) {
+        } catch (org.wso2.carbon.registry.core.exceptions.RegistryException e) {
             String message = (String.format("Cannot update cartridge group: [group-name] %s",
                     cartridgeGroup.getName()));
             throw new RuntimeException(message, e);
@@ -777,8 +773,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
                 }
                 throw new CartridgeGroupNotFoundException(msg);
             }
-        }
-        catch (org.wso2.carbon.registry.core.exceptions.RegistryException e) {
+        } catch (org.wso2.carbon.registry.core.exceptions.RegistryException e) {
             String message = "Could not remove cartridge group: " + groupName;
             log.error(message, e);
             throw new RuntimeException(message, e);
@@ -792,8 +787,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
         }
         try {
             return RegistryManager.getInstance().getServiceGroup(name);
-        }
-        catch (Exception e) {
+        } catch (Exception e) {
             throw new AutoScalerException("Error occurred while retrieving cartridge group", e);
         }
     }
@@ -811,13 +805,11 @@ public class AutoscalerServiceImpl implements AutoscalerService {
                 }
             }
             return null;
-        }
-        catch (Exception e) {
+        } catch (Exception e) {
             String message = String.format("Could not find cluster id: [application-id] %s [alias] %s",
                     applicationId, alias);
             throw new AutoScalerException(message, e);
-        }
-        finally {
+        } finally {
             ApplicationHolder.releaseReadLock();
         }
     }
@@ -833,8 +825,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
     public boolean undeployServiceGroup(String name) throws AutoScalerException {
         try {
             RegistryManager.getInstance().removeServiceGroup(name);
-        }
-        catch (RegistryException e) {
+        } catch (RegistryException e) {
             throw new AutoScalerException("Error occurred while removing the cartridge groups", e);
         }
         return true;
@@ -950,66 +941,102 @@ public class AutoscalerServiceImpl implements AutoscalerService {
                         "[application-id] %s", applicationId));
                 return;
             }
-        }
-        finally {
+        } finally {
             ApplicationHolder.releaseReadLock();
         }
 
-        Set<ClusterDataHolder> allClusters = application.getClusterDataRecursively();
-        for (ClusterDataHolder clusterDataHolder : allClusters) {
-            String serviceType = clusterDataHolder.getServiceType();
-            String clusterId = clusterDataHolder.getClusterId();
+        //Stopping the application monitor thread
+        ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().
+                getAppMonitor(applicationId);
+        if (applicationMonitor != null) {
+            applicationMonitor.destroy();
 
-            Cluster cluster;
-            try {
-                TopologyManager.acquireReadLockForCluster(serviceType, clusterId);
-                cluster = TopologyManager.getTopology().getService(serviceType).getCluster(clusterId);
-            }
-            finally {
-                TopologyManager.releaseReadLockForCluster(serviceType, clusterId);
-            }
+            if (applicationMonitor.hasInstance()) {
+                Map<String, Monitor> monitors = applicationMonitor.
+                        getAliasToActiveChildMonitorsMap();
+                AutoscalerUtil.handleForceTermination(monitors.values(),
+                        applicationMonitor, applicationId);
 
-            //If there are no members in cluster Instance, send cluster Terminated Event
-            //Stopping the cluster monitor thread
-            ClusterMonitor clusterMonitor = AutoscalerContext.getInstance().
-                    getClusterMonitor(clusterId);
-            if (clusterMonitor != null) {
-                clusterMonitor.destroy();
-            } else {
-                if (log.isDebugEnabled()) {
-                    log.debug(String.format("Cluster monitor cannot be found for [application] %s " +
-                            "[cluster] %s", applicationId, clusterId));
-                }
-            }
-            if (cluster != null) {
-                Collection<ClusterInstance> allClusterInstances = cluster.getClusterInstances();
-                for (ClusterInstance clusterInstance : allClusterInstances) {
-                    ClusterStatusEventPublisher.sendClusterTerminatedEvent(applicationId, cluster.getServiceName(),
-                            clusterId, clusterInstance.getInstanceId());
+                Collection<Instance> applicationInstances = applicationMonitor.getInstances();
+                for (Instance instance : applicationInstances) {
+                    ApplicationBuilder.handleApplicationInstanceTerminatedEvent(applicationId,
+                            instance.getInstanceId());
                 }
 
-                List<String> memberListToTerminate = new LinkedList<String>();
-                for (Member member : cluster.getMembers()) {
-                    memberListToTerminate.add(member.getMemberId());
-                }
+                Set<ClusterDataHolder> allClusters = application.getClusterDataRecursively();
+                for (ClusterDataHolder clusterDataHolder : allClusters) {
+                    String serviceType = clusterDataHolder.getServiceType();
+                    String clusterId = clusterDataHolder.getClusterId();
 
-                for (String memberIdToTerminate : memberListToTerminate) {
+                    Cluster cluster;
                     try {
-                        log.info(String.format(
-                                "Terminating member forcefully [member-id] %s of the cluster [cluster-id] %s " +
-                                        "[application-id] %s", memberIdToTerminate, clusterId, application));
-                        AutoscalerCloudControllerClient.getInstance().terminateInstanceForcefully(memberIdToTerminate);
+                        TopologyManager.acquireReadLockForCluster(serviceType, clusterId);
+                        cluster = TopologyManager.getTopology().getService(serviceType).getCluster(clusterId);
+                    } finally {
+                        TopologyManager.releaseReadLockForCluster(serviceType, clusterId);
+                    }
+
+                    //If there are no members in cluster Instance, send cluster Terminated Event
+                    //Stopping the cluster monitor thread
+                    ClusterMonitor clusterMonitor = AutoscalerContext.getInstance().
+                            getClusterMonitor(clusterId);
+                    if (clusterMonitor != null) {
+                        clusterMonitor.destroy();
+                    } else {
+                        if (log.isDebugEnabled()) {
+                            log.debug(String.format("Cluster monitor cannot be found for [application] %s " +
+                                    "[cluster] %s", applicationId, clusterId));
+                        }
                     }
-                    catch (Exception e) {
-                        log.error(
-                                String.format("Forceful termination of member %s has failed, but continuing forceful " +
-                                        "deletion of other members", memberIdToTerminate));
+                    if (cluster != null) {
+                        Collection<ClusterInstance> allClusterInstances = cluster.getClusterInstances();
+
+                        if (allClusterInstances.isEmpty() && clusterMonitor != null) {
+                            AutoscalerContext.getInstance().removeClusterMonitor(clusterId);
+                        }
+
+                        List<String> memberListToTerminate = new LinkedList<String>();
+                        for (Member member : cluster.getMembers()) {
+                            memberListToTerminate.add(member.getMemberId());
+                        }
+
+                        for (String memberIdToTerminate : memberListToTerminate) {
+                            try {
+                                log.info(String.format(
+                                        "Terminating member forcefully [member-id] %s of the cluster [cluster-id] %s " +
+                                                "[application-id] %s", memberIdToTerminate, clusterId, application));
+                                AutoscalerCloudControllerClient.getInstance().terminateInstanceForcefully(memberIdToTerminate);
+                            } catch (Exception e) {
+                                log.error(
+                                        String.format("Forceful termination of member %s has failed, but continuing forceful " +
+                                                "deletion of other members", memberIdToTerminate));
+                            }
+                        }
                     }
+
                 }
-            }
+            } else {
+                //There is no application instances. Need to directly un-deploy the application
+                // stopping application thread
+                ApplicationContext applicationContext = AutoscalerContext.getInstance().
+                        getApplicationContext(applicationId);
+                applicationMonitor.destroy();
+                AutoscalerContext.getInstance().removeAppMonitor(applicationId);
+                // Remove network partition algorithm context
+                AutoscalerContext.getInstance().removeNetworkPartitionAlgorithmContext(applicationId);
+                // update application status in application context
+                applicationContext.setStatus(ApplicationContext.STATUS_CREATED);
+                AutoscalerContext.getInstance().updateApplicationContext(applicationContext);
+                RegistryManager.getInstance().persistApplicationContext(applicationContext);
 
+                log.info("Application un-deployed successfully: [application-id] " + applicationId);
+            }
         }
 
+
+
+
+
     }
 
 
@@ -1137,7 +1164,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
             PartitionRef[] partitions = networkPartitionRef.getPartitionRefs();
             if (null == partitions || partitions.length == 0) {
                 String msg = String.format("Network partition does not have any partition references: "
-                        + "[deployment-policy-id] %s [network-partition-id] %s", deploymentPolicyId,
+                                + "[deployment-policy-id] %s [network-partition-id] %s", deploymentPolicyId,
                         networkPartitionId);
                 log.error(msg);
                 throw new InvalidDeploymentPolicyException(msg);
@@ -1190,23 +1217,20 @@ public class AutoscalerServiceImpl implements AutoscalerService {
                             addNewPartitionsToClusterMonitor(clusterLevelNetworkPartitionContext, networkPartition,
                                     deploymentPolicy.getDeploymentPolicyID(),
                                     clusterMonitor.getClusterContext().getServiceId());
-                        }
-                        catch (RemoteException e) {
+                        } catch (RemoteException e) {
 
                             String message =
                                     "Connection to cloud controller failed, Cluster monitor update failed for" +
                                             " [deployment-policy] " + deploymentPolicy.getDeploymentPolicyID();
                             log.error(message);
                             throw new CloudControllerConnectionException(message, e);
-                        }
-                        catch (CloudControllerServiceInvalidPartitionExceptionException e) {
+                        } catch (CloudControllerServiceInvalidPartitionExceptionException e) {
 
                             String message = "Invalid partition, Cluster monitor update failed for [deployment-policy] "
                                     + deploymentPolicy.getDeploymentPolicyID();
                             log.error(message);
                             throw new InvalidDeploymentPolicyException(message, e);
-                        }
-                        catch (CloudControllerServiceInvalidCartridgeTypeExceptionException e) {
+                        } catch (CloudControllerServiceInvalidCartridgeTypeExceptionException e) {
 
                             String message =
                                     "Invalid cartridge type, Cluster monitor update failed for [deployment-policy] "
@@ -1325,8 +1349,7 @@ public class AutoscalerServiceImpl implements AutoscalerService {
         try {
             Collection<DeploymentPolicy> deploymentPolicies = PolicyManager.getInstance().getDeploymentPolicies();
             return deploymentPolicies.toArray(new DeploymentPolicy[deploymentPolicies.size()]);
-        }
-        catch (Exception e) {
+        } catch (Exception e) {
             String message = "Could not get deployment policies";
             log.error(message);
             throw new AutoScalerException(message, e);

http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
index 3d80094..a639673 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
@@ -31,10 +31,12 @@ import org.apache.stratos.autoscaler.applications.pojo.ApplicationContext;
 import org.apache.stratos.autoscaler.applications.pojo.CartridgeContext;
 import org.apache.stratos.autoscaler.applications.pojo.ComponentContext;
 import org.apache.stratos.autoscaler.applications.pojo.GroupContext;
+import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
 import org.apache.stratos.autoscaler.context.AutoscalerContext;
 import org.apache.stratos.autoscaler.context.InstanceContext;
 import org.apache.stratos.autoscaler.context.cluster.ClusterInstanceContext;
 import org.apache.stratos.autoscaler.context.partition.network.NetworkPartitionContext;
+import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher;
 import org.apache.stratos.autoscaler.exception.AutoScalerException;
 import org.apache.stratos.autoscaler.exception.application.*;
 import org.apache.stratos.autoscaler.exception.policy.ApplicatioinPolicyNotExistsException;
@@ -44,10 +46,12 @@ import org.apache.stratos.autoscaler.monitor.MonitorFactory;
 import org.apache.stratos.autoscaler.monitor.cluster.ClusterMonitor;
 import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor;
 import org.apache.stratos.autoscaler.monitor.component.GroupMonitor;
+import org.apache.stratos.autoscaler.monitor.component.ParentComponentMonitor;
 import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.ApplicationPolicy;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy;
 import org.apache.stratos.autoscaler.registry.RegistryManager;
+import org.apache.stratos.cloud.controller.stub.domain.MemberContext;
 import org.apache.stratos.common.Properties;
 import org.apache.stratos.common.Property;
 import org.apache.stratos.common.client.CloudControllerServiceClient;
@@ -57,6 +61,7 @@ import org.apache.stratos.messaging.domain.application.Application;
 import org.apache.stratos.messaging.domain.application.Applications;
 import org.apache.stratos.messaging.domain.application.ClusterDataHolder;
 import org.apache.stratos.messaging.domain.application.Group;
+import org.apache.stratos.messaging.domain.instance.Instance;
 import org.apache.stratos.messaging.domain.topology.Service;
 import org.apache.stratos.messaging.domain.topology.Topology;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
@@ -1017,4 +1022,37 @@ public class AutoscalerUtil {
         }
     }
 
+
+    public static void handleForceTermination(Collection<Monitor> monitors, Monitor parentMonitor, String applicationId) {
+        Iterator<Monitor> monitorsIter = monitors.iterator();
+        while(monitorsIter.hasNext()) {
+            Monitor monitor = monitorsIter.next();
+            monitor.destroy();
+            Iterator<Instance> instances = monitor.getInstances().iterator();
+            while(instances.hasNext()) {
+                Instance instance = instances.next();
+                if (monitor instanceof GroupMonitor) {
+                    ApplicationBuilder.handleGroupInstanceTerminatedEvent(applicationId,
+                            monitor.getId(), instance.getInstanceId());
+                } else {
+                    ClusterStatusEventPublisher.sendClusterTerminatedEvent(applicationId,
+                            ((ClusterMonitor) monitor).getServiceId(), monitor.getId(), instance.getInstanceId());
+                }
+            }
+            if(monitor instanceof ParentComponentMonitor) {
+                ParentComponentMonitor pMonitor = (ParentComponentMonitor)parentMonitor;
+                if (!monitor.hasInstance()) {
+                    (pMonitor).removeMonitor(monitor.getId());
+                }
+                Collection<Monitor> childMonitors = pMonitor.
+                        getAliasToActiveChildMonitorsMap().values();
+                if(!childMonitors.isEmpty()) {
+                    handleForceTermination(childMonitors, monitor, applicationId);
+                }
+            }
+
+        }
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log
new file mode 100644
index 0000000..f63147c
Binary files /dev/null and b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log differ

http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data
new file mode 100644
index 0000000..e3832b7
Binary files /dev/null and b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data differ

http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo
new file mode 100644
index 0000000..b03cc50
Binary files /dev/null and b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo differ

http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
----------------------------------------------------------------------
diff --git a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
index 7148660..a7c1a89 100644
--- a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
+++ b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
@@ -24,16 +24,11 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.common.beans.application.ApplicationBean;
 import org.apache.stratos.common.beans.cartridge.CartridgeGroupBean;
 import org.apache.stratos.common.beans.policy.deployment.ApplicationPolicyBean;
-<<<<<<< HEAD:products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
 import org.apache.stratos.integration.common.RestConstants;
 import org.apache.stratos.integration.common.TopologyHandler;
 import org.apache.stratos.integration.tests.StratosIntegrationTest;
-=======
-import org.apache.stratos.integration.tests.RestConstants;
-import org.apache.stratos.integration.tests.StratosTestServerManager;
-import org.apache.stratos.integration.tests.TopologyHandler;
+import org.apache.stratos.integration.common.TopologyHandler;
 import org.apache.stratos.messaging.domain.application.Application;
->>>>>>> Support application update in the Applications Topology:products/stratos/modules/integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
 import org.apache.stratos.messaging.domain.application.ApplicationStatus;
 import org.apache.stratos.messaging.domain.application.ClusterDataHolder;
 import org.apache.stratos.messaging.domain.application.Group;


[2/3] stratos git commit: Support application update in the Applications Topology

Posted by re...@apache.org.
Support application update in the Applications Topology


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

Branch: refs/heads/stratos-4.1.x
Commit: 21e6c20815dadab33db5ba61aaf3c1569848afa5
Parents: b5d1020
Author: reka <rt...@gmail.com>
Authored: Thu Sep 10 16:56:57 2015 +0530
Committer: reka <rt...@gmail.com>
Committed: Wed Sep 16 10:49:03 2015 +0530

----------------------------------------------------------------------
 .../topic/ApplicationsEventPublisher.java       |  20 +++
 .../services/impl/AutoscalerServiceImpl.java    |   3 +
 .../application/ApplicationUpdatedEvent.java    |  43 ++++++
 .../ApplicationUpdatedEventListener.java        |  27 ++++
 .../ApplicationUpdatedMessageProcessor.java     | 152 +++++++++++++++++++
 .../ApplicationsMessageProcessorChain.java      |   6 +
 .../application/ApplicationUpdateTest.java      |  37 ++++-
 7 files changed, 283 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
index a5abc26..f66e525 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
@@ -44,15 +44,35 @@ public class ApplicationsEventPublisher {
     }
 
     public static void sendApplicationCreatedEvent(Application application) {
+        if(log.isInfoEnabled()) {
+            log.info("Sending application created event for [application] " +
+                    application.getUniqueIdentifier());
+        }
         publishEvent(new ApplicationCreatedEvent(application));
     }
 
+    public static void sendApplicationUpdated(Application application) {
+        if(log.isInfoEnabled()) {
+            log.info("Sending application updated event for [application] " +
+                    application.getUniqueIdentifier());
+        }
+        publishEvent(new ApplicationUpdatedEvent(application));
+    }
+
     public static void sendApplicationDeletedEvent(String appId, Set<ClusterDataHolder> clusterData) {
+        if(log.isInfoEnabled()) {
+            log.info("Sending application deleted event for [application] " +
+                    appId);
+        }
         publishEvent(new ApplicationDeletedEvent(appId, clusterData));
     }
 
     public static void sendApplicationInstanceCreatedEvent(String appId,
                                                            ApplicationInstance applicationInstance) {
+        if(log.isInfoEnabled()) {
+            log.info("Sending application instnace created event for [application] " +
+                    appId + " [instance] " + applicationInstance.getInstanceId());
+        }
         publishEvent(new ApplicationInstanceCreatedEvent(appId, applicationInstance));
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
index 47b03bb..d9023f7 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java
@@ -200,6 +200,9 @@ public class AutoscalerServiceImpl implements AutoscalerService {
         //updating the applicationContext
         AutoscalerContext.getInstance().updateApplicationContext(applicationContext);
 
+        //Send application Updated event
+        ApplicationsEventPublisher.sendApplicationUpdated(application);
+
         if (log.isInfoEnabled()) {
             log.info(String.format("Application updated successfully: [application-id] %s",
                     applicationId));

http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/application/ApplicationUpdatedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/application/ApplicationUpdatedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/application/ApplicationUpdatedEvent.java
new file mode 100644
index 0000000..4c2f7e0
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/application/ApplicationUpdatedEvent.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.messaging.event.application;
+
+import org.apache.stratos.messaging.domain.application.Application;
+import org.apache.stratos.messaging.event.Event;
+
+import java.io.Serializable;
+
+/**
+ * This event will be fired upon the application updated is detected.
+ */
+public class ApplicationUpdatedEvent extends Event implements Serializable {
+
+    private static final long serialVersionUID = 2625412714611885089L;
+
+    private Application application;
+
+    public ApplicationUpdatedEvent(Application application) {
+        this.application = application;
+    }
+
+    public Application getApplication() {
+        return application;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/application/ApplicationUpdatedEventListener.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/application/ApplicationUpdatedEventListener.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/application/ApplicationUpdatedEventListener.java
new file mode 100644
index 0000000..fc02e59
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/application/ApplicationUpdatedEventListener.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.stratos.messaging.listener.application;
+
+import org.apache.stratos.messaging.listener.EventListener;
+
+/**
+ * This will get triggered when application update happens
+ */
+abstract class ApplicationUpdatedEventListener extends EventListener {
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationUpdatedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationUpdatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationUpdatedMessageProcessor.java
new file mode 100644
index 0000000..99282ca
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationUpdatedMessageProcessor.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.messaging.message.processor.application;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.domain.application.Application;
+import org.apache.stratos.messaging.domain.application.Applications;
+import org.apache.stratos.messaging.domain.application.ClusterDataHolder;
+import org.apache.stratos.messaging.domain.application.Group;
+import org.apache.stratos.messaging.event.application.ApplicationCreatedEvent;
+import org.apache.stratos.messaging.event.application.ApplicationUpdatedEvent;
+import org.apache.stratos.messaging.message.processor.MessageProcessor;
+import org.apache.stratos.messaging.message.processor.application.updater.ApplicationsUpdater;
+import org.apache.stratos.messaging.util.MessagingUtil;
+
+import java.util.Set;
+
+public class ApplicationUpdatedMessageProcessor extends MessageProcessor {
+
+    private static final Log log = LogFactory.getLog(ApplicationUpdatedMessageProcessor.class);
+    private MessageProcessor nextProcessor;
+
+    @Override
+    public void setNext(MessageProcessor nextProcessor) {
+        this.nextProcessor = nextProcessor;
+    }
+
+    @Override
+    public boolean process(String type, String message, Object object) {
+
+        Applications applications = (Applications) object;
+
+        if (ApplicationUpdatedEvent.class.getName().equals(type)) {
+            if (!applications.isInitialized()) {
+                return false;
+            }
+
+            ApplicationUpdatedEvent event = (ApplicationUpdatedEvent) MessagingUtil.
+                    jsonToObject(message, ApplicationUpdatedEvent.class);
+            if (event == null) {
+                log.error("Unable to convert the JSON message to ApplicationCreatedEvent");
+                return false;
+            }
+
+            ApplicationsUpdater.acquireWriteLockForApplications();
+            try {
+                return doProcess(event, applications);
+
+            } finally {
+                ApplicationsUpdater.releaseWriteLockForApplications();
+            }
+
+        } else {
+            if (nextProcessor != null) {
+                // ask the next processor to take care of the message.
+                return nextProcessor.process(type, message, applications);
+            } else {
+                throw new RuntimeException(String.format("Failed to process message using available message processors: [type] %s [body] %s", type, message));
+            }
+        }
+    }
+
+    private boolean doProcess(ApplicationUpdatedEvent event, Applications applications) {
+
+        // check if required properties are available
+        if (event.getApplication() == null) {
+            String errorMsg = "Application object of application updated event is invalid";
+            log.error(errorMsg);
+            throw new RuntimeException(errorMsg);
+        }
+
+        if (event.getApplication().getUniqueIdentifier() == null ||
+                event.getApplication().getUniqueIdentifier().isEmpty()) {
+            String errorMsg = "App id of application updated event is invalid: [ " + event.getApplication().getUniqueIdentifier() + " ]";
+            log.error(errorMsg);
+            throw new RuntimeException(errorMsg);
+        }
+
+        // check if an Application with same name exists in applications
+        if (applications.applicationExists(event.getApplication().getUniqueIdentifier())) {
+            Application updatedApplication = event.getApplication();
+            // add application update to applications Topology
+            Application application = applications.
+                    getApplication(event.getApplication().getUniqueIdentifier());
+            //Update Application Recursively
+            Set<Group> groups = application.getAllGroupsRecursively();
+            for (Group group : groups) {
+                Group updatedGroup = updatedApplication.getGroupRecursively(group.getUniqueIdentifier());
+
+                if (updatedGroup != null) {
+                    group.setGroupMaxInstances(updatedGroup.getGroupMaxInstances());
+                    group.setGroupMinInstances(updatedGroup.getGroupMinInstances());
+                } else {
+                    log.warn("[Goup] " + group.getUniqueIdentifier() +
+                            " cannot be found in [application] " + application.getUniqueIdentifier());
+                }
+
+            }
+
+            Set<ClusterDataHolder> clusterDataHolders = application.getClusterDataRecursively();
+            for (ClusterDataHolder dataHolder : clusterDataHolders) {
+                Set<ClusterDataHolder> updatedClusters = updatedApplication.
+                        getClusterDataRecursively();
+                boolean clusterFound = false;
+                for(ClusterDataHolder updatedCluster : updatedClusters) {
+                    if (updatedCluster.getClusterId().equals(dataHolder.getClusterId())) {
+                        dataHolder.setMinInstances(updatedCluster.getMinInstances());
+                        dataHolder.setMaxInstances(updatedCluster.getMaxInstances());
+                        clusterFound = true;
+                        break;
+                    }
+                }
+                if(!clusterFound) {
+                    log.warn("[Cluster] " + dataHolder.getClusterId() +
+                            " cannot be found in [application] " + application.getUniqueIdentifier());
+                }
+
+            }
+
+
+            if (log.isInfoEnabled()) {
+                log.info("Application with id [ " + event.getApplication().getUniqueIdentifier() + " ] updated");
+            }
+        } else {
+            if (log.isDebugEnabled()) {
+                log.debug("Application with id [ " + event.getApplication().getUniqueIdentifier() + " ] not exists");
+            }
+
+        }
+
+        notifyEventListeners(event);
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationsMessageProcessorChain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationsMessageProcessorChain.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationsMessageProcessorChain.java
index b92a236..bed9b0d 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationsMessageProcessorChain.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationsMessageProcessorChain.java
@@ -39,6 +39,7 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain {
     private ApplicationInstanceCreatedMessageProcessor applicationInstanceCreatedMessageProcessor;
     private ApplicationInstanceActivatedMessageProcessor applicationActivatedMessageProcessor;
     private ApplicationCreatedMessageProcessor applicationCreatedMessageProcessor;
+    private ApplicationUpdatedMessageProcessor applicationUpdatedMessageProcessor;
     private ApplicationDeletedMessageProcessor applicationDeletedMessageProcessor;
     private ApplicationInstanceInactivatedMessageProcessor applicationInactivatedMessageProcessor;
     private ApplicationInstanceTerminatedMessageProcessor applicationTerminatedMessageProcessor;
@@ -67,6 +68,9 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain {
         applicationInstanceCreatedMessageProcessor = new ApplicationInstanceCreatedMessageProcessor();
         add(applicationInstanceCreatedMessageProcessor);
 
+        applicationUpdatedMessageProcessor = new ApplicationUpdatedMessageProcessor();
+        add(applicationUpdatedMessageProcessor);
+
         applicationActivatedMessageProcessor = new ApplicationInstanceActivatedMessageProcessor();
         add(applicationActivatedMessageProcessor);
 
@@ -112,6 +116,8 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain {
             applicationInstanceCreatedMessageProcessor.addEventListener(eventListener);
         } else if (eventListener instanceof ApplicationCreatedEventListener) {
             applicationCreatedMessageProcessor.addEventListener(eventListener);
+        } else if (eventListener instanceof ApplicationUndeployedEventListener) {
+            applicationUpdatedMessageProcessor.addEventListener(eventListener);
         } else if (eventListener instanceof ApplicationDeletedEventListener) {
             applicationDeletedMessageProcessor.addEventListener(eventListener);
         } else if (eventListener instanceof ApplicationInstanceActivatedEventListener) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/21e6c208/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
----------------------------------------------------------------------
diff --git a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
index b07ea2f..7148660 100644
--- a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
+++ b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
@@ -24,10 +24,20 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.common.beans.application.ApplicationBean;
 import org.apache.stratos.common.beans.cartridge.CartridgeGroupBean;
 import org.apache.stratos.common.beans.policy.deployment.ApplicationPolicyBean;
+<<<<<<< HEAD:products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
 import org.apache.stratos.integration.common.RestConstants;
 import org.apache.stratos.integration.common.TopologyHandler;
 import org.apache.stratos.integration.tests.StratosIntegrationTest;
+=======
+import org.apache.stratos.integration.tests.RestConstants;
+import org.apache.stratos.integration.tests.StratosTestServerManager;
+import org.apache.stratos.integration.tests.TopologyHandler;
+import org.apache.stratos.messaging.domain.application.Application;
+>>>>>>> Support application update in the Applications Topology:products/stratos/modules/integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java
 import org.apache.stratos.messaging.domain.application.ApplicationStatus;
+import org.apache.stratos.messaging.domain.application.ClusterDataHolder;
+import org.apache.stratos.messaging.domain.application.Group;
+import org.apache.stratos.messaging.message.receiver.application.ApplicationManager;
 import org.testng.annotations.Test;
 
 import static junit.framework.Assert.assertEquals;
@@ -134,14 +144,31 @@ public class ApplicationUpdateTest extends StratosIntegrationTest {
                     RestConstants.APPLICATIONS_NAME);
             assertEquals(updated, true);
 
-            topologyHandler.assertGroupInstanceCount(bean.getApplicationId(), "group3-application-update-test", 2);
-
-            topologyHandler.assertClusterMinMemberCount(bean.getApplicationId(), 2);
-
             ApplicationBean updatedBean = (ApplicationBean) restClient.getEntity(RestConstants.APPLICATIONS,
                     "g-sc-G123-1-application-update-test", ApplicationBean.class, RestConstants.APPLICATIONS_NAME);
             assertEquals(updatedBean.getApplicationId(), "g-sc-G123-1-application-update-test");
 
+            //Need to validate whether the updated taken into the applications Topology
+            Application application = ApplicationManager.getApplications().
+                    getApplication(bean.getApplicationId());
+
+            Group group = application.getGroupRecursively("group3-application-update-test");
+            assertEquals(group.getGroupMaxInstances(), 3);
+            assertEquals(group.getGroupMinInstances(), 2);
+            log.info("Application update is successfully done for [application] " +
+                    bean.getApplicationId() + " [group] " + group.getUniqueIdentifier());
+
+            ClusterDataHolder clusterDataHolder = application.
+                    getClusterDataHolderRecursivelyByAlias("c3-1x0-application-update-test");
+            assertEquals(clusterDataHolder.getMaxInstances(), 3);
+            assertEquals(clusterDataHolder.getMinInstances(), 2);
+            log.info("Application update is successfully done for [application] " +
+                    bean.getApplicationId() + " [Cluster] " + clusterDataHolder.getClusterId());
+
+            topologyHandler.assertGroupInstanceCount(bean.getApplicationId(), "group3-application-update-test", 2);
+
+            topologyHandler.assertClusterMinMemberCount(bean.getApplicationId(), 2);
+
             boolean removedGroup = restClient.removeEntity(RestConstants.CARTRIDGE_GROUPS, "G1-application-update-test",
                     RestConstants.CARTRIDGE_GROUPS_NAME);
             assertEquals(removedGroup, false);
@@ -244,4 +271,4 @@ public class ApplicationUpdateTest extends StratosIntegrationTest {
             assertTrue("An error occurred while handling application deployment/undeployment and update", false);
         }
     }
-}
\ No newline at end of file
+}


[3/3] stratos git commit: removing unnecessary files

Posted by re...@apache.org.
removing unnecessary files


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

Branch: refs/heads/stratos-4.1.x
Commit: 70eaa362d0e1c0b3b5f96a5f11efd3266c3cdb4c
Parents: 45228ba
Author: reka <rt...@gmail.com>
Authored: Wed Sep 16 10:49:36 2015 +0530
Committer: reka <rt...@gmail.com>
Committed: Wed Sep 16 10:49:36 2015 +0530

----------------------------------------------------------------------
 .../activemq-data/testBroker/KahaDB/db-1.log    | Bin 33030144 -> 0 bytes
 .../activemq-data/testBroker/KahaDB/db.data     | Bin 49152 -> 0 bytes
 .../activemq-data/testBroker/KahaDB/db.redo     | Bin 49240 -> 0 bytes
 3 files changed, 0 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/70eaa362/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log
deleted file mode 100644
index f63147c..0000000
Binary files a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log and /dev/null differ

http://git-wip-us.apache.org/repos/asf/stratos/blob/70eaa362/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data
deleted file mode 100644
index e3832b7..0000000
Binary files a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data and /dev/null differ

http://git-wip-us.apache.org/repos/asf/stratos/blob/70eaa362/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo
deleted file mode 100644
index b03cc50..0000000
Binary files a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo and /dev/null differ