You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by re...@apache.org on 2014/12/01 19:40:40 UTC

stratos git commit: fixing monitor starts up issue with global deployment policy

Repository: stratos
Updated Branches:
  refs/heads/master d0214f479 -> 7ccfa6f55


fixing monitor starts up issue with global deployment policy


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

Branch: refs/heads/master
Commit: 7ccfa6f55cc747ff79d184b4afa76339914779cb
Parents: d0214f4
Author: reka <rt...@gmail.com>
Authored: Tue Dec 2 00:09:58 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 2 00:09:58 2014 +0530

----------------------------------------------------------------------
 .../autoscaler/context/InstanceContext.java     |  38 +++++
 .../application/ApplicationInstanceContext.java |  31 +++++
 .../context/cluster/ClusterContextFactory.java  |   8 +-
 .../context/cluster/ClusterInstanceContext.java |  60 +++-----
 .../context/cluster/VMClusterContext.java       |  36 +++--
 .../cluster/VMServiceClusterContext.java        |   1 +
 .../context/group/GroupInstanceContext.java     |  81 +++++++++++
 .../partition/GroupLevelPartitionContext.java   |  18 +--
 ...ApplicationLevelNetworkPartitionContext.java |  15 +-
 .../GroupLevelNetworkPartitionContext.java      |  61 +++-----
 .../AutoscalerTopologyEventReceiver.java        | 138 +++++++++----------
 .../monitor/component/ApplicationMonitor.java   |  18 +--
 .../monitor/component/GroupMonitor.java         |  29 ++--
 .../pojo/policy/deployment/ChildPolicy.java     |  10 ++
 .../policy/deployment/DeploymentPolicy.java     |   9 ++
 15 files changed, 347 insertions(+), 206 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
new file mode 100644
index 0000000..ce23ec3
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
@@ -0,0 +1,38 @@
+/*
+ * 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.context;
+
+/**
+ * This will hold the instances related info.
+ */
+public abstract class InstanceContext {
+    protected String id;
+
+    public InstanceContext(String id) {
+        this.id = id;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/application/ApplicationInstanceContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/application/ApplicationInstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/application/ApplicationInstanceContext.java
new file mode 100644
index 0000000..6606efe
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/application/ApplicationInstanceContext.java
@@ -0,0 +1,31 @@
+/*
+ * 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.context.application;
+
+import org.apache.stratos.autoscaler.context.InstanceContext;
+
+/**
+ * This will hold the application instance related info.
+ */
+public class ApplicationInstanceContext extends InstanceContext {
+
+    public ApplicationInstanceContext(String id) {
+        super(id);
+    }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContextFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContextFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContextFactory.java
index 3c60432..23d703e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContextFactory.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContextFactory.java
@@ -28,7 +28,9 @@ import org.apache.stratos.autoscaler.exception.policy.PolicyValidationException;
 //import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.PartitionManager;
 import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
 import org.apache.stratos.autoscaler.pojo.policy.autoscale.AutoscalePolicy;
+import org.apache.stratos.autoscaler.pojo.policy.deployment.ChildPolicy;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy;
+import org.apache.stratos.autoscaler.util.AutoscalerUtil;
 import org.apache.stratos.cloud.controller.stub.domain.MemberContext;
 import org.apache.stratos.common.Properties;
 import org.apache.stratos.common.Property;
@@ -60,14 +62,14 @@ public class ClusterContextFactory {
         if (log.isDebugEnabled()) {
             log.debug("Autoscaler policy name: " + autoscalePolicyName);
         }
-        String deploymentPolicyName;
         DeploymentPolicy deploymentPolicy;
         ApplicationHolder.acquireReadLock();
         try {
             Application application = ApplicationHolder.getApplications().
                     getApplication(cluster.getAppId());
-            deploymentPolicyName = application.getDeploymentPolicy();
-            deploymentPolicy = PolicyManager.getInstance().getDeploymentPolicy(deploymentPolicyName);
+            deploymentPolicy = PolicyManager.getInstance().getDeploymentPolicy(cluster.getAppId());
+            ChildPolicy policy = deploymentPolicy.
+                    getChildPolicy(AutoscalerUtil.getAliasFromClusterId(cluster.getClusterId()));
         } finally {
             ApplicationHolder.releaseReadLock();
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
index f2c13b9..0c4bf58 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
@@ -20,31 +20,28 @@ package org.apache.stratos.autoscaler.context.cluster;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.context.InstanceContext;
 import org.apache.stratos.autoscaler.context.partition.ClusterLevelPartitionContext;
-import org.apache.stratos.autoscaler.context.partition.GroupLevelPartitionContext;
-import org.apache.stratos.autoscaler.context.partition.PartitionContext;
 import org.apache.stratos.autoscaler.pojo.policy.autoscale.LoadAverage;
 import org.apache.stratos.autoscaler.pojo.policy.autoscale.MemoryConsumption;
 import org.apache.stratos.autoscaler.pojo.policy.autoscale.RequestsInFlight;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ChildLevelPartition;
-import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ChildLevelNetworkPartition;
-import org.apache.stratos.cloud.controller.stub.domain.Partition;
 import org.apache.stratos.messaging.domain.topology.Member;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /*
  * It holds the runtime data of a VM cluster
  */
-public class ClusterInstanceContext {
+public class ClusterInstanceContext extends InstanceContext {
 
     private static final Log log = LogFactory.getLog(ClusterInstanceContext.class);
-    private final String id;
-
-
 
     private final String partitionAlgorithm;
-
+    // Map<PartitionId, Partition Context>
+    protected List<ClusterLevelPartitionContext> partitionCtxts;
     //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
@@ -55,37 +52,25 @@ public class ClusterInstanceContext {
             secondDerivativeLoadAverageRest = false;
     //boolean values to keep whether average requests served per instance parameters are reset or not
     private boolean averageRequestServedPerInstanceReset = false;
-
-
-
     //Following information will keep events details
     private RequestsInFlight requestsInFlight;
     private MemoryConsumption memoryConsumption;
     private LoadAverage loadAverage;
-
     private int scaleDownRequestsCount = 0;
     private float averageRequestsServedPerInstance;
     private float requestsServedPerInstance;
-
     private int minInstanceCount = 0, maxInstanceCount = 0;
     private int requiredInstanceCountBasedOnStats;
     private int requiredInstanceCountBasedOnDependencies;
-
     private int min;
-
-
     //details required for partition selection algorithms
     private int currentPartitionIndex;
-
-    // Map<PartitionId, Partition Context>
-    protected List<ClusterLevelPartitionContext> partitionCtxts;
-
     private ChildLevelPartition[] partitions;
 
     public ClusterInstanceContext(String clusterInstanceId, String partitionAlgo, ChildLevelPartition[] partitions,
                                   int min) {
 
-        this.id = clusterInstanceId;
+        super(clusterInstanceId);
         this.min = min;
         if (partitions == null) {
             this.partitions = new ChildLevelPartition[0];
@@ -107,27 +92,27 @@ public class ClusterInstanceContext {
 
     }
 
-    public List<ClusterLevelPartitionContext> getPartitionCtxts(){
+    public List<ClusterLevelPartitionContext> getPartitionCtxts() {
         return partitionCtxts;
     }
 
-    public ClusterLevelPartitionContext[] getPartitionCtxtsAsAnArray(){
-
-        return partitionCtxts.toArray(new ClusterLevelPartitionContext[0]);
+    public void setPartitionCtxts(List<ClusterLevelPartitionContext> partitionCtxt) {
+        this.partitionCtxts = partitionCtxt;
     }
 
 //    public ClusterLevelPartitionContext getNetworkPartitionCtxt(String PartitionId) {
 //        return partitionCtxts.get(PartitionId);
 //    }
 
-    public void setPartitionCtxts(List<ClusterLevelPartitionContext> partitionCtxt) {
-        this.partitionCtxts = partitionCtxt;
+    public ClusterLevelPartitionContext[] getPartitionCtxtsAsAnArray() {
+
+        return partitionCtxts.toArray(new ClusterLevelPartitionContext[0]);
     }
 
     public boolean partitionCtxtAvailable(String partitionId) {
 
-        for(ClusterLevelPartitionContext partitionContext : partitionCtxts){
-            if(partitionContext.getPartitionId().equals(partitionId)){
+        for (ClusterLevelPartitionContext partitionContext : partitionCtxts) {
+            if (partitionContext.getPartitionId().equals(partitionId)) {
                 return true;
             }
         }
@@ -140,8 +125,8 @@ public class ClusterInstanceContext {
 
     public ClusterLevelPartitionContext getPartitionCtxt(String id) {
 
-        for(ClusterLevelPartitionContext partitionContext : partitionCtxts){
-            if(partitionContext.getPartitionId().equals(id)){
+        for (ClusterLevelPartitionContext partitionContext : partitionCtxts) {
+            if (partitionContext.getPartitionId().equals(id)) {
                 return partitionContext;
             }
         }
@@ -152,8 +137,8 @@ public class ClusterInstanceContext {
         log.info("Getting [Partition] " + member.getPartitionId());
         String partitionId = member.getPartitionId();
 
-        for(ClusterLevelPartitionContext partitionContext : partitionCtxts){
-            if(partitionContext.getPartitionId().equals(partitionId)){
+        for (ClusterLevelPartitionContext partitionContext : partitionCtxts) {
+            if (partitionContext.getPartitionId().equals(partitionId)) {
                 log.info("Returning partition context, of [partition] " + partitionId);
                 return partitionContext;
             }
@@ -390,11 +375,6 @@ public class ClusterInstanceContext {
         this.secondDerivativeLoadAverageRest = loadAverageReset;
     }
 
-
-    public String getId() {
-        return id;
-    }
-
    /* public Map<String, ClusterLevelPartitionContext> getPartitionCtxts() {
         return partitionCtxts;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
index 9fb91ac..3ad1050 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
@@ -27,9 +27,10 @@ import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetwo
 import org.apache.stratos.autoscaler.exception.partition.PartitionValidationException;
 import org.apache.stratos.autoscaler.exception.policy.PolicyValidationException;
 import org.apache.stratos.autoscaler.pojo.policy.autoscale.AutoscalePolicy;
+import org.apache.stratos.autoscaler.pojo.policy.deployment.ChildPolicy;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy;
-import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ChildLevelPartition;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ChildLevelNetworkPartition;
+import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ChildLevelPartition;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.Partition;
 import org.apache.stratos.autoscaler.util.AutoscalerUtil;
 import org.apache.stratos.cloud.controller.stub.domain.MemberContext;
@@ -123,14 +124,17 @@ public class VMClusterContext extends AbstractClusterContext {
             networkPartitionContext = this.networkPartitionCtxts.get(
                     clusterInstance.getNetworkPartitionId());
         }
+
         if (clusterInstance.getPartitionId() != null) {
             //Need to add partition Context based on the given one from the parent
-            networkPartitionContext = addPartition(clusterInstance, cluster,
-                    this.deploymentPolicy, networkPartitionContext);
+            networkPartitionContext = addPartition(clusterInstance, cluster, networkPartitionContext);
 
         } else {
+            ChildPolicy policy = this.deploymentPolicy.
+                    getChildPolicy(
+                            AutoscalerUtil.getAliasFromClusterId(clusterId));
             networkPartitionContext = parseDeploymentPolicy(clusterInstance, cluster,
-                    this.deploymentPolicy, networkPartitionContext);
+                    policy, networkPartitionContext);
         }
         if (!networkPartitionCtxts.containsKey(clusterInstance.getNetworkPartitionId())) {
             this.networkPartitionCtxts.put(clusterInstance.getNetworkPartitionId(),
@@ -146,7 +150,7 @@ public class VMClusterContext extends AbstractClusterContext {
     private ClusterLevelNetworkPartitionContext parseDeploymentPolicy(
             ClusterInstance instance,
             Cluster cluster,
-            DeploymentPolicy deploymentPolicy,
+            ChildPolicy deploymentPolicy,
             ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext)
             throws PolicyValidationException, PartitionValidationException {
         if (log.isDebugEnabled()) {
@@ -159,8 +163,11 @@ public class VMClusterContext extends AbstractClusterContext {
             throw new PolicyValidationException(msg);
         }
 
-        Partition[] allPartitions = deploymentPolicy.getAllPartitions();
-        if (allPartitions == null) {
+        ChildLevelPartition[] childLevelPartitions = deploymentPolicy.
+                getChildLevelNetworkPartition(
+                        clusterLevelNetworkPartitionContext.getId()).
+                getChildLevelPartitions();
+        if (childLevelPartitions == null) {
             String msg =
                     "Partitions are null in deployment policy: [policy-name]: " +
                             deploymentPolicy.getId();
@@ -168,8 +175,13 @@ public class VMClusterContext extends AbstractClusterContext {
             throw new PolicyValidationException(msg);
         }
 
-        CloudControllerClient.getInstance().validateDeploymentPolicy(cluster.getServiceName(),
-                deploymentPolicy);
+        for(ChildLevelPartition childLevelPartition : childLevelPartitions) {
+            Partition partition = this.deploymentPolicy.
+                    getApplicationLevelNetworkPartition(clusterLevelNetworkPartitionContext.getId()).
+                    getPartition(childLevelPartition.getPartitionId());
+            CloudControllerClient.getInstance().validatePartition(convertTOCCPartition(partition));
+        }
+
 
         ChildLevelNetworkPartition networkPartition;
         networkPartition = deploymentPolicy.getChildLevelNetworkPartition(instance.getNetworkPartitionId());
@@ -195,8 +207,9 @@ public class VMClusterContext extends AbstractClusterContext {
             clusterLevelPartitionContext.setProperties(cluster.getProperties());
             clusterLevelPartitionContext.setNetworkPartitionId(networkPartition.getId());
             //add members to partition Context
-            Partition partition1 = deploymentPolicy.
-                    getApplicationLevelNetworkPartition(networkPartitionId).getPartition(partition.getPartitionId());
+            Partition partition1 = this.deploymentPolicy.
+                    getApplicationLevelNetworkPartition(clusterLevelNetworkPartitionContext.getId()).
+                    getPartition(partition.getPartitionId());
 
             addMembersFromTopology(cluster, partition1, clusterLevelPartitionContext);
 
@@ -217,7 +230,6 @@ public class VMClusterContext extends AbstractClusterContext {
     private ClusterLevelNetworkPartitionContext addPartition(
             ClusterInstance clusterInstance,
             Cluster cluster,
-            DeploymentPolicy deploymentPolicy,
             ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext)
             throws PolicyValidationException, PartitionValidationException {
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMServiceClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMServiceClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMServiceClusterContext.java
index 9e982cf..b865e85 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMServiceClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMServiceClusterContext.java
@@ -22,6 +22,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetworkPartitionContext;
 import org.apache.stratos.autoscaler.pojo.policy.autoscale.AutoscalePolicy;
+import org.apache.stratos.autoscaler.pojo.policy.deployment.ChildPolicy;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy;
 
 import java.util.Map;

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
new file mode 100644
index 0000000..072fc04
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
@@ -0,0 +1,81 @@
+/*
+ * 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.context.group;
+
+import org.apache.stratos.autoscaler.context.InstanceContext;
+import org.apache.stratos.autoscaler.context.partition.GroupLevelPartitionContext;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This will hold the group instance related info
+ */
+public class GroupInstanceContext extends InstanceContext {
+
+    //partitions of this network partition
+    private final List<GroupLevelPartitionContext> partitionCtxts;
+
+    public GroupInstanceContext(String id) {
+        super(id);
+        partitionCtxts = new ArrayList<GroupLevelPartitionContext>();
+
+    }
+
+    public List<GroupLevelPartitionContext> getPartitionCtxts() {
+
+        return partitionCtxts;
+    }
+
+    public GroupLevelPartitionContext getPartitionCtxt(String partitionId) {
+
+
+        for(GroupLevelPartitionContext partitionContext : partitionCtxts){
+            if(partitionContext.getPartitionId().equals(partitionId)){
+                return partitionContext;
+            }
+        }
+        return null;
+    }
+
+    public void addPartitionContext(GroupLevelPartitionContext partitionContext) {
+        partitionCtxts.add(partitionContext);
+    }
+
+    public int getNonTerminatedMemberCountOfPartition(String partitionId) {
+
+        for(GroupLevelPartitionContext partitionContext : partitionCtxts){
+            if(partitionContext.getPartitionId().equals(partitionId)){
+                return partitionContext.getNonTerminatedInstanceCount();
+            }
+        }
+        return 0;
+    }
+
+    public int getActiveMemberCount(String currentPartitionId) {
+
+        for(GroupLevelPartitionContext partitionContext : partitionCtxts){
+            if(partitionContext.getPartitionId().equals(currentPartitionId)){
+                return partitionContext.getActiveInstanceCount();
+            }
+        }
+        return 0;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/GroupLevelPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/GroupLevelPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/GroupLevelPartitionContext.java
index 6b7f23a..8cf5e61 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/GroupLevelPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/GroupLevelPartitionContext.java
@@ -21,6 +21,7 @@ package org.apache.stratos.autoscaler.context.partition;
 import org.apache.commons.configuration.XMLConfiguration;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.context.group.GroupInstanceContext;
 import org.apache.stratos.autoscaler.context.member.MemberStatsContext;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ChildLevelPartition;
 import org.apache.stratos.autoscaler.util.ConfUtil;
@@ -75,9 +76,6 @@ public class GroupLevelPartitionContext extends PartitionContext implements Seri
     //Keep statistics come from CEP
     private Map<String, MemberStatsContext> instanceStatsContexts;
 
-    //group instances kept inside a partition
-    private Map<String, Instance> instanceIdToInstanceContextMap;
-
     // for the use of tests
     public GroupLevelPartitionContext(long instanceExpiryTime) {
 
@@ -97,7 +95,6 @@ public class GroupLevelPartitionContext extends PartitionContext implements Seri
         this.terminationPendingInstances = new ArrayList<Instance>();
         this.obsoletedInstances = new ConcurrentHashMap<String, Instance>();
         instanceStatsContexts = new ConcurrentHashMap<String, MemberStatsContext>();
-        instanceIdToInstanceContextMap = new HashMap<String, Instance>();
 
 
         terminationPendingStartedTime = new HashMap<String, Long>();
@@ -122,19 +119,6 @@ public class GroupLevelPartitionContext extends PartitionContext implements Seri
         return terminationPendingStartedTime.get(instanceId);
     }
 
-    public Map<String, Instance> getInstanceIdToInstanceContextMap() {
-        return instanceIdToInstanceContextMap;
-    }
-
-    public void setInstanceIdToInstanceContextMap(Map<String, Instance> instanceIdToInstanceContextMap) {
-        this.instanceIdToInstanceContextMap = instanceIdToInstanceContextMap;
-    }
-
-    public void addInstanceContext(Instance context) {
-        this.instanceIdToInstanceContextMap.put(context.getInstanceId(), context);
-
-    }
-
     public List<Instance> getPendingInstances() {
         return pendingInstances;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ApplicationLevelNetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ApplicationLevelNetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ApplicationLevelNetworkPartitionContext.java
index 73d6555..9a427c2 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ApplicationLevelNetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ApplicationLevelNetworkPartitionContext.java
@@ -20,9 +20,11 @@ package org.apache.stratos.autoscaler.context.partition.network;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.context.application.ApplicationInstanceContext;
 import org.apache.stratos.messaging.domain.instance.ApplicationInstance;
 
 import java.io.Serializable;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -35,22 +37,23 @@ public class ApplicationLevelNetworkPartitionContext extends NetworkPartitionCon
     private boolean createdOnBurst;
 
     //group instances kept inside a partition
-    private Map<String, ApplicationInstance> instanceIdToInstanceContextMap;
+    private Map<String, ApplicationInstanceContext> instanceIdToInstanceContextMap;
 
     public ApplicationLevelNetworkPartitionContext(String id) {
         this.id = id;
+        this.instanceIdToInstanceContextMap = new HashMap<String, ApplicationInstanceContext>();
     }
 
-    public Map<String, ApplicationInstance> getInstanceIdToInstanceContextMap() {
+    public Map<String, ApplicationInstanceContext> getInstanceIdToInstanceContextMap() {
         return instanceIdToInstanceContextMap;
     }
 
-    public void setInstanceIdToInstanceContextMap(Map<String, ApplicationInstance> instanceIdToInstanceContextMap) {
+    public void setInstanceIdToInstanceContextMap(Map<String, ApplicationInstanceContext> instanceIdToInstanceContextMap) {
         this.instanceIdToInstanceContextMap = instanceIdToInstanceContextMap;
     }
 
-    public void addInstanceContext(ApplicationInstance context) {
-        this.instanceIdToInstanceContextMap.put(context.getInstanceId(), context);
+    public void addInstanceContext(ApplicationInstanceContext context) {
+        this.instanceIdToInstanceContextMap.put(context.getId(), context);
 
     }
 
@@ -102,4 +105,4 @@ public class ApplicationLevelNetworkPartitionContext extends NetworkPartitionCon
     public void setCreatedOnBurst(boolean createdOnBurst) {
         this.createdOnBurst = createdOnBurst;
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
index 2248a68..402bbfa 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
@@ -20,6 +20,7 @@ package org.apache.stratos.autoscaler.context.partition.network;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.context.group.GroupInstanceContext;
 import org.apache.stratos.autoscaler.context.partition.ClusterLevelPartitionContext;
 import org.apache.stratos.autoscaler.context.partition.GroupLevelPartitionContext;
 import org.apache.stratos.cloud.controller.stub.domain.Partition;
@@ -48,8 +49,8 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
     //details required for partition selection algorithms
     private int currentPartitionIndex;
 
-    //partitions of this network partition
-    private final List<GroupLevelPartitionContext> partitionCtxts;
+    //group instances kept inside a partition
+    private Map<String, GroupInstanceContext> instanceIdToInstanceContextMap;
 
     public GroupLevelNetworkPartitionContext(String id, String partitionAlgo, Partition[] partitions) {
         this.id = id;
@@ -59,13 +60,27 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
         } else {
             this.partitions = Arrays.copyOf(partitions, partitions.length);
         }
-        partitionCtxts = new ArrayList<GroupLevelPartitionContext>();
         for (Partition partition : partitions) {
             minInstanceCount += partition.getPartitionMin();
             maxInstanceCount += partition.getPartitionMax();
         }
         requiredInstanceCountBasedOnStats = minInstanceCount;
         requiredInstanceCountBasedOnDependencies = minInstanceCount;
+        instanceIdToInstanceContextMap = new HashMap<String, GroupInstanceContext>();
+
+
+    }
+
+    public Map<String, GroupInstanceContext> getInstanceIdToInstanceContextMap() {
+        return instanceIdToInstanceContextMap;
+    }
+
+    public void setInstanceIdToInstanceContextMap(Map<String, GroupInstanceContext> instanceIdToInstanceContextMap) {
+        this.instanceIdToInstanceContextMap = instanceIdToInstanceContextMap;
+    }
+
+    public void addInstanceContext(GroupInstanceContext context) {
+        this.instanceIdToInstanceContextMap.put(context.getId(), context);
 
     }
 
@@ -134,26 +149,8 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
         return id;
     }
 
-    public List<GroupLevelPartitionContext> getPartitionCtxts() {
-
-        return partitionCtxts;
-    }
-
-    public GroupLevelPartitionContext getPartitionCtxt(String partitionId) {
 
 
-        for(GroupLevelPartitionContext partitionContext : partitionCtxts){
-            if(partitionContext.getPartitionId().equals(partitionId)){
-                return partitionContext;
-            }
-        }
-        return null;
-    }
-
-    public void addPartitionContext(GroupLevelPartitionContext partitionContext) {
-        partitionCtxts.add(partitionContext);
-    }
-
     public String getPartitionAlgorithm() {
         return partitionAlgorithm;
     }
@@ -162,26 +159,6 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
         return partitions;
     }
 
-    public int getNonTerminatedMemberCountOfPartition(String partitionId) {
-
-        for(GroupLevelPartitionContext partitionContext : partitionCtxts){
-            if(partitionContext.getPartitionId().equals(partitionId)){
-                return partitionContext.getNonTerminatedInstanceCount();
-            }
-        }
-        return 0;
-    }
-
-    public int getActiveMemberCount(String currentPartitionId) {
-
-        for(GroupLevelPartitionContext partitionContext : partitionCtxts){
-            if(partitionContext.getPartitionId().equals(currentPartitionId)){
-                return partitionContext.getActiveInstanceCount();
-            }
-        }
-        return 0;
-    }
-
     public int getScaleDownRequestsCount() {
         return scaleDownRequestsCount;
     }
@@ -212,4 +189,4 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
 
 
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/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 98c0afa..7f8af6f 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
@@ -146,7 +146,7 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
                                     DeploymentPolicy policy = PolicyManager.getInstance().
                                             getDeploymentPolicyByApplication(
                                                     application.getUniqueIdentifier());
-                                    if(policy != null) {
+                                    if (policy != null) {
                                         AutoscalerUtil.getInstance().
                                                 startApplicationMonitor(application.getUniqueIdentifier());
                                     } else {
@@ -442,74 +442,74 @@ public class AutoscalerTopologyEventReceiver implements Runnable {
         });
 
         topologyEventReceiver.addEventListener(new ClusterInstanceCreatedEventListener() {
-                                                   @Override
-                                                   protected void onEvent(Event event) {
-
-                                                       ClusterInstanceCreatedEvent clusterInstanceCreatedEvent =
-                                                               (ClusterInstanceCreatedEvent) event;
-                                                       AbstractClusterMonitor clusterMonitor = AutoscalerContext.getInstance().
-                                                               getClusterMonitor(clusterInstanceCreatedEvent.getClusterId());
-                                                       String instanceId = ((ClusterInstanceCreatedEvent) event).getInstanceId();
-                                                       //FIXME to take lock when clusterMonitor is running
-                                                       if (clusterMonitor != null) {
-                                                           TopologyManager.acquireReadLockForCluster(clusterInstanceCreatedEvent.getServiceName(),
-                                                                   clusterInstanceCreatedEvent.getClusterId());
-
-                                                           try {
-                                                               Service service = TopologyManager.getTopology().
-                                                                       getService(clusterInstanceCreatedEvent.getServiceName());
-
-                                                               if (service != null) {
-                                                                   Cluster cluster = service.getCluster(clusterInstanceCreatedEvent.getClusterId());
-                                                                   if (cluster != null) {
-                                                                       try {
-                                                                           if (cluster.isKubernetesCluster()) {
-                                                                               clusterMonitor.setClusterContext(
-                                                                                       ClusterContextFactory.getKubernetesClusterContext(
-                                                                                               instanceId,
-                                                                                               cluster));
-                                                                           } else {
-                                                                               VMClusterContext clusterContext =
-                                                                                       (VMClusterContext) clusterMonitor.getClusterContext();
-                                                                               if (clusterContext == null) {
-                                                                                   clusterMonitor.setClusterContext(
-                                                                                           ClusterContextFactory.
-                                                                                                   getVMServiceClusterContext(instanceId,
-                                                                                                           cluster));
-                                                                               } else {
-                                                                                   clusterContext.addInstanceContext(instanceId, cluster);
-                                                                               }
-
-                                                                           }
-                                                                           if (clusterMonitor.hasMonitoringStarted().compareAndSet(false, true)) {
-                                                                               clusterMonitor.startScheduler();
-                                                                               log.info("Monitoring task for Cluster Monitor with cluster id " +
-                                                                                       clusterInstanceCreatedEvent.getClusterId() + " started successfully");
-                                                                           }
-                                                                       } catch (PolicyValidationException e) {
-                                                                           log.error(e.getMessage(), e);
-                                                                       } catch (PartitionValidationException e) {
-                                                                           log.error(e.getMessage(), e);
-                                                                       }
-                                                                   }
-
-                                                               } else {
-                                                                   log.error("Service " + clusterInstanceCreatedEvent.getServiceName() +
-                                                                           " not found, no cluster instance added to ClusterMonitor " +
-                                                                           clusterInstanceCreatedEvent.getClusterId());
-                                                               }
-
-                                                           } finally {
-                                                               TopologyManager.releaseReadLockForCluster(clusterInstanceCreatedEvent.getServiceName(),
-                                                                       clusterInstanceCreatedEvent.getClusterId());
-                                                           }
-
-                                                       } else {
-                                                           log.error("No Cluster Monitor found for cluster id " +
-                                                                   clusterInstanceCreatedEvent.getClusterId());
-                                                       }
-                                                   }
-                                               }
+           @Override
+           protected void onEvent(Event event) {
+
+               ClusterInstanceCreatedEvent clusterInstanceCreatedEvent =
+                       (ClusterInstanceCreatedEvent) event;
+               AbstractClusterMonitor clusterMonitor = AutoscalerContext.getInstance().
+                       getClusterMonitor(clusterInstanceCreatedEvent.getClusterId());
+               String instanceId = ((ClusterInstanceCreatedEvent) event).getInstanceId();
+               //FIXME to take lock when clusterMonitor is running
+               if (clusterMonitor != null) {
+                   TopologyManager.acquireReadLockForCluster(clusterInstanceCreatedEvent.getServiceName(),
+                           clusterInstanceCreatedEvent.getClusterId());
+
+                   try {
+                       Service service = TopologyManager.getTopology().
+                               getService(clusterInstanceCreatedEvent.getServiceName());
+
+                       if (service != null) {
+                           Cluster cluster = service.getCluster(clusterInstanceCreatedEvent.getClusterId());
+                           if (cluster != null) {
+                               try {
+                                   if (cluster.isKubernetesCluster()) {
+                                       clusterMonitor.setClusterContext(
+                                               ClusterContextFactory.getKubernetesClusterContext(
+                                                       instanceId,
+                                                       cluster));
+                                   } else {
+                                       VMClusterContext clusterContext =
+                                               (VMClusterContext) clusterMonitor.getClusterContext();
+                                       if (clusterContext == null) {
+                                           clusterMonitor.setClusterContext(
+                                                   ClusterContextFactory.
+                                                           getVMServiceClusterContext(instanceId,
+                                                                   cluster));
+                                       } else {
+                                           clusterContext.addInstanceContext(instanceId, cluster);
+                                       }
+
+                                   }
+                                   if (clusterMonitor.hasMonitoringStarted().compareAndSet(false, true)) {
+                                       clusterMonitor.startScheduler();
+                                       log.info("Monitoring task for Cluster Monitor with cluster id " +
+                                               clusterInstanceCreatedEvent.getClusterId() + " started successfully");
+                                   }
+                               } catch (PolicyValidationException e) {
+                                   log.error(e.getMessage(), e);
+                               } catch (PartitionValidationException e) {
+                                   log.error(e.getMessage(), e);
+                               }
+                           }
+
+                       } else {
+                           log.error("Service " + clusterInstanceCreatedEvent.getServiceName() +
+                                   " not found, no cluster instance added to ClusterMonitor " +
+                                   clusterInstanceCreatedEvent.getClusterId());
+                       }
+
+                   } finally {
+                       TopologyManager.releaseReadLockForCluster(clusterInstanceCreatedEvent.getServiceName(),
+                               clusterInstanceCreatedEvent.getClusterId());
+                   }
+
+               } else {
+                   log.error("No Cluster Monitor found for cluster id " +
+                           clusterInstanceCreatedEvent.getClusterId());
+               }
+           }
+       }
 
         );
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
index b332b15..0e5f751 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
@@ -22,6 +22,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.applications.ApplicationHolder;
 import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
+import org.apache.stratos.autoscaler.context.application.ApplicationInstanceContext;
 import org.apache.stratos.autoscaler.context.partition.network.ApplicationLevelNetworkPartitionContext;
 import org.apache.stratos.autoscaler.exception.application.DependencyBuilderException;
 import org.apache.stratos.autoscaler.exception.application.ParentMonitorNotFoundException;
@@ -212,7 +213,8 @@ public class ApplicationMonitor extends ParentComponentMonitor {
                     ApplicationLevelNetworkPartitionContext context =
                             new ApplicationLevelNetworkPartitionContext(networkPartition.getId());
                     instanceId = createApplicationInstance(application, networkPartition.getId());
-                    context.addInstanceContext(application.getInstanceContexts(instanceId));
+                    ApplicationInstanceContext instanceContext = new ApplicationInstanceContext(instanceId);
+                    context.addInstanceContext(instanceContext);
 
                     this.networkPartitionCtxts.put(context.getId(), context);
 
@@ -251,7 +253,9 @@ public class ApplicationMonitor extends ParentComponentMonitor {
                                 new ApplicationLevelNetworkPartitionContext(networkPartition.getId());
                         context.setCreatedOnBurst(true);
                         instanceId = createApplicationInstance(application, networkPartition.getId());
-                        context.addInstanceContext(application.getInstanceContexts(instanceId));
+
+                        ApplicationInstanceContext instanceContext = new ApplicationInstanceContext(instanceId);
+                        context.addInstanceContext(instanceContext);
                         this.networkPartitionCtxts.put(context.getId(), context);
                         burstNPFound = true;
                     }
@@ -270,12 +274,8 @@ public class ApplicationMonitor extends ParentComponentMonitor {
 
     private DeploymentPolicy getDeploymentPolicy(Application application) throws PolicyValidationException {
         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 = null;
+        DeploymentPolicy deploymentPolicy = PolicyManager.getInstance().
+                getDeploymentPolicyByApplication(application.getUniqueIdentifier());
         if(deploymentPolicyName != null) {
             deploymentPolicy = PolicyManager.getInstance()
                     .getDeploymentPolicy(deploymentPolicyName);
@@ -284,7 +284,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
                 log.error(msg);
                 throw new PolicyValidationException(msg);
             }
-            }
+        }
 
         return deploymentPolicy;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
index c64bccb..9ec04d7 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
@@ -26,6 +26,7 @@ import org.apache.stratos.autoscaler.applications.dependency.context.Application
 import org.apache.stratos.autoscaler.applications.dependency.context.GroupChildContext;
 import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
 import org.apache.stratos.autoscaler.context.AutoscalerContext;
+import org.apache.stratos.autoscaler.context.group.GroupInstanceContext;
 import org.apache.stratos.autoscaler.context.partition.network.GroupLevelNetworkPartitionContext;
 import org.apache.stratos.autoscaler.exception.application.DependencyBuilderException;
 import org.apache.stratos.autoscaler.exception.application.ParentMonitorNotFoundException;
@@ -36,6 +37,7 @@ import org.apache.stratos.autoscaler.monitor.events.MonitorScalingEvent;
 import org.apache.stratos.autoscaler.monitor.events.MonitorStatusEvent;
 import org.apache.stratos.autoscaler.monitor.events.builder.MonitorStatusEventBuilder;
 import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
+import org.apache.stratos.autoscaler.pojo.policy.deployment.ChildPolicy;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ChildLevelNetworkPartition;
 import org.apache.stratos.messaging.domain.applications.Application;
@@ -47,7 +49,10 @@ import org.apache.stratos.messaging.domain.instance.Instance;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * This is GroupMonitor to monitor the group which consists of
@@ -372,7 +377,10 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                 //Partition partition = algorithm.getNextScaleUpPartitionContext(groupLevelNetworkPartitionContext, this.id);
                 //TODO need to find the partition. partitionId=?
             }
+
             instanceId = createGroupInstance(group, parentInstanceId, partitionId, networkPartitionId);
+            GroupInstanceContext instanceContext = new GroupInstanceContext(instanceId);
+            //TODO to add new partitionContext
             instanceIds.add(instanceId);
         }
         startDependency(group, instanceIds);
@@ -411,16 +419,21 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         }
         String partitionId = null;
         String networkPartitionId = parentInstanceContext.getNetworkPartitionId();
-        if (deploymentPolicyName != null) {
-            DeploymentPolicy deploymentPolicy = PolicyManager.getInstance()
-                    .getDeploymentPolicy(deploymentPolicyName);
-            ChildLevelNetworkPartition networkPartition = deploymentPolicy.
-                    getChildLevelNetworkPartition(parentInstanceContext.getNetworkPartitionId());
 
+        ChildPolicy policy = PolicyManager.getInstance().
+                getDeploymentPolicyByApplication(group.getApplicationId()).
+                getChildPolicy(group.getUniqueIdentifier());
+
+        ChildLevelNetworkPartition networkPartition = policy.
+                getChildLevelNetworkPartition(parentInstanceContext.getNetworkPartitionId());
+
+        if(policy != null) {
             AutoscaleAlgorithm algorithm = this.getAutoscaleAlgorithm(networkPartition.getPartitionAlgo());
-            //Partition partition = algorithm.getNextScaleUpPartitionContext(groupLevelNetworkPartitionContext, this.id);
-            //TODO need to find the partition. partitionId=?
+            /*Partition partition = algorithm.getNextScaleUpPartitionContext(networkPartition.getChildLevelPartitions());
+            //TODO need to find the partition. partitionId=? */
         }
+
+
         instanceId = createGroupInstance(group, parentInstanceId, partitionId, networkPartitionId);
         startDependency(group, instanceId);
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ChildPolicy.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ChildPolicy.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ChildPolicy.java
index 9d78dcf..7a08ce9 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ChildPolicy.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/ChildPolicy.java
@@ -45,4 +45,14 @@ public class ChildPolicy implements Serializable {
     public void setChildLevelNetworkPartitions(ChildLevelNetworkPartition[] childLevelNetworkPartitions) {
         this.childLevelNetworkPartitions = childLevelNetworkPartitions;
     }
+
+    public ChildLevelNetworkPartition getChildLevelNetworkPartition(String id) {
+        for(ChildLevelNetworkPartition partition : childLevelNetworkPartitions) {
+            if(partition.getId().equals(id)) {
+                return partition;
+            }
+        }
+
+        return null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7ccfa6f5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/DeploymentPolicy.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/DeploymentPolicy.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/DeploymentPolicy.java
index ef3eacd..fb63c02 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/DeploymentPolicy.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/DeploymentPolicy.java
@@ -231,4 +231,13 @@ public class DeploymentPolicy implements Serializable{
     public void setApplicationId(String applicationId) {
         this.applicationId = applicationId;
     }
+
+    public ChildPolicy getChildPolicy(String id) {
+        for(ChildPolicy childPolicy : childPolicies) {
+            if (childPolicy.getId().equals(id)) {
+                return childPolicy;
+            }
+        }
+        return null;
+    }
 }