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/05 14:40:31 UTC

[5/5] stratos git commit: fixing group level deployment policy parsing and improving processors

fixing group level deployment policy parsing and improving processors


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

Branch: refs/heads/master
Commit: 3bd20e5ee2a4479a8953df6c6e62e478b8ebd672
Parents: cf1b372
Author: reka <rt...@gmail.com>
Authored: Fri Dec 5 19:09:56 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Fri Dec 5 19:09:56 2014 +0530

----------------------------------------------------------------------
 .../autoscaler/api/AutoScalerServiceImpl.java   |   1 +
 .../context/cluster/VMClusterContext.java       |  43 +--
 .../ClusterLevelNetworkPartitionContext.java    |  10 +-
 .../GroupLevelNetworkPartitionContext.java      |  85 +++-
 .../AutoscalerTopologyEventReceiver.java        | 162 ++++----
 .../autoscaler/monitor/MonitorFactory.java      |  22 +-
 .../monitor/component/GroupMonitor.java         | 384 +++++++++----------
 .../component/ParentComponentMonitor.java       |  21 +-
 .../policy/deployment/DeploymentPolicy.java     |  14 -
 .../cluster/ClusterStatusActiveProcessor.java   |   1 +
 .../cluster/ClusterStatusInActiveProcessor.java |   8 +-
 .../group/GroupStatusInActiveProcessor.java     |   1 +
 .../application/beans/GroupDefinition.java      |   2 +-
 .../domain/instance/ClusterInstance.java        |  11 -
 .../domain/instance/GroupInstance.java          |   8 -
 .../messaging/domain/instance/Instance.java     |  11 +
 .../ApplicationsMessageProcessorChain.java      |   6 +
 .../rest/endpoint/api/StratosApiV41.java        |   2 +-
 18 files changed, 406 insertions(+), 386 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
index bd98a76..64016fc 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
@@ -190,6 +190,7 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
                 }
             } catch (PartitionValidationException e) {
                 log.error("Error while validating the deployment policy", e);
+                //TODO throw exception
             } finally {
                 ApplicationHolder.releaseReadLock();
             }

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/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 2f83178..f506596 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
@@ -21,7 +21,6 @@ package org.apache.stratos.autoscaler.context.cluster;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.applications.ApplicationHolder;
-import org.apache.stratos.autoscaler.client.CloudControllerClient;
 import org.apache.stratos.autoscaler.context.member.MemberStatsContext;
 import org.apache.stratos.autoscaler.context.partition.ClusterLevelPartitionContext;
 import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetworkPartitionContext;
@@ -131,7 +130,7 @@ public class VMClusterContext extends AbstractClusterContext {
             networkPartitionContext = this.networkPartitionCtxts.get(
                     clusterInstance.getNetworkPartitionId());
         } else {
-            if(policy != null) {
+            if (policy != null) {
                 ChildLevelNetworkPartition networkPartition = policy.
                         getChildLevelNetworkPartition(clusterInstance.getNetworkPartitionId());
                 networkPartitionContext = new ClusterLevelNetworkPartitionContext(networkPartition.getId(),
@@ -139,9 +138,7 @@ public class VMClusterContext extends AbstractClusterContext {
             } else {
                 //Parent should have the partition specified
                 networkPartitionContext = new ClusterLevelNetworkPartitionContext(
-                                                        clusterInstance.getNetworkPartitionId(),
-                                                        null,
-                                                        0);
+                        clusterInstance.getNetworkPartitionId());
             }
 
         }
@@ -149,7 +146,7 @@ public class VMClusterContext extends AbstractClusterContext {
         if (clusterInstance.getPartitionId() != null) {
             //Need to add partition Context based on the given one from the parent
             networkPartitionContext = addPartition(clusterInstance, cluster,
-                                                    networkPartitionContext, null);
+                    networkPartitionContext, null);
         } else {
             networkPartitionContext = parseDeploymentPolicy(clusterInstance, cluster,
                     policy, networkPartitionContext);
@@ -159,7 +156,7 @@ public class VMClusterContext extends AbstractClusterContext {
                     networkPartitionContext);
             if (log.isInfoEnabled()) {
                 log.info(String.format("Cluster instance context has been added to network partition, [cluster instance]" +
-                        " %s [network partition] %s", clusterInstance.getInstanceId(),
+                                " %s [network partition] %s", clusterInstance.getInstanceId(),
                         clusterInstance.getNetworkPartitionId()));
             }
         }
@@ -178,7 +175,7 @@ public class VMClusterContext extends AbstractClusterContext {
             log.error(msg);
             throw new PolicyValidationException(msg);
         }
-        
+
         if (log.isDebugEnabled()) {
             log.debug("Deployment policy name: " + childPolicy.getId());
         }
@@ -198,12 +195,12 @@ public class VMClusterContext extends AbstractClusterContext {
         //Retrieving the ChildLevelNetworkPartition and create NP Context
         ChildLevelNetworkPartition networkPartition;
         networkPartition = childPolicy.
-                                getChildLevelNetworkPartition(clusterInstance.getNetworkPartitionId());
+                getChildLevelNetworkPartition(clusterInstance.getNetworkPartitionId());
         if (clusterLevelNetworkPartitionContext == null) {
             clusterLevelNetworkPartitionContext = new ClusterLevelNetworkPartitionContext(
-                                                                networkPartition.getId(),
-                                                                networkPartition.getPartitionAlgo(),
-                                                                networkPartition.getMin());
+                    networkPartition.getId(),
+                    networkPartition.getPartitionAlgo(),
+                    networkPartition.getMin());
         }
 
         //Fill cluster instance context with child level partitions
@@ -240,7 +237,7 @@ public class VMClusterContext extends AbstractClusterContext {
         }
 
         ClusterInstanceContext clusterInstanceContext = clusterLevelNetworkPartitionContext.
-                                        getClusterInstanceContext(clusterInstance.getInstanceId());
+                getClusterInstanceContext(clusterInstance.getInstanceId());
         int maxInstances = 1;
         if (clusterInstanceContext == null) {
             int minInstances = 1;
@@ -248,7 +245,8 @@ public class VMClusterContext extends AbstractClusterContext {
             try {
                 Application application = ApplicationHolder.getApplications().
                         getApplication(cluster.getAppId());
-                ClusterDataHolder dataHolder = application.getClusterData(AutoscalerUtil.getAliasFromClusterId(clusterId));
+                ClusterDataHolder dataHolder = application.
+                        getClusterData(AutoscalerUtil.getAliasFromClusterId(clusterId));
                 minInstances = dataHolder.getMinInstances();
                 maxInstances = dataHolder.getMaxInstances();
             } finally {
@@ -256,10 +254,10 @@ public class VMClusterContext extends AbstractClusterContext {
             }
             clusterInstanceContext = new ClusterInstanceContext(clusterInstance.getInstanceId(),
                     clusterLevelNetworkPartitionContext.getPartitionAlgorithm(),
-                    minInstances, maxInstances , nPartitionId);
+                    minInstances, maxInstances, nPartitionId);
         }
         String partitionId;
-        if(childLevelPartition != null) {
+        if (childLevelPartition != null) {
             //use it own defined partition
             partitionId = childLevelPartition.getPartitionId();
             maxInstances = childLevelPartition.getMax();
@@ -269,18 +267,19 @@ public class VMClusterContext extends AbstractClusterContext {
         }
         //Retrieving the actual partition from application
         Partition appPartition = deploymentPolicy.getApplicationLevelNetworkPartition(nPartitionId).
-                                                                        getPartition(partitionId);
+                getPartition(partitionId);
         org.apache.stratos.cloud.controller.stub.domain.Partition partition =
                 convertTOCCPartition(appPartition);
 
         //Validate the partition
-        CloudControllerClient.getInstance().validatePartition(partition);
+        //TODO validate partition removal
+        //CloudControllerClient.getInstance().validatePartition(partition);
 
         //Creating cluster level partition context
         ClusterLevelPartitionContext clusterLevelPartitionContext = new ClusterLevelPartitionContext(
-                                                        maxInstances,
-                                                        partition,
-                                                        clusterInstance.getNetworkPartitionId());
+                maxInstances,
+                partition,
+                clusterInstance.getNetworkPartitionId());
         clusterLevelPartitionContext.setServiceName(cluster.getServiceName());
         clusterLevelPartitionContext.setProperties(cluster.getProperties());
 
@@ -302,8 +301,6 @@ public class VMClusterContext extends AbstractClusterContext {
         }
 
 
-
-
         return clusterLevelNetworkPartitionContext;
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java
index 036228d..bb00c2b 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java
@@ -36,23 +36,25 @@ public class ClusterLevelNetworkPartitionContext extends NetworkPartitionContext
     private static final long serialVersionUID = 572769304374110159L;
     private final String id;
 
-    private final String partitionAlgorithm;
+    private String partitionAlgorithm;
     private int min;
 
     private Map<String, ClusterInstanceContext> instanceIdToClusterInstanceContextMap;
 
 
     public ClusterLevelNetworkPartitionContext(String id, String partitionAlgorithm, int min) {
-
-        //super(id, partitionAlgo, partitions);
         this.id = id;
         this.partitionAlgorithm = partitionAlgorithm;
         this.min = min;
-
         setInstanceIdToClusterInstanceContextMap(new HashMap<String, ClusterInstanceContext>());
 
     }
 
+    public ClusterLevelNetworkPartitionContext(String id) {
+        this.id = id;
+        setInstanceIdToClusterInstanceContextMap(new HashMap<String, ClusterInstanceContext>());
+    }
+
 
     public int hashCode() {
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/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 402bbfa..3ffe6d3 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
@@ -21,16 +21,16 @@ 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;
 
 import java.io.Serializable;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * Holds runtime data of a network partition.
- *
  */
 public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext implements Serializable {
     private static final Log log = LogFactory.getLog(GroupLevelNetworkPartitionContext.class);
@@ -42,9 +42,10 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
     private int requiredInstanceCountBasedOnStats;
     private int requiredInstanceCountBasedOnDependencies;
 
-    private final String partitionAlgorithm;
+    private String partitionAlgorithm;
 
-    private final Partition[] partitions;
+    //Group level partition contexts
+    private List<GroupLevelPartitionContext> partitionContexts;
 
     //details required for partition selection algorithms
     private int currentPartitionIndex;
@@ -52,18 +53,10 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
     //group instances kept inside a partition
     private Map<String, GroupInstanceContext> instanceIdToInstanceContextMap;
 
-    public GroupLevelNetworkPartitionContext(String id, String partitionAlgo, Partition[] partitions) {
+    public GroupLevelNetworkPartitionContext(String id, String partitionAlgo) {
         this.id = id;
         this.partitionAlgorithm = partitionAlgo;
-        if (partitions == null) {
-            this.partitions = new Partition[0];
-        } else {
-            this.partitions = Arrays.copyOf(partitions, partitions.length);
-        }
-        for (Partition partition : partitions) {
-            minInstanceCount += partition.getPartitionMin();
-            maxInstanceCount += partition.getPartitionMax();
-        }
+        partitionContexts = new ArrayList<GroupLevelPartitionContext>();
         requiredInstanceCountBasedOnStats = minInstanceCount;
         requiredInstanceCountBasedOnDependencies = minInstanceCount;
         instanceIdToInstanceContextMap = new HashMap<String, GroupInstanceContext>();
@@ -71,6 +64,14 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
 
     }
 
+    public GroupLevelNetworkPartitionContext(String id) {
+        this.id = id;
+        partitionContexts = new ArrayList<GroupLevelPartitionContext>();
+        requiredInstanceCountBasedOnStats = minInstanceCount;
+        requiredInstanceCountBasedOnDependencies = minInstanceCount;
+        instanceIdToInstanceContextMap = new HashMap<String, GroupInstanceContext>();
+    }
+
     public Map<String, GroupInstanceContext> getInstanceIdToInstanceContextMap() {
         return instanceIdToInstanceContextMap;
     }
@@ -150,15 +151,10 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
     }
 
 
-
     public String getPartitionAlgorithm() {
         return partitionAlgorithm;
     }
 
-    public Partition[] getPartitions() {
-        return partitions;
-    }
-
     public int getScaleDownRequestsCount() {
         return scaleDownRequestsCount;
     }
@@ -187,6 +183,53 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
         this.requiredInstanceCountBasedOnDependencies = requiredInstanceCountBasedOnDependencies;
     }
 
+    public List<GroupLevelPartitionContext> getPartitionCtxts() {
+
+        return partitionContexts;
+    }
+
+    public GroupLevelPartitionContext getPartitionCtxt(String partitionId) {
+
+        for (GroupLevelPartitionContext partitionContext : partitionContexts) {
+            if (partitionContext.getPartitionId().equals(partitionId)) {
+                return partitionContext;
+            }
+        }
+        return null;
+    }
+
+    public void addPartitionContext(GroupLevelPartitionContext partitionContext) {
+        partitionContexts.add(partitionContext);
+    }
+
+    public int getNonTerminatedMemberCountOfPartition(String partitionId) {
+
+        for (GroupLevelPartitionContext partitionContext : partitionContexts) {
+            if (partitionContext.getPartitionId().equals(partitionId)) {
+                return partitionContext.getNonTerminatedInstanceCount();
+            }
+        }
+        return 0;
+    }
+
+    public int getActiveMemberCount(String currentPartitionId) {
+
+        for (GroupLevelPartitionContext partitionContext : partitionContexts) {
+            if (partitionContext.getPartitionId().equals(currentPartitionId)) {
+                return partitionContext.getActiveInstanceCount();
+            }
+        }
+        return 0;
+    }
+
+    public GroupLevelPartitionContext getPartitionContextById(String partitionId) {
+        for (GroupLevelPartitionContext partitionContext : partitionContexts) {
+            if (partitionContext.getPartitionId().equals(partitionId)) {
+                return partitionContext;
+            }
+        }
+        return null;
+    }
 
 
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/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 e1357f5..e007a3f 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
@@ -412,87 +412,87 @@ public class AutoscalerTopologyEventReceiver {
         });
 
         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) {
-                                                                                   clusterContext = ClusterContextFactory.
-                                                                                           getVMClusterContext(instanceId,
-                                                                                                   cluster);
-                                                                                   clusterMonitor.setClusterContext(clusterContext);
-
-                                                                               }
-                                                                               clusterContext.addInstanceContext(instanceId, cluster);
-                                                                               if (clusterMonitor.getInstance(instanceId) == null) {
-                                                                                   ClusterInstance clusterInstance = cluster.
-                                                                                           getInstanceContexts(instanceId);
-                                                                                   ClusterInstance instance = new ClusterInstance(clusterInstance.getAlias(),
-                                                                                           cluster.getClusterId(),
-                                                                                           clusterInstance.getInstanceId());
-                                                                                   instance.setParentId(clusterInstance.getParentId());
-                                                                                   instance.setNetworkPartitionId(clusterInstance.getNetworkPartitionId());
-                                                                                   instance.setPartitionId(clusterInstance.getPartitionId());
-                                                                                   instance.setStatus(clusterInstance.getStatus());
-                                                                                   clusterMonitor.addInstance(instance);
-                                                                               }
-
-
-                                                                           }
-                                                                           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) {
+                                           clusterContext = ClusterContextFactory.
+                                                   getVMClusterContext(instanceId,
+                                                           cluster);
+                                           clusterMonitor.setClusterContext(clusterContext);
+
+                                       }
+                                       clusterContext.addInstanceContext(instanceId, cluster);
+                                       if (clusterMonitor.getInstance(instanceId) == null) {
+                                           ClusterInstance clusterInstance = cluster.
+                                                   getInstanceContexts(instanceId);
+                                           ClusterInstance instance = new ClusterInstance(clusterInstance.getAlias(),
+                                                   cluster.getClusterId(),
+                                                   clusterInstance.getInstanceId());
+                                           instance.setParentId(clusterInstance.getParentId());
+                                           instance.setNetworkPartitionId(clusterInstance.getNetworkPartitionId());
+                                           instance.setPartitionId(clusterInstance.getPartitionId());
+                                           instance.setStatus(clusterInstance.getStatus());
+                                           clusterMonitor.addInstance(instance);
+                                       }
+
+
+                                   }
+                                   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/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
index addffa4..964ff01 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
@@ -121,7 +121,7 @@ public class MonitorFactory {
                 groupMonitor.setParent(parentMonitor);
                 //Setting the dependent behaviour of the monitor
                 if (parentMonitor.hasStartupDependents() || (context.hasStartupDependents() &&
-                                                            context.hasChild())) {
+                        context.hasChild())) {
                     groupMonitor.setHasStartupDependents(true);
                 } else {
                     groupMonitor.setHasStartupDependents(false);
@@ -146,7 +146,7 @@ public class MonitorFactory {
             Group group = ApplicationHolder.getApplications().
                     getApplication(appId).getGroupRecursively(context.getId());
             //Starting the minimum dependencies
-            initialStartup = groupMonitor.startMinimumDependencies(group, instanceIds);
+            initialStartup = groupMonitor.createInstanceAndStartDependencyAtStartup(group, instanceIds);
         } finally {
             ApplicationHolder.releaseWriteLock();
         }
@@ -222,7 +222,7 @@ public class MonitorFactory {
             try {
                 Application application = ApplicationHolder.getApplications().getApplication(appId);
                 for (ApplicationInstance instance :
-                                        application.getInstanceIdToInstanceContextMap().values()) {
+                        application.getInstanceIdToInstanceContextMap().values()) {
                     //Starting statusChecking to make it sync with the Topology in the restart of stratos.
                     ServiceReferenceHolder.getInstance().
                             getGroupStatusProcessorChain().
@@ -282,7 +282,7 @@ public class MonitorFactory {
 
             //setting the startup dependent behaviour of the cluster monitor
             if (parentMonitor.hasStartupDependents() || (context.hasStartupDependents() &&
-                                                        context.hasChild())) {
+                    context.hasChild())) {
                 clusterMonitor.setHasStartupDependents(true);
             } else {
                 clusterMonitor.setHasStartupDependents(false);
@@ -295,16 +295,16 @@ public class MonitorFactory {
                 clusterMonitor.setHasGroupScalingDependent(false);
             }
 
-            for(String parentInstanceId : parentInstanceIds) {
+            for (String parentInstanceId : parentInstanceIds) {
                 Instance instance = parentMonitor.getInstance(parentInstanceId);
                 String partitionId = null;
-                if(instance instanceof GroupInstance) {
-                    partitionId = ((GroupInstance)instance).getPartitionId();
+                if (instance instanceof GroupInstance) {
+                    partitionId = ((GroupInstance) instance).getPartitionId();
                 }
-                if(instance != null) {
+                if (instance != null) {
                     ClusterInstance clusterInstance = cluster.getInstanceContexts(parentInstanceId);
-                    if(clusterInstance != null) {
-                        if(cluster.isKubernetesCluster()) {
+                    if (clusterInstance != null) {
+                        if (cluster.isKubernetesCluster()) {
                             clusterMonitor.setClusterContext(
                                     ClusterContextFactory.getKubernetesClusterContext(
                                             clusterInstance.getInstanceId(),
@@ -318,7 +318,7 @@ public class MonitorFactory {
                             clusterMonitor.setClusterContext(clusterContext);
                             //create VMClusterContext and then add all the instanceContexts
                             clusterContext.addInstanceContext(parentInstanceId, cluster);
-                            if(clusterMonitor.getInstance(clusterInstance.getInstanceId()) == null) {
+                            if (clusterMonitor.getInstance(clusterInstance.getInstanceId()) == null) {
                                 clusterMonitor.addInstance(clusterInstance);
                             }
                         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/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 8eaf32b..c8df090 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
@@ -68,8 +68,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
     private boolean groupScalingEnabled;
     //Network partition contexts
     private Map<String, GroupLevelNetworkPartitionContext> networkPartitionCtxts;
-    //Group level partition contexts
-    private List<GroupLevelPartitionContext> partitionContexts;
+
     //Indicates whether the monitor is destroyed or not
     private boolean isDestroyed;
     //Monitoring interval of the monitor
@@ -125,7 +124,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
      * @param status status of the group
      */
     public void setStatus(GroupStatus status, String instanceId) {
-        ((GroupInstance)this.instanceIdToInstanceMap.get(instanceId)).setStatus(status);
+        ((GroupInstance) this.instanceIdToInstanceMap.get(instanceId)).setStatus(status);
 
         if (status == GroupStatus.Inactive && !this.hasStartupDependents) {
             log.info("[Group] " + this.id + "is not notifying the parent, " +
@@ -191,9 +190,9 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
             } else {
                 log.warn("[monitor] " + id + " cannot be found in the inActive monitors list");
             }
-            GroupInstance instance = (GroupInstance)this.instanceIdToInstanceMap.get(instanceId);
+            GroupInstance instance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId);
             if (instance != null) {
-                if(instance.getStatus() == GroupStatus.Terminating) {
+                if (instance.getStatus() == GroupStatus.Terminating) {
                     ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(this.id,
                             appId, instanceId);
                 } else {
@@ -201,7 +200,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                 }
             } else {
                 log.warn("The required instance cannot be found in the the [GroupMonitor] " +
-                    this.id);
+                        this.id);
             }
         }
     }
@@ -215,13 +214,13 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                 statusEvent.getStatus() == ApplicationStatus.Terminating) {
             //Get all the instances which related to this instanceId
             GroupInstance instance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId);
-            if(instance != null) {
+            if (instance != null) {
                 ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId);
             } else {
                 //Using parentId need to get the children
                 List<String> instanceIds = this.getInstancesByParentInstanceId(instanceId);
-                if(!instanceIds.isEmpty()) {
-                    for(String instanceId1 : instanceIds) {
+                if (!instanceIds.isEmpty()) {
+                    for (String instanceId1 : instanceIds) {
                         ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId1);
                     }
                 }
@@ -291,47 +290,6 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
     }
 
     /**
-     * This will start the minimum required dependency instances
-     * based on the given parent instance ids
-     *
-     * @param group             blue print of the instance to be started
-     * @param parentInstanceIds parent instanceIds used to start the child instance
-     * @return whether first app startup or not
-     * @throws TopologyInConsistentException
-     */
-    public boolean startMinimumDependencies(Group group, List<String> parentInstanceIds)
-            throws TopologyInConsistentException {
-        boolean initialStartup = false;
-        int min = group.getGroupMinInstances();
-        if (group.getInstanceContextCount() >= min) {
-            startDependency(group);
-        } else {
-            if (group.getInstanceContextCount() > 0) {
-                List<String> instanceIds = new ArrayList<String>();
-                for (String parentInstanceId : parentInstanceIds) {
-                    List<Instance> contexts1 = group.getInstanceContextsWithParentId(parentInstanceId);
-                    //Finding the non startable instance ids
-                    if (group.getInstanceContexts(parentInstanceId) == null || contexts1.isEmpty() ||
-                            contexts1.size() == 0) {
-                        instanceIds.add(parentInstanceId);
-
-                    }
-                }
-                if (instanceIds.size() > 0) {
-                    //createInstanceAndStartDependency(group, instanceIds);
-                } else {
-                    startDependency(group);
-                }
-            } else {
-                //No available instances in the Applications. Need to start them all
-                createInstanceAndStartDependencyAtStartup(group, parentInstanceIds);
-                initialStartup = true;
-            }
-        }
-        return initialStartup;
-    }
-   
-    /**
      * Gets the parent instance context.
      *
      * @param parentInstanceId the parent instance id
@@ -339,7 +297,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
      */
     private Instance getParentInstanceContext(String parentInstanceId) {
         Instance parentInstanceContext;
-        
+
         Application application = ApplicationHolder.getApplications().getApplication(this.appId);
         if (this.id.equals(appId)) {
             parentInstanceContext = application.getInstanceContexts(parentInstanceId);
@@ -347,146 +305,204 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
             Group parentGroup = application.getGroupRecursively(this.parent.getId());
             parentInstanceContext = parentGroup.getInstanceContexts(parentInstanceId);
         }
-        
+
         return parentInstanceContext;
     }
-    
+
     /**
      * Gets the group level network partition context.
      *
      * @param parentInstanceContext the parent instance context
      * @return the group level network partition context
      */
-    private GroupLevelNetworkPartitionContext getGroupLevelNetworkPartitionContext(Instance parentInstanceContext) {
-    	GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext;
+    private GroupLevelNetworkPartitionContext getGroupLevelNetworkPartitionContext(String groupId,
+                                                                                   String appId,
+                                                                                   Instance parentInstanceContext) {
+        GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext;
+        ChildPolicy policy = PolicyManager.getInstance().
+                getDeploymentPolicyByApplication(appId).
+                getChildPolicy(groupId);
+
+
         if (this.networkPartitionCtxts.containsKey(parentInstanceContext)) {
             groupLevelNetworkPartitionContext = this.networkPartitionCtxts.
                     get(parentInstanceContext.getNetworkPartitionId());
         } else {
-            groupLevelNetworkPartitionContext = new GroupLevelNetworkPartitionContext(
-                    parentInstanceContext.getNetworkPartitionId(),
-                    null, null);
+            if (policy != null) {
+                ChildLevelNetworkPartition networkPartition = policy.
+                        getChildLevelNetworkPartition(parentInstanceContext.getNetworkPartitionId());
+                groupLevelNetworkPartitionContext = new GroupLevelNetworkPartitionContext(
+                        parentInstanceContext.getNetworkPartitionId(),
+                        networkPartition.getPartitionAlgo());
+            } else {
+                groupLevelNetworkPartitionContext = new GroupLevelNetworkPartitionContext(
+                        parentInstanceContext.getNetworkPartitionId());
+            }
             this.addNetworkPartitionContext(groupLevelNetworkPartitionContext);
         }
         return groupLevelNetworkPartitionContext;
     }
-    
+
     /**
-     * Finds the correct partition context to which the instance should be added to and 
+     * Finds the correct partition context to which the instance should be added to and
      * created and adds required context objects.
      *
-     * @param parentInstanceContext the parent instance context
-     * @param group the group
+     * @param parentInstanceContext   the parent instance context
+     * @param networkPartitionContext the GroupLevelNetworkPartitionContext
      * @return the partition context
      */
-    private String FindAndAddPartitionContext(Instance parentInstanceContext, Group group, boolean startup) {
-    	PartitionContext partitionContext = null;
-    	
-    	String networkPartitionId = parentInstanceContext.getNetworkPartitionId();
-        List<GroupLevelPartitionContext> childParitionContexts = null;
-    
+    private void addPartitionContext(Instance parentInstanceContext,
+                                     GroupLevelNetworkPartitionContext networkPartitionContext) {
+
+        String networkPartitionId = parentInstanceContext.getNetworkPartitionId();
+        List<GroupLevelPartitionContext> childPartitionContexts;
+
         ChildPolicy policy = PolicyManager.getInstance().
-                getDeploymentPolicyByApplication(group.getApplicationId()).
-                getChildPolicy(group.getUniqueIdentifier());
-
-        ChildLevelNetworkPartition networkPartition = policy.
-                getChildLevelNetworkPartition(networkPartitionId);
-        
-        if (startup) {  
-            // Create childPartitionContexts for all possibilities if startup
-            ChildLevelPartition[] childLevelPartitions = networkPartition.getChildLevelPartitions();
-            childParitionContexts = new ArrayList<GroupLevelPartitionContext>();
-            for (ChildLevelPartition childLevelPartition : childLevelPartitions) {
-            	partitionContext = new GroupLevelPartitionContext(childLevelPartition.getMax(), childLevelPartition.getPartitionId(), networkPartitionId); 
-            	childParitionContexts.add((GroupLevelPartitionContext) partitionContext);
-            	this.addPartitionContext((GroupLevelPartitionContext)partitionContext);
+                getDeploymentPolicyByApplication(this.appId).
+                getChildPolicy(this.id);
+
+
+        PartitionContext partitionContext;
+        String parentPartitionId = parentInstanceContext.getPartitionId();
+
+        if (policy == null) {
+            if (parentPartitionId != null &&
+                    networkPartitionContext.getPartitionCtxt(parentPartitionId) != null) {
+                partitionContext = new GroupLevelPartitionContext(0);
+                networkPartitionContext.addPartitionContext((GroupLevelPartitionContext) partitionContext);
             }
         } else {
-        	// Get partition contexts already created
-        	childParitionContexts = this.getPartitionCtxts();
+            ChildLevelNetworkPartition networkPartition = policy.
+                    getChildLevelNetworkPartition(networkPartitionId);
+            if (networkPartitionContext.getPartitionCtxts().isEmpty()) {
+                // Create childPartitionContexts for all possibilities if startup
+                ChildLevelPartition[] childLevelPartitions = networkPartition.getChildLevelPartitions();
+                childPartitionContexts = new ArrayList<GroupLevelPartitionContext>();
+
+                for (ChildLevelPartition childLevelPartition : childLevelPartitions) {
+                    partitionContext = new GroupLevelPartitionContext(childLevelPartition.getMax(),
+                            childLevelPartition.getPartitionId(), networkPartitionId);
+                    childPartitionContexts.add((GroupLevelPartitionContext) partitionContext);
+                    networkPartitionContext.addPartitionContext(
+                            (GroupLevelPartitionContext) partitionContext);
+                }
+            }
         }
-        
-        // Get partitionContext to create instance in
-        AutoscaleAlgorithm algorithm = this.getAutoscaleAlgorithm(networkPartition.getPartitionAlgo());
-        partitionContext = algorithm.getNextScaleUpPartitionContext((PartitionContext[]) childParitionContexts.toArray());
-        
-    	return partitionContext.getPartitionId();
     }
 
     /**
      * Creates the group instance and adds the required context objects
      *
-     * @param group the group
-     * @param parentInstanceContext the parent instance context
-     * @param partitionContext the partition context
+     * @param group                             the group
+     * @param parentInstanceContext             the parent instance context
+     * @param partitionContext
      * @param groupLevelNetworkPartitionContext the group level network partition context
-     * @param instanceIdstoStart the container with instance ids to start
      */
-    private String createGroupInstance(Group group, Instance parentInstanceContext, String partitionId, 
-    		GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext, String deploymentPolicyName, boolean startup)
-    {
-    	GroupInstance groupInstance = createGroupInstance(group, parentInstanceContext.getInstanceId(), partitionId, parentInstanceContext.getNetworkPartitionId());
+    private String createGroupInstanceAndAddToMonitor(Group group, Instance parentInstanceContext,
+                                                      PartitionContext partitionContext,
+                                                      GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext,
+                                                      GroupInstance groupInstance) {
+
+        String partitionId;
+
+        if (groupInstance == null) {
+            partitionId = partitionContext.getPartitionId();
+
+            groupInstance = createGroupInstance(group, parentInstanceContext.getInstanceId(),
+                    partitionId, parentInstanceContext.getNetworkPartitionId());
+        }
+
         this.addInstance(groupInstance);
-        
+
         String instanceId = groupInstance.getInstanceId();
         GroupInstanceContext groupInstanceContext = new GroupInstanceContext(instanceId);
-        PartitionContext partitionContext = this.getPartitionCtxt(partitionId);
-        
-        if (deploymentPolicyName != null && partitionContext != null && startup) {
-        	groupInstanceContext.addPartitionContext((GroupLevelPartitionContext)partitionContext);
-        }
+
+        groupInstanceContext.addPartitionContext((GroupLevelPartitionContext) partitionContext);
         groupLevelNetworkPartitionContext.addInstanceContext(groupInstanceContext);
-        
+
         if (partitionContext != null) {
-        	((GroupLevelPartitionContext)partitionContext).addActiveInstance(groupInstance);
+            ((GroupLevelPartitionContext) partitionContext).addActiveInstance(groupInstance);
         }
-        
+
         return instanceId;
     }
-    
+
     /**
      * This will create the required instance and start the dependency
-     * This method will be called on initial startup 
+     * This method will be called on initial startup
      *
      * @param group             blue print of the instance to be started
      * @param parentInstanceIds parent instanceIds used to start the child instance
      * @throws TopologyInConsistentException
      */
-    public void createInstanceAndStartDependencyAtStartup(Group group, List<String> parentInstanceIds)
+    public boolean createInstanceAndStartDependencyAtStartup(Group group, List<String> parentInstanceIds)
             throws TopologyInConsistentException {
-        List<String> instanceIdstoStart = new ArrayList<String>();
-         
+        boolean initialStartup = true;
+        List<String> instanceIdsToStart = new ArrayList<String>();
+
         for (String parentInstanceId : parentInstanceIds) {
             // Get parent instance context
             Instance parentInstanceContext = getParentInstanceContext(parentInstanceId);
-            
-            // Get existing or create new GroupLevelNetwokPartitionContext
-            GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext = getGroupLevelNetworkPartitionContext(parentInstanceContext);
-            
-            // Determine partitionContext
-            String deploymentPolicyName = group.getDeploymentPolicy();
-            String partitionId = null;
-            if(deploymentPolicyName != null) {
-            	partitionId = FindAndAddPartitionContext(parentInstanceContext, group, true);
-            }
-            else { 
-            	GroupInstance instance = (GroupInstance) this.parent.getInstance(parentInstanceId);
-            	if (instance != null) {
-            		partitionId = instance.getPartitionId();
-            	}
-            }
-                        
+
+            // Get existing or create new GroupLevelNetworkPartitionContext
+            GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext =
+                    getGroupLevelNetworkPartitionContext(group.getUniqueIdentifier(),
+                            this.appId, parentInstanceContext);
+            //adding the partitionContext to the network partition context
+            addPartitionContext(parentInstanceContext, groupLevelNetworkPartitionContext);
+
             String groupInstanceId;
+            PartitionContext partitionContext;
+            String parentPartitionId = parentInstanceContext.getPartitionId();
+
             // Create GroupInstance for partition instance and add to required contexts for minimum instance count
-            for(int i=0; i<groupLevelNetworkPartitionContext.getMinInstanceCount(); i++) {
-	            
-            	groupInstanceId = createGroupInstance(group, parentInstanceContext, partitionId, groupLevelNetworkPartitionContext, deploymentPolicyName, true);
-            	instanceIdstoStart.add(groupInstanceId);
+            int groupMin = groupLevelNetworkPartitionContext.getMinInstanceCount();
+
+            //Have to check whether group has generated its own instances
+            List<Instance> existingGroupInstances = group.getInstanceContextsWithParentId(parentInstanceId);
+            for(Instance instance : existingGroupInstances) {
+                initialStartup = false;
+                partitionContext = groupLevelNetworkPartitionContext.
+                        getPartitionContextById(parentPartitionId);
+                groupInstanceId = createGroupInstanceAndAddToMonitor(group, parentInstanceContext,
+                        partitionContext,
+                        groupLevelNetworkPartitionContext,
+                        null);
+                instanceIdsToStart.add(groupInstanceId);
             }
+
+            /**
+             * If the group instances have been partially created or not created,
+             * then create everything
+             */
+            if(existingGroupInstances.size() <= groupMin) {
+                for (int i = 0; i < groupMin - existingGroupInstances.size(); i++) {
+                    // Get partitionContext to create instance in
+                    if (parentPartitionId == null) {
+                        AutoscaleAlgorithm algorithm = this.getAutoscaleAlgorithm(
+                                        groupLevelNetworkPartitionContext.getPartitionAlgorithm());
+                        partitionContext = algorithm.getNextScaleUpPartitionContext(
+                                (PartitionContext[]) groupLevelNetworkPartitionContext.
+                                        getPartitionCtxts().toArray());
+                    } else {
+                        partitionContext = groupLevelNetworkPartitionContext.
+                                getPartitionContextById(parentPartitionId);
+                    }
+                    groupInstanceId = createGroupInstanceAndAddToMonitor(group, parentInstanceContext,
+                            partitionContext,
+                            groupLevelNetworkPartitionContext,
+                            null);
+                    instanceIdsToStart.add(groupInstanceId);
+                }
+            }
+
         }
-        startDependency(group, instanceIdstoStart);
+        startDependency(group, instanceIdsToStart);
+        return initialStartup;
     }
-    
+
+
+
     /**
      * This will start the group instance based on the given parent instanceId
      * A new monitor is not created in this case
@@ -497,34 +513,45 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
      */
     public void createInstanceAndStartDependencyOnScaleup(Group group, String parentInstanceId)
             throws MonitorNotFoundException {
-    	// Get parent instance context
+        // Get parent instance context
         Instance parentInstanceContext = getParentInstanceContext(parentInstanceId);
-        
-        // Get existing or create new GroupLevelNetwokPartitionContext
-        GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext = getGroupLevelNetworkPartitionContext(parentInstanceContext);
-        
-        // Determine partitionContext
-        String deploymentPolicyName = group.getDeploymentPolicy();
-        String partitionId = null;
-        if(deploymentPolicyName != null) {
-        	partitionId = FindAndAddPartitionContext(parentInstanceContext, group, false);
-        }
-        else {
-        	GroupInstance instance = (GroupInstance) this.parent.getInstance(parentInstanceId);
-        	if (instance != null) {
-        		partitionId = instance.getPartitionId();
-        	} 
+
+        // Get existing or create new GroupLevelNetworkPartitionContext
+        GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext =
+                getGroupLevelNetworkPartitionContext(group.getUniqueIdentifier(),
+                        this.appId, parentInstanceContext);
+        //adding the partitionContext to the network partition context
+        addPartitionContext(parentInstanceContext, groupLevelNetworkPartitionContext);
+
+        String groupInstanceId;
+        PartitionContext partitionContext;
+        String parentPartitionId = parentInstanceContext.getPartitionId();
+        int groupMax = groupLevelNetworkPartitionContext.getMaxInstanceCount();
+        if(group.getInstanceContextCount() < groupMax) {
+            // Get partitionContext to create instance in
+            if (parentPartitionId == null) {
+                AutoscaleAlgorithm algorithm = this.getAutoscaleAlgorithm(
+                        groupLevelNetworkPartitionContext.getPartitionAlgorithm());
+                partitionContext = algorithm.getNextScaleUpPartitionContext(
+                        (PartitionContext[]) groupLevelNetworkPartitionContext.
+                                getPartitionCtxts().toArray());
+            } else {
+                partitionContext = groupLevelNetworkPartitionContext.
+                        getPartitionContextById(parentPartitionId);
+            }
+            groupInstanceId = createGroupInstanceAndAddToMonitor(group, parentInstanceContext,
+                    partitionContext,
+                    groupLevelNetworkPartitionContext,
+                    null);
+            startDependency(group, groupInstanceId);
+        } else {
+            log.warn("[Group] " + group.getUniqueIdentifier() + " has reached the maximum limit as " +
+                    "[max] " + groupMax + ". Hence trying to notify the parent.");
         }
 
-        String groupInstanceId = createGroupInstance(group, parentInstanceContext, partitionId, groupLevelNetworkPartitionContext, deploymentPolicyName, false);
-        startDependency(group, groupInstanceId);
-    }
-    
-    public void createInstanceAndStartDependencyOnRestart(Group group, List<String> parentInstanceIds) {
-    	// TODO: Need to add functionality when restart happens
-    	// Should only do required work from Monitor side and not from Topology since that is already existent
     }
-    
+
+
     /**
      * This will create the group instance in the applications Topology
      *
@@ -535,7 +562,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
      * @return
      */
     private GroupInstance createGroupInstance(Group group, String parentInstanceId, String partitionId,
-                                       String networkPartitionId) {
+                                              String networkPartitionId) {
         String instanceId = parentInstanceId;
         int minGroupInstances = group.getGroupMinInstances();
         int maxGroupInstances = group.getGroupMaxInstances();
@@ -567,42 +594,5 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         this.isDestroyed = isDestroyed;
     }
 
-    public List<GroupLevelPartitionContext> getPartitionCtxts() {
-
-        return partitionContexts;
-    }
-
-    public GroupLevelPartitionContext getPartitionCtxt(String partitionId) {
-        
-    	for(GroupLevelPartitionContext partitionContext : partitionContexts){
-            if(partitionContext.getPartitionId().equals(partitionId)){
-                return partitionContext;
-            }
-        }
-        return null;
-    }
-
-    public void addPartitionContext(GroupLevelPartitionContext partitionContext) {
-    	partitionContexts.add(partitionContext);
-    }
-
-    public int getNonTerminatedMemberCountOfPartition(String partitionId) {
 
-        for(GroupLevelPartitionContext partitionContext : partitionContexts){
-            if(partitionContext.getPartitionId().equals(partitionId)){
-                return partitionContext.getNonTerminatedInstanceCount();
-            }
-        }
-        return 0;
-    }
-
-    public int getActiveMemberCount(String currentPartitionId) {
-
-        for(GroupLevelPartitionContext partitionContext : partitionContexts){
-            if(partitionContext.getPartitionId().equals(currentPartitionId)){
-                return partitionContext.getActiveInstanceCount();
-            }
-        }
-        return 0;
-    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
index 136cb9f..a0710ac 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
@@ -90,7 +90,7 @@ public abstract class ParentComponentMonitor extends Monitor {
     public void startDependency(ParentComponent component, List<String> instanceIds) {
         //start the first dependency
         List<ApplicationChildContext> applicationContexts = this.startupDependencyTree.
-                getStarAbleDependencies();
+                getStarAbleDependencies(); //TODO t
         startDependency(applicationContexts, instanceIds);
 
     }
@@ -280,17 +280,17 @@ public abstract class ParentComponentMonitor extends Monitor {
     }
 
     /**
-     * @param eventId
+     * @param childId
      */
-    protected void onChildInactiveEvent(String eventId, String instanceId) {
+    protected void onChildInactiveEvent(String childId, String instanceId) {
         List<ApplicationChildContext> terminationList;
         Monitor monitor;
-        terminationList = this.startupDependencyTree.getTerminationDependencies(eventId);
+        terminationList = this.startupDependencyTree.getTerminationDependencies(childId);
         //Need to notify the parent about the status  change from Active-->InActive
-        if (this.parent != null) {
+        // TODO to make app also inaction if (this.parent != null) {
             ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().
                     process(this.id, this.appId, instanceId);
-        }
+        //}
         //TODO checking whether terminating them in reverse order,
         // TODO if so can handle it in the parent event.
 
@@ -302,15 +302,15 @@ public abstract class ParentComponentMonitor extends Monitor {
             //handling the killall scenario
             if (this.parent != null) {
                 //send terminating to the parent. So that it will push terminating to its children
-                ApplicationBuilder.handleGroupTerminatingEvent(this.appId, eventId, instanceId);
+                ApplicationBuilder.handleGroupTerminatingEvent(this.appId, childId, instanceId);
             } else {
                 //if it is an application, send terminating event individually for children
-                sendTerminatingEventOnNotification(terminationList, eventId, true, instanceId);
+                sendTerminatingEventOnNotification(terminationList, childId, true, instanceId);
             }
-            log.info("The group" + eventId + " has been marked as terminating " +
+            log.info("The group" + childId + " has been marked as terminating " +
                     "due to all the children are to be terminated");
         } else {
-            sendTerminatingEventOnNotification(terminationList, eventId, false, instanceId);
+            sendTerminatingEventOnNotification(terminationList, childId, false, instanceId);
         }
     }
 
@@ -605,6 +605,7 @@ public abstract class ParentComponentMonitor extends Monitor {
             int retries = 5;
             boolean success;
             do {
+                //TODO remove thread.sleep, exectutor service
                 try {
                     Thread.sleep(5000);
                 } catch (InterruptedException e1) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/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 fb63c02..e2a6819 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
@@ -40,7 +40,6 @@ public class DeploymentPolicy implements Serializable{
     private String description;
     private boolean isPublic;
     private ApplicationLevelNetworkPartition[] applicationLevelNetworkPartitions;
-    private ChildPolicyHolder childPolicyHolder;
     private ChildPolicy[] childPolicies;
     private int tenantId;
 
@@ -193,25 +192,12 @@ public class DeploymentPolicy implements Serializable{
         		+" [partitions] " + Arrays.toString(this.getAllPartitions());
     }
 
-    public ChildLevelNetworkPartition getChildLevelNetworkPartition(String networkPartitionId) {
-
-        childPolicyHolder.getChildLevelNetworkPartitionById(networkPartitionId);
-        return null;
-    }
 
     public ChildLevelNetworkPartition[] getChildLevelNetworkPartitions() {
         //TODO create a map of child level network partition context and return correct one
         return new ChildLevelNetworkPartition[0];
     }
 
-    public ChildPolicyHolder getChildPolicyHolder() {
-        return childPolicyHolder;
-    }
-
-    public void setChildPolicyHolder(ChildPolicyHolder childPolicyHolder) {
-        this.childPolicyHolder = childPolicyHolder;
-    }
-
     public ChildPolicy[] getChildPolicies() {
         return childPolicies;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
index c007a46..5a47401 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
@@ -82,6 +82,7 @@ public class ClusterStatusActiveProcessor extends ClusterStatusProcessor {
                 log.info("Publishing Cluster activated event for [application]: "
                         + monitor.getAppId() + " [cluster]: " + clusterId);
             }
+            //TODO service call
             ClusterStatusEventPublisher.sendClusterActivatedEvent(monitor.getAppId(),
                     monitor.getServiceId(), monitor.getClusterId(), instanceId);
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java
index 91305bf..c3b1d05 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java
@@ -79,14 +79,14 @@ public class ClusterStatusInActiveProcessor extends ClusterStatusProcessor {
             //send cluster In-Active event to cluster status topic
             ClusterStatusEventPublisher.sendClusterInActivateEvent(monitor.getAppId(),
                     monitor.getServiceId(), clusterId, instanceId);
-        } else {
+        } /*else {
             if (log.isInfoEnabled()) {
                 log.info("Publishing Cluster active event for [application]: "
                         + monitor.getAppId() + " [cluster]: " + clusterId);
             }
-            ClusterStatusEventPublisher.sendClusterActivatedEvent(monitor.getAppId(),
-                                                        monitor.getServiceId(), clusterId, instanceId);
-        }
+            //ClusterStatusEventPublisher.sendClusterActivatedEvent(monitor.getAppId(),
+              //                                          monitor.getServiceId(), clusterId, instanceId);
+        }*/
         return clusterInActive;
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInActiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInActiveProcessor.java
index 90b608c..7911727 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInActiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInActiveProcessor.java
@@ -160,6 +160,7 @@ public class GroupStatusInActiveProcessor extends GroupStatusProcessor {
             } else {
                 groupStat = false;
             }
+            //TODO get by parent
         }
         return groupStat;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
index 0d77628..109370d 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/composite/application/beans/GroupDefinition.java
@@ -37,7 +37,7 @@ public class GroupDefinition implements Serializable {
     private int groupMaxInstances;
 
     public boolean isGroupScalingEnabled;
-    
+
     private List<CartridgeDefinition> cartridges;
 
     private List<GroupDefinition> groups;

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/ClusterInstance.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/ClusterInstance.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/ClusterInstance.java
index 38d1108..5dd9d19 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/ClusterInstance.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/ClusterInstance.java
@@ -26,8 +26,6 @@ import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleStateMana
 import java.util.Stack;
 
 public class ClusterInstance extends Instance<ClusterStatus> implements LifeCycleStateTransitionBehavior<ClusterStatus> {
-    //partition id
-    private String partitionId;
 
     public ClusterInstance(String alias, String clusterId, String instanceId) {
         super(alias, instanceId);
@@ -55,15 +53,6 @@ public class ClusterInstance extends Instance<ClusterStatus> implements LifeCycl
         return this.lifeCycleStateManager.changeState(newState);
     }
 
-    public String getPartitionId() {
-        return partitionId;
-    }
-
-    public void setPartitionId(String partitionId) {
-        this.partitionId = partitionId;
-    }
-
-
     /**
      * Get the current state
      *

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/GroupInstance.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/GroupInstance.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/GroupInstance.java
index dd28fc3..88c34e2 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/GroupInstance.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/GroupInstance.java
@@ -26,8 +26,6 @@ import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleStateMana
 import java.util.Stack;
 
 public class GroupInstance extends Instance<GroupStatus> implements LifeCycleStateTransitionBehavior<GroupStatus> {
-    //partition id
-    private String partitionId;
 
     public GroupInstance(String alias, String instanceId) {
         super(alias, instanceId);
@@ -55,11 +53,5 @@ public class GroupInstance extends Instance<GroupStatus> implements LifeCycleSta
         return this.lifeCycleStateManager.changeState(newState);
     }
 
-    public String getPartitionId() {
-        return partitionId;
-    }
 
-    public void setPartitionId(String partitionId) {
-        this.partitionId = partitionId;
-    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/Instance.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/Instance.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/Instance.java
index a994d2e..ba6f089 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/Instance.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/instance/Instance.java
@@ -39,6 +39,9 @@ public abstract class Instance<T extends LifeCycleState> implements Serializable
     private String parentId;
     //Network partition id
     private String networkPartitionId;
+    //partition id
+    protected String partitionId;
+
 
     public Instance(String alias, String instanceId) {
         this.alias = alias;
@@ -96,5 +99,13 @@ public abstract class Instance<T extends LifeCycleState> implements Serializable
         this.networkPartitionId = networkPartitionId;
     }
 
+    public String getPartitionId() {
+        return partitionId;
+    }
+
+    public void setPartitionId(String partitionId) {
+        this.partitionId = partitionId;
+    }
+
 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java
index b88a3ec..98b34ad 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java
@@ -36,6 +36,7 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain {
     private GroupInstanceInActivateProcessor groupInActivateMessageProcessor;
     private GroupInstanceTerminatedProcessor groupTerminatedProcessor;
     private GroupInstanceTerminatingProcessor groupTerminatingProcessor;
+    private ApplicationInstanceCreatedMessageProcessor applicationInstanceCreatedMessageProcessor;
     private ApplicationInstanceActivatedMessageProcessor applicationActivatedMessageProcessor;
     private ApplicationCreatedMessageProcessor applicationCreatedMessageProcessor;
     private ApplicationInstanceInactivatedMessageProcessor applicationInactivatedMessageProcessor;
@@ -61,6 +62,9 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain {
         groupTerminatingProcessor = new GroupInstanceTerminatingProcessor();
         add(groupTerminatingProcessor);
 
+        applicationInstanceCreatedMessageProcessor = new ApplicationInstanceCreatedMessageProcessor();
+        add(applicationInstanceCreatedMessageProcessor);
+
         applicationActivatedMessageProcessor = new ApplicationInstanceActivatedMessageProcessor();
         add(applicationActivatedMessageProcessor);
 
@@ -96,6 +100,8 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain {
             groupTerminatingProcessor.addEventListener(eventListener);
         } else if (eventListener instanceof GroupInstanceTerminatedEventListener) {
             groupTerminatedProcessor.addEventListener(eventListener);
+        } else if (eventListener instanceof ApplicationInstanceCreatedEventListener) {
+            applicationInstanceCreatedMessageProcessor.addEventListener(eventListener);
         } else if (eventListener instanceof ApplicationCreatedEventListener) {
             applicationCreatedMessageProcessor.addEventListener(eventListener);
         } else if (eventListener instanceof ApplicationInstanceActivatedEventListener) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/3bd20e5e/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
index fcc128d..fc31362 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41.java
@@ -330,7 +330,7 @@ public class StratosApiV41 extends AbstractApi {
     @AuthorizationAction("/permission/admin/manage/add/deploymentPolicy")
     public Response deployDeploymentPolicyDefinition(DeploymentPolicy deploymentPolicy)
             throws RestAPIException {
-
+        //TODO change the name to deployApplication
         String policyId = StratosApiV41Utils.deployDeploymentPolicy(deploymentPolicy);
         URI url = uriInfo.getAbsolutePathBuilder().path(policyId).build();
         return Response.created(url).build();