You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by la...@apache.org on 2013/12/11 14:48:04 UTC

[2/2] git commit: Autoscaler improvements with proper Scaling, lb cluster monitor etc.

Autoscaler improvements with proper Scaling, lb cluster monitor etc.


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

Branch: refs/heads/master
Commit: a39a1e1582e8b9841ae687213bcc7c76cece391b
Parents: 6d2d3eb
Author: Lahiru Sandaruwan <la...@apache.org>
Authored: Wed Dec 11 19:22:36 2013 +0530
Committer: Lahiru Sandaruwan <la...@apache.org>
Committed: Wed Dec 11 19:22:36 2013 +0530

----------------------------------------------------------------------
 .../stratos/autoscaler/AutoscalerContext.java   |  54 ++--
 .../stratos/autoscaler/ClusterContext.java      | 282 -------------------
 .../stratos/autoscaler/ClusterMonitor.java      | 181 ++++++++----
 .../stratos/autoscaler/LbClusterMonitor.java    | 206 ++++++++++++++
 .../stratos/autoscaler/MemberStatsContext.java  |  24 +-
 .../autoscaler/NetworkPartitionContext.java     | 218 +++++++++-----
 .../stratos/autoscaler/PartitionContext.java    |  51 +++-
 .../algorithm/AutoscaleAlgorithm.java           |   9 +-
 .../autoscaler/algorithm/OneAfterAnother.java   |  60 ++--
 .../PartitionGroupOneAfterAnother.java          | 164 -----------
 .../autoscaler/algorithm/RoundRobin.java        |  69 +++--
 .../autoscaler/api/AutoScalerServiceImpl.java   |   6 +-
 .../cloud/controller/CloudControllerClient.java |  13 +-
 .../deployment/policy/DeploymentPolicy.java     |   8 +-
 .../internal/AutoscalerServerComponent.java     |  11 +-
 .../health/HealthEventMessageDelegator.java     |  29 +-
 .../receiver/health/HealthEventQueue.java       |   2 +-
 .../autoscaler/partition/PartitionManager.java  | 117 ++++----
 .../partition/deployers/PartitionDeployer.java  |  10 +-
 .../policy/model/AutoscalePolicy.java           |   4 +-
 .../rule/AutoscalerRuleEvaluator.java           | 157 ++++++-----
 .../topology/AutoscalerTopologyReceiver.java    | 169 ++++++-----
 .../stratos/autoscaler/util/AutoscalerUtil.java | 154 ++++++++--
 23 files changed, 1035 insertions(+), 963 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/AutoscalerContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/AutoscalerContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/AutoscalerContext.java
index cd9d93c..5fae337 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/AutoscalerContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/AutoscalerContext.java
@@ -1,5 +1,8 @@
 package org.apache.stratos.autoscaler;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 import java.util.HashMap;
 import java.util.Map;
 
@@ -8,11 +11,18 @@ import java.util.Map;
  */
 public class AutoscalerContext {
     private static volatile AutoscalerContext instance;
-    Map<String, ClusterContext> clusterContextMap;
+//    Map<String, ClusterContext> clusterContextMap;
 
+    private static final Log log = LogFactory.getLog(AutoscalerContext.class);
     private AutoscalerContext() {
-        clusterContextMap = new HashMap<String, ClusterContext>();
+        try {
+            setMonitors(new HashMap<String, ClusterMonitor>());
+        } catch (Exception e) {
+            log.error("Rule evaluateMinCheck error", e);
+        }
     }
+    private Map<String, ClusterMonitor> monitors;
+    private Map<String, LbClusterMonitor> lbMonitors;
 
     public static AutoscalerContext getInstance() {
         if (instance == null) {
@@ -25,34 +35,32 @@ public class AutoscalerContext {
         return instance;
     }
 
-    /**
-     *
-     * @param clusterContext will be added to map
-     */
-    public void addClusterContext(ClusterContext clusterContext) {
-
-        clusterContextMap.put(clusterContext.getClusterId(), clusterContext);
+    public void addMonitor(ClusterMonitor monitor) {
+        monitors.put(monitor.getClusterId(), monitor);
     }
 
-    /**
-     * {@link ClusterContext} which carries clusterId will be removed from map
-     * @param clusterId
-     */
-    public void removeClusterContext(String clusterId){
+    public ClusterMonitor getMonitor(String clusterId) {
+        return monitors.get(clusterId);
+    }
 
-        clusterContextMap.remove(clusterId);
+    public ClusterMonitor removeMonitor(String clusterId) {
+        return monitors.remove(clusterId);
     }
-    
-    public boolean clusterExists(String clusterId){
-        return clusterContextMap.containsKey(clusterId);
+
+    public Map<String, ClusterMonitor> getMonitors() {
+        return monitors;
     }
 
-    public ClusterContext getClusterContext(String clusterId) {
 
-        return clusterContextMap.get(clusterId);
+    public void setMonitors(Map<String, ClusterMonitor> monitors) {
+        this.monitors = monitors;
+    }
+
+    public void setLbMonitors(Map<String, LbClusterMonitor> monitors) {
+        this.lbMonitors = monitors;
     }
 
-	public Map<String, ClusterContext> getClusterContexes() {
-		return clusterContextMap;
-	}
+    public void addLbMonitor(LbClusterMonitor monitor) {
+        lbMonitors.put(monitor.getClusterId(), monitor);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java
deleted file mode 100644
index b844ccc..0000000
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.stratos.autoscaler;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
-import org.apache.stratos.cloud.controller.deployment.partition.Partition;
-import org.drools.runtime.StatefulKnowledgeSession;
-import org.drools.runtime.rule.FactHandle;
-
-/**
- * Defines cluster context properties.
- */
-public class ClusterContext {
-
-    private String serviceId;
-
-    private String clusterId;
-
-    private float averageRequestsInFlight;
-
-    private float requestsInFlightSecondDerivative;
-
-    private float requestsInFlightGradient;
-    
-    private int memberCount;
-    
-    private StatefulKnowledgeSession ksession;
-    private FactHandle facthandle;
-
-    //This map will keep number of currently spawned instance count against partitionId
-    private Map<String, Integer> partitionCountMap;
-    
-    private List<Partition> partitionsOfThisCluster;
-
-    private int currentPartitionIndex;
-    private int currentPartitionGroupIndex;
-
-    private Properties properties;
-
-    private Map<String, MemberStatsContext> memberContextMap;
-    // Key- MemberId Value- partitionId
-    private Map<String, String> memberPartitionMap;
-    private DeploymentPolicy deploymentPolicy;
-
-    public ClusterContext(String clusterId, String serviceId, DeploymentPolicy deploymentPolicy, Partition[] partitions) {
-
-        this.clusterId = clusterId;
-        this.serviceId = serviceId;
-        this.setDeploymentPolicy(deploymentPolicy);
-        partitionsOfThisCluster = new ArrayList<Partition>();
-        memberContextMap = new HashMap<String, MemberStatsContext>();
-        setMemberPartitionMap(new HashMap<String, String>());
-        partitionCountMap = new HashMap<String, Integer>();
-        
-        for (Partition partition : partitions) {
-            partitionsOfThisCluster.add(partition);
-            this.addPartitionCount(partition.getId(), 0);
-        }
-        
-        memberCount = 0;
-    }
-
-    public String getClusterId() {
-
-        return clusterId;
-    }
-
-    public Properties getProperties() {
-
-        return properties;
-    }
-
-    public void setProperties(Properties properties) {
-
-        this.properties = properties;
-    }
-
-    public float getAverageRequestsInFlight() {
-        return averageRequestsInFlight;
-    }
-
-    public void setAverageRequestsInFlight(float averageRequestsInFlight) {
-
-        this.averageRequestsInFlight = averageRequestsInFlight;
-    }
-
-    public float getRequestsInFlightSecondDerivative() {
-
-        return requestsInFlightSecondDerivative;
-    }
-
-    public void setRequestsInFlightSecondDerivative(float requestsInFlightSecondDerivative) {
-
-        this.requestsInFlightSecondDerivative = requestsInFlightSecondDerivative;
-    }
-
-    public float getRequestsInFlightGradient() {
-
-        return requestsInFlightGradient;
-    }
-
-    public void setRequestsInFlightGradient(float requestsInFlightGradient) {
-
-        this.requestsInFlightGradient = requestsInFlightGradient;
-    }
-
-    /**
-     *
-     * @param memberContext will be added to map
-     */
-    public void addMemberContext(MemberStatsContext memberContext) {
-
-        memberContextMap.put(memberContext.getMemberId(), memberContext);
-    }
-
-    /**
-     * {@link MemberStatsContext} which carries memberId will be removed from map
-     * @param memberId
-     */
-    public void removeMemberContext(String memberId){
-
-        memberContextMap.remove(memberId);
-    }
-
-    public void increaseMemberCount(int count){
-        memberCount += count;
-
-    }
-    public void decreaseMemberCount(){
-        memberCount --;
-
-    }
-
-   public void increaseMemberCountInPartitionBy(String partitionId, int count){
-
-        partitionCountMap.put(partitionId, getMemberCount(partitionId) + count);
-    }
-
-    public void decreaseMemberCountInPartitionBy(String partitionId, int count){
-
-        partitionCountMap.put(partitionId, getMemberCount(partitionId) - count);
-    }
-
-    public void addPartitionCount(String partitionId, int count){    	
-        partitionCountMap.put(partitionId, count);
-    }
-
-    public void removePartitionCount(String partitionId){
-
-        partitionCountMap.remove(partitionId);
-    }
-
-    public boolean partitionCountExists(String partitionId){
-        return partitionCountMap.containsKey(partitionId);
-    }
-
-    public int getMemberCount(String partitionId){
-        if(partitionCountMap.containsKey(partitionId)) {
-            return partitionCountMap.get(partitionId);
-        }
-        return 0;
-    }
-
-    public void setMemberContextMap(Map<String, MemberStatsContext> memberContextMap) {
-
-        this.memberContextMap = memberContextMap;
-    }
-
-    public String getServiceId() {
-        return serviceId;
-    }
-
-    public int getCurrentPartitionIndex() {
-        return currentPartitionIndex;
-    }
-
-    public void setCurrentPartitionIndex(int currentPartitionIndex) {
-        this.currentPartitionIndex = currentPartitionIndex;
-    }
-
-    public int getMemberCount() {
-        return memberCount;
-    }
-
-    public void setMemberCount(int memberCount) {
-        this.memberCount = memberCount;
-    }
-    
-    public int getCurrentPartitionGroupIndex() {
-        return currentPartitionGroupIndex;
-    }
-
-    public void setCurrentPartitionGroupIndex(int currentPartitionGroupIndex) {
-        this.currentPartitionGroupIndex = currentPartitionGroupIndex;
-    }
-
-    public List<Partition> getAllPartitions() {
-        return partitionsOfThisCluster;
-    }
-
-    public void setPartitionsOfThisCluster(List<Partition> partitionsOfThisCluster) {
-        this.partitionsOfThisCluster = partitionsOfThisCluster;
-    }
-
-    public StatefulKnowledgeSession getKsession() {
-        return ksession;
-    }
-
-    public void setKsession(StatefulKnowledgeSession ksession) {
-        this.ksession = ksession;
-    }
-
-    public FactHandle getFacthandle() {
-        return facthandle;
-    }
-
-    public void setFacthandle(FactHandle facthandle) {
-        this.facthandle = facthandle;
-    }
-
-    public DeploymentPolicy getDeploymentPolicy() {
-        return deploymentPolicy;
-    }
-
-    public void setDeploymentPolicy(DeploymentPolicy deploymentPolicy) {
-        this.deploymentPolicy = deploymentPolicy;
-    }
-
-	/**
-	 * @return the memberPartitionMap
-	 */
-	public Map<String, String> getMemberPartitionMap() {
-		return memberPartitionMap;
-	}
-
-	/**
-	 * @param memberPartitionMap the memberPartitionMap to set
-	 */
-	public void setMemberPartitionMap(Map<String, String> memberPartitionMap) {
-		this.memberPartitionMap = memberPartitionMap;
-	}
-	
-	public void addMemberpartition(String memberId, String partitionId){
-		this.memberPartitionMap.put(memberId, partitionId);
-	}
-	
-	public String removeMemberPartition(String memberId){
-		return this.memberPartitionMap.remove(memberId);
-	}
-	
-	public String getPartitonOfMember(String memberId){
-		return this.memberPartitionMap.get(memberId);
-	}
-	
-	public boolean memberExist(String memberId){
-		return this.memberPartitionMap.containsKey(memberId);
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java
index 9e81c84..81a74e3 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java
@@ -18,41 +18,60 @@
  */
 package org.apache.stratos.autoscaler;
 
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
+import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
 import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
-import org.apache.stratos.cloud.controller.deployment.partition.Partition;
 import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.runtime.rule.FactHandle;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 /**
  * Is responsible for monitoring a service cluster. This runs periodically
  * and perform minimum instance check and scaling check using the underlying
  * rules engine.
- * @author nirmal
  *
  */
 public class ClusterMonitor implements Runnable{
 
     private static final Log log = LogFactory.getLog(ClusterMonitor.class);
     private String clusterId;
-    private ClusterContext clusterCtxt;
-    private List<MemberStatsContext> memberCtxt;
-    private Map<String, PartitionContext> partitionCtxts;
-    private StatefulKnowledgeSession ksession;
+
+    private String serviceId;
+
+    private Map<String, NetworkPartitionContext> networkPartitionCtxts;
+
+
+    private StatefulKnowledgeSession minCheckKnowledgeSession;
+    private StatefulKnowledgeSession scaleCheckKnowledgeSession;
     private boolean isDestroyed;
-    
-    private FactHandle facthandle;
-    
-    public ClusterMonitor(String clusterId, ClusterContext ctxt, StatefulKnowledgeSession ksession) {
+
+    private DeploymentPolicy deploymentPolicy;
+    private AutoscalePolicy autoscalePolicy;
+
+        // Key- MemberId Value- partitionId
+    private Map<String, String> memberPartitionMap;
+
+    private FactHandle minCheckFactHandle;
+    private FactHandle scaleCheckFactHandle;
+
+    private AutoscalerRuleEvaluator autoscalerRuleEvaluator;
+
+    public ClusterMonitor(String clusterId, String serviceId, DeploymentPolicy deploymentPolicy,
+                          AutoscalePolicy autoscalePolicy) {
         this.clusterId = clusterId;
-        this.clusterCtxt = ctxt;
-        this.ksession = ksession;
-        partitionCtxts = new ConcurrentHashMap<String, PartitionContext>();
+        this.serviceId = serviceId;
+
+        this.autoscalerRuleEvaluator = new AutoscalerRuleEvaluator();
+        this.scaleCheckKnowledgeSession = autoscalerRuleEvaluator.getScaleCheckStatefulSession();
+        this.minCheckKnowledgeSession = autoscalerRuleEvaluator.getMinCheckStatefulSession();
+
+        this.deploymentPolicy = deploymentPolicy;
+        this.deploymentPolicy = deploymentPolicy;
+        networkPartitionCtxts = new ConcurrentHashMap<String, NetworkPartitionContext>();
     }
 
     public String getClusterId() {
@@ -63,52 +82,44 @@ public class ClusterMonitor implements Runnable{
         this.clusterId = clusterId;
     }
 
-    public ClusterContext getClusterCtxt() {
-        return clusterCtxt;
+    public Map<String, NetworkPartitionContext> getNetworkPartitionCtxts() {
+        return networkPartitionCtxts;
     }
 
-    public void setClusterCtxt(ClusterContext clusterCtxt) {
-        this.clusterCtxt = clusterCtxt;
+    public NetworkPartitionContext getNetworkPartitionCtxt(String networkPartitionId) {
+        return networkPartitionCtxts.get(networkPartitionId);
     }
 
-    public List<MemberStatsContext> getMemberCtxt() {
-        return memberCtxt;
+    public void setPartitionCtxt(Map<String, NetworkPartitionContext> partitionCtxt) {
+        this.networkPartitionCtxts = partitionCtxt;
     }
 
-    public void setMemberCtxt(List<MemberStatsContext> memberCtxt) {
-        this.memberCtxt = memberCtxt;
+    public boolean partitionCtxtAvailable(String partitionId) {
+        return networkPartitionCtxts.containsKey(partitionId);
     }
 
-    public Map<String, PartitionContext> getPartitionCtxt() {
-        return partitionCtxts;
-    }
-
-    public void setPartitionCtxt(Map<String, PartitionContext> partitionCtxt) {
-        this.partitionCtxts = partitionCtxt;
-    }
-    
-    public void addPartitionCtxt(PartitionContext ctxt) {
-        this.partitionCtxts.put(ctxt.getPartitionId(), ctxt);
+    public void addNetworkPartitionCtxt(NetworkPartitionContext ctxt) {
+        this.networkPartitionCtxts.put(ctxt.getId(), ctxt);
     }
     
-    public PartitionContext getPartitionCtxt(String id) {
-        return this.partitionCtxts.get(id);
+    public NetworkPartitionContext getPartitionCtxt(String id) {
+        return this.networkPartitionCtxts.get(id);
     }
 
-    public StatefulKnowledgeSession getKsession() {
-        return ksession;
+    public StatefulKnowledgeSession getMinCheckKnowledgeSession() {
+        return minCheckKnowledgeSession;
     }
 
-    public void setKsession(StatefulKnowledgeSession ksession) {
-        this.ksession = ksession;
+    public void setMinCheckKnowledgeSession(StatefulKnowledgeSession minCheckKnowledgeSession) {
+        this.minCheckKnowledgeSession = minCheckKnowledgeSession;
     }
 
-    public FactHandle getFacthandle() {
-        return facthandle;
+    public FactHandle getMinCheckFactHandle() {
+        return minCheckFactHandle;
     }
 
-    public void setFacthandle(FactHandle facthandle) {
-        this.facthandle = facthandle;
+    public void setMinCheckFactHandle(FactHandle minCheckFactHandle) {
+        this.minCheckFactHandle = minCheckFactHandle;
     }
 
     @Override
@@ -119,11 +130,10 @@ public class ClusterMonitor implements Runnable{
                 log.debug("Cluster monitor is running..");
             }
             try {
-                minInstanceCountCheck();
+                monitor();
             } catch (Exception e) {
-                log.error("Cluster monitor: min instance count check failed.", e);
+                log.error("Cluster monitor: Monitor failed.", e);
             }
-            // TODO scale
             try {
                 // TODO make this configurable
                 Thread.sleep(30000);
@@ -132,26 +142,43 @@ public class ClusterMonitor implements Runnable{
         }
     }
     
-    private void minInstanceCountCheck() {
-        if(clusterCtxt != null ) {
-            ksession.setGlobal("clusterId", clusterId);
+    private void monitor() {
+//        if(clusterCtxt != null ) {
             //TODO make this concurrent
-            for (Partition partition : clusterCtxt.getAllPartitions()) {
-                String id = partition.getId();
-                PartitionContext ctxt = partitionCtxts.get(id);
-                if(ctxt == null) {
-                    ctxt = new PartitionContext(partition);
-                    partitionCtxts.put(id, ctxt);
+        for (NetworkPartitionContext networkPartitionContext : networkPartitionCtxts.values()) {
+
+            //minimum check per partition
+            for(PartitionContext partitionContext: networkPartitionContext.getPartitionCtxts().values()){
+
+                minCheckKnowledgeSession.setGlobal("clusterId", clusterId);
+
+                if (log.isDebugEnabled()) {
+                    log.debug(String.format("Running minimum check for partition %s ", partitionContext.getPartitionId()));
                 }
-                ctxt.setMinimumMemberCount(partition.getPartitionMin());
-                
-                facthandle = AutoscalerRuleEvaluator.evaluate(ksession, facthandle, ctxt);
+
+                minCheckFactHandle = AutoscalerRuleEvaluator.evaluateMinCheck(minCheckKnowledgeSession
+                        , minCheckFactHandle, partitionContext);
+
+            }
+
+            scaleCheckKnowledgeSession.setGlobal("clusterId", clusterId);
+            scaleCheckKnowledgeSession.setGlobal("deploymentPolicy", deploymentPolicy);
+            scaleCheckKnowledgeSession.setGlobal("autoscalePolicy", autoscalePolicy);
+
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Running scale check for network partition %s ", networkPartitionContext.getId()));
             }
+
+            scaleCheckFactHandle = AutoscalerRuleEvaluator.evaluateScaleCheck(scaleCheckKnowledgeSession
+                    , scaleCheckFactHandle, networkPartitionContext);
+
         }
     }
+
     
     public void destroy() {
-        ksession.dispose();
+        minCheckKnowledgeSession.dispose();
+        scaleCheckKnowledgeSession.dispose();
         setDestroyed(true);
         if(log.isDebugEnabled()) {
             log.debug("Cluster Monitor Drools session has been disposed.");
@@ -165,4 +192,36 @@ public class ClusterMonitor implements Runnable{
     public void setDestroyed(boolean isDestroyed) {
         this.isDestroyed = isDestroyed;
     }
+
+    public String getServiceId() {
+        return serviceId;
+    }
+
+    public void setServiceId(String serviceId) {
+        this.serviceId = serviceId;
+    }
+
+    public DeploymentPolicy getDeploymentPolicy() {
+        return deploymentPolicy;
+    }
+
+    public void setDeploymentPolicy(DeploymentPolicy deploymentPolicy) {
+        this.deploymentPolicy = deploymentPolicy;
+    }
+
+    public AutoscalePolicy getAutoscalePolicy() {
+        return autoscalePolicy;
+    }
+
+    public void setAutoscalePolicy(AutoscalePolicy autoscalePolicy) {
+        this.autoscalePolicy = autoscalePolicy;
+    }
+
+    public String getPartitonOfMember(String memberId){
+   		return this.memberPartitionMap.get(memberId);
+   	}
+
+   	public boolean memberExist(String memberId){
+   		return this.memberPartitionMap.containsKey(memberId);
+   	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/LbClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/LbClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/LbClusterMonitor.java
new file mode 100644
index 0000000..9e3b4a5
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/LbClusterMonitor.java
@@ -0,0 +1,206 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one 
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
+ * KIND, either express or implied.  See the License for the 
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.stratos.autoscaler;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
+import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
+import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.rule.FactHandle;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Is responsible for monitoring a service cluster. This runs periodically
+ * and perform minimum instance check and scaling check using the underlying
+ * rules engine.
+ *
+ */
+public class LbClusterMonitor implements Runnable{
+
+    private static final Log log = LogFactory.getLog(LbClusterMonitor.class);
+    private String clusterId;
+    private String serviceId;
+
+    private Map<String, NetworkPartitionContext> networkPartitionCtxts;
+
+    private StatefulKnowledgeSession minCheckKnowledgeSession;
+    private StatefulKnowledgeSession scaleCheckKnowledgeSession;
+    private boolean isDestroyed;
+
+    private DeploymentPolicy deploymentPolicy;
+    private AutoscalePolicy autoscalePolicy;
+
+        // Key- MemberId Value- partitionId
+    private Map<String, String> memberPartitionMap;
+
+    private FactHandle minCheckFactHandle;
+    private FactHandle scaleCheckFactHandle;
+
+    private AutoscalerRuleEvaluator autoscalerRuleEvaluator;
+
+    public LbClusterMonitor(String clusterId, String serviceId, DeploymentPolicy deploymentPolicy,
+                            AutoscalePolicy autoscalePolicy) {
+        this.clusterId = clusterId;
+        this.serviceId = serviceId;
+
+        this.autoscalerRuleEvaluator = new AutoscalerRuleEvaluator();
+        this.scaleCheckKnowledgeSession = autoscalerRuleEvaluator.getScaleCheckStatefulSession();
+        this.minCheckKnowledgeSession = autoscalerRuleEvaluator.getMinCheckStatefulSession();
+
+        this.deploymentPolicy = deploymentPolicy;
+        this.deploymentPolicy = deploymentPolicy;
+        networkPartitionCtxts = new ConcurrentHashMap<String, NetworkPartitionContext>();
+    }
+
+    public String getClusterId() {
+        return clusterId;
+    }
+
+    public void setClusterId(String clusterId) {
+        this.clusterId = clusterId;
+    }
+
+    public Map<String, NetworkPartitionContext> getNetworkPartitionCtxts() {
+        return networkPartitionCtxts;
+    }
+
+    public NetworkPartitionContext getNetworkPartitionCtxt(String networkPartitionId) {
+        return networkPartitionCtxts.get(networkPartitionId);
+    }
+
+    public void setPartitionCtxt(Map<String, NetworkPartitionContext> partitionCtxt) {
+        this.networkPartitionCtxts = partitionCtxt;
+    }
+
+    public boolean partitionCtxtAvailable(String partitionId) {
+        return networkPartitionCtxts.containsKey(partitionId);
+    }
+
+    public void addNetworkPartitionCtxt(NetworkPartitionContext ctxt) {
+        this.networkPartitionCtxts.put(ctxt.getId(), ctxt);
+    }
+    
+    public NetworkPartitionContext getPartitionCtxt(String id) {
+        return this.networkPartitionCtxts.get(id);
+    }
+
+    public StatefulKnowledgeSession getMinCheckKnowledgeSession() {
+        return minCheckKnowledgeSession;
+    }
+
+    public void setMinCheckKnowledgeSession(StatefulKnowledgeSession minCheckKnowledgeSession) {
+        this.minCheckKnowledgeSession = minCheckKnowledgeSession;
+    }
+
+    public FactHandle getMinCheckFactHandle() {
+        return minCheckFactHandle;
+    }
+
+    public void setMinCheckFactHandle(FactHandle minCheckFactHandle) {
+        this.minCheckFactHandle = minCheckFactHandle;
+    }
+
+    @Override
+    public void run() {
+
+        while (!isDestroyed()) {
+            if (log.isDebugEnabled()) {
+                log.debug("Cluster monitor is running..");
+            }
+            try {
+                monitor();
+            } catch (Exception e) {
+                log.error("Cluster monitor: Monitor failed.", e);
+            }
+            try {
+                // TODO make this configurable
+                Thread.sleep(30000);
+            } catch (InterruptedException ignore) {
+            }
+        }
+    }
+    
+    private void monitor() {
+//        if(clusterCtxt != null ) {
+            //TODO make this concurrent
+        for (NetworkPartitionContext networkPartitionContext : networkPartitionCtxts.values()) {
+
+                minCheckKnowledgeSession.setGlobal("clusterId", clusterId);
+                log.info("partition " + networkPartitionContext.getId());
+                minCheckFactHandle = AutoscalerRuleEvaluator.evaluateMinCheck(minCheckKnowledgeSession
+                        , minCheckFactHandle, networkPartitionContext);
+
+
+        }
+    }
+
+    
+    public void destroy() {
+        minCheckKnowledgeSession.dispose();
+        scaleCheckKnowledgeSession.dispose();
+        setDestroyed(true);
+        if(log.isDebugEnabled()) {
+            log.debug("Cluster Monitor Drools session has been disposed.");
+        }
+    }
+
+    public boolean isDestroyed() {
+        return isDestroyed;
+    }
+
+    public void setDestroyed(boolean isDestroyed) {
+        this.isDestroyed = isDestroyed;
+    }
+
+    public String getServiceId() {
+        return serviceId;
+    }
+
+    public void setServiceId(String serviceId) {
+        this.serviceId = serviceId;
+    }
+
+    public DeploymentPolicy getDeploymentPolicy() {
+        return deploymentPolicy;
+    }
+
+    public void setDeploymentPolicy(DeploymentPolicy deploymentPolicy) {
+        this.deploymentPolicy = deploymentPolicy;
+    }
+
+    public AutoscalePolicy getAutoscalePolicy() {
+        return autoscalePolicy;
+    }
+
+    public void setAutoscalePolicy(AutoscalePolicy autoscalePolicy) {
+        this.autoscalePolicy = autoscalePolicy;
+    }
+
+    public String getPartitonOfMember(String memberId){
+   		return this.memberPartitionMap.get(memberId);
+   	}
+
+   	public boolean memberExist(String memberId){
+   		return this.memberPartitionMap.containsKey(memberId);
+   	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/MemberStatsContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/MemberStatsContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/MemberStatsContext.java
index da85cee..98b75dd 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/MemberStatsContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/MemberStatsContext.java
@@ -19,13 +19,16 @@
 
 package org.apache.stratos.autoscaler;
 
+import org.apache.stratos.autoscaler.policy.model.LoadAverage;
+import org.apache.stratos.autoscaler.policy.model.MemoryConsumption;
+
 /**
  * This class will keep additional parameters such as load average and memory consumption
  */
 
 public class MemberStatsContext {
-    private float loadAverage;
-    private float memoryConsumption;
+    private LoadAverage loadAverage;
+    private MemoryConsumption memoryConsumption;
     private String memberId;
 
     public MemberStatsContext(String memberId){
@@ -40,19 +43,20 @@ public class MemberStatsContext {
         this.memberId = memberId;
     }
 
-    public float getMemoryConsumption() {
-        return memoryConsumption;
+
+    public LoadAverage getLoadAverage() {
+        return loadAverage;
     }
 
-    public void setMemoryConsumption(float memoryConsumption) {
-        this.memoryConsumption = memoryConsumption;
+    public void setLoadAverage(LoadAverage loadAverage) {
+        this.loadAverage = loadAverage;
     }
 
-    public float getLoadAverage() {
-        return loadAverage;
+    public MemoryConsumption getMemoryConsumption() {
+        return memoryConsumption;
     }
 
-    public void setLoadAverage(float loadAverage) {
-        this.loadAverage = loadAverage;
+    public void setMemoryConsumption(MemoryConsumption memoryConsumption) {
+        this.memoryConsumption = memoryConsumption;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java
index 964168e..18a0715 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java
@@ -6,9 +6,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License. You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -28,10 +28,6 @@ import java.util.*;
 public class NetworkPartitionContext {
 
     private String id;
-    
-    private String provider;
-
-    private String region;
 
     private String defaultLbClusterId;
 
@@ -39,65 +35,27 @@ public class NetworkPartitionContext {
 
     private Map<String, String> clusterIdToLBClusterIdMap;
 
-    public NetworkPartitionContext(final String provider, final String region) {
-
-        super();
-        this.provider = provider;
-        this.region = region;
-        this.setServiceToLBClusterId(new HashMap<String, String>());
-        this.setClusterIdToLBClusterIdMap(new HashMap<String, String>());
-
-    }
-
-    public boolean isLBExist(final String clusterId) {
-
-        return clusterId != null &&
-               (clusterId.equals(this.defaultLbClusterId) ||
-                this.serviceNameToLBClusterIdMap.containsValue(clusterId) || this.clusterIdToLBClusterIdMap.containsValue(clusterId));
-
-    }
-    
-    public boolean isDefaultLBExist() {
-
-        return defaultLbClusterId != null;
-
-    }
-    
-    public boolean isServiceLBExist(String serviceName) {
-
-        return this.serviceNameToLBClusterIdMap.containsKey(serviceName) && 
-                this.serviceNameToLBClusterIdMap.get(serviceName) != null;
-
-    }
-    
-    public boolean isClusterLBExist(String clusterId) {
+    private String partitionAlgorithm;
 
-        return this.clusterIdToLBClusterIdMap.containsKey(clusterId) &&
-                this.clusterIdToLBClusterIdMap.get(clusterId) != null;
 
-    }
+    //Following information will keep events details
+    private float averageRequestsInFlight;
+    private float requestsInFlightSecondDerivative;
+    private float requestsInFlightGradient;
 
-    public String getProvider() {
+    //details required for partition selection algorithms
+    private int currentPartitionIndex;
+    private Map<String, Integer> partitionCountMap;
 
-        return this.provider;
+    //partitions of this network partition
+    private Map<String, PartitionContext> partitionCtxts;
 
-    }
+    public NetworkPartitionContext(String id) {
 
-    public void setProvider(final String provider) {
-
-        this.provider = provider;
-
-    }
-
-    public String getRegion() {
-
-        return this.region;
-
-    }
-
-    public void setRegion(final String region) {
-
-        this.region = region;
+        super();
+        this.id = id;
+        this.setServiceToLBClusterId(new HashMap<String, String>());
+        this.setClusterIdToLBClusterIdMap(new HashMap<String, String>());
 
     }
 
@@ -149,20 +107,40 @@ public class NetworkPartitionContext {
 
     }
 
-    public String getId() {
-        return id;
+
+    public boolean isLBExist(final String clusterId) {
+
+        return clusterId != null &&
+               (clusterId.equals(this.defaultLbClusterId) ||
+                this.serviceNameToLBClusterIdMap.containsValue(clusterId) || this.clusterIdToLBClusterIdMap.containsValue(clusterId));
+
     }
 
-    public void setId(String id) {
-        this.id = id;
+    public boolean isDefaultLBExist() {
+
+        return defaultLbClusterId != null;
+
+    }
+
+    public boolean isServiceLBExist(String serviceName) {
+
+        return this.serviceNameToLBClusterIdMap.containsKey(serviceName) &&
+                this.serviceNameToLBClusterIdMap.get(serviceName) != null;
+
+    }
+
+    public boolean isClusterLBExist(String clusterId) {
+
+        return this.clusterIdToLBClusterIdMap.containsKey(clusterId) &&
+                this.clusterIdToLBClusterIdMap.get(clusterId) != null;
+
     }
 
     public int hashCode() {
 
         final int prime = 31;
         int result = 1;
-        result = 31 * result + ((this.provider == null) ? 0 : this.provider.hashCode());
-        result = 31 * result + ((this.region == null) ? 0 : this.region.hashCode());
+        result = 31 * result + ((this.id == null) ? 0 : this.id.hashCode());
         return result;
 
     }
@@ -179,23 +157,111 @@ public class NetworkPartitionContext {
             return false;
         }
         final NetworkPartitionContext other = (NetworkPartitionContext) obj;
-        if (this.provider == null) {
-            if (other.provider != null) {
-                return false;
-            }
-        }
-        else if (!this.provider.equals(other.provider)) {
-            return false;
-        }
-        if (this.region == null) {
-            if (other.region != null) {
+        if (this.id == null) {
+            if (other.id != null) {
                 return false;
             }
         }
-        else if (!this.region.equals(other.region)) {
+        else if (!this.id.equals(other.id)) {
             return false;
         }
         return true;
     }
 
+
+
+    public int getCurrentPartitionIndex() {
+        return currentPartitionIndex;
+    }
+
+    public void setCurrentPartitionIndex(int currentPartitionIndex) {
+        this.currentPartitionIndex = currentPartitionIndex;
+    }
+
+    public float getAverageRequestsInFlight() {
+        return averageRequestsInFlight;
+    }
+
+    public void setAverageRequestsInFlight(float averageRequestsInFlight) {
+        this.averageRequestsInFlight = averageRequestsInFlight;
+    }
+
+    public float getRequestsInFlightSecondDerivative() {
+        return requestsInFlightSecondDerivative;
+    }
+
+    public void setRequestsInFlightSecondDerivative(float requestsInFlightSecondDerivative) {
+        this.requestsInFlightSecondDerivative = requestsInFlightSecondDerivative;
+    }
+
+    public float getRequestsInFlightGradient() {
+        return requestsInFlightGradient;
+    }
+
+    public void setRequestsInFlightGradient(float requestsInFlightGradient) {
+        this.requestsInFlightGradient = requestsInFlightGradient;
+    }
+
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public void increaseMemberCountInPartitionBy(String partitionId, int count){
+
+         partitionCountMap.put(partitionId, getMemberCount(partitionId) + count);
+     }
+
+     public void decreaseMemberCountInPartitionBy(String partitionId, int count){
+
+         partitionCountMap.put(partitionId, getMemberCount(partitionId) - count);
+     }
+
+     public void addPartitionCount(String partitionId, int count){
+         partitionCountMap.put(partitionId, count);
+     }
+
+     public void removePartitionCount(String partitionId){
+
+         partitionCountMap.remove(partitionId);
+     }
+
+     public boolean partitionCountExists(String partitionId){
+         return partitionCountMap.containsKey(partitionId);
+     }
+
+     public int getMemberCount(String partitionId){
+         if(partitionCountMap.containsKey(partitionId)) {
+             return partitionCountMap.get(partitionId);
+         }
+         return 0;
+     }
+
+    public Map<String, PartitionContext> getPartitionCtxts() {
+        return partitionCtxts;
+    }
+
+    public PartitionContext getPartitionCtxt(String partitionId) {
+        return partitionCtxts.get(partitionId);
+    }
+
+    public void setPartitionCtxts(Map<String, PartitionContext> partitionCtxts) {
+        this.partitionCtxts = partitionCtxts;
+    }
+
+    public void addPartitionContext(PartitionContext partitionContext) {
+        partitionCtxts.put(partitionContext.getPartitionId(), partitionContext);
+    }
+
+    public String getPartitionAlgorithm() {
+        return partitionAlgorithm;
+    }
+
+    public void setPartitionAlgorithm(String partitionAlgorithm) {
+        this.partitionAlgorithm = partitionAlgorithm;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java
index 10cd652..1980f08 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java
@@ -18,16 +18,18 @@
  */
 package org.apache.stratos.autoscaler;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.deployment.partition.Partition;
 import org.apache.stratos.cloud.controller.pojo.MemberContext;
 
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
 
 /**
  * This is an object that inserted to the rules engine.
@@ -35,10 +37,12 @@ import org.apache.stratos.cloud.controller.pojo.MemberContext;
  * @author nirmal
  *
  */
+
 public class PartitionContext {
 
     private static final Log log = LogFactory.getLog(PartitionContext.class);
     private String partitionId;
+    private String networkPartitionId;
     private Partition partition;
     private int currentMemberCount = 0;
     private int minimumMemberCount = 0;
@@ -55,6 +59,8 @@ public class PartitionContext {
     
     // active members
     private List<MemberContext> activeMembers;
+
+    private Map<String, MemberStatsContext> memberStatsContexts;
     
     public PartitionContext(Partition partition) {
         this.setPartition(partition);
@@ -63,6 +69,7 @@ public class PartitionContext {
         this.activeMembers = new ArrayList<MemberContext>();
         this.obsoletedMembers = new CopyOnWriteArrayList<String>(); 
         this.faultyMembers = new CopyOnWriteArrayList<String>();
+        memberStatsContexts = new ConcurrentHashMap<String, MemberStatsContext>();
         Thread th = new Thread(new PendingMemberWatcher(this));
         th.start();
     }
@@ -193,6 +200,40 @@ public class PartitionContext {
         this.obsoletedMembers = obsoletedMembers;
     }
 
+    public String getNetworkPartitionId() {
+        return networkPartitionId;
+    }
+
+    public void setNetworkPartitionId(String networkPartitionId) {
+        this.networkPartitionId = networkPartitionId;
+    }
+
+    
+    public Map<String, MemberStatsContext> getMemberStatsContexts() {
+        return memberStatsContexts;
+    }
+
+    public MemberStatsContext getMemberStatsContext(String memberId) {
+        return memberStatsContexts.get(networkPartitionId);
+    }
+
+    public void addMemberStatsContext(MemberStatsContext ctxt) {
+        this.memberStatsContexts.put(ctxt.getMemberId(), ctxt);
+    }
+
+    public void removeMemberStatsContext(String memberId) {
+        this.memberStatsContexts.remove(memberId);
+    }
+
+    public MemberStatsContext getPartitionCtxt(String id) {
+        return this.memberStatsContexts.get(id);
+    }
+
+//    public boolean memberExist(String memberId) {
+//        return memberStatsContexts.containsKey(memberId);
+//    }
+
+
     private class PendingMemberWatcher implements Runnable {
         private PartitionContext ctxt;
 

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java
index 8f003aa..58a3ff6 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java
@@ -19,6 +19,7 @@
 
 package org.apache.stratos.autoscaler.algorithm;
 
+import org.apache.stratos.autoscaler.NetworkPartitionContext;
 import org.apache.stratos.autoscaler.partition.PartitionGroup;
 import org.apache.stratos.cloud.controller.deployment.partition.Partition;
 
@@ -45,18 +46,18 @@ public interface AutoscaleAlgorithm {
 
     /**
      * Returns a {@link Partition} to scale up from the given {@link PartitionGroup} according to algorithm
-     * @param partitionGroup {@link PartitionGroup} which need the {@link Partition}
+     * @param networkPartitionContext {@link org.apache.stratos.autoscaler.NetworkPartitionContext} which need the {@link Partition}
      * @param clusterId Id of the cluster which need the {@link Partition}
      * @return {@link Partition} to scale up
      */
-    public Partition getNextScaleUpPartition(PartitionGroup partitionGroup, String clusterId);
+    public Partition getNextScaleUpPartition(NetworkPartitionContext networkPartitionContext, String clusterId);
 
 
     /**
      * Returns a {@link Partition} to scale down from the given {@link PartitionGroup} according to algorithm
-     * @param partitionGroup {@link PartitionGroup} which need the {@link Partition}
+     * @param networkPartitionContext {@link org.apache.stratos.autoscaler.NetworkPartitionContext} which need the {@link Partition}
      * @param clusterId Id of the cluster which need the {@link Partition}
      * @return {@link Partition} to scale down
      */
-    public Partition getNextScaleDownPartition(PartitionGroup partitionGroup, String clusterId);
+    public Partition getNextScaleDownPartition(NetworkPartitionContext networkPartitionContext, String clusterId);
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java
index ae01360..7b0dce3 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java
@@ -19,22 +19,22 @@
 
 package org.apache.stratos.autoscaler.algorithm;
 
-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.AutoscalerContext;
-import org.apache.stratos.autoscaler.ClusterContext;
-import org.apache.stratos.autoscaler.partition.PartitionGroup;
+import org.apache.stratos.autoscaler.NetworkPartitionContext;
 import org.apache.stratos.cloud.controller.deployment.partition.Partition;
 
+import java.util.Arrays;
 import java.util.List;
 
+//import org.apache.stratos.autoscaler.partition.networkPartitionContext;
+
 /**
  *
  */
 /**
 * This class is used for selecting a {@link Partition} one after another and checking availability of
- * partitions of a {@link PartitionGroup}
+ * partitions of a {@link NetworkPartitionContext}
  * One after another means it completes partitions in the order defined in
  * {@link org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy}, and go to next  if current one
  * reached the max limit
@@ -44,27 +44,26 @@ public class OneAfterAnother implements AutoscaleAlgorithm {
 	
 	private static final Log log = LogFactory.getLog(OneAfterAnother.class);
 
-    public Partition getNextScaleUpPartition(PartitionGroup partitionGroup, String clusterId) {
-    	
-    	ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);
-    	int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
-    	List<?> partitions = Arrays.asList(partitionGroup.getPartitions());
-    	int noOfPartitions = partitions.size();    	
+    public Partition getNextScaleUpPartition(NetworkPartitionContext networkPartitionContext, String clusterId) {
+
+    	int currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex();
+    	List<?> partitionContexts = Arrays.asList(networkPartitionContext.getPartitionCtxts());
+    	int noOfPartitions = partitionContexts.size();
     	
     	for(int i=currentPartitionIndex; i< noOfPartitions; i++)
     	{
-            if (partitions.get(currentPartitionIndex) instanceof Partition) {
-                currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
-                Partition currentPartition = (Partition) partitions.get(currentPartitionIndex);
+            if (partitionContexts.get(currentPartitionIndex) instanceof Partition) {
+                currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex();
+                Partition currentPartition = (Partition) partitionContexts.get(currentPartitionIndex);
                 String currentPartitionId = currentPartition.getId();
 
-                if (clusterContext.partitionCountExists(currentPartitionId)) {
-                    clusterContext.addPartitionCount(currentPartitionId, 0);
+                if (networkPartitionContext.partitionCountExists(currentPartitionId)) {
+                    networkPartitionContext.addPartitionCount(currentPartitionId, 0);
                 }
 
-                if (clusterContext.getMemberCount(currentPartitionId) < currentPartition.getPartitionMax()) {
+                if (networkPartitionContext.getMemberCount(currentPartitionId) < currentPartition.getPartitionMax()) {
                     // current partition is free
-                    clusterContext.increaseMemberCountInPartitionBy(currentPartitionId, 1);
+                    networkPartitionContext.increaseMemberCountInPartitionBy(currentPartitionId, 1);
                     if (log.isDebugEnabled())
                         log.debug("Free space found in partition " + currentPartition.getId());
 
@@ -77,34 +76,33 @@ public class OneAfterAnother implements AutoscaleAlgorithm {
                         return null;
                     }
 
-                    clusterContext.setCurrentPartitionIndex(currentPartitionIndex + 1);
+                    networkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex + 1);
                 }
             }
     	}
     	
     	if(log.isDebugEnabled())
-    		log.debug("No free partition found at partition group" + partitionGroup);
+    		log.debug("No free partition found at network partition " + networkPartitionContext);
     	
     	return null;
     }
 
-    public Partition getNextScaleDownPartition(PartitionGroup partitionGroup, String clusterId) {
+    public Partition getNextScaleDownPartition(NetworkPartitionContext networkPartitionContext, String clusterId) {
 
-    	ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);
-    	int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
-    	List<?> partitions = Arrays.asList(partitionGroup.getPartitions());
+    	int currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex();
+    	List<?> partitionContexts = Arrays.asList(networkPartitionContext.getPartitionCtxts());
     	
     	for(int i = currentPartitionIndex; i >= 0; i--)
     	{
-            if (partitions.get(currentPartitionIndex) instanceof Partition) {
-                currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
-                Partition currentPartition = (Partition) partitions.get(currentPartitionIndex);
+            if (partitionContexts.get(currentPartitionIndex) instanceof Partition) {
+                currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex();
+                Partition currentPartition = (Partition) partitionContexts.get(currentPartitionIndex);
                 String currentPartitionId = currentPartition.getId();
 
                 // has more than minimum instances.
-                if (clusterContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMin()) {
+                if (networkPartitionContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMin()) {
                     // current partition is free
-                    clusterContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1);
+                    networkPartitionContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1);
                     if (log.isDebugEnabled())
                         log.debug("A free space found for scale down in partition" +
                                   currentPartition.getId());
@@ -117,13 +115,13 @@ public class OneAfterAnother implements AutoscaleAlgorithm {
                     }
                     // Set next partition as current partition in Autoscaler Context
                     currentPartitionIndex = currentPartitionIndex - 1;
-                    clusterContext.setCurrentPartitionIndex(currentPartitionIndex);
+                    networkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex);
                 }
             }
 	        
     	}
     	if(log.isDebugEnabled())
-    		log.debug("No space found in this partition group " + partitionGroup.getId());
+    		log.debug("No space found in this network partition " + networkPartitionContext.getId());
     	return null;
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java
deleted file mode 100644
index 91e7e38..0000000
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-
-package org.apache.stratos.autoscaler.algorithm;
-
-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.AutoscalerContext;
-import org.apache.stratos.autoscaler.ClusterContext;
-import org.apache.stratos.autoscaler.partition.PartitionGroup;
-import org.apache.stratos.autoscaler.policy.PolicyManager;
-import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
-import org.apache.stratos.cloud.controller.deployment.partition.Partition;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
-
-import java.util.List;
-
-/**
- * Completes {@link PartitionGroup} in the order defined in  * {@link org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy}, and go to next  if current one
-  * reached the max limit policy, go to next if current one reached the max limit
- */
-public class PartitionGroupOneAfterAnother implements AutoscaleAlgorithm {
-
-	private static final Log log = LogFactory.getLog(PartitionGroupOneAfterAnother.class);
-	
-    public Partition getNextScaleUpPartition(String clusterId) {
-    	
-    	ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);    	            	       
-        String serviceId = AutoscalerContext.getInstance().getClusterContext(clusterId).getServiceId();
-        
-    	//Find relevant policyId using topology
-    	String policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getDeploymentPolicyName();
-    	    	
-    	List<?> partitionGroups = Arrays.asList(PolicyManager.getInstance().getDeploymentPolicy(policyId).getPartitionGroups());  	    	    
-    	int currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();  
-    	
-    	for(int i= currentPartitionGroupIndex; i< partitionGroups.size(); i++)
-    	{
-            if (partitionGroups.get(currentPartitionGroupIndex) instanceof PartitionGroup) {
-                currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();
-                PartitionGroup currentPartitionGroup =
-                                                       (PartitionGroup) partitionGroups.get(currentPartitionGroupIndex);
-                String alogirthm = currentPartitionGroup.getPartitionAlgo();
-
-                if (log.isDebugEnabled())
-                    log.debug("Trying current partition group " + currentPartitionGroup.getId());
-                // search withing the partition group
-                Partition partition =
-                                      AutoscalerRuleEvaluator.getInstance()
-                                                             .getAutoscaleAlgorithm(alogirthm)
-                                                             .getNextScaleUpPartition(currentPartitionGroup,
-                                                                                      clusterId);
-
-                if (partition != null) {
-                    if (log.isDebugEnabled())
-                        log.debug("No partition found in partition group" +
-                                  currentPartitionGroup.getId());
-                    return partition;
-                } else {
-                    clusterContext.setCurrentPartitionIndex(0);
-                    // last partition group has reached
-                    if (currentPartitionGroupIndex == partitionGroups.size() - 1) {
-                        if (log.isDebugEnabled())
-                            log.debug("First partition group has reached wihtout space ");
-                        return null;
-                    }
-                    // current partition group is filled
-                    clusterContext.setCurrentPartitionGroupIndex(currentPartitionGroupIndex + 1);
-                }
-            }
-    	}
-    	
-    	return null;
-    }
-
-    public Partition getNextScaleDownPartition(String clusterId) {
-    	ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);    	            	       
-        String serviceId = AutoscalerContext.getInstance().getClusterContext(clusterId).getServiceId();
-        
-    	//Find relevant policyId using topology
-    	String policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getDeploymentPolicyName();
-    	int currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();
-    	
-    	List<?> partitionGroups = Arrays.asList(PolicyManager.getInstance().getDeploymentPolicy(policyId).getPartitionGroups());  	    	    
-    	
-    	for(int i = currentPartitionGroupIndex; i >= 0; i--)
-    	{
-            if (partitionGroups.get(currentPartitionGroupIndex) instanceof PartitionGroup) {
-                currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();
-                PartitionGroup currentPartitionGroup =
-                                                       (PartitionGroup) partitionGroups.get(currentPartitionGroupIndex);
-                String alogirthm = currentPartitionGroup.getPartitionAlgo();
-                if (log.isDebugEnabled())
-                    log.debug("Trying scale down in partition group " +
-                              currentPartitionGroup.getId());
-                // search within the partition group
-                Partition partition =
-                                      AutoscalerRuleEvaluator.getInstance()
-                                                             .getAutoscaleAlgorithm(alogirthm)
-                                                             .getNextScaleDownPartition(currentPartitionGroup,
-                                                                                        clusterId);
-
-                if (partition != null) {
-                    if (log.isDebugEnabled())
-                        log.debug("No free partition in partition group" +
-                                  currentPartitionGroup.getId());
-                    return partition;
-                } else {
-                    clusterContext.setCurrentPartitionIndex(0);
-                    // first partition group has reached. None of the partitions group has less than
-                    // minimum instance count.
-                    if (currentPartitionGroupIndex == 0)
-                        return null;
-
-                    // current partition group has no extra instances
-                    clusterContext.setCurrentPartitionGroupIndex(currentPartitionGroupIndex - 1);
-                }
-            }
-    	}
-    	// none of the partitions groups are free.
-    	return null;
-    }
-    
-    @Override
-    public boolean scaleUpPartitionAvailable(String clusterId) {
-        return false;  //To change body of implemented methods use File | Settings | File Templates.
-    }
-
-    @Override
-    public boolean scaleDownPartitionAvailable(String clusterId) {
-        return false;  //To change body of implemented methods use File | Settings | File Templates.
-    }
-
-	@Override
-	public Partition getNextScaleUpPartition(PartitionGroup partitionGroup,
-			String clusterId) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Partition getNextScaleDownPartition(PartitionGroup partitionGroup,
-			String clusterId) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java
index 01b63fc..9597c74 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java
@@ -22,48 +22,46 @@ package org.apache.stratos.autoscaler.algorithm;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.AutoscalerContext;
-import org.apache.stratos.autoscaler.ClusterContext;
-import org.apache.stratos.autoscaler.partition.PartitionGroup;
+import org.apache.stratos.autoscaler.NetworkPartitionContext;
 import org.apache.stratos.cloud.controller.deployment.partition.Partition;
 
-import edu.emory.mathcs.backport.java.util.Arrays;
-
+import java.util.Arrays;
 import java.util.List;
 
 /**
 * This class is used for selecting a {@link Partition} in round robin manner and checking availability of
- * {@link Partition}s of a {@link PartitionGroup}
+ * {@link Partition}s of a {@link org.apache.stratos.autoscaler.NetworkPartitionContext}
  *
 */
 public class RoundRobin implements AutoscaleAlgorithm{
 	
 	private static final Log log = LogFactory.getLog(RoundRobin.class);
     
-    public Partition getNextScaleUpPartition(PartitionGroup partitionGroup, String clusterId){
-
+    public Partition getNextScaleUpPartition(NetworkPartitionContext networkPartitionContext, String clusterId){
 
-        ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);
-    	List<?> partitions = Arrays.asList(partitionGroup.getPartitions());
-    	int noOfPartitions = partitions.size();
+    	List<?> partitionContexts = Arrays.asList(networkPartitionContext.getPartitionCtxts());
+    	int noOfPartitions = partitionContexts.size();
 
     	for(int i=0; i < noOfPartitions; i++)
     	{
-    	    int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
-    	    if (partitions.get(currentPartitionIndex) instanceof Partition) {
-    		    Partition currentPartition = (Partition) partitions.get(currentPartitionIndex);
+    	    int currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex();
+    	    if (partitionContexts.get(currentPartitionIndex) instanceof Partition) {
+    		    Partition currentPartition = (Partition) partitionContexts.get(currentPartitionIndex);
     	        String currentPartitionId =  currentPartition.getId();
     	        
     	        // point to next partition
     	        int nextPartitionIndex = currentPartitionIndex  == noOfPartitions - 1 ? 0 : currentPartitionIndex+1;
-    	        clusterContext.setCurrentPartitionIndex(nextPartitionIndex);
+    	        networkPartitionContext.setCurrentPartitionIndex(nextPartitionIndex);
     	        
     	        // current partition has no partitionid-instanceid info in cluster context
-	        	if(!clusterContext.partitionCountExists(currentPartitionId))    	        		
-	        		AutoscalerContext.getInstance().getClusterContext(clusterId).addPartitionCount(currentPartitionId, 0);
+	        	if(!networkPartitionContext.partitionCountExists(currentPartitionId))
+                    AutoscalerContext.getInstance().getMonitor(clusterId)
+                                                .getNetworkPartitionCtxt(networkPartitionContext.getId())
+                                                .addPartitionCount(currentPartitionId, 0);
 	        	
-    	        if(clusterContext.getMemberCount(currentPartitionId) < currentPartition.getPartitionMax()){
+    	        if(networkPartitionContext.getMemberCount(currentPartitionId) < currentPartition.getPartitionMax()){
     	        	// current partition is free    	        	
-    	        	clusterContext.increaseMemberCountInPartitionBy(currentPartitionId, 1);
+    	        	networkPartitionContext.increaseMemberCountInPartitionBy(currentPartitionId, 1);
     	        	if(log.isDebugEnabled())
     	        		log.debug("Free space found in partition " + currentPartition.getId());
 	                return currentPartition;
@@ -77,24 +75,20 @@ public class RoundRobin implements AutoscaleAlgorithm{
     	
     	// none of the partitions were free.
     	if(log.isDebugEnabled()) {
-    		log.debug("No free partition found at partition group " + partitionGroup);
+    		log.debug("No free partition found at partition group " + networkPartitionContext);
     	}
         return null;
     }
 
 
 	@Override
-    public Partition getNextScaleDownPartition(PartitionGroup partitionGroup, String clusterId) {
-
-        ClusterContext clusterContext =
-                                        AutoscalerContext.getInstance()
-                                                         .getClusterContext(clusterId);
+    public Partition getNextScaleDownPartition(NetworkPartitionContext networkPartitionContext, String clusterId) {
 
-        List<?> partitions = Arrays.asList(partitionGroup.getPartitions());
-        int noOfPartitions = partitions.size();
+        List<?> partitionContexts = Arrays.asList(networkPartitionContext.getPartitionCtxts());
+        int noOfPartitions = partitionContexts.size();
 
         for (int i = 0; i < noOfPartitions; i++) {
-            int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
+            int currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex();
             // point to next partition
             if (currentPartitionIndex == 0) {
 
@@ -105,20 +99,21 @@ public class RoundRobin implements AutoscaleAlgorithm{
             }
 
             // Set next partition as current partition in Autoscaler Context
-            clusterContext.setCurrentPartitionIndex(currentPartitionIndex);
+            networkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex);
 
-            if (partitions.get(currentPartitionIndex) instanceof Partition) {
+            if (partitionContexts.get(currentPartitionIndex) instanceof Partition) {
 
-                Partition currentPartition = (Partition) partitions.get(currentPartitionIndex);
+                Partition currentPartition = (Partition) partitionContexts.get(currentPartitionIndex);
                 String currentPartitionId = currentPartition.getId();
 
-                if (!clusterContext.partitionCountExists(currentPartitionId))
-                    AutoscalerContext.getInstance().getClusterContext(clusterId)
-                                     .addPartitionCount(currentPartitionId, 0);
+                if (!networkPartitionContext.partitionCountExists(currentPartitionId))
+                    AutoscalerContext.getInstance().getMonitor(clusterId)
+                            .getNetworkPartitionCtxt(networkPartitionContext.getId())
+                            .addPartitionCount(currentPartitionId, 0);
                 // has more than minimum instances.
-                if (clusterContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMin()) {
+                if (networkPartitionContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMin()) {
                     // current partition is free
-                    clusterContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1);
+                    networkPartitionContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1);
                     if (log.isDebugEnabled()) {
                         log.debug("Returning partition for scaling down " +
                                   currentPartition.getId());
@@ -133,8 +128,8 @@ public class RoundRobin implements AutoscaleAlgorithm{
         }
 
         if (log.isDebugEnabled())
-            log.debug("No partition found for scale down at partition group " +
-                      partitionGroup.getId());
+            log.debug("No partition found for scale down at network partition " +
+                      networkPartitionContext.getId());
         // none of the partitions were free.
         return null;
     }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
index 9255980..c114e62 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
@@ -18,8 +18,6 @@
  */
 package org.apache.stratos.autoscaler.api;
 
-import java.util.ArrayList;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.NetworkPartitionContext;
@@ -35,6 +33,8 @@ import org.apache.stratos.autoscaler.policy.PolicyManager;
 import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
 import org.apache.stratos.cloud.controller.deployment.partition.Partition;
 
+import java.util.ArrayList;
+
 /**
  * Auto Scaler Service API is responsible getting Partitions and Policies.
  */
@@ -70,7 +70,7 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface{
 
 	@Override
 	public boolean addPartition(Partition partition) {
-        return PartitionManager.getInstance().deployNewPartitoion(partition);
+        return PartitionManager.getInstance().deployNewPartiotion(partition);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/cloud/controller/CloudControllerClient.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/cloud/controller/CloudControllerClient.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/cloud/controller/CloudControllerClient.java
index 1531c88..583b346 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/cloud/controller/CloudControllerClient.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/cloud/controller/CloudControllerClient.java
@@ -28,13 +28,7 @@ import org.apache.stratos.autoscaler.exception.SpawningException;
 import org.apache.stratos.autoscaler.exception.TerminationException;
 import org.apache.stratos.autoscaler.util.ConfUtil;
 import org.apache.stratos.cloud.controller.deployment.partition.Partition;
-import org.apache.stratos.cloud.controller.stub.CloudControllerServiceIllegalArgumentExceptionException;
-import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeTypeExceptionException;
-import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidClusterExceptionException;
-import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidMemberExceptionException;
-import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidPartitionExceptionException;
-import org.apache.stratos.cloud.controller.stub.CloudControllerServiceStub;
-import org.apache.stratos.cloud.controller.stub.CloudControllerServiceUnregisteredCartridgeExceptionException;
+import org.apache.stratos.cloud.controller.stub.*;
 
 import java.rmi.RemoteException;
 
@@ -77,6 +71,7 @@ public class CloudControllerClient {
     public void spawnInstances(Partition partition, String clusterId, int memberCountToBeIncreased) throws SpawningException {
         //call CC spawnInstances method
 
+
         log.info("Calling CC for spawning instances in cluster " + clusterId);
         log.info("Member count to be increased: " + memberCountToBeIncreased);
 
@@ -103,7 +98,8 @@ public class CloudControllerClient {
         } catch (CloudControllerServiceInvalidCartridgeTypeExceptionException e) {
             log.error(e.getMessage());
             throw new PartitionValidationException(e);
-        } 
+        }
+
     }
     
     /*
@@ -119,6 +115,7 @@ public class CloudControllerClient {
         } catch (CloudControllerServiceInvalidPartitionExceptionException e) {
         	throw new PartitionValidationException(e.getMessage(),e);
 		}
+
     }
 
     public org.apache.stratos.cloud.controller.pojo.MemberContext spawnAnInstance(Partition partition, String clusterId) throws SpawningException {

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicy.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicy.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicy.java
index e8b3478..d930cb6 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicy.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicy.java
@@ -19,14 +19,12 @@
 
 package org.apache.stratos.autoscaler.deployment.policy;
 
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
 import org.apache.stratos.autoscaler.partition.PartitionGroup;
 import org.apache.stratos.cloud.controller.deployment.partition.Partition;
 
-import edu.emory.mathcs.backport.java.util.Arrays;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
 
 /**
  * The model class for Deployment-Policy definition.

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java
index c4f4ae0..3bd037e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java
@@ -18,9 +18,6 @@
  */
 package org.apache.stratos.autoscaler.internal;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
@@ -43,6 +40,9 @@ import org.osgi.service.component.ComponentContext;
 import org.wso2.carbon.registry.api.RegistryException;
 import org.wso2.carbon.registry.core.service.RegistryService;
 
+import java.util.ArrayList;
+import java.util.Iterator;
+
 /**
 * @scr.component name=org.apache.stratos.autoscaler.internal.AutoscalerServerComponent"
 * immediate="true"
@@ -79,11 +79,12 @@ public class AutoscalerServerComponent {
         // Adding the registry stored AS policies to the information model.
         
         try {
-			Thread th = new Thread(new AutoscalerTopologyReceiver());
-			th.start();
+			Thread topologyTopicSubscriberThread = new Thread(new AutoscalerTopologyReceiver());
+			topologyTopicSubscriberThread.start();
 			if (log.isDebugEnabled()) {
 				log.debug("Topology message processor thread started");
 			}
+
 			TopicSubscriber healthStatTopicSubscriber = new TopicSubscriber(
 					Constants.HEALTH_STAT_TOPIC);
 			healthStatTopicSubscriber

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java
index e16ea63..7e6ef90 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java
@@ -19,22 +19,17 @@
 package org.apache.stratos.autoscaler.message.receiver.health;
 
 import com.google.gson.stream.JsonReader;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.AutoscalerContext;
-import org.apache.stratos.autoscaler.ClusterContext;
 import org.apache.stratos.autoscaler.ClusterMonitor;
 import org.apache.stratos.autoscaler.Constants;
-import org.apache.stratos.autoscaler.PartitionContext;
 import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
 import org.apache.stratos.autoscaler.exception.SpawningException;
 import org.apache.stratos.autoscaler.exception.TerminationException;
-import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
 import org.apache.stratos.cloud.controller.deployment.partition.Partition;
 
 import javax.jms.TextMessage;
-
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.StringReader;
@@ -50,6 +45,7 @@ public class HealthEventMessageDelegator implements Runnable {
     private static final Log log = LogFactory.getLog(HealthEventMessageDelegator.class);
     private String eventName;
     private String clusterId;
+    private String networkPartitionId;
     private Map<String, String> messageProperties;
     @Override
     public void run() {
@@ -69,15 +65,18 @@ public class HealthEventMessageDelegator implements Runnable {
 
                 if(Constants.AVERAGE_REQUESTS_IN_FLIGHT.equals(eventName)){                	
                 	Float messageValue = Float.parseFloat(messageProperties.get("value"));
-                    AutoscalerContext.getInstance().getClusterContext(clusterId).setAverageRequestsInFlight(messageValue);
+                    AutoscalerContext.getInstance().getMonitor(clusterId).getNetworkPartitionCtxt(networkPartitionId)
+                            .setAverageRequestsInFlight(messageValue);
 
                 }  else if(Constants.GRADIENT_OF_REQUESTS_IN_FLIGHT.equals(eventName)){                	
                 	Float messageValue = Float.parseFloat(messageProperties.get("value"));
-                    AutoscalerContext.getInstance().getClusterContext(clusterId).setRequestsInFlightGradient(messageValue);
+                    AutoscalerContext.getInstance().getMonitor(clusterId).getNetworkPartitionCtxt(networkPartitionId)
+                            .setRequestsInFlightGradient(messageValue);
 
                 }  else if(Constants.SECOND_DERIVATIVE_OF_REQUESTS_IN_FLIGHT.equals(eventName)){
                 	Float messageValue = Float.parseFloat(messageProperties.get("value"));
-                    AutoscalerContext.getInstance().getClusterContext(clusterId).setRequestsInFlightSecondDerivative(messageValue);
+                    AutoscalerContext.getInstance().getMonitor(clusterId).getNetworkPartitionCtxt(networkPartitionId)
+                            .setRequestsInFlightSecondDerivative(messageValue);
 
                 }else if (Constants.MEMBER_FAULT_EVENT_NAME.equals(eventName)){
                 	
@@ -100,10 +99,9 @@ public class HealthEventMessageDelegator implements Runnable {
     private void handleMemberfaultEvent(String memberId) {
 		try {	
 			
-			ClusterMonitor monitor = AutoscalerRuleEvaluator.getInstance().getMonitor(this.clusterId);
-			ClusterContext clusCtx = monitor.getClusterCtxt();
-								
-			if(!clusCtx.memberExist(memberId)){
+			ClusterMonitor monitor = AutoscalerContext.getInstance().getMonitor(this.clusterId);
+//            TopologyManager.getTopology().get
+			if(!monitor.memberExist(memberId)){
 				// member has already terminated. So no action required
 				return;
 			}
@@ -113,9 +111,9 @@ public class HealthEventMessageDelegator implements Runnable {
 			ccClient.terminate(memberId);
 			
 			// start a new member in the same Partition
-			//ClusterContext clsCtx = AutoscalerContext.getInstance().getClusterContext(clusterId);
-			String partitionId = clusCtx.getPartitonOfMember(memberId);
-			Partition partition = clusCtx.getDeploymentPolicy().getPartitionById(partitionId);
+			//ClusterContext clsCtx = AutoscalerContext.getInstance().getClusterMonitor(clusterId);
+			String partitionId = monitor.getPartitonOfMember(memberId);
+			Partition partition = monitor.getDeploymentPolicy().getPartitionById(partitionId);
 			ccClient.spawnAnInstance(partition, clusterId);
 			
 		} catch (TerminationException e) {
@@ -132,7 +130,6 @@ public class HealthEventMessageDelegator implements Runnable {
         JsonReader reader = new JsonReader(bufferedReader);
         try {
 
-           
             reader.beginObject();
 
             if(reader.hasNext()) {