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 2014/12/18 10:51:30 UTC

stratos git commit: refining networkpatitioncontext and support dependent scaling in applicaiton monitor

Repository: stratos
Updated Branches:
  refs/heads/master d858feb17 -> 1c6642b46


refining networkpatitioncontext and support dependent scaling in applicaiton monitor

Conflicts:
	components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java


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

Branch: refs/heads/master
Commit: 1c6642b465a99d38fdb9526d7fa705ceaee780fa
Parents: d858feb
Author: reka <rt...@gmail.com>
Authored: Thu Dec 18 15:04:15 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Thu Dec 18 15:21:05 2014 +0530

----------------------------------------------------------------------
 .../applications/topic/ApplicationBuilder.java  |  13 +-
 .../autoscaler/context/InstanceContext.java     |  62 ++++++
 .../context/cluster/VMClusterContext.java       |   6 +-
 .../context/group/GroupInstanceContext.java     |  55 +----
 ...ApplicationLevelNetworkPartitionContext.java |  37 +---
 .../ClusterLevelNetworkPartitionContext.java    |  38 +---
 .../GroupLevelNetworkPartitionContext.java      |  42 +---
 .../network/NetworkPartitionContext.java        |  44 ++++
 .../AutoscalerTopologyEventReceiver.java        |   2 +-
 .../monitor/cluster/VMClusterMonitor.java       |  23 +-
 .../monitor/component/ApplicationMonitor.java   | 143 ++++++-------
 .../monitor/component/GroupMonitor.java         | 211 ++-----------------
 .../component/ParentComponentMonitor.java       | 154 ++++++++++++--
 .../autoscaler/rule/RuleTasksDelegator.java     |   8 +-
 .../cluster/ClusterStatusActiveProcessor.java   |   4 +-
 .../cluster/ClusterStatusInactiveProcessor.java |   5 +-
 .../ClusterStatusTerminatedProcessor.java       |   7 +-
 17 files changed, 394 insertions(+), 460 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
index e842a6e..ffaa00c 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
@@ -25,7 +25,6 @@ import org.apache.stratos.autoscaler.applications.pojo.ApplicationClusterContext
 import org.apache.stratos.autoscaler.client.CloudControllerClient;
 import org.apache.stratos.autoscaler.context.AutoscalerContext;
 import org.apache.stratos.autoscaler.context.partition.network.GroupLevelNetworkPartitionContext;
-import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher;
 import org.apache.stratos.autoscaler.exception.policy.InvalidPolicyException;
 import org.apache.stratos.autoscaler.monitor.Monitor;
 import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor;
@@ -33,15 +32,10 @@ import org.apache.stratos.autoscaler.monitor.component.GroupMonitor;
 import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
 import org.apache.stratos.messaging.domain.applications.*;
 import org.apache.stratos.messaging.domain.instance.ApplicationInstance;
-import org.apache.stratos.messaging.domain.instance.ClusterInstance;
 import org.apache.stratos.messaging.domain.instance.GroupInstance;
-import org.apache.stratos.messaging.domain.topology.Cluster;
-import org.apache.stratos.messaging.domain.topology.Service;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
 import org.wso2.carbon.base.MultitenantConstants;
 import org.wso2.carbon.context.PrivilegedCarbonContext;
 
-import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -251,7 +245,7 @@ public class ApplicationBuilder {
                         getAppMonitor(appId);
                 applicationMonitor.getNetworkPartitionContext(applicationInstance.
                                                                 getNetworkPartitionId()).
-                        removeClusterApplicationContext(instanceId);
+                        removeInstanceContext(instanceId);
                 applicationMonitor.removeInstance(instanceId);
                 application.removeInstance(instanceId);
                 //removing the monitor
@@ -335,8 +329,9 @@ public class ApplicationBuilder {
                         }
                     }
                     GroupLevelNetworkPartitionContext networkPartitionContext =
-                            monitor.getNetworkPartitionContext(groupInstance.getNetworkPartitionId());
-                    networkPartitionContext.removeClusterGroupContext(instanceId);
+                            (GroupLevelNetworkPartitionContext) monitor.
+                                    getNetworkPartitionContext(groupInstance.getNetworkPartitionId());
+                    networkPartitionContext.removeInstanceContext(instanceId);
                     if (groupInstance.getPartitionId() != null) {
                         networkPartitionContext.getPartitionCtxt(groupInstance.getPartitionId()).
                                 removeActiveInstance(groupInstance);

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
index 8d4ef27..a5cf689 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
@@ -18,6 +18,12 @@
  */
 package org.apache.stratos.autoscaler.context;
 
+import org.apache.stratos.autoscaler.monitor.events.ScalingEvent;
+import org.apache.stratos.autoscaler.monitor.events.ScalingOverMaxEvent;
+
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * This will hold the instances related info.
  */
@@ -26,8 +32,16 @@ public abstract class InstanceContext {
 
     protected String parentInstanceId;
 
+    //key=id of the child, value=ScalingEvent
+    private Map<String, ScalingEvent> idToScalingEvent;
+    //key=id of the child, value=MaxOutScalingEvent
+    private Map<String, ScalingOverMaxEvent> idToScalingOverMaxEvent;
+
+
     public InstanceContext(String id) {
         this.id = id;
+        setIdToScalingEvent(new HashMap<String, ScalingEvent>());
+        setIdToScalingOverMaxEvent(new HashMap<String, ScalingOverMaxEvent>());
     }
 
     public String getId() {
@@ -45,4 +59,52 @@ public abstract class InstanceContext {
     public void setParentInstanceId(String parentInstanceId) {
         this.parentInstanceId = parentInstanceId;
     }
+
+    public Map<String, ScalingEvent> getIdToScalingEvent() {
+        return idToScalingEvent;
+    }
+
+    public void setIdToScalingEvent(Map<String, ScalingEvent> idToScalingEvent) {
+        this.idToScalingEvent = idToScalingEvent;
+    }
+
+    public Map<String, ScalingOverMaxEvent> getIdToScalingOverMaxEvent() {
+        return idToScalingOverMaxEvent;
+    }
+
+    public void setIdToScalingOverMaxEvent(Map<String, ScalingOverMaxEvent> idToScalingOverMaxEvent) {
+        this.idToScalingOverMaxEvent = idToScalingOverMaxEvent;
+    }
+
+    public void removeScalingEvent(String id) {
+        this.idToScalingEvent.remove(id);
+    }
+
+    public void addScalingEvent(ScalingEvent scalingEvent) {
+        this.idToScalingEvent.put(scalingEvent.getId(), scalingEvent);
+    }
+
+    public ScalingEvent getScalingEvent(String id) {
+        return this.idToScalingEvent.get(id);
+    }
+
+    public ScalingOverMaxEvent getScalingMaxEvent(String id) {
+        return this.idToScalingOverMaxEvent.get(id);
+    }
+
+    public void removeScalingOverMaxEvent(String id) {
+        this.idToScalingOverMaxEvent.remove(id);
+    }
+
+    public void addScalingOverMaxEvent(ScalingOverMaxEvent scalingOverMaxEvent) {
+        this.idToScalingOverMaxEvent.put(scalingOverMaxEvent.getId(), scalingOverMaxEvent);
+    }
+
+    public boolean containsScalingEvent(String id) {
+        return this.idToScalingEvent.containsKey(id);
+    }
+
+    public boolean containsScalingOverMaxEvent(String id) {
+        return this.idToScalingOverMaxEvent.containsKey(id);
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
index 3f0feb4..ba90d8f 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
@@ -236,8 +236,8 @@ public class VMClusterContext extends AbstractClusterContext {
             throw new PolicyValidationException(msg);
         }
 
-        ClusterInstanceContext clusterInstanceContext = clusterLevelNetworkPartitionContext.
-                getClusterInstanceContext(clusterInstance.getInstanceId());
+        ClusterInstanceContext clusterInstanceContext = (ClusterInstanceContext) clusterLevelNetworkPartitionContext.
+                getInstanceContext(clusterInstance.getInstanceId());
         int maxInstances = 1;
         if (clusterInstanceContext == null) {
             int minInstances = 1;
@@ -294,7 +294,7 @@ public class VMClusterContext extends AbstractClusterContext {
                     clusterLevelPartitionContext.getPartitionId()));
         }
 
-        clusterLevelNetworkPartitionContext.addClusterInstanceContext(clusterInstanceContext);
+        clusterLevelNetworkPartitionContext.addInstanceContext(clusterInstanceContext);
 
         if (log.isInfoEnabled()) {
             log.info(String.format("Cluster Instance context has been added: " +

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
index 1f4ae6f..775b5f1 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
@@ -35,16 +35,11 @@ public class GroupInstanceContext extends InstanceContext {
 
     //partitions of this network partition
     private final List<GroupLevelPartitionContext> partitionCtxts;
-    //key=id of the child, value=ScalingEvent
-    private Map<String, ScalingEvent> idToScalingEvent;
-    //key=id of the child, value=MaxOutScalingEvent
-    private Map<String, ScalingOverMaxEvent> idToScalingOverMaxEvent;
 
     public GroupInstanceContext(String id) {
         super(id);
         partitionCtxts = new ArrayList<GroupLevelPartitionContext>();
-        setIdToScalingEvent(new HashMap<String, ScalingEvent>());
-        setIdToScalingOverMaxEvent(new HashMap<String, ScalingOverMaxEvent>());
+
     }
 
     public List<GroupLevelPartitionContext> getPartitionCtxts() {
@@ -86,52 +81,4 @@ public class GroupInstanceContext extends InstanceContext {
         }
         return 0;
     }
-
-    public Map<String, ScalingEvent> getIdToScalingEvent() {
-        return idToScalingEvent;
-    }
-
-    public void setIdToScalingEvent(Map<String, ScalingEvent> idToScalingEvent) {
-        this.idToScalingEvent = idToScalingEvent;
-    }
-
-    public Map<String, ScalingOverMaxEvent> getIdToScalingOverMaxEvent() {
-        return idToScalingOverMaxEvent;
-    }
-
-    public void setIdToScalingOverMaxEvent(Map<String, ScalingOverMaxEvent> idToScalingOverMaxEvent) {
-        this.idToScalingOverMaxEvent = idToScalingOverMaxEvent;
-    }
-
-    public void removeScalingEvent(String id) {
-        this.idToScalingEvent.remove(id);
-    }
-
-    public void addScalingEvent(ScalingEvent scalingEvent) {
-        this.idToScalingEvent.put(scalingEvent.getId(), scalingEvent);
-    }
-
-    public ScalingEvent getScalingEvent(String id) {
-        return this.idToScalingEvent.get(id);
-    }
-
-    public ScalingOverMaxEvent getScalingMaxEvent(String id) {
-        return this.idToScalingOverMaxEvent.get(id);
-    }
-
-    public void removeScalingOverMaxEvent(String id) {
-        this.idToScalingOverMaxEvent.remove(id);
-    }
-
-    public void addScalingOverMaxEvent(ScalingOverMaxEvent scalingOverMaxEvent) {
-        this.idToScalingOverMaxEvent.put(scalingOverMaxEvent.getId(), scalingOverMaxEvent);
-    }
-
-    public boolean containsScalingEvent(String id) {
-        return this.idToScalingEvent.containsKey(id);
-    }
-
-    public boolean containsScalingOverMaxEvent(String id) {
-        return this.idToScalingOverMaxEvent.containsKey(id);
-    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ApplicationLevelNetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ApplicationLevelNetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ApplicationLevelNetworkPartitionContext.java
index b894fce..3e3edf5 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ApplicationLevelNetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ApplicationLevelNetworkPartitionContext.java
@@ -21,7 +21,6 @@ package org.apache.stratos.autoscaler.context.partition.network;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.context.application.ApplicationInstanceContext;
-import org.apache.stratos.messaging.domain.instance.ApplicationInstance;
 
 import java.io.Serializable;
 import java.util.HashMap;
@@ -33,36 +32,17 @@ import java.util.Map;
  */
 public class ApplicationLevelNetworkPartitionContext extends NetworkPartitionContext implements Serializable {
     private static final Log log = LogFactory.getLog(ApplicationLevelNetworkPartitionContext.class);
-    private final String id;
     private boolean createdOnBurst;
 
-    //group instances kept inside a partition
-    private Map<String, ApplicationInstanceContext> instanceIdToInstanceContextMap;
-
     public ApplicationLevelNetworkPartitionContext(String id) {
-        this.id = id;
-        this.instanceIdToInstanceContextMap = new HashMap<String, ApplicationInstanceContext>();
-    }
-
-    public Map<String, ApplicationInstanceContext> getInstanceIdToInstanceContextMap() {
-        return instanceIdToInstanceContextMap;
-    }
-
-    public void setInstanceIdToInstanceContextMap(Map<String, ApplicationInstanceContext> instanceIdToInstanceContextMap) {
-        this.instanceIdToInstanceContextMap = instanceIdToInstanceContextMap;
+        super(id);
     }
 
-    public void addInstanceContext(ApplicationInstanceContext context) {
-        this.instanceIdToInstanceContextMap.put(context.getId(), context);
-
-    }
-
-
     public int hashCode() {
 
         final int prime = 31;
         int result = 1;
-        result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
+        result = prime * result + ((super.getId() == null) ? 0 : super.getId().hashCode());
         return result;
 
     }
@@ -79,11 +59,11 @@ public class ApplicationLevelNetworkPartitionContext extends NetworkPartitionCon
             return false;
         }
         final ApplicationLevelNetworkPartitionContext other = (ApplicationLevelNetworkPartitionContext) obj;
-        if (this.id == null) {
-            if (other.id != null) {
+        if (super.getId() == null) {
+            if (super.getId() != null) {
                 return false;
             }
-        } else if (!this.id.equals(other.id)) {
+        } else if (!super.getId().equals(super.getId())) {
             return false;
         }
         return true;
@@ -91,11 +71,11 @@ public class ApplicationLevelNetworkPartitionContext extends NetworkPartitionCon
 
     @Override
     public String toString() {
-        return "ApplicationNetworkPartitionContext [id=" + id  + "]";
+        return "ApplicationNetworkPartitionContext [id=" + super.getId() + "]";
     }
 
     public String getId() {
-        return id;
+        return super.getId();
     }
 
     public boolean isCreatedOnBurst() {
@@ -106,7 +86,4 @@ public class ApplicationLevelNetworkPartitionContext extends NetworkPartitionCon
         this.createdOnBurst = createdOnBurst;
     }
 
-    public void removeClusterApplicationContext(String instanceId) {
-        this.instanceIdToInstanceContextMap.remove(instanceId);
-    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java
index c6af5f7..21234b0 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java
@@ -35,25 +35,19 @@ public class ClusterLevelNetworkPartitionContext extends NetworkPartitionContext
 
     private static final Log log = LogFactory.getLog(ClusterLevelNetworkPartitionContext.class);
     private static final long serialVersionUID = 572769304374110159L;
-    private final String id;
 
     private String partitionAlgorithm;
     private int min;
 
-    private Map<String, ClusterInstanceContext> instanceIdToClusterInstanceContextMap;
-
-
     public ClusterLevelNetworkPartitionContext(String id, String partitionAlgorithm, int min) {
-        this.id = id;
+        super(id);
         this.partitionAlgorithm = partitionAlgorithm;
         this.min = min;
-        setInstanceIdToClusterInstanceContextMap(new ConcurrentHashMap<String, ClusterInstanceContext>());
 
     }
 
     public ClusterLevelNetworkPartitionContext(String id) {
-        this.id = id;
-        setInstanceIdToClusterInstanceContextMap(new HashMap<String, ClusterInstanceContext>());
+        super(id);
     }
 
 
@@ -90,33 +84,7 @@ public class ClusterLevelNetworkPartitionContext extends NetworkPartitionContext
 
 
     public String getId() {
-        return id;
-    }
-
-    public ClusterInstanceContext getClusterInstanceContext(String instanceId) {
-        return this.getClusterInstanceContextMap().get(instanceId);
-    }
-
-    public void addClusterInstanceContext(ClusterInstanceContext clusterInstanceContext) {
-        this.getClusterInstanceContextMap().put(clusterInstanceContext.getId(),
-                clusterInstanceContext);
-    }
-
-    public Map<String, ClusterInstanceContext> getClusterInstanceContextMap() {
-        return instanceIdToClusterInstanceContextMap;
-    }
-
-    public void setInstanceIdToClusterInstanceContextMap(
-            Map<String, ClusterInstanceContext> instanceIdToClusterInstanceContextMap) {
-        this.instanceIdToClusterInstanceContextMap = instanceIdToClusterInstanceContextMap;
-    }
-
-    public boolean containsClusterInstanceContext(String instanceId) {
-        return this.instanceIdToClusterInstanceContextMap.containsKey(instanceId);
-    }
-
-    public void removeClusterInstanceContext(String instanceId) {
-        this.instanceIdToClusterInstanceContextMap.remove(instanceId);
+        return super.getId();
     }
 
     public int getMin() {

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
index 52af38d..4749e23 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
@@ -20,7 +20,6 @@ package org.apache.stratos.autoscaler.context.partition.network;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.autoscaler.context.InstanceContext;
 import org.apache.stratos.autoscaler.context.group.GroupInstanceContext;
 import org.apache.stratos.autoscaler.context.partition.GroupLevelPartitionContext;
 
@@ -35,7 +34,6 @@ import java.util.Map;
  */
 public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext implements Serializable {
     private static final Log log = LogFactory.getLog(GroupLevelNetworkPartitionContext.class);
-    private final String id;
     private int scaleDownRequestsCount = 0;
     private float averageRequestsServedPerInstance;
 
@@ -51,44 +49,26 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
     //details required for partition selection algorithms
     private int currentPartitionIndex;
 
-    //group instances kept inside a partition
-    private Map<String, GroupInstanceContext> instanceIdToInstanceContextMap;
+
 
     public GroupLevelNetworkPartitionContext(String id, String partitionAlgo) {
-        this.id = id;
+        super(id);
         this.partitionAlgorithm = partitionAlgo;
         partitionContexts = new ArrayList<GroupLevelPartitionContext>();
         requiredInstanceCountBasedOnStats = minInstanceCount;
         requiredInstanceCountBasedOnDependencies = minInstanceCount;
-        instanceIdToInstanceContextMap = new HashMap<String, GroupInstanceContext>();
 
 
     }
 
     public GroupLevelNetworkPartitionContext(String id) {
-        this.id = id;
+        super(id);
         partitionContexts = new ArrayList<GroupLevelPartitionContext>();
         requiredInstanceCountBasedOnStats = minInstanceCount;
         requiredInstanceCountBasedOnDependencies = minInstanceCount;
-        instanceIdToInstanceContextMap = new HashMap<String, GroupInstanceContext>();
-    }
-
-    public Map<String, GroupInstanceContext> getInstanceIdToInstanceContextMap() {
-        return instanceIdToInstanceContextMap;
-    }
-
-    public void setInstanceIdToInstanceContextMap(Map<String, GroupInstanceContext> instanceIdToInstanceContextMap) {
-        this.instanceIdToInstanceContextMap = instanceIdToInstanceContextMap;
     }
 
-    public void addInstanceContext(GroupInstanceContext context) {
-        this.instanceIdToInstanceContextMap.put(context.getId(), context);
 
-    }
-
-    public GroupInstanceContext getInstanceContext(String instanceId) {
-        return this.instanceIdToInstanceContextMap.get(instanceId);
-    }
 
     public int getMinInstanceCount() {
         return minInstanceCount;
@@ -110,7 +90,7 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
 
         final int prime = 31;
         int result = 1;
-        result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
+        result = prime * result + ((super.getId() == null) ? 0 : super.getId().hashCode());
         return result;
 
     }
@@ -127,11 +107,11 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
             return false;
         }
         final GroupLevelNetworkPartitionContext other = (GroupLevelNetworkPartitionContext) obj;
-        if (this.id == null) {
-            if (other.id != null) {
+        if (super.getId() == null) {
+            if (super.getId() != null) {
                 return false;
             }
-        } else if (!this.id.equals(other.id)) {
+        } else if (!super.getId().equals(super.getId())) {
             return false;
         }
         return true;
@@ -139,7 +119,7 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
 
     @Override
     public String toString() {
-        return "NetworkPartitionContext [id=" + id + "partitionAlgorithm=" + partitionAlgorithm + ", minInstanceCount=" +
+        return "NetworkPartitionContext [id=" + super.getId() + "partitionAlgorithm=" + partitionAlgorithm + ", minInstanceCount=" +
                 minInstanceCount + ", maxInstanceCount=" + maxInstanceCount + "]";
     }
 
@@ -152,7 +132,7 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
     }
 
     public String getId() {
-        return id;
+        return super.getId();
     }
 
 
@@ -236,9 +216,7 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
         return null;
     }
 
-    public void removeClusterGroupContext(String instanceId) {
-        this.instanceIdToInstanceContextMap.remove(instanceId);
-    }
+
 
 
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
index 45d0376..0183220 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
@@ -20,10 +20,54 @@ package org.apache.stratos.autoscaler.context.partition.network;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.context.InstanceContext;
+import org.apache.stratos.autoscaler.context.group.GroupInstanceContext;
+
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * This will keep track of network partition level information.
  */
 public abstract class NetworkPartitionContext {
     private static final Log log = LogFactory.getLog(GroupLevelNetworkPartitionContext.class);
+    //id of the network partition context
+    private final String id;
+    //group instances kept inside a partition
+    private Map<String, InstanceContext> instanceIdToInstanceContextMap;
+
+    protected NetworkPartitionContext(String id) {
+        this.id = id;
+        instanceIdToInstanceContextMap = new HashMap<String, InstanceContext>();
+
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public Map<String, InstanceContext> getInstanceIdToInstanceContextMap() {
+        return instanceIdToInstanceContextMap;
+    }
+
+    public void setInstanceIdToInstanceContextMap(Map<String, InstanceContext> instanceIdToInstanceContextMap) {
+        this.instanceIdToInstanceContextMap = instanceIdToInstanceContextMap;
+    }
+
+    public void addInstanceContext(InstanceContext context) {
+        this.instanceIdToInstanceContextMap.put(context.getId(), context);
+
+    }
+
+    public InstanceContext getInstanceContext(String instanceId) {
+        return this.instanceIdToInstanceContextMap.get(instanceId);
+    }
+
+    public void removeInstanceContext(String instanceId) {
+        this.instanceIdToInstanceContextMap.remove(instanceId);
+    }
+
+    public boolean containsInstanceContext(String instanceId) {
+        return this.instanceIdToInstanceContextMap.containsKey(instanceId);
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
index ad992ba..2a6f945 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
@@ -306,7 +306,7 @@ public class AutoscalerTopologyEventReceiver {
                 ClusterInstance instance = (ClusterInstance) monitor.getInstance(instanceId);
                 ((VMClusterContext)monitor.getClusterContext()).
                         getNetworkPartitionCtxt(instance.getNetworkPartitionId()).
-                        removeClusterInstanceContext(instanceId);
+                        removeInstanceContext(instanceId);
                 monitor.removeInstance(instanceId);
                 if (!monitor.hasInstance() && appMonitor.isTerminating()) {
                     //Destroying and Removing the Cluster monitor

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
index 8bdbf0a..1ef3a58 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
@@ -22,6 +22,7 @@ import org.apache.commons.configuration.XMLConfiguration;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.client.CloudControllerClient;
+import org.apache.stratos.autoscaler.context.InstanceContext;
 import org.apache.stratos.autoscaler.context.cluster.ClusterContextFactory;
 import org.apache.stratos.autoscaler.context.cluster.ClusterInstanceContext;
 import org.apache.stratos.autoscaler.context.cluster.VMClusterContext;
@@ -190,10 +191,11 @@ public class VMClusterMonitor extends AbstractClusterMonitor {
 
         for (ClusterLevelNetworkPartitionContext networkPartitionContext : getNetworkPartitionCtxts()) {
 
-            final Collection<ClusterInstanceContext> clusterInstanceContexts = networkPartitionContext.
-                    getClusterInstanceContextMap().values();
+            final Collection<InstanceContext> clusterInstanceContexts = networkPartitionContext.
+                    getInstanceIdToInstanceContextMap().values();
 
-            for (final ClusterInstanceContext instanceContext : clusterInstanceContexts) {
+            for (final InstanceContext pInstanceContext : clusterInstanceContexts) {
+                final ClusterInstanceContext instanceContext = (ClusterInstanceContext) pInstanceContext;
                 ClusterInstance instance = (ClusterInstance) this.instanceIdToInstanceMap.
                         get(instanceContext.getId());
 
@@ -211,7 +213,8 @@ public class VMClusterMonitor extends AbstractClusterMonitor {
                             // store primary members in the cluster instance context
                             List<String> primaryMemberListInClusterInstance = new ArrayList<String>();
 
-                            for (ClusterLevelPartitionContext partitionContext : instanceContext.getPartitionCtxts()) {
+                            for (ClusterLevelPartitionContext partitionContext :
+                                                            instanceContext.getPartitionCtxts()) {
 
                                 // get active primary members in this cluster instance context
                                 for (MemberContext memberContext : partitionContext.getActiveMembers()) {
@@ -1037,8 +1040,9 @@ public class VMClusterMonitor extends AbstractClusterMonitor {
         Thread memberTerminator = new Thread(new Runnable() {
             public void run() {
 
-                ClusterInstanceContext instanceContext = getAllNetworkPartitionCtxts().get(networkPartitionId)
-                        .getClusterInstanceContext(instanceId);
+                ClusterInstanceContext instanceContext =
+                        (ClusterInstanceContext) getAllNetworkPartitionCtxts().get(networkPartitionId)
+                                                                    .getInstanceContext(instanceId);
                 boolean allMovedToObsolete = true;
                 for (ClusterLevelPartitionContext partitionContext : instanceContext.getPartitionCtxts()) {
                     if (log.isInfoEnabled()) {
@@ -1104,7 +1108,9 @@ public class VMClusterMonitor extends AbstractClusterMonitor {
                 ((VMClusterContext) this.clusterContext).getNetworkPartitionCtxts();
         ClusterLevelNetworkPartitionContext networkPartitionContext =
                 clusterLevelNetworkPartitionContextMap.get(networkPartitionId);
-        return networkPartitionContext.getClusterInstanceContextMap().get(instanceId);
+        ClusterInstanceContext instanceContext = (ClusterInstanceContext) networkPartitionContext.
+                                                        getInstanceContext(instanceId);
+        return instanceContext;
     }
 
     public Collection<ClusterLevelNetworkPartitionContext> getNetworkPartitionCtxts() {
@@ -1201,7 +1207,8 @@ public class VMClusterMonitor extends AbstractClusterMonitor {
         //FIXME to iterate properly
         for (ClusterLevelNetworkPartitionContext networkPartitionContext :
                 ((VMClusterContext) this.clusterContext).getNetworkPartitionCtxts().values()) {
-            ClusterInstanceContext clusterInstanceContext = networkPartitionContext.getClusterInstanceContext(instanceId);
+            ClusterInstanceContext clusterInstanceContext =
+                    (ClusterInstanceContext) networkPartitionContext.getInstanceContext(instanceId);
             if (clusterInstanceContext != null) {
                 for (ClusterLevelPartitionContext partitionContext : clusterInstanceContext.getPartitionCtxts()) {
                     List<String> members = new ArrayList<String>();

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/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 69eb68e..07c13fd 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
@@ -22,18 +22,18 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.applications.ApplicationHolder;
 import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
+import org.apache.stratos.autoscaler.context.InstanceContext;
 import org.apache.stratos.autoscaler.context.application.ApplicationInstanceContext;
 import org.apache.stratos.autoscaler.context.partition.network.ApplicationLevelNetworkPartitionContext;
+import org.apache.stratos.autoscaler.context.partition.network.NetworkPartitionContext;
 import org.apache.stratos.autoscaler.exception.application.DependencyBuilderException;
 import org.apache.stratos.autoscaler.exception.application.MonitorNotFoundException;
 import org.apache.stratos.autoscaler.exception.application.TopologyInConsistentException;
 import org.apache.stratos.autoscaler.exception.policy.PolicyValidationException;
 import org.apache.stratos.autoscaler.monitor.Monitor;
-import org.apache.stratos.autoscaler.monitor.cluster.VMClusterMonitor;
 import org.apache.stratos.autoscaler.monitor.events.ApplicationStatusEvent;
-import org.apache.stratos.autoscaler.monitor.events.ScalingEvent;
 import org.apache.stratos.autoscaler.monitor.events.MonitorStatusEvent;
-import org.apache.stratos.autoscaler.monitor.events.ScalingOverMaxEvent;
+import org.apache.stratos.autoscaler.monitor.events.ScalingEvent;
 import org.apache.stratos.autoscaler.monitor.events.builder.MonitorStatusEventBuilder;
 import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy;
@@ -42,15 +42,11 @@ import org.apache.stratos.autoscaler.util.ServiceReferenceHolder;
 import org.apache.stratos.messaging.domain.applications.Application;
 import org.apache.stratos.messaging.domain.applications.ApplicationStatus;
 import org.apache.stratos.messaging.domain.applications.GroupStatus;
-import org.apache.stratos.messaging.domain.applications.ScalingDependentList;
 import org.apache.stratos.messaging.domain.instance.ApplicationInstance;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * ApplicationMonitor is to control the child monitors
@@ -58,8 +54,6 @@ import java.util.Map;
 public class ApplicationMonitor extends ParentComponentMonitor {
     private static final Log log = LogFactory.getLog(ApplicationMonitor.class);
 
-    //network partition contexts
-    private Map<String, ApplicationLevelNetworkPartitionContext> networkPartitionCtxts;
     //Flag to set whether application is terminating
     private boolean isTerminating;
 
@@ -69,9 +63,69 @@ public class ApplicationMonitor extends ParentComponentMonitor {
         super(application);
         //setting the appId for the application
         this.appId = application.getUniqueIdentifier();
-        networkPartitionCtxts = new HashMap<String, ApplicationLevelNetworkPartitionContext>();
     }
 
+    @Override
+    public void run() {
+        try {
+            if (log.isDebugEnabled()) {
+                log.debug("Application monitor is running : " + this.toString());
+            }
+            monitor();
+        } catch (Exception e) {
+            log.error("Application monitor failed : " + this.toString(), e);
+        }
+    }
+
+    public synchronized void monitor() {
+        final Collection<NetworkPartitionContext> networkPartitionContexts =
+                this.networkPartitionCtxts.values();
+
+        Runnable monitoringRunnable = new Runnable() {
+            @Override
+            public void run() {
+                if (log.isDebugEnabled()) {
+                    log.debug("Application monitor is running====== : " + this.toString());
+                }
+                for (NetworkPartitionContext networkPartitionContext : networkPartitionContexts) {
+
+                    for (InstanceContext instanceContext : networkPartitionContext.
+                            getInstanceIdToInstanceContextMap().values()) {
+                        ApplicationInstance instance = (ApplicationInstance) instanceIdToInstanceMap.
+                                get(instanceContext.getId());
+                        //stopping the monitoring when the group is inactive/Terminating/Terminated
+                        if (instance.getStatus().getCode() <= GroupStatus.Active.getCode()) {
+                            //Gives priority to scaling max out rather than dependency scaling
+                            if (!instanceContext.getIdToScalingOverMaxEvent().isEmpty()) {
+                                //handling the application bursting
+                                try {
+                                    if (log.isInfoEnabled()) {
+                                        log.info("Handling application busting, " +
+                                                "since resources are exhausted in " +
+                                                "this application instance ");
+                                    }
+                                    createInstanceOnBurstingForApplication();
+                                } catch (TopologyInConsistentException e) {
+                                    log.error("Error while bursting the application", e);
+                                } catch (PolicyValidationException e) {
+                                    log.error("Error while bursting the application", e);
+                                } catch (MonitorNotFoundException e) {
+                                    log.error("Error while bursting the application", e);
+                                }
+
+                            } else {
+                                handleDependentScaling(instanceContext, networkPartitionContext);
+
+                            }
+                        }
+                    }
+                }
+            }
+        };
+        monitoringRunnable.run();
+    }
+
+
     /**
      * Find the group monitor by traversing recursively in the hierarchical monitors.
      *
@@ -97,7 +151,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
         }
 
         for (Monitor monitor : monitors.values()) {
-            if(monitor instanceof ParentComponentMonitor) {
+            if (monitor instanceof ParentComponentMonitor) {
                 Monitor monitor1 = findGroupMonitor(id, ((ParentComponentMonitor) monitor).
                         getAliasToActiveMonitorsMap());
                 if (monitor1 != null) {
@@ -176,55 +230,6 @@ public class ApplicationMonitor extends ParentComponentMonitor {
         // nothing to do
     }
 
-    @Override
-    public void onChildScalingEvent(ScalingEvent scalingEvent) {
-
-
-        if (log.isDebugEnabled()) {
-            log.debug("Child scaling event received to [group]: " + this.getId()
-                    + ", [network partition]: " + scalingEvent.getNetworkPartitionId()
-                    + ", [event] " + scalingEvent.getId() + ", [group instance] " + scalingEvent.getInstanceId());
-        }
-
-        //find the child context of this group,
-        //Notifying children, if this group has scaling dependencies
-        /*if(scalingDependencies != null && !scalingDependencies.isEmpty()) {
-            // has dependencies. Notify children
-            if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
-
-                for (ScalingDependentList scalingDependentList : scalingDependencies) {
-
-                    for(String scalingDependentListComponent : scalingDependentList.getScalingDependentListComponents()){
-
-                        if(scalingDependentListComponent.equals("cartridge."
-                                + scalingEvent.getId().substring(0, scalingEvent.getId().indexOf('.')))
-                                || scalingDependentListComponent.equals("group."
-                                + scalingEvent.getId().substring(0, scalingEvent.getId().indexOf('.')))){
-
-                            for(String scalingDependentListComponentInSelectedList : scalingDependentList.getScalingDependentListComponents()){
-
-                                Monitor monitor = aliasToActiveMonitorsMap.get(
-                                        scalingDependentListComponentInSelectedList.substring(
-                                                scalingDependentListComponentInSelectedList.indexOf('.') + 1) +
-                                                "." + scalingEvent.getServiceName() +
-                                                ".domain");
-                                if(monitor instanceof GroupMonitor || monitor instanceof VMClusterMonitor){
-                                    monitor.onParentScalingEvent(scalingEvent);
-                                }
-                            }
-                            break;
-                        }
-                    }
-                }
-            }
-        }*/
-    }
-
-    @Override
-    public void onChildScalingOverMaxEvent(ScalingOverMaxEvent scalingOverMaxEvent) {
-        //TODO to check for the capability of cloud bursting
-
-    }
 
     @Override
     public void onParentScalingEvent(ScalingEvent scalingEvent) {
@@ -383,22 +388,6 @@ public class ApplicationMonitor extends ParentComponentMonitor {
         return instance;
     }
 
-    public Map<String, ApplicationLevelNetworkPartitionContext> getApplicationLevelNetworkPartitionCtxts() {
-        return networkPartitionCtxts;
-    }
-
-    public void setApplicationLevelNetworkPartitionCtxts(Map<String, ApplicationLevelNetworkPartitionContext> networkPartitionCtxts) {
-        this.networkPartitionCtxts = networkPartitionCtxts;
-    }
-
-    public void addApplicationLevelNetworkPartitionContext(ApplicationLevelNetworkPartitionContext applicationLevelNetworkPartitionContext) {
-        this.networkPartitionCtxts.put(applicationLevelNetworkPartitionContext.getId(), applicationLevelNetworkPartitionContext);
-    }
-
-    public ApplicationLevelNetworkPartitionContext getNetworkPartitionContext(String networkPartitionId) {
-        return this.networkPartitionCtxts.get(networkPartitionId);
-    }
-
     public boolean isTerminating() {
         return isTerminating;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/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 7f96486..a6c99ce 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
@@ -23,10 +23,12 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.algorithm.AutoscaleAlgorithm;
 import org.apache.stratos.autoscaler.applications.ApplicationHolder;
 import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
+import org.apache.stratos.autoscaler.context.InstanceContext;
 import org.apache.stratos.autoscaler.context.group.GroupInstanceContext;
 import org.apache.stratos.autoscaler.context.partition.GroupLevelPartitionContext;
 import org.apache.stratos.autoscaler.context.partition.PartitionContext;
 import org.apache.stratos.autoscaler.context.partition.network.GroupLevelNetworkPartitionContext;
+import org.apache.stratos.autoscaler.context.partition.network.NetworkPartitionContext;
 import org.apache.stratos.autoscaler.exception.application.DependencyBuilderException;
 import org.apache.stratos.autoscaler.exception.application.MonitorNotFoundException;
 import org.apache.stratos.autoscaler.exception.application.TopologyInConsistentException;
@@ -57,20 +59,13 @@ import java.util.concurrent.TimeUnit;
  * This is GroupMonitor to monitor the group which consists of
  * groups and clusters
  */
-public class GroupMonitor extends ParentComponentMonitor implements Runnable {
+public class GroupMonitor extends ParentComponentMonitor {
 
     private static final Log log = LogFactory.getLog(GroupMonitor.class);
-    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
     //has scaling dependents
     protected boolean hasScalingDependents;
     //Indicates whether groupScaling enabled or not
     private boolean groupScalingEnabled;
-    //Network partition contexts
-    private Map<String, GroupLevelNetworkPartitionContext> networkPartitionCtxts;
-    //Indicates whether the monitor is destroyed or not
-    private boolean isDestroyed;
-    //Monitoring interval of the monitor
-    private int monitoringIntervalMilliseconds = 60000;     //TODO get this from config file
 
     /**
      * Constructor of GroupMonitor
@@ -85,7 +80,6 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         super(group);
         this.groupScalingEnabled = group.isGroupScalingEnabled();
         this.appId = appId;
-        networkPartitionCtxts = new HashMap<String, GroupLevelNetworkPartitionContext>();
         this.hasScalingDependents = hasScalingDependents;
     }
 
@@ -101,16 +95,8 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         }
     }
 
-    public void startScheduler() {
-        scheduler.scheduleAtFixedRate(this, 0, monitoringIntervalMilliseconds, TimeUnit.MILLISECONDS);
-    }
-
-    protected void stopScheduler() {
-        scheduler.shutdownNow();
-    }
-
-    public void monitor() {
-        final Collection<GroupLevelNetworkPartitionContext> networkPartitionContexts =
+    public synchronized void monitor() {
+        final Collection<NetworkPartitionContext> networkPartitionContexts =
                 this.networkPartitionCtxts.values();
 
         Runnable monitoringRunnable = new Runnable() {
@@ -119,9 +105,9 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                 if (log.isDebugEnabled()) {
                     log.debug("Group monitor is running====== : " + this.toString());
                 }
-                for (GroupLevelNetworkPartitionContext networkPartitionContext : networkPartitionContexts) {
+                for (NetworkPartitionContext networkPartitionContext : networkPartitionContexts) {
 
-                    for (GroupInstanceContext instanceContext : networkPartitionContext.
+                    for (InstanceContext instanceContext : networkPartitionContext.
                             getInstanceIdToInstanceContextMap().values()) {
                         GroupInstance instance = (GroupInstance) instanceIdToInstanceMap.
                                 get(instanceContext.getId());
@@ -154,55 +140,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                                             appId);
                                 }
                             } else {
-                                /**
-                                 * Dependency scaling handling
-                                 * Finding out the highest scaling events within the scaling dependencies
-                                 */
-                                List<ScalingEvent> highestScalingEventOfDependencies = new ArrayList<ScalingEvent>();
-                                for (ScalingDependentList scalingDependentList : scalingDependencies) {
-                                    ScalingEvent highestFactorEvent = null;
-                                    for (String scalingDependentListComponent : scalingDependentList.
-                                            getScalingDependentListComponents()) {
-                                        ScalingEvent scalingEvent = instanceContext.
-                                                getScalingEvent(scalingDependentListComponent);
-                                        if (highestFactorEvent == null) {
-                                            highestFactorEvent = scalingEvent;
-                                        } else {
-                                            if (scalingEvent.getFactor() > highestFactorEvent.getFactor()) {
-                                                highestFactorEvent = scalingEvent;
-                                            }
-                                        }
-                                    }
-                                    highestScalingEventOfDependencies.add(highestFactorEvent);
-                                }
-
-                                for (ScalingEvent highestScalingEventOfChild : highestScalingEventOfDependencies) {
-                                    //find the child context of this group,
-                                    //Notifying children, if this group has scaling dependencies
-                                    if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
-                                        for (ScalingDependentList scalingDependentList : scalingDependencies) {
-                                            if (scalingDependentList.getScalingDependentListComponents().
-                                                    contains(highestScalingEventOfChild.getId())) {
-                                                for (String scalingDependentListComponent : scalingDependentList
-                                                        .getScalingDependentListComponents()) {
-                                                    Monitor monitor = aliasToActiveMonitorsMap.get(
-                                                            scalingDependentListComponent);
-                                                    if (monitor instanceof GroupMonitor ||
-                                                            monitor instanceof VMClusterMonitor) {
-                                                        ScalingEvent scalingEvent = new ScalingEvent(monitor.getId(),
-                                                                networkPartitionContext.getId(),
-                                                                instanceContext.getId(),
-                                                                highestScalingEventOfChild.getFactor());
-                                                        monitor.onParentScalingEvent(scalingEvent);
-                                                    }
-                                                }
-                                            }
-                                            break;
-                                        }
-                                    }
-                                }
-                                //Resetting the events
-                                instanceContext.setIdToScalingEvent(new HashMap<String, ScalingEvent>());
+                                handleDependentScaling(instanceContext, networkPartitionContext);
                             }
                         }
 
@@ -373,94 +311,8 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
     }
 
     @Override
-    public void onChildScalingEvent(ScalingEvent scalingEvent) {
-        if (hasScalingDependents) {
-            //notify parent
-            parent.onChildScalingEvent(scalingEvent);
-        }
-
-        if (log.isDebugEnabled()) {
-            log.debug("Child scaling event received to [group]: " + this.getId()
-                    + ", [network partition]: " + scalingEvent.getNetworkPartitionId()
-                    + ", [event] " + scalingEvent.getId() + ", [group instance] " + scalingEvent.getInstanceId());
-        }
-
-        //find the child context of this group,
-        //Notifying children, if this group has scaling dependencies
-        //TODO will be handled by the periodic task
-        /*if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
-            // has dependencies. Notify children
-            if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
-
-                for (ScalingDependentList scalingDependentList : scalingDependencies) {
-
-                    for (String scalingDependentListComponent : scalingDependentList
-                            .getScalingDependentListComponents()) {
-
-                        if (scalingDependentListComponent.equals(scalingEvent.getId())) {
-
-                            for (String scalingDependentListComponentInSelectedList :
-                                    scalingDependentList.getScalingDependentListComponents()) {
-
-                                Monitor monitor = aliasToActiveMonitorsMap.get(
-                                        scalingDependentListComponentInSelectedList);
-                                if (monitor instanceof GroupMonitor ||
-                                        monitor instanceof VMClusterMonitor) {
-                                    monitor.onParentScalingEvent(scalingEvent);
-                                }
-                            }
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-*/
-        String networkPartitionId = scalingEvent.getNetworkPartitionId();
-        String instanceId = scalingEvent.getInstanceId();
-        String id = scalingEvent.getId();
-        GroupLevelNetworkPartitionContext networkPartitionContext =
-                this.networkPartitionCtxts.get(networkPartitionId);
-        if (networkPartitionContext != null) {
-            GroupInstanceContext instanceContext = networkPartitionContext.getInstanceContext(instanceId);
-            if (instanceContext != null) {
-                if (instanceContext.containsScalingEvent(id)) {
-                    instanceContext.removeScalingEvent(id);
-                    instanceContext.addScalingEvent(scalingEvent);
-                } else {
-                    instanceContext.addScalingEvent(scalingEvent);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void onChildScalingOverMaxEvent(ScalingOverMaxEvent scalingOverMaxEvent) {
-        //Checking whether this monitor has room to create new instances else
-        // notify the parent with max out
-        //TODO by drool or periodic monitor or here
-
-        //adding the scaling over max event to group instance Context
-        String networkPartitionId = scalingOverMaxEvent.getNetworkPartitionId();
-        String instanceId = scalingOverMaxEvent.getInstanceId();
-        String id = scalingOverMaxEvent.getId();
-        GroupLevelNetworkPartitionContext networkPartitionContext =
-                this.networkPartitionCtxts.get(networkPartitionId);
-        if (networkPartitionContext != null) {
-            GroupInstanceContext instanceContext = networkPartitionContext.getInstanceContext(instanceId);
-            if (instanceContext != null) {
-                if (instanceContext.containsScalingEvent(id)) {
-                    instanceContext.removeScalingOverMaxEvent(id);
-                    instanceContext.addScalingOverMaxEvent(scalingOverMaxEvent);
-                } else {
-                    instanceContext.addScalingOverMaxEvent(scalingOverMaxEvent);
-                }
-            }
-        }
-    }
-
-    @Override
     public void onParentScalingEvent(ScalingEvent scalingEvent) {
+        //TODO group scaling, if there are enough spaces else notify the parent with max out
         //Notifying children, if this group has scaling dependencies
         if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
             for (ScalingDependentList scalingDependentList : scalingDependencies) {
@@ -489,10 +341,6 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         return groupScalingEnabled;
     }
 
-    public void setGroupScalingEnabled(boolean groupScalingEnabled) {
-        this.groupScalingEnabled = groupScalingEnabled;
-    }
-
     /**
      * Gets the parent instance context.
      *
@@ -531,7 +379,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
 
         String networkPartitionId = parentInstanceContext.getNetworkPartitionId();
         if (this.networkPartitionCtxts.containsKey(parentInstanceContext)) {
-            groupLevelNetworkPartitionContext = this.networkPartitionCtxts.
+            groupLevelNetworkPartitionContext = (GroupLevelNetworkPartitionContext) this.networkPartitionCtxts.
                     get(networkPartitionId);
         } else {
             if (policy != null) {
@@ -849,25 +697,11 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                 parentInstanceId, networkPartitionId, partitionId);
     }
 
-    public Map<String, GroupLevelNetworkPartitionContext> getNetworkPartitionCtxts() {
-        return networkPartitionCtxts;
-    }
-
-    public void setNetworkPartitionCtxts(Map<String, GroupLevelNetworkPartitionContext> networkPartitionCtxts) {
-        this.networkPartitionCtxts = networkPartitionCtxts;
-    }
-
-    public GroupLevelNetworkPartitionContext getNetworkPartitionContext(String networkPartitionId) {
-        return this.networkPartitionCtxts.get(networkPartitionId);
-    }
-
     public void addNetworkPartitionContext(GroupLevelNetworkPartitionContext clusterLevelNetworkPartitionContext) {
         this.networkPartitionCtxts.put(clusterLevelNetworkPartitionContext.getId(), clusterLevelNetworkPartitionContext);
     }
 
-    public void setDestroyed(boolean isDestroyed) {
-        this.isDestroyed = isDestroyed;
-    }
+
 
     public boolean verifyGroupStatus(String childId, String instanceId, GroupStatus requiredStatus) {
         Monitor monitor = this.getMonitor(childId);
@@ -891,20 +725,17 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
             if (childGroupInstance.getStatus() == requiredStatus) {
                 noOfInstancesOfRequiredStatus++;
             }
-        }
 
-        if (!groupInstances.isEmpty()) {
-            int minInstances = this.networkPartitionCtxts.get(networkPartitionId).
-                    getMinInstanceCount();
-            //if terminated all the instances in this instances map should be in terminated state
-            if (noOfInstancesOfRequiredStatus == this.inactiveInstancesMap.size() &&
-                    requiredStatus == GroupStatus.Terminated) {
-                return true;
-            } else if (noOfInstancesOfRequiredStatus >= minInstances) {
-                return true;
-            } else {
-                //of only one is inActive implies that the whole group is Inactive
-                if (requiredStatus == GroupStatus.Inactive && noOfInstancesOfRequiredStatus >= 1) {
+            if (!groupInstances.isEmpty()) {
+                GroupLevelNetworkPartitionContext networkPartitionContext =
+                        (GroupLevelNetworkPartitionContext) this.networkPartitionCtxts.
+                        get(networkPartitionId);
+                int minInstances = networkPartitionContext.getMinInstanceCount();
+                //if terminated all the instances in this instances map should be in terminated state
+                if (noOfInstancesOfRequiredStatus == this.inactiveInstancesMap.size() &&
+                        requiredStatus == GroupStatus.Terminated) {
+                    return true;
+                } else if (noOfInstancesOfRequiredStatus >= minInstances) {
                     return true;
                 }
             }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/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 37524d3..253aaf4 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
@@ -29,6 +29,9 @@ import org.apache.stratos.autoscaler.applications.dependency.DependencyBuilder;
 import org.apache.stratos.autoscaler.applications.dependency.DependencyTree;
 import org.apache.stratos.autoscaler.applications.dependency.context.ApplicationChildContext;
 import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
+import org.apache.stratos.autoscaler.context.InstanceContext;
+import org.apache.stratos.autoscaler.context.partition.network.ApplicationLevelNetworkPartitionContext;
+import org.apache.stratos.autoscaler.context.partition.network.NetworkPartitionContext;
 import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher;
 import org.apache.stratos.autoscaler.exception.application.DependencyBuilderException;
 import org.apache.stratos.autoscaler.exception.application.MonitorNotFoundException;
@@ -38,6 +41,9 @@ import org.apache.stratos.autoscaler.exception.policy.PolicyValidationException;
 import org.apache.stratos.autoscaler.monitor.Monitor;
 import org.apache.stratos.autoscaler.monitor.MonitorFactory;
 import org.apache.stratos.autoscaler.monitor.cluster.AbstractClusterMonitor;
+import org.apache.stratos.autoscaler.monitor.cluster.VMClusterMonitor;
+import org.apache.stratos.autoscaler.monitor.events.ScalingEvent;
+import org.apache.stratos.autoscaler.monitor.events.ScalingOverMaxEvent;
 import org.apache.stratos.autoscaler.util.ServiceReferenceHolder;
 import org.apache.stratos.common.threading.StratosThreadPool;
 import org.apache.stratos.messaging.domain.applications.GroupStatus;
@@ -47,22 +53,19 @@ import org.apache.stratos.messaging.domain.instance.ClusterInstance;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutorService;
+import java.util.*;
+import java.util.concurrent.*;
 
 /**
  * Monitor is to monitor it's child monitors and
  * control them according to the dependencies respectively.
  */
-public abstract class ParentComponentMonitor extends Monitor {
+public abstract class ParentComponentMonitor extends Monitor implements Runnable {
     private static final Log log = LogFactory.getLog(ParentComponentMonitor.class);
     private static final String IDENTIFIER = "Auto-Scaler";
     private static final int THREAD_POOL_SIZE = 10;
-
+    //Scheduler executor service to execute this monitor in a thread
+    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
     //The monitors dependency tree with all the start-able/kill-able dependencies
     protected DependencyTree startupDependencyTree;
     //The monitors dependency tree with all the scaling dependencies
@@ -75,8 +78,12 @@ public abstract class ParentComponentMonitor extends Monitor {
     protected Map<String, List<String>> inactiveInstancesMap;
     //terminating map, key=alias, value instanceIds
     protected Map<String, List<String>> terminatingInstancesMap;
+    //network partition contexts
+    protected Map<String, NetworkPartitionContext> networkPartitionCtxts;
     //Executor service to maintain the thread pool
     private ExecutorService executorService;
+    //Monitoring interval of the monitor
+    private int monitoringIntervalMilliseconds = 60000;     //TODO get this from config file
 
     public ParentComponentMonitor(ParentComponent component) throws DependencyBuilderException {
         aliasToActiveMonitorsMap = new ConcurrentHashMap<String, Monitor>();
@@ -93,6 +100,21 @@ public abstract class ParentComponentMonitor extends Monitor {
         }
         //Create the executor service with identifier and thread pool size
 	    executorService = StratosThreadPool.getExecutorService(IDENTIFIER, THREAD_POOL_SIZE);
+        networkPartitionCtxts = new HashMap<String, NetworkPartitionContext>();
+
+    }
+
+    /**
+     * This will monitor the network partition context with child notifications
+     */
+    public abstract void monitor();
+
+    public void startScheduler() {
+        scheduler.scheduleAtFixedRate(this, 0, monitoringIntervalMilliseconds, TimeUnit.MILLISECONDS);
+    }
+
+    protected void stopScheduler() {
+        scheduler.shutdownNow();
     }
 
     /**
@@ -232,11 +254,64 @@ public abstract class ParentComponentMonitor extends Monitor {
 
     }
 
-    /*protected String generateInstanceId(ParentComponent component) {
-        String instanceId = component.getUniqueIdentifier() + "_" +
-                (component.getInstanceContextCount() + 1);
-        return instanceId;
-    }*/
+    @Override
+    public void onChildScalingEvent(ScalingEvent scalingEvent) {
+        if (log.isDebugEnabled()) {
+            log.debug("Child scaling event received to [group]: " + this.getId()
+                    + ", [network partition]: " + scalingEvent.getNetworkPartitionId()
+                    + ", [event] " + scalingEvent.getId() + ", [group instance] " + scalingEvent.getInstanceId());
+        }
+
+        String networkPartitionId = scalingEvent.getNetworkPartitionId();
+        String instanceId = scalingEvent.getInstanceId();
+        String id = scalingEvent.getId();
+        NetworkPartitionContext networkPartitionContext =
+                this.networkPartitionCtxts.get(networkPartitionId);
+        if (networkPartitionContext != null) {
+            InstanceContext instanceContext = networkPartitionContext.
+                    getInstanceContext(instanceId);
+            if (instanceContext != null) {
+                if (instanceContext.containsScalingEvent(id)) {
+                    instanceContext.removeScalingEvent(id);
+                    instanceContext.addScalingEvent(scalingEvent);
+                } else {
+                    instanceContext.addScalingEvent(scalingEvent);
+                }
+            }
+        }
+
+
+    }
+
+    @Override
+    public void onChildScalingOverMaxEvent(ScalingOverMaxEvent scalingOverMaxEvent) {
+        //adding the scaling over max event to group instance Context
+        String networkPartitionId = scalingOverMaxEvent.getNetworkPartitionId();
+        String instanceId = scalingOverMaxEvent.getInstanceId();
+        String id = scalingOverMaxEvent.getId();
+        NetworkPartitionContext networkPartitionContext =
+                this.networkPartitionCtxts.get(networkPartitionId);
+        if (networkPartitionContext != null) {
+            InstanceContext instanceContext = networkPartitionContext.
+                    getInstanceContext(instanceId);
+            if (instanceContext != null) {
+                if (instanceContext.containsScalingEvent(id)) {
+                    instanceContext.removeScalingOverMaxEvent(id);
+                    instanceContext.addScalingOverMaxEvent(scalingOverMaxEvent);
+                } else {
+                    instanceContext.addScalingOverMaxEvent(scalingOverMaxEvent);
+                }
+            }
+        }
+        //calling monitor to go for group scaling or notify the parent
+        this.monitor();
+
+    }
+
+    public NetworkPartitionContext getNetworkPartitionContext(String networkPartitionId) {
+        return this.networkPartitionCtxts.get(networkPartitionId);
+    }
+
 
     /**
      * This will start the child monitors based on the active of siblings according to start up order
@@ -482,6 +557,59 @@ public abstract class ParentComponentMonitor extends Monitor {
         return parentsActive;
     }
 
+    protected void handleDependentScaling(InstanceContext instanceContext,
+                                          NetworkPartitionContext networkPartitionContext) {
+        /**
+         * Dependency scaling handling
+         * Finding out the highest scaling events within the scaling dependencies
+         */
+        List<ScalingEvent> highestScalingEventOfDependencies = new ArrayList<ScalingEvent>();
+        for (ScalingDependentList scalingDependentList : scalingDependencies) {
+            ScalingEvent highestFactorEvent = null;
+            for (String scalingDependentListComponent : scalingDependentList.
+                    getScalingDependentListComponents()) {
+                ScalingEvent scalingEvent = instanceContext.
+                        getScalingEvent(scalingDependentListComponent);
+                if (highestFactorEvent == null) {
+                    highestFactorEvent = scalingEvent;
+                } else {
+                    if (scalingEvent.getFactor() > highestFactorEvent.getFactor()) {
+                        highestFactorEvent = scalingEvent;
+                    }
+                }
+            }
+            highestScalingEventOfDependencies.add(highestFactorEvent);
+        }
+
+        for (ScalingEvent highestScalingEventOfChild : highestScalingEventOfDependencies) {
+            //find the child context of this group,
+            //Notifying children, if this group has scaling dependencies
+            if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
+                for (ScalingDependentList scalingDependentList : scalingDependencies) {
+                    if (scalingDependentList.getScalingDependentListComponents().
+                            contains(highestScalingEventOfChild.getId())) {
+                        for (String scalingDependentListComponent : scalingDependentList
+                                .getScalingDependentListComponents()) {
+                            Monitor monitor = aliasToActiveMonitorsMap.get(
+                                    scalingDependentListComponent);
+                            if (monitor instanceof GroupMonitor ||
+                                    monitor instanceof VMClusterMonitor) {
+                                ScalingEvent scalingEvent = new ScalingEvent(monitor.getId(),
+                                        networkPartitionContext.getId(),
+                                        instanceContext.getId(),
+                                        highestScalingEventOfChild.getFactor());
+                                monitor.onParentScalingEvent(scalingEvent);
+                            }
+                        }
+                    }
+                    break;
+                }
+            }
+        }
+        //Resetting the events
+        instanceContext.setIdToScalingEvent(new HashMap<String, ScalingEvent>());
+    }
+
     // move to inactive monitors list to use in the Terminated event
     protected synchronized void markInstanceAsInactive(String childId, String instanceId) {
         if (this.inactiveInstancesMap.containsKey(childId)) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
index 4a8ec87..5ad3b76 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
@@ -193,7 +193,9 @@ public class RuleTasksDelegator {
             VMClusterMonitor vmClusterMonitor = (VMClusterMonitor) AutoscalerContext.getInstance().getClusterMonitor(clusterId);
             VMClusterContext clusterContext = (VMClusterContext) vmClusterMonitor.getClusterContext();
             ClusterLevelNetworkPartitionContext  clusterLevelNetworkPartitionContext = clusterContext.getNetworkPartitionCtxt(nwPartitionId);
-            ClusterInstanceContext clusterInstanceContext = clusterLevelNetworkPartitionContext.getClusterInstanceContext(instanceId);
+            ClusterInstanceContext clusterInstanceContext =
+                    (ClusterInstanceContext) clusterLevelNetworkPartitionContext.
+                                getInstanceContext(instanceId);
             minimumCountOfNetworkPartition = clusterInstanceContext.getMinInstanceCount();
             
             
@@ -246,7 +248,9 @@ public class RuleTasksDelegator {
             VMClusterMonitor vmClusterMonitor = (VMClusterMonitor) AutoscalerContext.getInstance().getClusterMonitor(clusterId);
             VMClusterContext clusterContext = (VMClusterContext) vmClusterMonitor.getClusterContext();
             ClusterLevelNetworkPartitionContext  clusterLevelNetworkPartitionContext = clusterContext.getNetworkPartitionCtxt(nwPartitionId);
-            ClusterInstanceContext clusterInstanceContext = clusterLevelNetworkPartitionContext.getClusterInstanceContext(instanceId);
+            ClusterInstanceContext clusterInstanceContext =
+                    (ClusterInstanceContext) clusterLevelNetworkPartitionContext.
+                            getInstanceContext(instanceId);
             minimumCountOfNetworkPartition = clusterInstanceContext.getMinInstanceCount();
             
             if (vmClusterMonitor.getCluster().isKubernetesCluster()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
index 7c2063d..4888828 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
@@ -66,7 +66,9 @@ public class ClusterStatusActiveProcessor extends ClusterStatusProcessor {
         boolean clusterActive = false;
         for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext : monitor.getNetworkPartitionCtxts()) {
             //minimum check per partition
-            ClusterInstanceContext instanceContext = clusterLevelNetworkPartitionContext.getClusterInstanceContext(instanceId);
+            ClusterInstanceContext instanceContext =
+                    (ClusterInstanceContext) clusterLevelNetworkPartitionContext.
+                            getInstanceContext(instanceId);
             if (instanceContext != null) {
                 if (instanceContext.getActiveMembers() >= instanceContext.getMinInstanceCount()) {
                     clusterActive = true;

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java
index 852beb3..039aae6 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java
@@ -86,8 +86,9 @@ public class ClusterStatusInactiveProcessor extends ClusterStatusProcessor {
         boolean clusterInactive = false;
         for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext :
                 monitor.getAllNetworkPartitionCtxts().values()) {
-            ClusterInstanceContext instanceContext = clusterLevelNetworkPartitionContext.
-                    getClusterInstanceContext(instanceId);
+            ClusterInstanceContext instanceContext =
+                    (ClusterInstanceContext) clusterLevelNetworkPartitionContext.
+                    getInstanceContext(instanceId);
             if(instanceContext != null) {
                 if(instanceContext.getActiveMembers() < instanceContext.getMinInstanceCount()) {
                     clusterInactive = true;

http://git-wip-us.apache.org/repos/asf/stratos/blob/1c6642b4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java
index 1d0b82e..015d5b8 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java
@@ -121,9 +121,10 @@ public class ClusterStatusTerminatedProcessor extends ClusterStatusProcessor {
         for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext :
                 monitor.getAllNetworkPartitionCtxts().values()) {
             //minimum check per partition
-            if (clusterLevelNetworkPartitionContext.containsClusterInstanceContext(instanceId)) {
-                ClusterInstanceContext clusterInstanceContext = clusterLevelNetworkPartitionContext.
-                        getClusterInstanceContext(instanceId);
+            if (clusterLevelNetworkPartitionContext.containsInstanceContext(instanceId)) {
+                ClusterInstanceContext clusterInstanceContext =
+                        (ClusterInstanceContext) clusterLevelNetworkPartitionContext.
+                        getInstanceContext(instanceId);
                 if(clusterInstanceContext != null) {
                     for (ClusterLevelPartitionContext partitionContext :
                             clusterInstanceContext.getPartitionCtxts()) {