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/05/12 17:51:31 UTC

stratos git commit: adding application instance scale down support based on available network-partition

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 <rt...@gmail.com>
Authored: Tue May 12 21:17:57 2015 +0530
Committer: reka <rt...@gmail.com>
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);
                 }