Repository: stratos
Updated Branches:
  refs/heads/master ac02c043c -> 10cf2da77


adding application instance scale down support based on available 
network-partition


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

Branch: refs/heads/master
Commit: 10cf2da77ff69efa1180ca0a288843a5a5a0a263
Parents: ac02c04
Author: reka <[email protected]>
Authored: Tue May 12 21:17:57 2015 +0530
Committer: reka <[email protected]>
Committed: Tue May 12 21:21:17 2015 +0530

----------------------------------------------------------------------
 .../algorithms/NetworkPartitionAlgorithm.java   |   9 +-
 .../networkpartition/AllAtOnceAlgorithm.java    |  25 ++-
 .../NetworkPartitionAlgorithmContext.java       |  14 +-
 .../OneAfterAnotherAlgorithm.java               | 169 ++++++++++++++-----
 .../monitor/component/ApplicationMonitor.java   |  53 +++++-
 .../services/impl/AutoscalerServiceImpl.java    |  25 ++-
 6 files changed, 233 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/10cf2da7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/NetworkPartitionAlgorithm.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/NetworkPartitionAlgorithm.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/NetworkPartitionAlgorithm.java
index e881452..aa2f925 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/NetworkPartitionAlgorithm.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/NetworkPartitionAlgorithm.java
@@ -27,8 +27,13 @@ public interface NetworkPartitionAlgorithm {
     /**
      * Get a list network partitions in which application instances to be 
spawned
      *
-     * @param networkPartitionAlgorithmContext the {@link 
NetworkPartitionAlgorithmContext}
+     * @param networkPartitionAlgorithmContext the {@link 
org.apache.stratos.autoscaler.algorithms.networkpartition.NetworkPartitionAlgorithmContext}
      * @return list of network partition ids
      */
-    public List<String> 
getNextNetworkPartitions(NetworkPartitionAlgorithmContext 
networkPartitionAlgorithmContext);
+    public List getNextNetworkPartitions(NetworkPartitionAlgorithmContext
+                                                 
networkPartitionAlgorithmContext);
+
+
+    public List<String> 
getDefaultNetworkPartitions(NetworkPartitionAlgorithmContext
+                                                            
networkPartitionAlgorithmContext);
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/10cf2da7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/AllAtOnceAlgorithm.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/AllAtOnceAlgorithm.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/AllAtOnceAlgorithm.java
index 8cd7268..1966d0c 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/AllAtOnceAlgorithm.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/AllAtOnceAlgorithm.java
@@ -20,6 +20,7 @@ package 
org.apache.stratos.autoscaler.algorithms.networkpartition;
 
 import edu.emory.mathcs.backport.java.util.Arrays;
 import org.apache.stratos.autoscaler.algorithms.NetworkPartitionAlgorithm;
+import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.ApplicationPolicy;
 
 import java.util.List;
@@ -33,7 +34,29 @@ public class AllAtOnceAlgorithm implements 
NetworkPartitionAlgorithm {
             return null;
         }
 
-        ApplicationPolicy applicationPolicy = 
networkPartitionAlgorithmContext.getApplicationPolicy();
+        ApplicationPolicy applicationPolicy = 
PolicyManager.getInstance().getApplicationPolicy(
+                networkPartitionAlgorithmContext.getApplicationPolicyId());
+        if (applicationPolicy == null) {
+            return null;
+        }
+
+        String[] networkPartitions = applicationPolicy.getNetworkPartitions();
+        if (networkPartitions == null || networkPartitions.length == 0) {
+            return null;
+        }
+
+        return Arrays.asList(networkPartitions);
+    }
+
+    @Override
+    public List<String> 
getDefaultNetworkPartitions(NetworkPartitionAlgorithmContext
+                                                                
networkPartitionAlgorithmContext) {
+        if (networkPartitionAlgorithmContext == null) {
+            return null;
+        }
+
+        ApplicationPolicy applicationPolicy = 
PolicyManager.getInstance().getApplicationPolicy(
+                networkPartitionAlgorithmContext.getApplicationPolicyId());
         if (applicationPolicy == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/10cf2da7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/NetworkPartitionAlgorithmContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/NetworkPartitionAlgorithmContext.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/NetworkPartitionAlgorithmContext.java
index 53605f5..b605d4f 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/NetworkPartitionAlgorithmContext.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/NetworkPartitionAlgorithmContext.java
@@ -27,13 +27,13 @@ public class NetworkPartitionAlgorithmContext implements 
Serializable {
 
     private static final long serialVersionUID = -1539453541207312793L;
     private String applicationId;
-    private ApplicationPolicy applicationPolicy;
+    private String applicationPolicyId;
     private AtomicInteger currentNetworkPartitionIndex;
 
-    public NetworkPartitionAlgorithmContext(String applicationId, 
ApplicationPolicy applicationPolicy,
+    public NetworkPartitionAlgorithmContext(String applicationId, String 
applicationPolicyId,
                                             int currentNetworkPartitionIndex) {
         this.applicationId = applicationId;
-        this.applicationPolicy = applicationPolicy;
+        this.applicationPolicyId = applicationPolicyId;
         this.currentNetworkPartitionIndex = new 
AtomicInteger(currentNetworkPartitionIndex);
     }
 
@@ -41,11 +41,11 @@ public class NetworkPartitionAlgorithmContext implements 
Serializable {
         return currentNetworkPartitionIndex;
     }
 
-    public ApplicationPolicy getApplicationPolicy() {
-        return applicationPolicy;
-    }
-
     public String getApplicationId() {
         return applicationId;
     }
+
+    public String getApplicationPolicyId() {
+        return applicationPolicyId;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/10cf2da7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/OneAfterAnotherAlgorithm.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/OneAfterAnotherAlgorithm.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/OneAfterAnotherAlgorithm.java
index d70d028..c9f6970 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/OneAfterAnotherAlgorithm.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithms/networkpartition/OneAfterAnotherAlgorithm.java
@@ -18,22 +18,27 @@
  */
 package org.apache.stratos.autoscaler.algorithms.networkpartition;
 
-import edu.emory.mathcs.backport.java.util.Arrays;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.algorithms.NetworkPartitionAlgorithm;
+import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.ApplicationPolicy;
 import org.apache.stratos.common.constants.StratosConstants;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
+/**
+ * One after algorithm for the network-partition or groups
+ */
 public class OneAfterAnotherAlgorithm implements NetworkPartitionAlgorithm {
 
     private static final Log log = 
LogFactory.getLog(NetworkPartitionAlgorithm.class);
 
     @Override
-    public List<String> 
getNextNetworkPartitions(NetworkPartitionAlgorithmContext 
networkPartitionAlgorithmContext) {
+    public List<String> 
getNextNetworkPartitions(NetworkPartitionAlgorithmContext
+                                                         
networkPartitionAlgorithmContext) {
 
         if (networkPartitionAlgorithmContext == null) {
             if (log.isWarnEnabled()) {
@@ -46,78 +51,92 @@ public class OneAfterAnotherAlgorithm implements 
NetworkPartitionAlgorithm {
         String applicationId = 
networkPartitionAlgorithmContext.getApplicationId();
         if (applicationId == null) {
             if (log.isWarnEnabled()) {
-                String msg = "Application id is null in etwork partition 
algorithm context";
+                String msg = "Application id is null in network partition 
algorithm context";
                 log.warn(msg);
             }
             return null;
         }
 
-        ApplicationPolicy applicationPolicy = 
networkPartitionAlgorithmContext.getApplicationPolicy();
+        ApplicationPolicy applicationPolicy = 
PolicyManager.getInstance().getApplicationPolicy(
+                networkPartitionAlgorithmContext.getApplicationPolicyId());
         if (applicationPolicy == null) {
             if (log.isWarnEnabled()) {
-                String msg = String.format("No application policy found in 
network partition algorithm context [application-id] %s", applicationId);
+                String msg = String.format("No application policy found in 
network partition " +
+                        "algorithm context [application-id] %s", 
applicationId);
                 log.warn(msg);
             }
             return null;
         }
 
-        String applicatioinPolicyId = applicationPolicy.getId();
+        String applicationPolicyId = applicationPolicy.getId();
         String[] networkPartitionGroups = 
applicationPolicy.getNetworkPartitionGroups();
         if (networkPartitionGroups != null && networkPartitionGroups.length != 
0) {
             if (log.isDebugEnabled()) {
-                String msg = String.format("Network partition groups property 
found in application policy [application-id] %s [application-policy-id] %s. "
-                        + "Hence using network partition groups for app 
bursting", applicationId, applicatioinPolicyId);
+                String msg = String.format("Network partition groups property 
found in " +
+                                "application policy [application-id] %s 
[application-policy-id] %s. "
+                                + "Hence using network partition groups for 
app bursting",
+                        applicationId, applicationPolicyId);
                 log.debug(msg);
             }
             int totalNetworkPartitionGroups = networkPartitionGroups.length;
             if (log.isDebugEnabled()) {
-                String msg = String.format("%s network partition groups found 
in application policy [application-id] %s [application-policy-id] %s",
-                        totalNetworkPartitionGroups, applicationId, 
applicatioinPolicyId);
+                String msg = String.format("%s network partition groups found 
in application " +
+                                "policy [application-id] %s 
[application-policy-id] %s",
+                        totalNetworkPartitionGroups, applicationId, 
applicationPolicyId);
                 log.debug(msg);
             }
 
-            int currentPartitionIndex = 
networkPartitionAlgorithmContext.getCurrentNetworkPartitionIndex().intValue();
+            int currentPartitionIndex = networkPartitionAlgorithmContext.
+                    getCurrentNetworkPartitionIndex().intValue();
             if (log.isDebugEnabled()) {
-                String msg = String.format("Current network partition group 
index is %s [application-id] %s [application-policy-d]",
-                        currentPartitionIndex, applicationId, 
applicatioinPolicyId);
+                String msg = String.format("Current network partition group 
index is %s " +
+                                "[application-id] %s [application-policy-d] 
%s",
+                        currentPartitionIndex, applicationId, 
applicationPolicyId);
                 log.debug(msg);
             }
 
             if (currentPartitionIndex >= totalNetworkPartitionGroups) {
                 if (log.isDebugEnabled()) {
-                    String msg = String.format("currentPartitionIndex >= 
totalNetworkPartitionGroups, hence no more network partition groups are 
available "
-                            + "[application-id] %s [application-policy-d]", 
currentPartitionIndex, applicationId, applicatioinPolicyId);
+                    String msg = String.format("currentPartitionIndex %s >= " +
+                                    "totalNetworkPartitionGroups %s, hence no 
more network partition" +
+                                    " groups are available [application-id] %s 
" +
+                                    "[application-policy-id] %s", 
currentPartitionIndex,
+                            totalNetworkPartitionGroups, applicationId, 
applicationPolicyId);
                     log.debug(msg);
                 }
                 return null;
             }
 
-            int selectedIndex = 
networkPartitionAlgorithmContext.getCurrentNetworkPartitionIndex().incrementAndGet();
+            int selectedIndex = networkPartitionAlgorithmContext.
+                    getCurrentNetworkPartitionIndex().incrementAndGet();
             if (log.isDebugEnabled()) {
-                String msg = String.format("Selected network partition group 
index is %s (starting from 1,2,3...) [application-id] %s 
[application-policy-d]",
-                        selectedIndex, applicationId, applicatioinPolicyId);
+                String msg = String.format("Selected network partition group 
index is %s " +
+                                "(starting from 1,2,3...) [application-id] %s 
" +
+                                "[application-policy-d] %s", selectedIndex,
+                        applicationId, applicationPolicyId);
                 log.debug(msg);
             }
 
             if (log.isDebugEnabled()) {
-                String msg = String.format("Selected network partition group 
is %s [application-id] %s [application-policy-d]",
-                        networkPartitionGroups[selectedIndex - 1], 
applicationId, applicatioinPolicyId);
+                String msg = String.format("Selected network partition group 
is %s " +
+                                "[application-id] %s [application-policy-id] 
%s",
+                        networkPartitionGroups[selectedIndex - 1], 
applicationId, applicationPolicyId);
                 log.debug(msg);
             }
 
-            String[] selectedNetworkPartitions = 
networkPartitionGroups[selectedIndex - 
1].split(StratosConstants.APPLICATION_POLICY_NETWORK_PARTITIONS_SPLITTER);
-            if (selectedNetworkPartitions == null) {
-                return null;
-            }
+            List<String> selectedNetworkPartitions = new ArrayList<String>();
+            Collections.addAll(selectedNetworkPartitions, 
networkPartitionGroups[selectedIndex - 1].
+                    
split(StratosConstants.APPLICATION_POLICY_NETWORK_PARTITIONS_SPLITTER));
 
-            return Arrays.asList(selectedNetworkPartitions);
+            return selectedNetworkPartitions;
         }
 
         String[] networkPartitions = applicationPolicy.getNetworkPartitions();
         if (networkPartitions == null || networkPartitions.length == 0) {
             if (log.isWarnEnabled()) {
-                String msg = String.format("Network partitions found in 
application policy [application-id] %s [application-policy-id] %s",
-                        applicationId, applicatioinPolicyId);
+                String msg = String.format("Network partitions found in 
application policy " +
+                                "[application-id] %s [application-policy-id] 
%s",
+                        applicationId, applicationPolicyId);
                 log.warn(msg);
             }
             return null;
@@ -125,37 +144,45 @@ public class OneAfterAnotherAlgorithm implements 
NetworkPartitionAlgorithm {
 
         int totalNetworkPartitions = networkPartitions.length;
         if (log.isDebugEnabled()) {
-            String msg = String.format("%s network partitions found in 
application policy [application-id] %s [application-policy-id] %s",
-                    totalNetworkPartitions, applicationId, 
applicatioinPolicyId);
+            String msg = String.format("%s network partitions found in 
application policy " +
+                            "[application-id] %s [application-policy-id] %s",
+                    totalNetworkPartitions, applicationId, 
applicationPolicyId);
             log.debug(msg);
         }
 
-        int currentPartitionIndex = 
networkPartitionAlgorithmContext.getCurrentNetworkPartitionIndex().intValue();
+        int currentPartitionIndex = networkPartitionAlgorithmContext.
+                getCurrentNetworkPartitionIndex().intValue();
         if (log.isDebugEnabled()) {
-            String msg = String.format("Current network partition index is %s 
[application-id] %s [application-policy-d]",
-                    currentPartitionIndex, applicationId, 
applicatioinPolicyId);
+            String msg = String.format("Current network partition index is %s 
" +
+                            "[application-id] %s [application-policy-id] %s",
+                    currentPartitionIndex, applicationId, applicationPolicyId);
             log.debug(msg);
         }
 
         if (currentPartitionIndex >= totalNetworkPartitions) {
             if (log.isDebugEnabled()) {
-                String msg = String.format("currentPartitionIndex >= 
totalNetworkPartitions, hence no more network partitions are available "
-                        + "[application-id] %s [application-policy-d]", 
currentPartitionIndex, applicationId, applicatioinPolicyId);
+                String msg = String.format("currentPartitionIndex %s >= 
totalNetworkPartitions %s , " +
+                                "hence no more network partitions are 
available "
+                                + "[application-id] %s [application-policy-id] 
%s", currentPartitionIndex,
+                        totalNetworkPartitions, applicationId, 
applicationPolicyId);
                 log.debug(msg);
             }
             return null;
         }
 
-        int selectedIndex = 
networkPartitionAlgorithmContext.getCurrentNetworkPartitionIndex().incrementAndGet();
+        int selectedIndex = 
networkPartitionAlgorithmContext.getCurrentNetworkPartitionIndex().
+                incrementAndGet();
         if (log.isDebugEnabled()) {
-            String msg = String.format("Selected network partition index is %s 
(starting from 1,2,3...) [application-id] %s [application-policy-d]",
-                    selectedIndex, applicationId, applicatioinPolicyId);
+            String msg = String.format("Selected network partition index is %s 
" +
+                            "(starting from 1,2,3...) [application-id] %s 
[application-policy-id] %s",
+                    selectedIndex, applicationId, applicationPolicyId);
             log.debug(msg);
         }
 
         if (log.isDebugEnabled()) {
-            String msg = String.format("Selected network partition is %s 
[application-id] %s [application-policy-d]",
-                    networkPartitions[selectedIndex - 1], applicationId, 
applicatioinPolicyId);
+            String msg = String.format("Selected network partition is %s 
[application-id] %s " +
+                            "[application-policy-id] %s",
+                    networkPartitions[selectedIndex - 1], applicationId, 
applicationPolicyId);
             log.debug(msg);
         }
 
@@ -164,4 +191,68 @@ public class OneAfterAnotherAlgorithm implements 
NetworkPartitionAlgorithm {
 
         return nextNetworkPartitions;
     }
+
+    @Override
+    public List<String> 
getDefaultNetworkPartitions(NetworkPartitionAlgorithmContext
+                                                            
networkPartitionAlgorithmContext) {
+        if (networkPartitionAlgorithmContext == null) {
+            if (log.isWarnEnabled()) {
+                String msg = "Network partition algorithm context is null";
+                log.warn(msg);
+            }
+            return null;
+        }
+
+        String applicationId = 
networkPartitionAlgorithmContext.getApplicationId();
+        if (applicationId == null) {
+            if (log.isWarnEnabled()) {
+                String msg = "Application id is null in network partition 
algorithm context";
+                log.warn(msg);
+            }
+            return null;
+        }
+
+        ApplicationPolicy applicationPolicy = 
PolicyManager.getInstance().getApplicationPolicy(
+                networkPartitionAlgorithmContext.getApplicationPolicyId());
+        if (applicationPolicy == null) {
+            if (log.isWarnEnabled()) {
+                String msg = String.format("No application policy found in 
network partition " +
+                        "algorithm context [application-id] %s", 
applicationId);
+                log.warn(msg);
+            }
+            return null;
+        }
+
+        String applicationPolicyId = applicationPolicy.getId();
+        String[] networkPartitionGroups = 
applicationPolicy.getNetworkPartitionGroups();
+        List<String> selectedNetworkPartitions = new ArrayList<String>();
+
+        if (networkPartitionGroups != null && networkPartitionGroups.length != 
0) {
+            if (log.isDebugEnabled()) {
+                String msg = String.format("Network partition groups property 
found in application " +
+                                "policy [application-id] %s 
[application-policy-id] %s. "
+                                + "Hence using network partition groups for 
app bursting",
+                        applicationId, applicationPolicyId);
+                log.debug(msg);
+            }
+            int totalNetworkPartitionGroups = networkPartitionGroups.length;
+            if (log.isDebugEnabled()) {
+                String msg = String.format("%s network partition groups found 
in application policy" +
+                                " [application-id] %s [application-policy-id] 
%s",
+                        totalNetworkPartitionGroups, applicationId, 
applicationPolicyId);
+                log.debug(msg);
+            }
+            //Returning the very first network-partition group as the default 
one
+            Collections.addAll(selectedNetworkPartitions, 
networkPartitionGroups[0].
+                    
split(StratosConstants.APPLICATION_POLICY_NETWORK_PARTITIONS_SPLITTER));
+
+        } else {
+            //Returning the very first network-partition as the default one
+            String[] networkPartitions = 
applicationPolicy.getNetworkPartitions();
+            selectedNetworkPartitions.add(networkPartitions[0]);
+        }
+
+        return selectedNetworkPartitions;
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/10cf2da7/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 8183ea8..871bbf6 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
@@ -120,7 +120,7 @@ public class ApplicationMonitor extends 
ParentComponentMonitor {
                         ApplicationInstance instance = (ApplicationInstance) 
instanceIdToInstanceMap.
                                 get(instanceContext.getId());
                         //stopping the monitoring when the group is 
inactive/Terminating/Terminated
-                        if (instance.getStatus().getCode() <= 
GroupStatus.Active.getCode()) {
+                        if (instance.getStatus().getCode() <= 
ApplicationStatus.Active.getCode()) {
                             //Gives priority to scaling max out rather than 
dependency scaling
                             if 
(!instanceContext.getIdToScalingOverMaxEvent().isEmpty()) {
                                 //handling the scaling max out of the children
@@ -192,9 +192,54 @@ public class ApplicationMonitor extends 
ParentComponentMonitor {
 
         //all the children sent the scale down only, it will try to scale down
         if (allChildrenScaleDown) {
-            //Check whether this app monitor has burst application
-            
ApplicationBuilder.handleApplicationInstanceTerminatingEvent(this.appId,
-                    instanceContext.getId());
+            //Need to get the network partition
+            NetworkPartitionAlgorithmContext algorithmContext = 
AutoscalerContext.getInstance().
+                    getNetworkPartitionAlgorithmContext(appId);
+            if (algorithmContext == null) {
+                String msg = String.format("Network partition algorithm 
context not found " +
+                        "in registry or in-memory [application-id] %s", appId);
+                log.error(msg);
+                throw new RuntimeException(msg);
+            }
+
+            ApplicationPolicy applicationPolicy = PolicyManager.getInstance().
+                    
getApplicationPolicy(algorithmContext.getApplicationPolicyId());
+            if (applicationPolicy == null) {
+                String msg = String.format("Application policy not found in 
registry or " +
+                        "in-memory [application-id] %s", appId);
+                log.error(msg);
+                throw new RuntimeException(msg);
+            }
+
+            String networkPartitionAlgorithmName = 
applicationPolicy.getAlgorithm();
+            if (log.isDebugEnabled()) {
+                String msg = String.format("Network partition algorithm is %s 
[application-id] %s",
+                        networkPartitionAlgorithmName, appId);
+                log.debug(msg);
+            }
+
+            NetworkPartitionAlgorithm algorithm = getNetworkPartitionAlgorithm(
+                    networkPartitionAlgorithmName);
+            if (algorithm == null) {
+                String msg = String.format("Couldn't create network partition 
algorithm " +
+                        "[application-id] %s", appId);
+                log.error(msg);
+                throw new RuntimeException(msg);
+            }
+
+
+            // Check whether the network-partition of the application
+            // instance belongs to default set of network-partitions.
+            // If it is default set, then application instance cannot be 
terminated.
+            List<String> defaultNetworkPartitions = algorithm.
+                    getDefaultNetworkPartitions(algorithmContext);
+            if(!defaultNetworkPartitions.contains(nwPartitionContext.getId())) 
{
+                //Since it is not default network-partition, it can be 
terminated
+                // upon scale-down of the children as it has been created by 
bursting
+                
ApplicationBuilder.handleApplicationInstanceTerminatingEvent(this.appId,
+                        instanceContext.getId());
+            }
+
         }
 
         //Resetting the events

http://git-wip-us.apache.org/repos/asf/stratos/blob/10cf2da7/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 328aa26..4d2e3bf 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
@@ -221,24 +221,28 @@ public class AutoscalerServiceImpl implements 
AutoscalerService {
     @Override
     public ApplicationContext[] getApplications() {
         return AutoscalerContext.getInstance().getApplicationContexts().
-                toArray(new 
ApplicationContext[AutoscalerContext.getInstance().getApplicationContexts().size()]);
+                toArray(new ApplicationContext[AutoscalerContext.getInstance().
+                        getApplicationContexts().size()]);
     }
 
     @Override
-    public boolean deployApplication(String applicationId, String 
applicationPolicyId) throws ApplicationDefinitionException {
+    public boolean deployApplication(String applicationId, String 
applicationPolicyId)
+            throws ApplicationDefinitionException {
         try {
             Application application = 
ApplicationHolder.getApplications().getApplication(applicationId);
             if (application == null) {
                 throw new RuntimeException("Application not found: " + 
applicationId);
             }
 
-            ApplicationContext applicationContext = 
RegistryManager.getInstance().getApplicationContext(applicationId);
+            ApplicationContext applicationContext = 
RegistryManager.getInstance().
+                    getApplicationContext(applicationId);
             if (applicationContext == null) {
                 throw new RuntimeException("Application context not found: " + 
applicationId);
             }
 
             // Create application clusters in cloud controller and send 
application created event
-            ApplicationBuilder.handleApplicationDeployment(application, 
applicationContext.getComponents().getApplicationClusterContexts());
+            ApplicationBuilder.handleApplicationDeployment(application,
+                    
applicationContext.getComponents().getApplicationClusterContexts());
 
             // validating application policy against the application
             
AutoscalerUtil.validateApplicationPolicyAgainstApplication(applicationId, 
applicationPolicyId);
@@ -254,13 +258,14 @@ public class AutoscalerServiceImpl implements 
AutoscalerService {
             }
 
             // adding network partition algorithm context to registry
-            ApplicationPolicy applicationPolicy = 
PolicyManager.getInstance().getApplicationPolicy(applicationPolicyId);
-            NetworkPartitionAlgorithmContext algorithmContext = new 
NetworkPartitionAlgorithmContext(applicationId, applicationPolicy, 0);
+            NetworkPartitionAlgorithmContext algorithmContext =
+                    new NetworkPartitionAlgorithmContext(applicationId, 
applicationPolicyId, 0);
             
AutoscalerContext.getInstance().addNetworkPartitionAlgorithmContext(algorithmContext);
 
             if (!applicationContext.isMultiTenant()) {
                 // Add application signup for single tenant applications
-                addApplicationSignUp(applicationContext, application.getKey(), 
findApplicationClusterIds(application));
+                addApplicationSignUp(applicationContext, application.getKey(),
+                        findApplicationClusterIds(application));
             }
             applicationContext.setStatus(ApplicationContext.STATUS_DEPLOYED);
             
AutoscalerContext.getInstance().updateApplicationContext(applicationContext);
@@ -268,7 +273,8 @@ public class AutoscalerServiceImpl implements 
AutoscalerService {
             log.info("Waiting for application clusters to be created: 
[application] " + applicationId);
             return true;
         } catch (Exception e) {
-            ApplicationContext applicationContext = 
RegistryManager.getInstance().getApplicationContext(applicationId);
+            ApplicationContext applicationContext = 
RegistryManager.getInstance().
+                    getApplicationContext(applicationId);
             if (applicationContext != null) {
                 // Revert application status
                 
applicationContext.setStatus(ApplicationContext.STATUS_CREATED);
@@ -367,7 +373,8 @@ public class AutoscalerServiceImpl implements 
AutoscalerService {
                 }
             }
             if (groupContext.getGroupContexts() != null) {
-                for (CartridgeContext cartridgeContext : 
getCartridgeContextsOfGroupsRecursively(groupContext.getGroupContexts())) {
+                for (CartridgeContext cartridgeContext :
+                        
getCartridgeContextsOfGroupsRecursively(groupContext.getGroupContexts())) {
 
                     cartridgeContextsList.add(cartridgeContext);
                 }

Reply via email to