adding network partition context to cluster and application

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

Branch: refs/heads/master
Commit: 746bdc10356d1d21fc5b1653829c0a6b699cc19e
Parents: 7587568
Author: reka <[email protected]>
Authored: Thu Nov 27 16:11:37 2014 +0530
Committer: reka <[email protected]>
Committed: Thu Nov 27 16:26:13 2014 +0530

----------------------------------------------------------------------
 .../autoscaler/ClusterContextFactory.java       |  20 +-
 .../ClusterLevelNetworkPartitionContext.java    | 443 +++++++++++++++++++
 .../autoscaler/NetworkPartitionContext.java     | 278 ++----------
 ...ntComponentLevelNetworkPartitionContext.java | 222 ++++++++++
 .../stratos/autoscaler/VMClusterContext.java    |  16 +-
 .../autoscaler/VMServiceClusterContext.java     |   3 +-
 .../algorithm/AutoscaleAlgorithm.java           |   8 +-
 .../autoscaler/algorithm/OneAfterAnother.java   |  34 +-
 .../autoscaler/algorithm/RoundRobin.java        |  32 +-
 .../applications/topic/ApplicationBuilder.java  |   4 +-
 .../AutoscalerTopologyEventReceiver.java        |   8 +-
 .../monitor/ParentComponentMonitor.java         |  52 ++-
 .../monitor/application/ApplicationMonitor.java |  49 +-
 .../application/ApplicationMonitorFactory.java  |  10 +-
 .../monitor/cluster/VMClusterMonitor.java       | 103 ++---
 .../monitor/cluster/VMLbClusterMonitor.java     |   2 +-
 .../cluster/VMServiceClusterMonitor.java        |  10 +-
 .../autoscaler/monitor/group/GroupMonitor.java  |  35 +-
 .../autoscaler/rule/RuleTasksDelegator.java     |  12 +-
 .../status/processor/StatusChecker.java         |  16 +-
 .../cluster/ClusterStatusActiveProcessor.java   |   6 +-
 .../cluster/ClusterStatusInActiveProcessor.java |   6 +-
 .../ClusterStatusTerminatedProcessor.java       |   8 +-
 23 files changed, 981 insertions(+), 396 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContextFactory.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContextFactory.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContextFactory.java
index 4e17b2a..7a9d4d6 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContextFactory.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContextFactory.java
@@ -85,12 +85,12 @@ public class ClusterContextFactory {
 
         
CloudControllerClient.getInstance().validateDeploymentPolicy(cluster.getServiceName(),
 deploymentPolicy);
 
-        Map<String, NetworkPartitionContext> networkPartitionContextMap = new 
HashMap<String, NetworkPartitionContext>();
+        Map<String, ClusterLevelNetworkPartitionContext> 
networkPartitionContextMap = new HashMap<String, 
ClusterLevelNetworkPartitionContext>();
 
         for (PartitionGroup partitionGroup : 
deploymentPolicy.getPartitionGroups()) {
 
             String networkPartitionId = partitionGroup.getId();
-            NetworkPartitionContext networkPartitionContext = new 
NetworkPartitionContext(networkPartitionId,
+            ClusterLevelNetworkPartitionContext 
clusterLevelNetworkPartitionContext = new 
ClusterLevelNetworkPartitionContext(networkPartitionId,
                     partitionGroup.getPartitionAlgo(),
                     partitionGroup.getPartitions());
 
@@ -137,17 +137,17 @@ public class ClusterContextFactory {
                     }
 
                 }
-                
networkPartitionContext.addPartitionContext(clusterMonitorPartitionContext);
+                
clusterLevelNetworkPartitionContext.addPartitionContext(clusterMonitorPartitionContext);
                 if (log.isInfoEnabled()) {
                     log.info(String.format("Partition context has been added: 
[partition] %s",
                             clusterMonitorPartitionContext.getPartitionId()));
                 }
             }
 
-            networkPartitionContextMap.put(networkPartitionId, 
networkPartitionContext);
+            networkPartitionContextMap.put(networkPartitionId, 
clusterLevelNetworkPartitionContext);
             if (log.isInfoEnabled()) {
                 log.info(String.format("Network partition context has been 
added: [network partition] %s",
-                        networkPartitionContext.getId()));
+                        clusterLevelNetworkPartitionContext.getId()));
             }
         }
 
@@ -186,7 +186,7 @@ public class ClusterContextFactory {
 
         String clusterId = cluster.getClusterId();
 
-        Map<String, NetworkPartitionContext> networkPartitionContextMap = new 
HashMap<String, NetworkPartitionContext>();
+        Map<String, ClusterLevelNetworkPartitionContext> 
networkPartitionContextMap = new HashMap<String, 
ClusterLevelNetworkPartitionContext>();
 
         // partition group = network partition context
         for (PartitionGroup partitionGroup : 
deploymentPolicy.getPartitionGroups()) {
@@ -206,12 +206,12 @@ public class ClusterContextFactory {
             
clusterMonitorPartitionContext.setNetworkPartitionId(networkPartitionId);
             clusterMonitorPartitionContext.setMinimumMemberCount(1);//Here it 
hard codes the minimum value as one for LB cartridge partitions
 
-            NetworkPartitionContext networkPartitionContext = new 
NetworkPartitionContext(networkPartitionId,
+            ClusterLevelNetworkPartitionContext 
clusterLevelNetworkPartitionContext = new 
ClusterLevelNetworkPartitionContext(networkPartitionId,
                     partitionGroup.getPartitionAlgo(),
                     partitionGroup.getPartitions());
             for (Member member : cluster.getMembers()) {
                 String memberId = member.getMemberId();
-                if 
(member.getNetworkPartitionId().equalsIgnoreCase(networkPartitionContext.getId()))
 {
+                if 
(member.getNetworkPartitionId().equalsIgnoreCase(clusterLevelNetworkPartitionContext.getId()))
 {
                     MemberContext memberContext = new MemberContext();
                     memberContext.setClusterId(member.getClusterId());
                     memberContext.setMemberId(memberId);
@@ -245,7 +245,7 @@ public class ClusterContextFactory {
                 }
 
             }
-            
networkPartitionContext.addPartitionContext(clusterMonitorPartitionContext);
+            
clusterLevelNetworkPartitionContext.addPartitionContext(clusterMonitorPartitionContext);
 
             // populate lb cluster id in network partition context.
             java.util.Properties props = cluster.getProperties();
@@ -273,7 +273,7 @@ public class ClusterContextFactory {
                 }
             }
 
-            networkPartitionContextMap.put(networkPartitionId, 
networkPartitionContext);
+            networkPartitionContextMap.put(networkPartitionId, 
clusterLevelNetworkPartitionContext);
         }
 
         return new VMClusterContext(clusterId, cluster.getServiceName(), 
autoscalePolicy,

http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterLevelNetworkPartitionContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterLevelNetworkPartitionContext.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterLevelNetworkPartitionContext.java
new file mode 100644
index 0000000..73f1bce
--- /dev/null
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterLevelNetworkPartitionContext.java
@@ -0,0 +1,443 @@
+/*
+ * 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.policy.model.LoadAverage;
+import org.apache.stratos.autoscaler.policy.model.MemoryConsumption;
+import org.apache.stratos.autoscaler.policy.model.RequestsInFlight;
+import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
+import org.apache.stratos.messaging.domain.instance.context.InstanceContext;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Holds runtime data of a network partition.
+ *
+ */
+public class ClusterLevelNetworkPartitionContext extends 
NetworkPartitionContext implements Serializable {
+
+    private static final Log log = 
LogFactory.getLog(ClusterLevelNetworkPartitionContext.class);
+    private static final long serialVersionUID = 572769304374110159L;
+    private final String id;
+    private int scaleDownRequestsCount = 0;
+    private float averageRequestsServedPerInstance;
+    private float requestsServedPerInstance;
+
+    private int minInstanceCount = 0, maxInstanceCount = 0;
+    private int requiredInstanceCountBasedOnStats;
+    private int requiredInstanceCountBasedOnDependencies;
+
+    private Map<String, InstanceContext> instanceIdToInstanceContextMap;
+
+
+    private final String partitionAlgorithm;
+
+    //boolean values to keep whether the requests in flight parameters are 
reset or not
+    private boolean rifReset = false, averageRifReset = false, 
gradientRifReset = false, secondDerivativeRifRest = false;
+    //boolean values to keep whether the memory consumption parameters are 
reset or not
+    private boolean memoryConsumptionReset = false, 
averageMemoryConsumptionReset = false,
+            gradientMemoryConsumptionReset = false, 
secondDerivativeMemoryConsumptionRest = false;
+    //boolean values to keep whether the load average parameters are reset or 
not
+    private boolean loadAverageReset = false, averageLoadAverageReset = false, 
gradientLoadAverageReset = false,
+            secondDerivativeLoadAverageRest = false;
+    //boolean values to keep whether average requests served per instance 
parameters are reset or not
+    private boolean averageRequestServedPerInstanceReset = false;
+
+    private final Partition[] partitions;
+
+    //Following information will keep events details
+    private RequestsInFlight requestsInFlight;
+    private MemoryConsumption memoryConsumption;
+    private LoadAverage loadAverage;
+
+    //details required for partition selection algorithms
+    private int currentPartitionIndex;
+
+    //partitions of this network partition
+    private final Map<String, ClusterLevelPartitionContext> partitionCtxts;
+
+    public ClusterLevelNetworkPartitionContext(String id, String 
partitionAlgo, Partition[] partitions) {
+
+        super(id, partitionAlgo, partitions);
+        this.id = id;
+        this.partitionAlgorithm = partitionAlgo;
+        if (partitions == null) {
+            this.partitions = new Partition[0];
+        } else {
+            this.partitions = Arrays.copyOf(partitions, partitions.length);
+        }
+        partitionCtxts = new HashMap<String, ClusterLevelPartitionContext>();
+        requestsInFlight = new RequestsInFlight();
+        loadAverage = new LoadAverage();
+        memoryConsumption = new MemoryConsumption();
+        for (Partition partition : partitions) {
+            minInstanceCount += partition.getPartitionMin();
+            maxInstanceCount += partition.getPartitionMax();
+        }
+        requiredInstanceCountBasedOnStats = minInstanceCount;
+        requiredInstanceCountBasedOnDependencies = minInstanceCount;
+        instanceIdToInstanceContextMap = new HashMap<String, 
InstanceContext>();
+
+    }
+
+    public int getMinInstanceCount() {
+        return minInstanceCount;
+    }
+
+    public void setMinInstanceCount(int minInstanceCount) {
+        this.minInstanceCount = minInstanceCount;
+    }
+
+    public int getMaxInstanceCount() {
+        return maxInstanceCount;
+    }
+
+    public void setMaxInstanceCount(int maxInstanceCount) {
+        this.maxInstanceCount = maxInstanceCount;
+    }
+
+    public int hashCode() {
+
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
+        return result;
+
+    }
+
+    public boolean equals(final Object obj) {
+
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (!(obj instanceof ClusterLevelNetworkPartitionContext)) {
+            return false;
+        }
+        final ClusterLevelNetworkPartitionContext other = 
(ClusterLevelNetworkPartitionContext) obj;
+        if (this.id == null) {
+            if (other.id != null) {
+                return false;
+            }
+        } else if (!this.id.equals(other.id)) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "NetworkPartitionContext [id=" + id + "partitionAlgorithm=" + 
partitionAlgorithm + ", minInstanceCount=" +
+                minInstanceCount + ", maxInstanceCount=" + maxInstanceCount + 
"]";
+    }
+
+    public int getCurrentPartitionIndex() {
+        return currentPartitionIndex;
+    }
+
+    public void setCurrentPartitionIndex(int currentPartitionIndex) {
+        this.currentPartitionIndex = currentPartitionIndex;
+    }
+
+    public float getAverageRequestsServedPerInstance() {
+        return averageRequestsServedPerInstance;
+    }
+
+    public void setAverageRequestsServedPerInstance(float 
averageRequestServedPerInstance) {
+        this.averageRequestsServedPerInstance = 
averageRequestServedPerInstance;
+        averageRequestServedPerInstanceReset = true;
+
+        if (log.isDebugEnabled()) {
+            log.debug(String.format("Average Requesets Served Per Instance 
stats are reset, ready to do scale check [network partition] %s"
+                    , this.id));
+
+        }
+    }
+
+    public float getRequestsServedPerInstance() {
+        return requestsServedPerInstance;
+    }
+
+    public float getAverageRequestsInFlight() {
+        return requestsInFlight.getAverage();
+    }
+
+    public void setAverageRequestsInFlight(float averageRequestsInFlight) {
+        requestsInFlight.setAverage(averageRequestsInFlight);
+        averageRifReset = true;
+        if (secondDerivativeRifRest && gradientRifReset) {
+            rifReset = true;
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Requests in flights stats are reset, 
ready to do scale check [network partition] %s"
+                        , this.id));
+            }
+        }
+    }
+
+    public float getRequestsInFlightSecondDerivative() {
+        return requestsInFlight.getSecondDerivative();
+    }
+
+    public void setRequestsInFlightSecondDerivative(float 
requestsInFlightSecondDerivative) {
+        requestsInFlight.setSecondDerivative(requestsInFlightSecondDerivative);
+        secondDerivativeRifRest = true;
+        if (averageRifReset && gradientRifReset) {
+            rifReset = true;
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Requests in flights stats are reset, 
ready to do scale check [network partition] %s"
+                        , this.id));
+            }
+        }
+    }
+
+    public float getRequestsInFlightGradient() {
+        return requestsInFlight.getGradient();
+    }
+
+    public void setRequestsInFlightGradient(float requestsInFlightGradient) {
+        requestsInFlight.setGradient(requestsInFlightGradient);
+        gradientRifReset = true;
+        if (secondDerivativeRifRest && averageRifReset) {
+            rifReset = true;
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Requests in flights stats are reset, 
ready to do scale check [network partition] %s"
+                        , this.id));
+            }
+        }
+    }
+
+    public boolean isRifReset() {
+        return rifReset;
+    }
+
+    public void setRifReset(boolean rifReset) {
+        this.rifReset = rifReset;
+        this.averageRifReset = rifReset;
+        this.gradientRifReset = rifReset;
+        this.secondDerivativeRifRest = rifReset;
+    }
+
+
+    public float getAverageMemoryConsumption() {
+        return memoryConsumption.getAverage();
+    }
+
+    public void setAverageMemoryConsumption(float averageMemoryConsumption) {
+        memoryConsumption.setAverage(averageMemoryConsumption);
+        averageMemoryConsumptionReset = true;
+        if (secondDerivativeMemoryConsumptionRest && 
gradientMemoryConsumptionReset) {
+            memoryConsumptionReset = true;
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Memory consumption stats are reset, 
ready to do scale check [network partition] %s"
+                        , this.id));
+            }
+        }
+    }
+
+    public float getMemoryConsumptionSecondDerivative() {
+        return memoryConsumption.getSecondDerivative();
+    }
+
+    public void setMemoryConsumptionSecondDerivative(float 
memoryConsumptionSecondDerivative) {
+        
memoryConsumption.setSecondDerivative(memoryConsumptionSecondDerivative);
+        secondDerivativeMemoryConsumptionRest = true;
+        if (averageMemoryConsumptionReset && gradientMemoryConsumptionReset) {
+            memoryConsumptionReset = true;
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Memory consumption stats are reset, 
ready to do scale check [network partition] %s"
+                        , this.id));
+            }
+        }
+    }
+
+    public float getMemoryConsumptionGradient() {
+        return memoryConsumption.getGradient();
+    }
+
+    public void setMemoryConsumptionGradient(float memoryConsumptionGradient) {
+        memoryConsumption.setGradient(memoryConsumptionGradient);
+        gradientMemoryConsumptionReset = true;
+        if (secondDerivativeMemoryConsumptionRest && 
averageMemoryConsumptionReset) {
+            memoryConsumptionReset = true;
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Memory consumption stats are reset, 
ready to do scale check [network partition] %s"
+                        , this.id));
+            }
+        }
+    }
+
+    public boolean isMemoryConsumptionReset() {
+        return memoryConsumptionReset;
+    }
+
+    public void setMemoryConsumptionReset(boolean memoryConsumptionReset) {
+        this.memoryConsumptionReset = memoryConsumptionReset;
+        this.averageMemoryConsumptionReset = memoryConsumptionReset;
+        this.gradientMemoryConsumptionReset = memoryConsumptionReset;
+        this.secondDerivativeMemoryConsumptionRest = memoryConsumptionReset;
+    }
+
+
+    public float getAverageLoadAverage() {
+        return loadAverage.getAverage();
+    }
+
+    public void setAverageLoadAverage(float averageLoadAverage) {
+        loadAverage.setAverage(averageLoadAverage);
+        averageLoadAverageReset = true;
+        if (secondDerivativeLoadAverageRest && gradientLoadAverageReset) {
+            loadAverageReset = true;
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Load average stats are reset, ready 
to do scale check [network partition] %s"
+                        , this.id));
+            }
+        }
+    }
+
+    public float getLoadAverageSecondDerivative() {
+        return loadAverage.getSecondDerivative();
+    }
+
+    public void setLoadAverageSecondDerivative(float 
loadAverageSecondDerivative) {
+        loadAverage.setSecondDerivative(loadAverageSecondDerivative);
+        secondDerivativeLoadAverageRest = true;
+        if (averageLoadAverageReset && gradientLoadAverageReset) {
+            loadAverageReset = true;
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Load average stats are reset, ready 
to do scale check [network partition] %s"
+                        , this.id));
+            }
+        }
+    }
+
+    public float getLoadAverageGradient() {
+        return loadAverage.getGradient();
+    }
+
+    public void setLoadAverageGradient(float loadAverageGradient) {
+        loadAverage.setGradient(loadAverageGradient);
+        gradientLoadAverageReset = true;
+        if (secondDerivativeLoadAverageRest && averageLoadAverageReset) {
+            loadAverageReset = true;
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Load average stats are reset, ready 
to do scale check [network partition] %s"
+                        , this.id));
+            }
+        }
+    }
+
+    public boolean isLoadAverageReset() {
+        return loadAverageReset;
+    }
+
+    public void setLoadAverageReset(boolean loadAverageReset) {
+        this.loadAverageReset = loadAverageReset;
+        this.averageLoadAverageReset = loadAverageReset;
+        this.gradientLoadAverageReset = loadAverageReset;
+        this.secondDerivativeLoadAverageRest = loadAverageReset;
+    }
+
+
+    public String getId() {
+        return id;
+    }
+
+    public Map<String, ClusterLevelPartitionContext> getPartitionCtxts() {
+        return partitionCtxts;
+    }
+
+    public ClusterLevelPartitionContext getPartitionCtxt(String partitionId) {
+        return partitionCtxts.get(partitionId);
+    }
+
+    public void addPartitionContext(ClusterLevelPartitionContext 
partitionContext) {
+        partitionCtxts.put(partitionContext.getPartitionId(), 
partitionContext);
+    }
+
+    public String getPartitionAlgorithm() {
+        return partitionAlgorithm;
+    }
+
+    public Partition[] getPartitions() {
+        return partitions;
+    }
+
+    public int getNonTerminatedMemberCountOfPartition(String partitionId) {
+        if (partitionCtxts.containsKey(partitionId)) {
+            return getPartitionCtxt(partitionId).getNonTerminatedMemberCount();
+        }
+        return 0;
+    }
+
+    public int getActiveMemberCount(String currentPartitionId) {
+        if (partitionCtxts.containsKey(currentPartitionId)) {
+            return getPartitionCtxt(currentPartitionId).getActiveMemberCount();
+        }
+        return 0;
+    }
+
+    public int getScaleDownRequestsCount() {
+        return scaleDownRequestsCount;
+    }
+
+    public void resetScaleDownRequestsCount() {
+        this.scaleDownRequestsCount = 0;
+    }
+
+    public void increaseScaleDownRequestsCount() {
+        this.scaleDownRequestsCount += 1;
+    }
+
+    public float getRequiredInstanceCountBasedOnStats() {
+        return requiredInstanceCountBasedOnStats;
+    }
+
+    public void setRequiredInstanceCountBasedOnStats(int 
requiredInstanceCountBasedOnStats) {
+        this.requiredInstanceCountBasedOnStats = 
requiredInstanceCountBasedOnStats;
+    }
+
+    public int getRequiredInstanceCountBasedOnDependencies() {
+        return requiredInstanceCountBasedOnDependencies;
+    }
+
+    public void setRequiredInstanceCountBasedOnDependencies(int 
requiredInstanceCountBasedOnDependencies) {
+        this.requiredInstanceCountBasedOnDependencies = 
requiredInstanceCountBasedOnDependencies;
+    }
+
+    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.getInstanceId(), 
context);
+
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/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 8fc7bf7..9ca60ca 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
@@ -1,18 +1,18 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
+ * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
+ * 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
+ * with the License.  You may obtain a copy of the License at
  *
- * http://www.apache.org/licenses/LICENSE-2.0
+ *  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
+ * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
@@ -20,54 +20,33 @@ package org.apache.stratos.autoscaler;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.autoscaler.policy.model.LoadAverage;
-import org.apache.stratos.autoscaler.policy.model.MemoryConsumption;
-import org.apache.stratos.autoscaler.policy.model.RequestsInFlight;
 import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
+import org.apache.stratos.messaging.domain.instance.context.InstanceContext;
 
-import java.io.Serializable;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
 /**
- * Holds runtime data of a network partition.
- *
+ * This will keep track of network partition level information.
  */
-public class NetworkPartitionContext implements Serializable{
-
-       private static final Log log = 
LogFactory.getLog(NetworkPartitionContext.class);
-    private static final long serialVersionUID = 572769304374110159L;
+public abstract class NetworkPartitionContext {
+    private static final Log log = 
LogFactory.getLog(ParentComponentLevelNetworkPartitionContext.class);
     private final String id;
     private int scaleDownRequestsCount = 0;
     private float averageRequestsServedPerInstance;
-    private float requestsServedPerInstance;
 
     private int minInstanceCount = 0, maxInstanceCount = 0;
     private int requiredInstanceCountBasedOnStats;
     private int requiredInstanceCountBasedOnDependencies;
 
+    private Map<String, InstanceContext> instanceIdToInstanceContextMap;
 
-    private final String partitionAlgorithm;
 
-    //boolean values to keep whether the requests in flight parameters are 
reset or not
-    private boolean rifReset = false, averageRifReset = false, 
gradientRifReset = false, secondDerivativeRifRest = false;
-    //boolean values to keep whether the memory consumption parameters are 
reset or not
-    private boolean memoryConsumptionReset = false, 
averageMemoryConsumptionReset = false,
-            gradientMemoryConsumptionReset = false, 
secondDerivativeMemoryConsumptionRest = false;
-    //boolean values to keep whether the load average parameters are reset or 
not
-    private boolean loadAverageReset = false, averageLoadAverageReset = false, 
gradientLoadAverageReset = false,
-            secondDerivativeLoadAverageRest = false;
-    //boolean values to keep whether average requests served per instance 
parameters are reset or not
-    private boolean averageRequestServedPerInstanceReset= false;
+    private final String partitionAlgorithm;
 
     private final Partition[] partitions;
 
-    //Following information will keep events details
-    private RequestsInFlight requestsInFlight;
-    private MemoryConsumption memoryConsumption;
-    private LoadAverage loadAverage;
-
     //details required for partition selection algorithms
     private int currentPartitionIndex;
 
@@ -79,21 +58,19 @@ public class NetworkPartitionContext implements 
Serializable{
         super();
         this.id = id;
         this.partitionAlgorithm = partitionAlgo;
-        if(partitions == null) {
+        if (partitions == null) {
             this.partitions = new Partition[0];
         } else {
             this.partitions = Arrays.copyOf(partitions, partitions.length);
         }
         partitionCtxts = new HashMap<String, ClusterLevelPartitionContext>();
-        requestsInFlight = new RequestsInFlight();
-        loadAverage = new LoadAverage();
-        memoryConsumption = new MemoryConsumption();
-        for(Partition partition : partitions){
+        for (Partition partition : partitions) {
             minInstanceCount += partition.getPartitionMin();
             maxInstanceCount += partition.getPartitionMax();
         }
         requiredInstanceCountBasedOnStats = minInstanceCount;
         requiredInstanceCountBasedOnDependencies = minInstanceCount;
+        instanceIdToInstanceContextMap = new HashMap<String, 
InstanceContext>();
 
     }
 
@@ -130,16 +107,15 @@ public class NetworkPartitionContext implements 
Serializable{
         if (obj == null) {
             return false;
         }
-        if (!(obj instanceof NetworkPartitionContext)) {
+        if (!(obj instanceof ParentComponentLevelNetworkPartitionContext)) {
             return false;
         }
-        final NetworkPartitionContext other = (NetworkPartitionContext) obj;
+        final ParentComponentLevelNetworkPartitionContext other = 
(ParentComponentLevelNetworkPartitionContext) obj;
         if (this.id == null) {
-            if (other.id != null) {
+            if (this.id != null) {
                 return false;
             }
-        }
-        else if (!this.id.equals(other.id)) {
+        } else if (!this.id.equals(this.id)) {
             return false;
         }
         return true;
@@ -148,7 +124,7 @@ public class NetworkPartitionContext implements 
Serializable{
     @Override
     public String toString() {
         return "NetworkPartitionContext [id=" + id + "partitionAlgorithm=" + 
partitionAlgorithm + ", minInstanceCount=" +
-               minInstanceCount + ", maxInstanceCount=" + maxInstanceCount + 
"]";
+                minInstanceCount + ", maxInstanceCount=" + maxInstanceCount + 
"]";
     }
 
     public int getCurrentPartitionIndex() {
@@ -159,202 +135,6 @@ public class NetworkPartitionContext implements 
Serializable{
         this.currentPartitionIndex = currentPartitionIndex;
     }
 
-    public float getAverageRequestsServedPerInstance() { return 
averageRequestsServedPerInstance;}
-
-    public void setAverageRequestsServedPerInstance(float 
averageRequestServedPerInstance) {
-        this.averageRequestsServedPerInstance = 
averageRequestServedPerInstance;
-        averageRequestServedPerInstanceReset = true;
-
-        if(log.isDebugEnabled()){
-            log.debug(String.format("Average Requesets Served Per Instance 
stats are reset, ready to do scale check [network partition] %s"
-                    , this.id));
-
-        }
-    }
-
-    public float getRequestsServedPerInstance() { return 
requestsServedPerInstance;}
-
-    public float getAverageRequestsInFlight() {
-        return requestsInFlight.getAverage();
-    }
-
-    public void setAverageRequestsInFlight(float averageRequestsInFlight) {
-        requestsInFlight.setAverage(averageRequestsInFlight);
-        averageRifReset = true;
-        if(secondDerivativeRifRest && gradientRifReset){
-            rifReset = true;
-            if(log.isDebugEnabled()){
-                log.debug(String.format("Requests in flights stats are reset, 
ready to do scale check [network partition] %s"
-                        , this.id));
-            }
-        }
-    }
-
-    public float getRequestsInFlightSecondDerivative() {
-        return requestsInFlight.getSecondDerivative();
-    }
-
-    public void setRequestsInFlightSecondDerivative(float 
requestsInFlightSecondDerivative) {
-        requestsInFlight.setSecondDerivative(requestsInFlightSecondDerivative);
-        secondDerivativeRifRest = true;
-        if(averageRifReset && gradientRifReset){
-            rifReset = true;
-            if(log.isDebugEnabled()){
-                log.debug(String.format("Requests in flights stats are reset, 
ready to do scale check [network partition] %s"
-                        , this.id));
-            }
-        }
-    }
-
-    public float getRequestsInFlightGradient() {
-        return requestsInFlight.getGradient();
-    }
-
-    public void setRequestsInFlightGradient(float requestsInFlightGradient) {
-        requestsInFlight.setGradient(requestsInFlightGradient);
-        gradientRifReset = true;
-        if(secondDerivativeRifRest && averageRifReset){
-            rifReset = true;
-            if(log.isDebugEnabled()){
-                log.debug(String.format("Requests in flights stats are reset, 
ready to do scale check [network partition] %s"
-                        , this.id));
-            }
-        }
-    }
-
-    public boolean isRifReset() {
-        return rifReset;
-    }
-
-    public void setRifReset(boolean rifReset) {
-        this.rifReset = rifReset;
-        this.averageRifReset = rifReset;
-        this.gradientRifReset = rifReset;
-        this.secondDerivativeRifRest = rifReset;
-    }
-
-
-    public float getAverageMemoryConsumption() {
-        return memoryConsumption.getAverage();
-    }
-
-    public void setAverageMemoryConsumption(float averageMemoryConsumption) {
-        memoryConsumption.setAverage(averageMemoryConsumption);
-        averageMemoryConsumptionReset = true;
-        if(secondDerivativeMemoryConsumptionRest && 
gradientMemoryConsumptionReset){
-            memoryConsumptionReset = true;
-            if(log.isDebugEnabled()){
-                log.debug(String.format("Memory consumption stats are reset, 
ready to do scale check [network partition] %s"
-                        , this.id));
-            }
-        }
-    }
-
-    public float getMemoryConsumptionSecondDerivative() {
-        return memoryConsumption.getSecondDerivative();
-    }
-
-    public void setMemoryConsumptionSecondDerivative(float 
memoryConsumptionSecondDerivative) {
-        
memoryConsumption.setSecondDerivative(memoryConsumptionSecondDerivative);
-        secondDerivativeMemoryConsumptionRest = true;
-        if(averageMemoryConsumptionReset && gradientMemoryConsumptionReset){
-            memoryConsumptionReset = true;
-            if(log.isDebugEnabled()){
-                log.debug(String.format("Memory consumption stats are reset, 
ready to do scale check [network partition] %s"
-                        , this.id));
-            }
-        }
-    }
-
-    public float getMemoryConsumptionGradient() {
-        return memoryConsumption.getGradient();
-    }
-
-    public void setMemoryConsumptionGradient(float memoryConsumptionGradient) {
-        memoryConsumption.setGradient(memoryConsumptionGradient);
-        gradientMemoryConsumptionReset = true;
-        if(secondDerivativeMemoryConsumptionRest && 
averageMemoryConsumptionReset){
-            memoryConsumptionReset = true;
-            if(log.isDebugEnabled()){
-                log.debug(String.format("Memory consumption stats are reset, 
ready to do scale check [network partition] %s"
-                        , this.id));
-            }
-        }
-    }
-
-    public boolean isMemoryConsumptionReset() {
-        return memoryConsumptionReset;
-    }
-
-    public void setMemoryConsumptionReset(boolean memoryConsumptionReset) {
-        this.memoryConsumptionReset = memoryConsumptionReset;
-        this.averageMemoryConsumptionReset = memoryConsumptionReset;
-        this.gradientMemoryConsumptionReset = memoryConsumptionReset;
-        this.secondDerivativeMemoryConsumptionRest = memoryConsumptionReset;
-    }
-
-
-    public float getAverageLoadAverage() {
-        return loadAverage.getAverage();
-    }
-
-    public void setAverageLoadAverage(float averageLoadAverage) {
-        loadAverage.setAverage(averageLoadAverage);
-        averageLoadAverageReset = true;
-        if(secondDerivativeLoadAverageRest && gradientLoadAverageReset){
-            loadAverageReset = true;
-            if(log.isDebugEnabled()){
-                log.debug(String.format("Load average stats are reset, ready 
to do scale check [network partition] %s"
-                        , this.id));
-            }
-        }
-    }
-
-    public float getLoadAverageSecondDerivative() {
-        return loadAverage.getSecondDerivative();
-    }
-
-    public void setLoadAverageSecondDerivative(float 
loadAverageSecondDerivative) {
-        loadAverage.setSecondDerivative(loadAverageSecondDerivative);
-        secondDerivativeLoadAverageRest = true;
-        if(averageLoadAverageReset && gradientLoadAverageReset){
-            loadAverageReset = true;
-            if(log.isDebugEnabled()){
-                log.debug(String.format("Load average stats are reset, ready 
to do scale check [network partition] %s"
-                        , this.id));
-            }
-        }
-    }
-
-    public float getLoadAverageGradient() {
-        return loadAverage.getGradient();
-    }
-
-    public void setLoadAverageGradient(float loadAverageGradient) {
-        loadAverage.setGradient(loadAverageGradient);
-        gradientLoadAverageReset = true;
-        if(secondDerivativeLoadAverageRest && averageLoadAverageReset){
-            loadAverageReset = true;
-            if(log.isDebugEnabled()){
-                log.debug(String.format("Load average stats are reset, ready 
to do scale check [network partition] %s"
-                        , this.id));
-            }
-        }
-    }
-
-    public boolean isLoadAverageReset() {
-        return loadAverageReset;
-    }
-
-    public void setLoadAverageReset(boolean loadAverageReset) {
-        this.loadAverageReset = loadAverageReset;
-        this.averageLoadAverageReset = loadAverageReset;
-        this.gradientLoadAverageReset = loadAverageReset;
-        this.secondDerivativeLoadAverageRest = loadAverageReset;
-    }
-
-
-
     public String getId() {
         return id;
     }
@@ -380,14 +160,14 @@ public class NetworkPartitionContext implements 
Serializable{
     }
 
     public int getNonTerminatedMemberCountOfPartition(String partitionId) {
-        if(partitionCtxts.containsKey(partitionId)){
+        if (partitionCtxts.containsKey(partitionId)) {
             return getPartitionCtxt(partitionId).getNonTerminatedMemberCount();
         }
         return 0;
     }
 
     public int getActiveMemberCount(String currentPartitionId) {
-        if(partitionCtxts.containsKey(currentPartitionId)){
+        if (partitionCtxts.containsKey(currentPartitionId)) {
             return getPartitionCtxt(currentPartitionId).getActiveMemberCount();
         }
         return 0;
@@ -400,6 +180,7 @@ public class NetworkPartitionContext implements 
Serializable{
     public void resetScaleDownRequestsCount() {
         this.scaleDownRequestsCount = 0;
     }
+
     public void increaseScaleDownRequestsCount() {
         this.scaleDownRequestsCount += 1;
     }
@@ -419,4 +200,17 @@ public class NetworkPartitionContext implements 
Serializable{
     public void setRequiredInstanceCountBasedOnDependencies(int 
requiredInstanceCountBasedOnDependencies) {
         this.requiredInstanceCountBasedOnDependencies = 
requiredInstanceCountBasedOnDependencies;
     }
-}
\ No newline at end of file
+
+    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.getInstanceId(), 
context);
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ParentComponentLevelNetworkPartitionContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ParentComponentLevelNetworkPartitionContext.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ParentComponentLevelNetworkPartitionContext.java
new file mode 100644
index 0000000..e9ca470
--- /dev/null
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ParentComponentLevelNetworkPartitionContext.java
@@ -0,0 +1,222 @@
+/*
+ * 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.policy.model.LoadAverage;
+import org.apache.stratos.autoscaler.policy.model.MemoryConsumption;
+import org.apache.stratos.autoscaler.policy.model.RequestsInFlight;
+import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
+import org.apache.stratos.messaging.domain.instance.context.InstanceContext;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Holds runtime data of a network partition.
+ *
+ */
+public class ParentComponentLevelNetworkPartitionContext extends 
NetworkPartitionContext implements Serializable {
+    private static final Log log = 
LogFactory.getLog(ParentComponentLevelNetworkPartitionContext.class);
+    private final String id;
+    private int scaleDownRequestsCount = 0;
+    private float averageRequestsServedPerInstance;
+
+    private int minInstanceCount = 0, maxInstanceCount = 0;
+    private int requiredInstanceCountBasedOnStats;
+    private int requiredInstanceCountBasedOnDependencies;
+
+    private Map<String, InstanceContext> instanceIdToInstanceContextMap;
+
+
+    private final String partitionAlgorithm;
+
+    private final Partition[] partitions;
+
+    //details required for partition selection algorithms
+    private int currentPartitionIndex;
+
+    //partitions of this network partition
+    private final Map<String, PartitionContext> partitionCtxts;
+
+    public ParentComponentLevelNetworkPartitionContext(String id, String 
partitionAlgo, Partition[] partitions) {
+
+        super(id, partitionAlgo, partitions);
+        this.id = id;
+        this.partitionAlgorithm = partitionAlgo;
+        if (partitions == null) {
+            this.partitions = new Partition[0];
+        } else {
+            this.partitions = Arrays.copyOf(partitions, partitions.length);
+        }
+        partitionCtxts = new HashMap<String, PartitionContext>();
+        for (Partition partition : partitions) {
+            minInstanceCount += partition.getPartitionMin();
+            maxInstanceCount += partition.getPartitionMax();
+        }
+        requiredInstanceCountBasedOnStats = minInstanceCount;
+        requiredInstanceCountBasedOnDependencies = minInstanceCount;
+        instanceIdToInstanceContextMap = new HashMap<String, 
InstanceContext>();
+
+    }
+
+    public int getMinInstanceCount() {
+        return minInstanceCount;
+    }
+
+    public void setMinInstanceCount(int minInstanceCount) {
+        this.minInstanceCount = minInstanceCount;
+    }
+
+    public int getMaxInstanceCount() {
+        return maxInstanceCount;
+    }
+
+    public void setMaxInstanceCount(int maxInstanceCount) {
+        this.maxInstanceCount = maxInstanceCount;
+    }
+
+    public int hashCode() {
+
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
+        return result;
+
+    }
+
+    public boolean equals(final Object obj) {
+
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (!(obj instanceof ParentComponentLevelNetworkPartitionContext)) {
+            return false;
+        }
+        final ParentComponentLevelNetworkPartitionContext other = 
(ParentComponentLevelNetworkPartitionContext) obj;
+        if (this.id == null) {
+            if (other.id != null) {
+                return false;
+            }
+        } else if (!this.id.equals(other.id)) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "NetworkPartitionContext [id=" + id + "partitionAlgorithm=" + 
partitionAlgorithm + ", minInstanceCount=" +
+                minInstanceCount + ", maxInstanceCount=" + maxInstanceCount + 
"]";
+    }
+
+    public int getCurrentPartitionIndex() {
+        return currentPartitionIndex;
+    }
+
+    public void setCurrentPartitionIndex(int currentPartitionIndex) {
+        this.currentPartitionIndex = currentPartitionIndex;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public Map<String, PartitionContext> getPartitionCtxts() {
+        return partitionCtxts;
+    }
+
+    public PartitionContext getPartitionCtxt(String partitionId) {
+        return partitionCtxts.get(partitionId);
+    }
+
+    public void addPartitionContext(PartitionContext partitionContext) {
+        partitionCtxts.put(partitionContext.getPartitionId(), 
partitionContext);
+    }
+
+    public String getPartitionAlgorithm() {
+        return partitionAlgorithm;
+    }
+
+    public Partition[] getPartitions() {
+        return partitions;
+    }
+
+    public int getNonTerminatedMemberCountOfPartition(String partitionId) {
+        if (partitionCtxts.containsKey(partitionId)) {
+            return getPartitionCtxt(partitionId).getNonTerminatedMemberCount();
+        }
+        return 0;
+    }
+
+    public int getActiveMemberCount(String currentPartitionId) {
+        if (partitionCtxts.containsKey(currentPartitionId)) {
+            return getPartitionCtxt(currentPartitionId).getActiveMemberCount();
+        }
+        return 0;
+    }
+
+    public int getScaleDownRequestsCount() {
+        return scaleDownRequestsCount;
+    }
+
+    public void resetScaleDownRequestsCount() {
+        this.scaleDownRequestsCount = 0;
+    }
+
+    public void increaseScaleDownRequestsCount() {
+        this.scaleDownRequestsCount += 1;
+    }
+
+    public float getRequiredInstanceCountBasedOnStats() {
+        return requiredInstanceCountBasedOnStats;
+    }
+
+    public void setRequiredInstanceCountBasedOnStats(int 
requiredInstanceCountBasedOnStats) {
+        this.requiredInstanceCountBasedOnStats = 
requiredInstanceCountBasedOnStats;
+    }
+
+    public int getRequiredInstanceCountBasedOnDependencies() {
+        return requiredInstanceCountBasedOnDependencies;
+    }
+
+    public void setRequiredInstanceCountBasedOnDependencies(int 
requiredInstanceCountBasedOnDependencies) {
+        this.requiredInstanceCountBasedOnDependencies = 
requiredInstanceCountBasedOnDependencies;
+    }
+
+    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.getInstanceId(), 
context);
+
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMClusterContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMClusterContext.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMClusterContext.java
index 1c031a5..b492d76 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMClusterContext.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMClusterContext.java
@@ -33,12 +33,12 @@ public class VMClusterContext extends 
AbstractClusterContext {
     private static final Log log = LogFactory.getLog(VMClusterContext.class);
 
     // Map<NetworkpartitionId, Network Partition Context>
-    protected Map<String, NetworkPartitionContext> networkPartitionCtxts;
+    protected Map<String, ClusterLevelNetworkPartitionContext> 
networkPartitionCtxts;
     protected DeploymentPolicy deploymentPolicy;
     protected AutoscalePolicy autoscalePolicy;
 
     public VMClusterContext(String clusterId, String serviceId, 
AutoscalePolicy autoscalePolicy, DeploymentPolicy deploymentPolicy,
-                            Map<String, NetworkPartitionContext> 
networkPartitionCtxts) {
+                            Map<String, ClusterLevelNetworkPartitionContext> 
networkPartitionCtxts) {
 
         super(clusterId, serviceId);
         this.deploymentPolicy = deploymentPolicy;
@@ -47,7 +47,7 @@ public class VMClusterContext extends AbstractClusterContext {
 
     }
 
-    public Map<String, NetworkPartitionContext> getNetworkPartitionCtxts(){
+    public Map<String, ClusterLevelNetworkPartitionContext> 
getNetworkPartitionCtxts(){
         return networkPartitionCtxts;
     }
 
@@ -67,11 +67,11 @@ public class VMClusterContext extends 
AbstractClusterContext {
         this.autoscalePolicy = autoscalePolicy;
     }
 
-    public NetworkPartitionContext getNetworkPartitionCtxt(String 
networkPartitionId) {
+    public ClusterLevelNetworkPartitionContext getNetworkPartitionCtxt(String 
networkPartitionId) {
         return networkPartitionCtxts.get(networkPartitionId);
     }
 
-    public void setPartitionCtxt(Map<String, NetworkPartitionContext> 
partitionCtxt) {
+    public void setPartitionCtxt(Map<String, 
ClusterLevelNetworkPartitionContext> partitionCtxt) {
         this.networkPartitionCtxts = partitionCtxt;
     }
 
@@ -79,15 +79,15 @@ public class VMClusterContext extends 
AbstractClusterContext {
         return networkPartitionCtxts.containsKey(partitionId);
     }
 
-    public void addNetworkPartitionCtxt(NetworkPartitionContext ctxt) {
+    public void addNetworkPartitionCtxt(ClusterLevelNetworkPartitionContext 
ctxt) {
         this.networkPartitionCtxts.put(ctxt.getId(), ctxt);
     }
 
-    public NetworkPartitionContext getPartitionCtxt(String id) {
+    public ClusterLevelNetworkPartitionContext getPartitionCtxt(String id) {
         return this.networkPartitionCtxts.get(id);
     }
 
-    public NetworkPartitionContext getNetworkPartitionCtxt(Member member) {
+    public ClusterLevelNetworkPartitionContext getNetworkPartitionCtxt(Member 
member) {
         log.info("***** getNetworkPartitionCtxt " + 
member.getNetworkPartitionId());
         String networkPartitionId = member.getNetworkPartitionId();
         if (networkPartitionCtxts.containsKey(networkPartitionId)) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMServiceClusterContext.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMServiceClusterContext.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMServiceClusterContext.java
index 6b9fefd..6c9d359 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMServiceClusterContext.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMServiceClusterContext.java
@@ -22,7 +22,6 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
 import org.apache.stratos.autoscaler.policy.model.DeploymentPolicy;
-import org.apache.stratos.messaging.domain.topology.Member;
 
 import java.util.Map;
 
@@ -36,7 +35,7 @@ public class VMServiceClusterContext extends VMClusterContext 
{
     protected AutoscalePolicy autoscalePolicy;
 
     public VMServiceClusterContext(String clusterId, String serviceId, 
AutoscalePolicy autoscalePolicy, DeploymentPolicy deploymentPolicy,
-                                   Map<String, NetworkPartitionContext> 
networkPartitionCtxts) {
+                                   Map<String, 
ClusterLevelNetworkPartitionContext> networkPartitionCtxts) {
 
         super(clusterId, serviceId, autoscalePolicy, deploymentPolicy, 
networkPartitionCtxts);
         this.autoscalePolicy = autoscalePolicy;

http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/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 8ae0fb6..c27cc1e 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
@@ -46,18 +46,18 @@ public interface AutoscaleAlgorithm {
 
     /**
      * Returns a {@link Partition} to scale up from the given {@link 
PartitionGroup} according to algorithm
-     * @param networkPartitionContext {@link 
org.apache.stratos.autoscaler.NetworkPartitionContext} which need the {@link 
Partition}
+     * @param clusterLevelNetworkPartitionContext {@link 
org.apache.stratos.autoscaler.ClusterLevelNetworkPartitionContext} 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(NetworkPartitionContext 
networkPartitionContext, String clusterId);
+    public Partition getNextScaleUpPartition(NetworkPartitionContext 
clusterLevelNetworkPartitionContext, String clusterId);
 
 
     /**
      * Returns a {@link Partition} to scale down from the given {@link 
PartitionGroup} according to algorithm
-     * @param networkPartitionContext {@link 
org.apache.stratos.autoscaler.NetworkPartitionContext} which need the {@link 
Partition}
+     * @param clusterLevelNetworkPartitionContext {@link 
org.apache.stratos.autoscaler.ClusterLevelNetworkPartitionContext} 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(NetworkPartitionContext 
networkPartitionContext, String clusterId);
+    public Partition getNextScaleDownPartition(NetworkPartitionContext 
clusterLevelNetworkPartitionContext, String clusterId);
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/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 e234713..afae0e8 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
@@ -35,7 +35,7 @@ import java.util.List;
 
 /**
  * This class is used for selecting a {@link Partition} one after another and 
checking availability of
- * partitions of a {@link NetworkPartitionContext}
+ * partitions of a {@link 
org.apache.stratos.autoscaler.ClusterLevelNetworkPartitionContext}
  * One after another means it completes partitions in the order defined in
  * {@link org.apache.stratos.autoscaler.policy.model.DeploymentPolicy}, and go 
to next  if current one
  * reached the max limit
@@ -44,23 +44,23 @@ public class OneAfterAnother implements AutoscaleAlgorithm {
 
     private static final Log log = LogFactory.getLog(OneAfterAnother.class);
 
-    public Partition getNextScaleUpPartition(NetworkPartitionContext 
networkPartitionContext, String clusterId) {
+    public Partition getNextScaleUpPartition(NetworkPartitionContext 
clusterLevelNetworkPartitionContext, String clusterId) {
 
         try {
             if (log.isDebugEnabled())
                 log.debug(String.format("Searching for a partition to up 
[network partition] %s",
-                        networkPartitionContext.getId()))  ;
-            int currentPartitionIndex = 
networkPartitionContext.getCurrentPartitionIndex();
-            List<?> partitions = 
Arrays.asList(networkPartitionContext.getPartitions());
+                        clusterLevelNetworkPartitionContext.getId()))  ;
+            int currentPartitionIndex = 
clusterLevelNetworkPartitionContext.getCurrentPartitionIndex();
+            List<?> partitions = 
Arrays.asList(clusterLevelNetworkPartitionContext.getPartitions());
             int noOfPartitions = partitions.size();
 
 
             for (int i = currentPartitionIndex; i < noOfPartitions; i++) {
                 if (partitions.get(currentPartitionIndex) instanceof 
Partition) {
-                    currentPartitionIndex = 
networkPartitionContext.getCurrentPartitionIndex();
+                    currentPartitionIndex = 
clusterLevelNetworkPartitionContext.getCurrentPartitionIndex();
                     Partition currentPartition = (Partition) 
partitions.get(currentPartitionIndex);
                     String currentPartitionId = currentPartition.getId();
-                    int nonTerminatedMemberCountOfPartition = 
networkPartitionContext.getNonTerminatedMemberCountOfPartition(currentPartitionId);
+                    int nonTerminatedMemberCountOfPartition = 
clusterLevelNetworkPartitionContext.getNonTerminatedMemberCountOfPartition(currentPartitionId);
                     if (nonTerminatedMemberCountOfPartition < 
currentPartition.getPartitionMax()) {
                         // current partition is free
                         if (log.isDebugEnabled())
@@ -75,37 +75,37 @@ public class OneAfterAnother implements AutoscaleAlgorithm {
                             return null;
                         }
 
-                        
networkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex + 1);
+                        
clusterLevelNetworkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex
 + 1);
                     }
                 }
             }
 
             if (log.isDebugEnabled())
-                log.debug(String.format("No free partition found at network 
partition %s" , networkPartitionContext));
+                log.debug(String.format("No free partition found at network 
partition %s" , clusterLevelNetworkPartitionContext));
         } catch (Exception e) {
             log.error("Error occurred while searching for next scale up 
partition", e);
         }
         return null;
     }
 
-    public Partition getNextScaleDownPartition(NetworkPartitionContext 
networkPartitionContext, String clusterId) {
+    public Partition getNextScaleDownPartition(NetworkPartitionContext 
clusterLevelNetworkPartitionContext, String clusterId) {
 
         try {
 
             if (log.isDebugEnabled())
                 log.debug(String.format("Searching for a partition to scale 
down [network partition] %s",
-                        networkPartitionContext.getId()))  ;
-            int currentPartitionIndex = 
networkPartitionContext.getCurrentPartitionIndex();
-            List<?> partitions = 
Arrays.asList(networkPartitionContext.getPartitions());
+                        clusterLevelNetworkPartitionContext.getId()))  ;
+            int currentPartitionIndex = 
clusterLevelNetworkPartitionContext.getCurrentPartitionIndex();
+            List<?> partitions = 
Arrays.asList(clusterLevelNetworkPartitionContext.getPartitions());
 
             for (int i = currentPartitionIndex; i >= 0; i--) {
                 if (partitions.get(currentPartitionIndex) instanceof 
Partition) {
-                    currentPartitionIndex = 
networkPartitionContext.getCurrentPartitionIndex();
+                    currentPartitionIndex = 
clusterLevelNetworkPartitionContext.getCurrentPartitionIndex();
                     Partition currentPartition = (Partition) 
partitions.get(currentPartitionIndex);
                     String currentPartitionId = currentPartition.getId();
 
                     // has more than minimum instances.
-                    int currentlyActiveMemberCount = 
networkPartitionContext.getActiveMemberCount(currentPartitionId);
+                    int currentlyActiveMemberCount = 
clusterLevelNetworkPartitionContext.getActiveMemberCount(currentPartitionId);
                     if ( currentlyActiveMemberCount > 
currentPartition.getPartitionMin()) {
                         // current partition is free
                         if (log.isDebugEnabled())
@@ -122,13 +122,13 @@ public class OneAfterAnother implements 
AutoscaleAlgorithm {
                         }
                         // Set next partition as current partition in 
Autoscaler Context
                         currentPartitionIndex = currentPartitionIndex - 1;
-                        
networkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex);
+                        
clusterLevelNetworkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex);
                     }
                 }
 
             }
             if (log.isDebugEnabled())
-                log.debug("No space found in this network partition " + 
networkPartitionContext.getId());
+                log.debug("No space found in this network partition " + 
clusterLevelNetworkPartitionContext.getId());
         } catch (Exception e) {
             log.error("Error occurred while searching for scale down 
partition", e);
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/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 9f54039..db24696 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
@@ -29,38 +29,38 @@ 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 
org.apache.stratos.autoscaler.NetworkPartitionContext}
+ * {@link Partition}s of a {@link 
org.apache.stratos.autoscaler.ClusterLevelNetworkPartitionContext}
  *
 */
 public class RoundRobin implements AutoscaleAlgorithm{
 
        private static final Log log = LogFactory.getLog(RoundRobin.class);
 
-    public Partition getNextScaleUpPartition(NetworkPartitionContext 
networkPartitionContext, String clusterId){
+    public Partition getNextScaleUpPartition(NetworkPartitionContext 
clusterLevelNetworkPartitionContext, String clusterId){
         try{
 
             if (log.isDebugEnabled())
                 log.debug(String.format("Searching for a partition to scale up 
[network partition] %s",
-                        networkPartitionContext.getId()))  ;
-            List<?> partitions = 
Arrays.asList(networkPartitionContext.getPartitions());
+                        clusterLevelNetworkPartitionContext.getId()))  ;
+            List<?> partitions = 
Arrays.asList(clusterLevelNetworkPartitionContext.getPartitions());
             int noOfPartitions = partitions.size();
 
             for(int i=0; i < noOfPartitions; i++)
             {
-                int currentPartitionIndex = 
networkPartitionContext.getCurrentPartitionIndex();
+                int currentPartitionIndex = 
clusterLevelNetworkPartitionContext.getCurrentPartitionIndex();
                 if (partitions.get(currentPartitionIndex) instanceof 
Partition) {
                     Partition currentPartition = (Partition) 
partitions.get(currentPartitionIndex);
                     String currentPartitionId =  currentPartition.getId();
 
                     // point to next partition
                     int nextPartitionIndex = currentPartitionIndex  == 
noOfPartitions - 1 ? 0 : currentPartitionIndex+1;
-                    
networkPartitionContext.setCurrentPartitionIndex(nextPartitionIndex);
-                    int nonTerminatedMemberCountOfPartition = 
networkPartitionContext.getNonTerminatedMemberCountOfPartition(currentPartitionId);
+                    
clusterLevelNetworkPartitionContext.setCurrentPartitionIndex(nextPartitionIndex);
+                    int nonTerminatedMemberCountOfPartition = 
clusterLevelNetworkPartitionContext.getNonTerminatedMemberCountOfPartition(currentPartitionId);
                     if(nonTerminatedMemberCountOfPartition < 
currentPartition.getPartitionMax()){
                         // current partition is free
                         if (log.isDebugEnabled())
                             log.debug(String.format("A free space found for 
scale up in partition %s [current] %s [max] %s",
-                                    currentPartitionId, 
networkPartitionContext.getNonTerminatedMemberCountOfPartition(currentPartitionId),
+                                    currentPartitionId, 
clusterLevelNetworkPartitionContext.getNonTerminatedMemberCountOfPartition(currentPartitionId),
                                                                     
currentPartition.getPartitionMax()))  ;
                         return currentPartition;
                     }
@@ -73,7 +73,7 @@ public class RoundRobin implements AutoscaleAlgorithm{
 
             // none of the partitions were free.
             if(log.isDebugEnabled()) {
-                log.debug("No free partition found at network partition " + 
networkPartitionContext);
+                log.debug("No free partition found at network partition " + 
clusterLevelNetworkPartitionContext);
            }
         } catch (Exception e) {
             log.error("Error occurred while searching for next scale up 
partition", e);
@@ -83,16 +83,16 @@ public class RoundRobin implements AutoscaleAlgorithm{
 
 
        @Override
-    public Partition getNextScaleDownPartition(NetworkPartitionContext 
networkPartitionContext, String clusterId) {
+    public Partition getNextScaleDownPartition(NetworkPartitionContext 
clusterLevelNetworkPartitionContext, String clusterId) {
         try{
             if (log.isDebugEnabled())
                 log.debug(String.format("Searching for a partition to scale up 
[network partition] %s",
-                        networkPartitionContext.getId()))  ;
-            List<?> partitions = 
Arrays.asList(networkPartitionContext.getPartitions());
+                        clusterLevelNetworkPartitionContext.getId()))  ;
+            List<?> partitions = 
Arrays.asList(clusterLevelNetworkPartitionContext.getPartitions());
             int noOfPartitions = partitions.size();
 
             for (int i = 0; i < noOfPartitions; i++) {
-                int currentPartitionIndex = 
networkPartitionContext.getCurrentPartitionIndex();
+                int currentPartitionIndex = 
clusterLevelNetworkPartitionContext.getCurrentPartitionIndex();
                 // point to next partition
                 if (currentPartitionIndex == 0) {
 
@@ -103,7 +103,7 @@ public class RoundRobin implements AutoscaleAlgorithm{
                 }
 
                 // Set next partition as current partition in Autoscaler 
Context
-                
networkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex);
+                
clusterLevelNetworkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex);
 
                 if (partitions.get(currentPartitionIndex) instanceof 
Partition) {
 
@@ -111,7 +111,7 @@ public class RoundRobin implements AutoscaleAlgorithm{
                     String currentPartitionId = currentPartition.getId();
 
                     // has more than minimum instances.
-                    int currentlyActiveMemberCount = 
networkPartitionContext.getActiveMemberCount(currentPartitionId);
+                    int currentlyActiveMemberCount = 
clusterLevelNetworkPartitionContext.getActiveMemberCount(currentPartitionId);
                     if (currentlyActiveMemberCount > 
currentPartition.getPartitionMin()) {
                         // current partition is free
                         if (log.isDebugEnabled())
@@ -133,7 +133,7 @@ public class RoundRobin implements AutoscaleAlgorithm{
 
             if (log.isDebugEnabled())
                 log.debug("No partition found for scale down at network 
partition " +
-                          networkPartitionContext.getId());
+                          clusterLevelNetworkPartitionContext.getId());
             // none of the partitions were free.
 
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/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 4dcff2a..31f5763 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
@@ -78,7 +78,8 @@ public class ApplicationBuilder {
         ApplicationsEventPublisher.sendApplicationCreatedEvent(application);
     }
 
-    public static void handleApplicationInstanceCreatedEvent(String appId, 
String instanceId) {
+    public static void handleApplicationInstanceCreatedEvent(String appId, 
String instanceId,
+                                                             String 
networkPartitionId) {
         if (log.isDebugEnabled()) {
             log.debug("Handling application activation event: [application-id] 
" + appId);
         }
@@ -99,6 +100,7 @@ public class ApplicationBuilder {
             //setting the status, persist and publish
             ApplicationInstanceContext context = new 
ApplicationInstanceContext(appId, instanceId);
             context.setStatus(status);
+            context.setNetworkPartitionId(networkPartitionId);
             application.addInstanceContext(instanceId, context);
             //updateApplicationMonitor(appId, status);
             ApplicationHolder.persistApplication(application);

http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/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 63e7055..6d91db3 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
@@ -546,7 +546,13 @@ public class AutoscalerTopologyEventReceiver implements 
Runnable {
                         log.debug("application monitor is going to be started 
for [application] " +
                                 appId);
                     }
-                    applicationMonitor = 
ApplicationMonitorFactory.getApplicationMonitor(appId);
+                    try {
+                        applicationMonitor = 
ApplicationMonitorFactory.getApplicationMonitor(appId);
+                    } catch (PolicyValidationException e) {
+                        String msg = "Application monitor creation failed for 
Application: ";
+                        log.warn(msg, e);
+                        retries--;
+                    }
                     long end = System.currentTimeMillis();
                     log.info("Time taken to start app monitor: " + (end - 
start) / 1000);
                     success = true;

http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java
index 77832b0..1c563ee 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java
@@ -20,6 +20,12 @@ package org.apache.stratos.autoscaler.monitor;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.Constants;
+import org.apache.stratos.autoscaler.ClusterLevelNetworkPartitionContext;
+import 
org.apache.stratos.autoscaler.ParentComponentLevelNetworkPartitionContext;
+import org.apache.stratos.autoscaler.algorithm.AutoscaleAlgorithm;
+import org.apache.stratos.autoscaler.algorithm.OneAfterAnother;
+import org.apache.stratos.autoscaler.algorithm.RoundRobin;
 import org.apache.stratos.autoscaler.applications.ApplicationHolder;
 import org.apache.stratos.autoscaler.applications.dependency.DependencyBuilder;
 import org.apache.stratos.autoscaler.applications.dependency.DependencyTree;
@@ -27,7 +33,6 @@ import 
org.apache.stratos.autoscaler.applications.dependency.context.Application
 import 
org.apache.stratos.autoscaler.applications.dependency.context.ClusterChildContext;
 import 
org.apache.stratos.autoscaler.applications.dependency.context.GroupChildContext;
 import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
-import org.apache.stratos.autoscaler.client.CloudControllerClient;
 import 
org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher;
 import org.apache.stratos.autoscaler.exception.DependencyBuilderException;
 import org.apache.stratos.autoscaler.exception.PartitionValidationException;
@@ -62,11 +67,15 @@ public abstract class ParentComponentMonitor extends 
Monitor {
     protected List<String> inactiveMonitorsList;
     //terminating monitors list
     protected List<String> terminatingMonitorsList;
+    //network partition contexts
+    protected Map<String, ParentComponentLevelNetworkPartitionContext> 
networkPartitionCtxts;
+
 
     public ParentComponentMonitor(ParentComponent component) throws 
DependencyBuilderException {
         aliasToActiveMonitorsMap = new HashMap<String, Monitor>();
         inactiveMonitorsList = new ArrayList<String>();
         terminatingMonitorsList = new ArrayList<String>();
+        networkPartitionCtxts = new HashMap<String, 
ParentComponentLevelNetworkPartitionContext>();
         //clusterIdToClusterMonitorsMap = new HashMap<String, 
AbstractClusterMonitor>();
         this.id = component.getUniqueIdentifier();
         //Building the startup dependencies for this monitor within the 
immediate children
@@ -496,6 +505,27 @@ public abstract class ParentComponentMonitor extends 
Monitor {
         this.terminatingMonitorsList = terminatingMonitorsList;
     }
 
+    public Map<String, ParentComponentLevelNetworkPartitionContext> 
getNetworkPartitionCtxts() {
+        return networkPartitionCtxts;
+    }
+
+    public void setNetworkPartitionCtxts(Map<String, 
ParentComponentLevelNetworkPartitionContext> networkPartitionCtxts) {
+        this.networkPartitionCtxts = networkPartitionCtxts;
+    }
+
+    public void 
addNetworkPartitionContext(ParentComponentLevelNetworkPartitionContext 
clusterLevelNetworkPartitionContext) {
+        
this.networkPartitionCtxts.put(clusterLevelNetworkPartitionContext.getId(), 
clusterLevelNetworkPartitionContext);
+    }
+
+    public InstanceContext getInstanceContext(String instanceId) {
+        for(ParentComponentLevelNetworkPartitionContext context : 
this.networkPartitionCtxts.values()) {
+            
if(context.getInstanceIdToInstanceContextMap().containsKey(instanceId)) {
+                return 
context.getInstanceIdToInstanceContextMap().get(instanceId);
+            }
+        }
+        return null;
+    }
+
     private class MonitorAdder implements Runnable {
         private ApplicationChildContext context;
         private ParentComponentMonitor parent;
@@ -566,4 +596,24 @@ public abstract class ParentComponentMonitor extends 
Monitor {
         }
     }
 
+    public AutoscaleAlgorithm getAutoscaleAlgorithm(String partitionAlgorithm) 
{
+        AutoscaleAlgorithm autoscaleAlgorithm = null;
+        if (log.isDebugEnabled()) {
+            log.debug(String.format("Partition algorithm is ", 
partitionAlgorithm));
+        }
+        if (Constants.ROUND_ROBIN_ALGORITHM_ID.equals(partitionAlgorithm)) {
+
+            autoscaleAlgorithm = new RoundRobin();
+        } else if 
(Constants.ONE_AFTER_ANOTHER_ALGORITHM_ID.equals(partitionAlgorithm)) {
+
+            autoscaleAlgorithm = new OneAfterAnother();
+        } else {
+            if (log.isErrorEnabled()) {
+                log.error(String.format("Partition algorithm %s could not be 
identified !", partitionAlgorithm));
+            }
+        }
+        return autoscaleAlgorithm;
+    }
+
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java
index 6d9ffdc..096cf06 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java
@@ -20,8 +20,10 @@ package org.apache.stratos.autoscaler.monitor.application;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import 
org.apache.stratos.autoscaler.ParentComponentLevelNetworkPartitionContext;
 import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
 import org.apache.stratos.autoscaler.exception.DependencyBuilderException;
+import org.apache.stratos.autoscaler.exception.PolicyValidationException;
 import org.apache.stratos.autoscaler.exception.TopologyInConsistentException;
 import org.apache.stratos.autoscaler.monitor.Monitor;
 import org.apache.stratos.autoscaler.monitor.MonitorStatusEventBuilder;
@@ -29,6 +31,9 @@ import 
org.apache.stratos.autoscaler.monitor.ParentComponentMonitor;
 import org.apache.stratos.autoscaler.monitor.events.ApplicationStatusEvent;
 import org.apache.stratos.autoscaler.monitor.events.MonitorScalingEvent;
 import org.apache.stratos.autoscaler.monitor.events.MonitorStatusEvent;
+import org.apache.stratos.autoscaler.partition.PartitionGroup;
+import org.apache.stratos.autoscaler.policy.PolicyManager;
+import org.apache.stratos.autoscaler.policy.model.DeploymentPolicy;
 import org.apache.stratos.messaging.domain.applications.Application;
 import org.apache.stratos.messaging.domain.applications.ApplicationStatus;
 import org.apache.stratos.messaging.domain.applications.GroupStatus;
@@ -51,7 +56,7 @@ public class ApplicationMonitor extends 
ParentComponentMonitor {
         //setting the appId for the application
         this.appId = application.getUniqueIdentifier();
         //starting the first set of dependencies from its children
-        startMinimumDependencies(application);
+        //TODO startMinimumDependencies(application);
 
     }
 
@@ -166,8 +171,8 @@ public class ApplicationMonitor extends 
ParentComponentMonitor {
 
     }
 
-    private void startMinimumDependencies(Application application)
-            throws TopologyInConsistentException {
+    public void startMinimumDependencies(Application application)
+            throws TopologyInConsistentException, PolicyValidationException {
         //There will be one application instance
         if (application.getInstanceContextCount() > 0) {
             startDependency(application);
@@ -178,16 +183,44 @@ public class ApplicationMonitor extends 
ParentComponentMonitor {
     }
 
     private void createInstanceAndStartDependency(Application application)
-            throws TopologyInConsistentException {
-        String instanceId = createApplicationInstance(application);
+            throws TopologyInConsistentException, PolicyValidationException {
         List<String> instanceIds = new ArrayList<String>();
-        instanceIds.add(instanceId);
+        String deploymentPolicyName = application.getDeploymentPolicy();
+        if (deploymentPolicyName == null) {
+            String msg = "Deployment Policy is not specified to the 
[Application]:" + appId;
+            log.error(msg);
+            throw new PolicyValidationException(msg);
+        }
+
+        DeploymentPolicy deploymentPolicy =
+                PolicyManager.getInstance()
+                        .getDeploymentPolicy(deploymentPolicyName);
+        if (deploymentPolicy == null) {
+            if (deploymentPolicy == null) {
+                String msg = "Deployment policy is null: [policy-name] " + 
deploymentPolicyName;
+                log.error(msg);
+                throw new PolicyValidationException(msg);
+            }
+        }
+        String instanceId;
+        for (PartitionGroup partitionGroup : 
deploymentPolicy.getPartitionGroups()) {
+            instanceId = createApplicationInstance(application, 
partitionGroup.getId());
+            ParentComponentLevelNetworkPartitionContext context = new 
ParentComponentLevelNetworkPartitionContext(partitionGroup.getId(),
+                    partitionGroup.getPartitionAlgo(),
+                    partitionGroup.getPartitions());
+            
context.addInstanceContext(application.getInstanceContexts(instanceId));
+            this.addNetworkPartitionContext(context);
+
+            instanceIds.add(instanceId);
+        }
         startDependency(application, instanceIds);
+
+
     }
 
-    private String createApplicationInstance(Application application) {
+    private String createApplicationInstance(Application application, String 
networkPartitionId) {
         String instanceId = this.generateInstanceId(application);
-        ApplicationBuilder.handleApplicationInstanceCreatedEvent(appId, 
instanceId);
+        ApplicationBuilder.handleApplicationInstanceCreatedEvent(appId, 
instanceId, networkPartitionId);
         return instanceId;
     }
 

Reply via email to