You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ni...@apache.org on 2013/11/28 17:03:44 UTC

[8/8] git commit: changes to autoscaler after CC changes, now a cluster monitor would make sure to monitor the cluster health an act accordingly, etc.

changes to autoscaler after CC changes, now a cluster monitor would make sure to monitor the cluster health an act accordingly, etc.


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

Branch: refs/heads/master
Commit: 530af9eb438914f4de09a96bd0979f9ace5e15a3
Parents: 8cb502c
Author: Nirmal Fernando <ni...@apache.org>
Authored: Thu Nov 28 21:33:11 2013 +0530
Committer: Nirmal Fernando <ni...@apache.org>
Committed: Thu Nov 28 21:33:11 2013 +0530

----------------------------------------------------------------------
 .../stratos/autoscaler/ClusterContext.java      |  14 ++-
 .../stratos/autoscaler/ClusterMonitor.java      |  15 ++-
 .../stratos/autoscaler/PartitionContext.java    |   3 +-
 .../algorithm/AutoscaleAlgorithm.java           |   5 +-
 .../autoscaler/algorithm/OneAfterAnother.java   | 106 ++++++++--------
 .../PartitionGroupOneAfterAnother.java          | 120 +++++++++++--------
 .../autoscaler/algorithm/RoundRobin.java        | 110 +++++++++--------
 .../cloud/controller/CloudControllerClient.java |  30 +++--
 .../exception/PolicyValidationException.java    |  19 +++
 .../health/HealthEventMessageDelegator.java     |   9 --
 .../autoscaler/policy/PolicyManager.java        |   2 +-
 .../deployers/DeploymentPolicyDeployer.java     |   2 +-
 .../deployers/DeploymentPolicyReader.java       |  39 +++++-
 .../rule/AutoscalerRuleEvaluator.java           |   5 +-
 .../processors/AutoscalerTopologyReceiver.java  |  74 +++++++++---
 .../stratos/autoscaler/util/AutoscalerUtil.java |  16 ++-
 .../stratos/autoscaler/TestKnowledgeBase.java   |   4 -
 .../policy/DeploymentPolicyDeployerTest.java    |  53 ++++++++
 .../src/test/resources/deployment-policy.xml    |  16 +++
 .../resources/test-minimum-autoscaler-rule.drl  |  46 ++-----
 20 files changed, 448 insertions(+), 240 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java
index ce3249b..99711ee 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java
@@ -19,13 +19,15 @@
 
 package org.apache.stratos.autoscaler;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
-import org.apache.stratos.messaging.domain.policy.DeploymentPolicy;
-import org.apache.stratos.messaging.domain.policy.Partition;
+import org.apache.stratos.cloud.controller.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.deployment.partition.PartitionGroup;
+import org.apache.stratos.cloud.controller.deployment.policy.DeploymentPolicy;
 import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.runtime.rule.FactHandle;
 
@@ -62,13 +64,19 @@ public class ClusterContext {
     private Map<String, MemberContext> memberContextMap;
     private DeploymentPolicy deploymentPolicy;
 
+    @SuppressWarnings("unchecked")
     public ClusterContext(String clusterId, String serviceId, DeploymentPolicy deploymentPolicy) {
 
         this.clusterId = clusterId;
         this.serviceId = serviceId;
         this.setDeploymentPolicy(deploymentPolicy);
+        partitionsOfThisCluster = new ArrayList<Partition>();
         if (deploymentPolicy != null) {
-            this.setPartitionsOfThisCluster(deploymentPolicy.getAllPartitions());
+            for (PartitionGroup group : deploymentPolicy.getPartitionGroup()) {
+                for (Partition partition : group.getPartitions()) {
+                    partitionsOfThisCluster.add(partition);
+                }
+            }
         }
         memberContextMap = new HashMap<String, MemberContext>();
         partitionCountMap = new HashMap<String, Integer>();

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java
index f795baa..40758f7 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java
@@ -22,8 +22,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
-import org.apache.stratos.messaging.domain.policy.Partition;
+import org.apache.stratos.cloud.controller.deployment.partition.Partition;
 import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.runtime.rule.FactHandle;
 
@@ -36,6 +38,7 @@ import org.drools.runtime.rule.FactHandle;
  */
 public class ClusterMonitor implements Runnable{
 
+    private static final Log log = LogFactory.getLog(ClusterMonitor.class);
     private String clusterId;
     private ClusterContext clusterCtxt;
     private List<MemberContext> memberCtxt;
@@ -112,7 +115,12 @@ public class ClusterMonitor implements Runnable{
     public void run() {
 
         while (!isDestroyed()) {
-            minInstanceCountCheck();
+            log.info("Cluster monitor is running..");
+            try {
+                minInstanceCountCheck();
+            } catch (Exception e) {
+                log.error("Cluster monitor: min instance count check failed.", e);
+            }
             // TODO scale
             try {
                 // TODO make this configurable
@@ -131,8 +139,9 @@ public class ClusterMonitor implements Runnable{
                 PartitionContext ctxt = partitionCtxts.get(id);
                 if(ctxt == null) {
                     ctxt = new PartitionContext(partition);
+                    partitionCtxts.put(id, ctxt);
                 }
-                ctxt.setMinimumMemberCount(partition.getPartitionMembersMin());
+                ctxt.setMinimumMemberCount(partition.getPartitionMin());
                 
                 AutoscalerRuleEvaluator.evaluate(ksession, facthandle, ctxt);
             }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java
index 3579bcf..c76ac9f 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java
@@ -21,7 +21,8 @@ package org.apache.stratos.autoscaler;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.stratos.messaging.domain.policy.Partition;
+import org.apache.stratos.cloud.controller.deployment.partition.Partition;
+
 
 /**
  * @author nirmal

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java
index 3a3fef5..91d20a0 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java
@@ -19,8 +19,9 @@
 
 package org.apache.stratos.autoscaler.algorithm;
 
-import org.apache.stratos.messaging.domain.policy.Partition;
-import org.apache.stratos.messaging.domain.policy.PartitionGroup;
+import org.apache.stratos.cloud.controller.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.deployment.partition.PartitionGroup;
+
 
 /**
  *

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java
index 309c2c9..bbc2438 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java
@@ -25,8 +25,10 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.AutoscalerContext;
 import org.apache.stratos.autoscaler.ClusterContext;
-import org.apache.stratos.messaging.domain.policy.Partition;
-import org.apache.stratos.messaging.domain.policy.PartitionGroup;
+import org.apache.stratos.cloud.controller.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.deployment.partition.PartitionGroup;
+
+import edu.emory.mathcs.backport.java.util.Arrays;
 
 /**
  * Completes partitions in the order defined in autoscaler policy, go to next if current one reached the max limit
@@ -39,37 +41,38 @@ public class OneAfterAnother implements AutoscaleAlgorithm {
     	
     	ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);
     	int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
-    	List<Partition> partitions = partitionGrp.getPartitions();
+    	List<?> partitions = Arrays.asList(partitionGrp.getPartitions());
     	int noOfPartitions = partitions.size();    	
     	
     	for(int i=currentPartitionIndex; i< noOfPartitions; i++)
     	{
-    		currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
-    		Partition currentPartition = partitions.get(currentPartitionIndex);
-	        String currentPartitionId =  currentPartition.getId();
-	        
-    		if(clusterContext.partitionCountExists(currentPartitionId)){
-    			clusterContext.addPartitionCount(currentPartitionId, 0);
-    		}
-    		
-    		 if(clusterContext.getMemberCount(currentPartitionId) < currentPartition.getPartitionMembersMax()){
- 	        	// current partition is free    	        	
- 	        	clusterContext.increaseMemberCountInPartitionBy(currentPartitionId, 1);
- 	        	if(log.isDebugEnabled()) 	        		
- 	        		log.debug("Free space found in partition " + currentPartition.getId());
- 	        	
-	            return currentPartition;
-	         }else
-	         {
-	        	 // last partition is reached which is not free
-	        	 if(currentPartitionIndex == noOfPartitions - 1){
-	        		 if(log.isDebugEnabled())
-	        			 log.debug("Last partition also has no space");
-	        		 return null;
-	        	 }
-	        		 	        	 
-	        	 clusterContext.setCurrentPartitionIndex(currentPartitionIndex + 1);
-	         }
+            if (partitions.get(currentPartitionIndex) instanceof Partition) {
+                currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
+                Partition currentPartition = (Partition) partitions.get(currentPartitionIndex);
+                String currentPartitionId = currentPartition.getId();
+
+                if (clusterContext.partitionCountExists(currentPartitionId)) {
+                    clusterContext.addPartitionCount(currentPartitionId, 0);
+                }
+
+                if (clusterContext.getMemberCount(currentPartitionId) < currentPartition.getPartitionMembersMax()) {
+                    // current partition is free
+                    clusterContext.increaseMemberCountInPartitionBy(currentPartitionId, 1);
+                    if (log.isDebugEnabled())
+                        log.debug("Free space found in partition " + currentPartition.getId());
+
+                    return currentPartition;
+                } else {
+                    // last partition is reached which is not free
+                    if (currentPartitionIndex == noOfPartitions - 1) {
+                        if (log.isDebugEnabled())
+                            log.debug("Last partition also has no space");
+                        return null;
+                    }
+
+                    clusterContext.setCurrentPartitionIndex(currentPartitionIndex + 1);
+                }
+            }
     	}
     	
     	if(log.isDebugEnabled())
@@ -82,30 +85,33 @@ public class OneAfterAnother implements AutoscaleAlgorithm {
 
     	ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);
     	int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
-    	List<Partition> partitions = partitionGrp.getPartitions();
+    	List<?> partitions = Arrays.asList(partitionGrp.getPartitions());
     	
     	for(int i = currentPartitionIndex; i >= 0; i--)
     	{
-    		currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
-    		Partition currentPartition = partitions.get(currentPartitionIndex);
-	        String currentPartitionId =  currentPartition.getId();
-	        	            
-	        // has more than minimum instances.
-	        if(clusterContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMembersMin()){
-	        	// current partition is free    	        	
-	        	clusterContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1);
-	        	if(log.isDebugEnabled())
-	        		log.debug("A free space found for scale down in partition" + currentPartition.getId());
-                return currentPartition;
-            }else{
-            	if (currentPartitionIndex == 0){
-            		if(log.isDebugEnabled())
-            			log.debug("First partition reached with no space to scale down");
-    	        	return null;
-            	}
-        	    //Set next partition as current partition in Autoscaler Context
-                currentPartitionIndex = currentPartitionIndex - 1;                	
-                clusterContext.setCurrentPartitionIndex(currentPartitionIndex);
+            if (partitions.get(currentPartitionIndex) instanceof Partition) {
+                currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
+                Partition currentPartition = (Partition) partitions.get(currentPartitionIndex);
+                String currentPartitionId = currentPartition.getId();
+
+                // has more than minimum instances.
+                if (clusterContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMembersMin()) {
+                    // current partition is free
+                    clusterContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1);
+                    if (log.isDebugEnabled())
+                        log.debug("A free space found for scale down in partition" +
+                                  currentPartition.getId());
+                    return currentPartition;
+                } else {
+                    if (currentPartitionIndex == 0) {
+                        if (log.isDebugEnabled())
+                            log.debug("First partition reached with no space to scale down");
+                        return null;
+                    }
+                    // Set next partition as current partition in Autoscaler Context
+                    currentPartitionIndex = currentPartitionIndex - 1;
+                    clusterContext.setCurrentPartitionIndex(currentPartitionIndex);
+                }
             }
 	        
     	}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java
index c95d621..ba35131 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java
@@ -27,9 +27,11 @@ import org.apache.stratos.autoscaler.AutoscalerContext;
 import org.apache.stratos.autoscaler.ClusterContext;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
 import org.apache.stratos.autoscaler.policy.PolicyManager;
-import org.apache.stratos.messaging.domain.policy.Partition;
-import org.apache.stratos.messaging.domain.policy.PartitionGroup;
 import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
+import org.apache.stratos.cloud.controller.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.deployment.partition.PartitionGroup;
+
+import edu.emory.mathcs.backport.java.util.Arrays;
 
 /**
  * Completes partitions in the order defined in autoscaler policy, go to next if current one reached the max limit
@@ -46,36 +48,43 @@ public class PartitionGroupOneAfterAnother implements AutoscaleAlgorithm {
     	//Find relevant policyId using topology
     	String policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getDeploymentPolicyName();
     	    	
-    	List<PartitionGroup> partitionGroups = PolicyManager.getInstance().getDeploymentPolicy(policyId).getPartitionGroups();  	    	    
+    	List<?> partitionGroups = Arrays.asList(PolicyManager.getInstance().getDeploymentPolicy(policyId).getPartitionGroups());  	    	    
     	int currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();  
     	
     	for(int i= currentPartitionGroupIndex; i< partitionGroups.size(); i++)
     	{
-    		currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();   		
-	        PartitionGroup currentPartitionGroup = partitionGroups.get(currentPartitionGroupIndex);
-	        String alogirthm = currentPartitionGroup.getPartitionAlgo();
-	        
-	        if(log.isDebugEnabled())
-	        	log.debug("Trying current partition group " + currentPartitionGroup.getId());
-	        // search withing the partition group
-	        Partition partition = AutoscalerRuleEvaluator.getInstance().getAutoscaleAlgorithm(alogirthm).getNextScaleUpPartition(currentPartitionGroup, clusterId);
-	        
-	        if(partition != null){
-	        	if(log.isDebugEnabled())
-	        		log.debug("No partition found in partition group" +currentPartitionGroup.getId());
-	        	return partition;
-	        }else{
-	        	clusterContext.setCurrentPartitionIndex(0);
-	        	//last partition group has reached
-	        	if(currentPartitionGroupIndex == partitionGroups.size() - 1){
-	        		if(log.isDebugEnabled())
-	        			log.debug("First partition group has reached wihtout space ");
-	        		return null;
-	        	}
-	        	// current partition group is filled	        	
-	        	clusterContext.setCurrentPartitionGroupIndex(currentPartitionGroupIndex + 1);	        	
-	        }
-	       
+            if (partitionGroups.get(currentPartitionGroupIndex) instanceof PartitionGroup) {
+                currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();
+                PartitionGroup currentPartitionGroup =
+                                                       (PartitionGroup) partitionGroups.get(currentPartitionGroupIndex);
+                String alogirthm = currentPartitionGroup.getPartitionAlgo();
+
+                if (log.isDebugEnabled())
+                    log.debug("Trying current partition group " + currentPartitionGroup.getId());
+                // search withing the partition group
+                Partition partition =
+                                      AutoscalerRuleEvaluator.getInstance()
+                                                             .getAutoscaleAlgorithm(alogirthm)
+                                                             .getNextScaleUpPartition(currentPartitionGroup,
+                                                                                      clusterId);
+
+                if (partition != null) {
+                    if (log.isDebugEnabled())
+                        log.debug("No partition found in partition group" +
+                                  currentPartitionGroup.getId());
+                    return partition;
+                } else {
+                    clusterContext.setCurrentPartitionIndex(0);
+                    // last partition group has reached
+                    if (currentPartitionGroupIndex == partitionGroups.size() - 1) {
+                        if (log.isDebugEnabled())
+                            log.debug("First partition group has reached wihtout space ");
+                        return null;
+                    }
+                    // current partition group is filled
+                    clusterContext.setCurrentPartitionGroupIndex(currentPartitionGroupIndex + 1);
+                }
+            }
     	}
     	
     	return null;
@@ -89,32 +98,41 @@ public class PartitionGroupOneAfterAnother implements AutoscaleAlgorithm {
     	String policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getDeploymentPolicyName();
     	int currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();
     	
-    	List<PartitionGroup> partitionGroups = PolicyManager.getInstance().getDeploymentPolicy(policyId).getPartitionGroups();  	    	    
+    	List<?> partitionGroups = Arrays.asList(PolicyManager.getInstance().getDeploymentPolicy(policyId).getPartitionGroups());  	    	    
     	
     	for(int i = currentPartitionGroupIndex; i >= 0; i--)
     	{
-    		currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();    		
-	        PartitionGroup currentPartitionGroup = partitionGroups.get(currentPartitionGroupIndex);
-	        String alogirthm = currentPartitionGroup.getPartitionAlgo();
-	        if(log.isDebugEnabled())
-	        	log.debug("Trying scale down in partition group " + currentPartitionGroup.getId());
-	        // search within the partition group
-	        Partition partition = AutoscalerRuleEvaluator.getInstance().getAutoscaleAlgorithm(alogirthm).getNextScaleDownPartition(currentPartitionGroup, clusterId);
-	        
-	        if(partition != null){
-	        	if(log.isDebugEnabled())
-	        		log.debug("No free partition in partition group" + currentPartitionGroup.getId());
-	        	return partition;
-	        }else{
-	        	clusterContext.setCurrentPartitionIndex(0);
-	        	//first partition group has reached. None of the partitions group has less than minimum instance count.  
-	        	if(currentPartitionGroupIndex == 0)
-	        		return null;
-	        	
-	        	// current partition group has no extra instances      		        	
-	        	clusterContext.setCurrentPartitionGroupIndex(currentPartitionGroupIndex - 1);	        	
-	        }
-	       
+            if (partitionGroups.get(currentPartitionGroupIndex) instanceof PartitionGroup) {
+                currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();
+                PartitionGroup currentPartitionGroup =
+                                                       (PartitionGroup) partitionGroups.get(currentPartitionGroupIndex);
+                String alogirthm = currentPartitionGroup.getPartitionAlgo();
+                if (log.isDebugEnabled())
+                    log.debug("Trying scale down in partition group " +
+                              currentPartitionGroup.getId());
+                // search within the partition group
+                Partition partition =
+                                      AutoscalerRuleEvaluator.getInstance()
+                                                             .getAutoscaleAlgorithm(alogirthm)
+                                                             .getNextScaleDownPartition(currentPartitionGroup,
+                                                                                        clusterId);
+
+                if (partition != null) {
+                    if (log.isDebugEnabled())
+                        log.debug("No free partition in partition group" +
+                                  currentPartitionGroup.getId());
+                    return partition;
+                } else {
+                    clusterContext.setCurrentPartitionIndex(0);
+                    // first partition group has reached. None of the partitions group has less than
+                    // minimum instance count.
+                    if (currentPartitionGroupIndex == 0)
+                        return null;
+
+                    // current partition group has no extra instances
+                    clusterContext.setCurrentPartitionGroupIndex(currentPartitionGroupIndex - 1);
+                }
+            }
     	}
     	// none of the partitions groups are free.
     	return null;

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java
index 47e72d4..78444f6 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java
@@ -23,8 +23,10 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.AutoscalerContext;
 import org.apache.stratos.autoscaler.ClusterContext;
-import org.apache.stratos.messaging.domain.policy.Partition;
-import org.apache.stratos.messaging.domain.policy.PartitionGroup;
+import org.apache.stratos.cloud.controller.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.deployment.partition.PartitionGroup;
+
+import edu.emory.mathcs.backport.java.util.Arrays;
 
 import java.util.List;
 
@@ -38,13 +40,14 @@ public class RoundRobin implements AutoscaleAlgorithm{
     public Partition getNextScaleUpPartition(PartitionGroup partitionGrp, String clusterId){
     	
     	ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);    	
-    	List<Partition> partitions = partitionGrp.getPartitions();
+    	List<?> partitions = Arrays.asList(partitionGrp.getPartitions());
     	int noOfPartitions = partitions.size();
 
     	for(int i=0; i < noOfPartitions; i++)
     	{
-    			int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
-    		    Partition currentPartition = partitions.get(currentPartitionIndex);
+    	    int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
+    	    if (partitions.get(currentPartitionIndex) instanceof Partition) {
+    		    Partition currentPartition = (Partition) partitions.get(currentPartitionIndex);
     	        String currentPartitionId =  currentPartition.getId();
     	        
     	        // point to next partition
@@ -62,62 +65,75 @@ public class RoundRobin implements AutoscaleAlgorithm{
     	        		log.debug("Free space found in partition " + currentPartition.getId());
 	                return currentPartition;
 	            }   	            	      
-    	        if(log.isDebugEnabled())
+    	        if(log.isDebugEnabled()) {
     	        	log.debug("No free space for a new instance in partition " + currentPartition.getId());
+    	        }
+    	    }
     	}
     	
     	// none of the partitions were free.
-    	if(log.isDebugEnabled())
+    	if(log.isDebugEnabled()) {
     		log.debug("No free partition found at partition group " + partitionGrp);
+    	}
         return null;
     }
 
 
 	@Override
-	public Partition getNextScaleDownPartition(PartitionGroup partitionGrp , String clusterId) {
-		
-		ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);
-    	
-    	List<Partition> partitions = partitionGrp.getPartitions();
-    	int noOfPartitions = partitions.size();
-    	
-    	for(int i=0; i < noOfPartitions; i++)
-    	{
-    			int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
-    			 // point to next partition
-    	        if (currentPartitionIndex == 0) {
+    public Partition getNextScaleDownPartition(PartitionGroup partitionGrp, String clusterId) {
+
+        ClusterContext clusterContext =
+                                        AutoscalerContext.getInstance()
+                                                         .getClusterContext(clusterId);
+
+        List<?> partitions = Arrays.asList(partitionGrp.getPartitions());
+        int noOfPartitions = partitions.size();
+
+        for (int i = 0; i < noOfPartitions; i++) {
+            int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
+            // point to next partition
+            if (currentPartitionIndex == 0) {
+
+                currentPartitionIndex = noOfPartitions - 1;
+            } else {
+
+                currentPartitionIndex = currentPartitionIndex - 1;
+            }
+
+            // Set next partition as current partition in Autoscaler Context
+            clusterContext.setCurrentPartitionIndex(currentPartitionIndex);
+
+            if (partitions.get(currentPartitionIndex) instanceof Partition) {
 
-    	        	currentPartitionIndex = noOfPartitions - 1;
-                }else {
+                Partition currentPartition = (Partition) partitions.get(currentPartitionIndex);
+                String currentPartitionId = currentPartition.getId();
 
-                	currentPartitionIndex = currentPartitionIndex - 1;
+                if (!clusterContext.partitionCountExists(currentPartitionId))
+                    AutoscalerContext.getInstance().getClusterContext(clusterId)
+                                     .addPartitionCount(currentPartitionId, 0);
+                // has more than minimum instances.
+                if (clusterContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMembersMin()) {
+                    // current partition is free
+                    clusterContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1);
+                    if (log.isDebugEnabled()) {
+                        log.debug("Returning partition for scaling down " +
+                                  currentPartition.getId());
+                    }
+                    return currentPartition;
                 }
-     	       
-    	        //Set next partition as current partition in Autoscaler Context
-    	        clusterContext.setCurrentPartitionIndex(currentPartitionIndex);
-    	        
-    		    Partition currentPartition = partitions.get(currentPartitionIndex);
-    	        String currentPartitionId =  currentPartition.getId();
-    	            	         
-    	        if(!clusterContext.partitionCountExists(currentPartitionId))    	        		
-	        		AutoscalerContext.getInstance().getClusterContext(clusterId).addPartitionCount(currentPartitionId, 0);
-    	        // has more than minimum instances.
-    	        if(clusterContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMembersMin()){
-    	        	// current partition is free    	        	
-    	        	clusterContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1);
-    	        	if(log.isDebugEnabled())
-    	        		log.debug("Returning partition for scaling down " + currentPartition.getId());
-	                return currentPartition;
-	            }   	            	      
-    	        if(log.isDebugEnabled())
-    	        	log.debug("Found no members to scale down at partition" + currentPartition.getId());
-    	}
-    	
-    	if(log.isDebugEnabled())
-    		log.debug("No partition found for scale down at partition group " + partitionGrp.getId());
-    	// none of the partitions were free.
+                if (log.isDebugEnabled()) {
+                    log.debug("Found no members to scale down at partition" +
+                              currentPartition.getId());
+                }
+            }
+        }
+
+        if (log.isDebugEnabled())
+            log.debug("No partition found for scale down at partition group " +
+                      partitionGrp.getId());
+        // none of the partitions were free.
         return null;
-	}
+    }
 	
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/cloud/controller/CloudControllerClient.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/cloud/controller/CloudControllerClient.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/cloud/controller/CloudControllerClient.java
index 2536007..17ad1c7 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/cloud/controller/CloudControllerClient.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/cloud/controller/CloudControllerClient.java
@@ -23,15 +23,18 @@ import org.apache.commons.configuration.XMLConfiguration;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.Constants;
+import org.apache.stratos.autoscaler.exception.PolicyValidationException;
 import org.apache.stratos.autoscaler.exception.SpawningException;
 import org.apache.stratos.autoscaler.exception.TerminationException;
 import org.apache.stratos.autoscaler.util.ConfUtil;
+import org.apache.stratos.cloud.controller.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.deployment.policy.DeploymentPolicy;
 import org.apache.stratos.cloud.controller.stub.CloudControllerServiceIllegalArgumentExceptionException;
 import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeTypeExceptionException;
 import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidMemberExceptionException;
+import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidPartitionExceptionException;
 import org.apache.stratos.cloud.controller.stub.CloudControllerServiceStub;
 import org.apache.stratos.cloud.controller.stub.CloudControllerServiceUnregisteredCartridgeExceptionException;
-import org.apache.stratos.messaging.domain.policy.Partition;
 
 import java.rmi.RemoteException;
 
@@ -82,15 +85,26 @@ public class CloudControllerClient {
         }
         
     }
-
-    public static void spawnAnInstance(Partition partition, String clusterId) throws SpawningException {
-
-        org.apache.stratos.messaging.domain.policy.xsd.Partition partitionTopology = new
-                org.apache.stratos.messaging.domain.policy.xsd.Partition();
-        partitionTopology.setId(partition.getId());
+    
+    public boolean validateDeploymentPolicy(String cartridgeType, DeploymentPolicy policy) throws PolicyValidationException{
         
         try {
-            stub.startInstance(clusterId, partitionTopology);
+            return stub.validateDeploymentPolicy(cartridgeType, policy);
+        } catch (RemoteException e) {
+            log.error(e.getMessage());
+            throw new PolicyValidationException(e);
+        } catch (CloudControllerServiceInvalidPartitionExceptionException e) {
+            log.error(e.getMessage());
+            throw new PolicyValidationException(e);
+        } catch (CloudControllerServiceInvalidCartridgeTypeExceptionException e) {
+            log.error(e.getMessage());
+            throw new PolicyValidationException(e);
+        }
+    }
+
+    public void spawnAnInstance(Partition partition, String clusterId) throws SpawningException {
+        try {
+            stub.startInstance(clusterId, partition);
         } catch (CloudControllerServiceIllegalArgumentExceptionException e) {
             log.error(e.getMessage());
             throw new SpawningException(e);

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/exception/PolicyValidationException.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/exception/PolicyValidationException.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/exception/PolicyValidationException.java
new file mode 100644
index 0000000..0d899af
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/exception/PolicyValidationException.java
@@ -0,0 +1,19 @@
+package org.apache.stratos.autoscaler.exception;
+
+/**
+ *
+ */
+public class PolicyValidationException extends Exception {
+
+    private static final long serialVersionUID = -7423800138697480115L;
+
+
+    public PolicyValidationException(String message, Exception exception){
+        super(message, exception);
+    }
+
+
+    public PolicyValidationException(Exception exception){
+        super(exception);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java
index 5c57135..e7a03bd 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java
@@ -23,16 +23,7 @@ import com.google.gson.stream.JsonReader;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.AutoscalerContext;
-import org.apache.stratos.autoscaler.ClusterContext;
 import org.apache.stratos.autoscaler.Constants;
-import org.apache.stratos.autoscaler.policy.PolicyManager;
-import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
-import org.apache.stratos.autoscaler.policy.model.LoadThresholds;
-import org.apache.stratos.messaging.domain.policy.DeploymentPolicy;
-import org.apache.stratos.messaging.domain.topology.Cluster;
-import org.apache.stratos.messaging.domain.topology.Service;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
-
 import javax.jms.TextMessage;
 
 import java.io.BufferedReader;

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/PolicyManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/PolicyManager.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/PolicyManager.java
index 2630f98..27000f1 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/PolicyManager.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/PolicyManager.java
@@ -29,7 +29,7 @@ import java.util.Map;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
-import org.apache.stratos.messaging.domain.policy.DeploymentPolicy;
+import org.apache.stratos.cloud.controller.deployment.policy.DeploymentPolicy;
 
 /**
  * 

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/deployers/DeploymentPolicyDeployer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/deployers/DeploymentPolicyDeployer.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/deployers/DeploymentPolicyDeployer.java
index a219088..5c126e7 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/deployers/DeploymentPolicyDeployer.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/deployers/DeploymentPolicyDeployer.java
@@ -29,7 +29,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.policy.InvalidPolicyException;
 import org.apache.stratos.autoscaler.policy.PolicyManager;
-import org.apache.stratos.messaging.domain.policy.DeploymentPolicy;
+import org.apache.stratos.cloud.controller.deployment.policy.DeploymentPolicy;
 
 /**
  * 

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/deployers/DeploymentPolicyReader.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/deployers/DeploymentPolicyReader.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/deployers/DeploymentPolicyReader.java
index 603742b..60a31fd 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/deployers/DeploymentPolicyReader.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/policy/deployers/DeploymentPolicyReader.java
@@ -20,7 +20,9 @@
 package org.apache.stratos.autoscaler.policy.deployers;
 
 import java.io.File;
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 
 import javax.xml.namespace.QName;
 
@@ -29,9 +31,11 @@ import org.apache.axis2.deployment.DeploymentException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.policy.InvalidPolicyException;
-import org.apache.stratos.messaging.domain.policy.DeploymentPolicy;
-import org.apache.stratos.messaging.domain.policy.PartitionGroup;
-import org.apache.stratos.messaging.domain.policy.Partition;
+import org.apache.stratos.cloud.controller.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.deployment.partition.PartitionGroup;
+import org.apache.stratos.cloud.controller.deployment.policy.DeploymentPolicy;
+import org.apache.stratos.cloud.controller.pojo.Properties;
+import org.apache.stratos.cloud.controller.pojo.Property;
 
 /**
  * 
@@ -56,6 +60,7 @@ public class DeploymentPolicyReader  extends AbstractPolicyReader<DeploymentPoli
 				//Partition-Groups
 				Iterator<?> partitionGroupItr = docEle.getChildrenWithLocalName("partitionGroup");
 				while(partitionGroupItr.hasNext()){
+				    List<PartitionGroup> partitionGroups = new ArrayList<PartitionGroup>();
 					Object nextGroup = partitionGroupItr.next();
 					if(nextGroup instanceof OMElement){
 						OMElement groupEle = (OMElement) nextGroup;
@@ -63,6 +68,7 @@ public class DeploymentPolicyReader  extends AbstractPolicyReader<DeploymentPoli
 						group.setId(groupEle.getAttributeValue(new QName("id")));
 						group.setPartitionAlgo(readValue(groupEle, "partitionAlgo"));
 						
+						List<Partition> partitions = new ArrayList<Partition>() ;
 						//Partitions
 						Iterator<?> partitionItr = groupEle.getChildrenWithLocalName("partition");
 						while(partitionItr.hasNext()){
@@ -70,22 +76,45 @@ public class DeploymentPolicyReader  extends AbstractPolicyReader<DeploymentPoli
 							if(next instanceof OMElement){
 								OMElement partitionEle = (OMElement) next;
 								Partition partition = new Partition();
+								Properties props = new Properties();
+								List<Property> propertyList = new ArrayList<Property>();
+								
 								Iterator<?> partitionPropItr = partitionEle.getChildrenWithLocalName("property");
 								while(partitionPropItr.hasNext())
 								{
 									Object nextProperty = partitionPropItr.next();
 									if(nextProperty instanceof OMElement){
 										OMElement property = (OMElement)nextProperty;
+										Property prop = new Property();
+										prop.setName(property.getAttributeValue(new QName("name")));
+										prop.setValue(property.getText());
+										propertyList.add(prop);
 									}
 								}
+								if(props.getProperties() == null) {
+								    props.setProperties(new Property[0]);
+								}
+								props.setProperties(propertyList.toArray(props.getProperties()));
+								partition.setProperties(props);
 								partition.setId(partitionEle.getAttributeValue(new QName("id")));
 								partition.setPartitionMax(Integer.valueOf(readValue(partitionEle, "max")));
 								partition.setPartitionMin(Integer.valueOf(readValue(partitionEle, "min")));
-								group.getPartitions().add(partition);
+								partition.setProvider(readValue(partitionEle, "provider"));
+								//TODO partition validation before policy deployment
+//								validatePartition();
+								partitions.add(partition);
 							}
 						}
-						policy.getPartitionGroups().add(group);
+						if(group.getPartitions() == null) {
+						    group.setPartitions(new Partition[0]);
+						}
+						group.setPartitions(partitions.toArray(group.getPartitions()));
+						partitionGroups.add(group);
 					}
+					if(policy.getPartitionGroups() == null) {
+                        policy.setPartitionGroups(new PartitionGroup[0]);
+                    }
+					policy.setPartitionGroup(partitionGroups.toArray(policy.getPartitionGroups()));
 				}
 			} else{
 				throw new DeploymentException("File is not a valid deployment policy");

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/AutoscalerRuleEvaluator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/AutoscalerRuleEvaluator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/AutoscalerRuleEvaluator.java
index a360c52..a53040b 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/AutoscalerRuleEvaluator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/AutoscalerRuleEvaluator.java
@@ -31,7 +31,6 @@ import org.apache.stratos.autoscaler.ClusterMonitor;
 import org.apache.stratos.autoscaler.PartitionContext;
 import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
 import org.apache.stratos.autoscaler.policy.PolicyManager;
-import org.apache.stratos.messaging.domain.policy.Partition;
 import org.apache.stratos.messaging.domain.topology.Service;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
 import org.drools.KnowledgeBase;
@@ -48,6 +47,7 @@ import org.apache.stratos.autoscaler.algorithm.RoundRobin;
 import org.apache.stratos.autoscaler.util.AutoscalerUtil;
 import org.apache.stratos.messaging.domain.topology.Cluster;
 import org.apache.stratos.autoscaler.algorithm.PartitionGroupOneAfterAnother;
+import org.apache.stratos.cloud.controller.deployment.partition.Partition;
 import org.drools.runtime.rule.FactHandle;
 
 /**
@@ -82,6 +82,7 @@ public class AutoscalerRuleEvaluator {
             ksession.update(handle, obj);
         }
         ksession.fireAllRules();
+        log.info("fired all rules "+obj);
 
     }
 
@@ -116,7 +117,7 @@ public class AutoscalerRuleEvaluator {
 
 //            if(currentMemberCount < partition.getPartitionMembersMax())       {
 //                AutoscalerContext.getInstance().getClusterContext(clusterId).increaseMemberCount(1);
-    			CloudControllerClient.spawnAnInstance(partition, clusterId);
+    			CloudControllerClient.getInstance().spawnAnInstance(partition, clusterId);
 
 		} catch (Throwable e) {
 			log.error("Cannot spawn an instance", e);

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/topology/processors/AutoscalerTopologyReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/topology/processors/AutoscalerTopologyReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/topology/processors/AutoscalerTopologyReceiver.java
index ca79578..c44239d 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/topology/processors/AutoscalerTopologyReceiver.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/topology/processors/AutoscalerTopologyReceiver.java
@@ -23,6 +23,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.ClusterContext;
 import org.apache.stratos.autoscaler.ClusterMonitor;
+import org.apache.stratos.autoscaler.exception.PolicyValidationException;
 import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
 import org.apache.stratos.autoscaler.util.AutoscalerUtil;
 import org.apache.stratos.messaging.domain.topology.Cluster;
@@ -57,6 +58,11 @@ public class AutoscalerTopologyReceiver implements Runnable {
 
     @Override
     public void run() {
+        //FIXME this activated before autoscaler deployer actovated.
+        try {
+            Thread.sleep(30000);
+        } catch (InterruptedException ignore) {
+        }
         Thread thread = new Thread(topologyReceiver);
         thread.start();
         if(log.isInfoEnabled()) {
@@ -80,7 +86,8 @@ public class AutoscalerTopologyReceiver implements Runnable {
                     TopologyManager.acquireReadLock();
                     for(Service service : TopologyManager.getTopology().getServices()) {
                         for(Cluster cluster : service.getClusters()) {
-                                addClusterToContext(cluster);
+                                Thread th = new Thread(new ClusterContextAdder(cluster));
+                                th.start();
                         }
                     }
                 }
@@ -106,7 +113,8 @@ public class AutoscalerTopologyReceiver implements Runnable {
                     TopologyManager.acquireReadLock();
                     Service service = TopologyManager.getTopology().getService(e.getServiceName());
                     Cluster cluster = service.getCluster(e.getClusterId());
-                    addClusterToContext(cluster);
+                    Thread th = new Thread(new ClusterContextAdder(cluster));
+                    th.start();
                 }
                 finally {
                     TopologyManager.releaseReadLock();
@@ -173,22 +181,58 @@ public class AutoscalerTopologyReceiver implements Runnable {
         });
         return processorChain;
     }
-
-    private void addClusterToContext(Cluster cluster) {
-        ClusterContext ctxt = AutoscalerUtil.getClusterContext(cluster);
-        AutoscalerRuleEvaluator ruleCtxt = AutoscalerRuleEvaluator.getInstance();
-        ClusterMonitor monitor =
-                                 new ClusterMonitor(cluster.getClusterId(), ctxt,
-                                                    ruleCtxt.getStatefulSession());
-        Thread th = new Thread(monitor);
-        th.start();
-        AutoscalerRuleEvaluator.getInstance().addMonitor(monitor);
-        if (log.isDebugEnabled()) {
-            log.debug(String.format("Cluster monitor has been added: [cluster] %s",
-                                    cluster.getClusterId()));
+    
+    private class ClusterContextAdder implements Runnable {
+        private Cluster cluster;
+        
+        public ClusterContextAdder(Cluster cluster) {
+            this.cluster = cluster;
+        }
+        public void run() {
+            ClusterContext ctxt;
+            try {
+                ctxt = AutoscalerUtil.getClusterContext(cluster);
+            } catch (PolicyValidationException e) {
+                String msg = "Cluster monitor creation failed for cluster: "+cluster.getClusterId();
+                log.error(msg, e);
+                throw new RuntimeException(msg, e);
+            }
+            AutoscalerRuleEvaluator ruleCtxt = AutoscalerRuleEvaluator.getInstance();
+            ClusterMonitor monitor =
+                                     new ClusterMonitor(cluster.getClusterId(), ctxt,
+                                                        ruleCtxt.getStatefulSession());
+            Thread th = new Thread(monitor);
+            th.start();
+            AutoscalerRuleEvaluator.getInstance().addMonitor(monitor);
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Cluster monitor has been added: [cluster] %s",
+                                        cluster.getClusterId()));
+            }
         }
     }
 
+//    private void addClusterToContext(Cluster cluster) {
+//        ClusterContext ctxt;
+//        try {
+//            ctxt = AutoscalerUtil.getClusterContext(cluster);
+//        } catch (PolicyValidationException e) {
+//            String msg = "Cluster monitor creation failed for cluster: "+cluster.getClusterId();
+//            log.error(msg, e);
+//            throw new RuntimeException(msg, e);
+//        }
+//        AutoscalerRuleEvaluator ruleCtxt = AutoscalerRuleEvaluator.getInstance();
+//        ClusterMonitor monitor =
+//                                 new ClusterMonitor(cluster.getClusterId(), ctxt,
+//                                                    ruleCtxt.getStatefulSession());
+//        Thread th = new Thread(monitor);
+//        th.start();
+//        AutoscalerRuleEvaluator.getInstance().addMonitor(monitor);
+//        if (log.isDebugEnabled()) {
+//            log.debug(String.format("Cluster monitor has been added: [cluster] %s",
+//                                    cluster.getClusterId()));
+//        }
+//    }
+
     private void removeClusterFromContext(String clusterId) {
         ClusterMonitor monitor = AutoscalerRuleEvaluator.getInstance().removeMonitor(clusterId);
         monitor.destroy();

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
index 3b7cef8..af2841e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
@@ -19,11 +19,15 @@
 
 package org.apache.stratos.autoscaler.util;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.ClusterContext;
+import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
+import org.apache.stratos.autoscaler.exception.PolicyValidationException;
 import org.apache.stratos.autoscaler.policy.PolicyManager;
 import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
 import org.apache.stratos.autoscaler.policy.model.LoadThresholds;
-import org.apache.stratos.messaging.domain.policy.DeploymentPolicy;
+import org.apache.stratos.cloud.controller.deployment.policy.DeploymentPolicy;
 import org.apache.stratos.messaging.domain.topology.Cluster;
 
 
@@ -31,6 +35,8 @@ import org.apache.stratos.messaging.domain.topology.Cluster;
  * This class contains utility methods used by Autoscaler.
  */
 public class AutoscalerUtil {
+    
+    private static final Log log = LogFactory.getLog(AutoscalerUtil.class);
 
 	private AutoscalerUtil() {
 
@@ -40,14 +46,18 @@ public class AutoscalerUtil {
 	 * Updates ClusterContext for given cluster
 	 * @param cluster
 	 * @return ClusterContext - Updated ClusterContext
+	 * @throws PolicyValidationException 
 	 */
-    public static ClusterContext getClusterContext(Cluster cluster) {
+    public static ClusterContext getClusterContext(Cluster cluster) throws PolicyValidationException {
         // FIXME fix the following code to correctly update
         // AutoscalerContext context = AutoscalerContext.getInstance();
         if (null == cluster) {
             return null;
         }
 
+        log.info("Deployment policy name: "+cluster.getDeploymentPolicyName());
+        log.info("Autoscaler policy name: "+cluster.getAutoscalePolicyName());
+        
         AutoscalePolicy policy =
                                  PolicyManager.getInstance()
                                               .getAutoscalePolicy(cluster.getAutoscalePolicyName());
@@ -55,6 +65,8 @@ public class AutoscalerUtil {
                                             PolicyManager.getInstance()
                                                          .getDeploymentPolicy(cluster.getDeploymentPolicyName());
 
+        log.info("Autoscaler policy: "+policy+" Deployment Policy: "+deploymentPolicy);
+            CloudControllerClient.getInstance().validateDeploymentPolicy(cluster.getServiceName(), deploymentPolicy);
         ClusterContext clusterContext =
                                         new ClusterContext(cluster.getClusterId(),
                                                            cluster.getServiceName(),

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestKnowledgeBase.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestKnowledgeBase.java b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestKnowledgeBase.java
index cd6476c..0895e44 100644
--- a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestKnowledgeBase.java
+++ b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestKnowledgeBase.java
@@ -24,10 +24,6 @@ import java.util.List;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.autoscaler.policy.PolicyManager;
-import org.apache.stratos.messaging.domain.policy.Partition;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
-import org.drools.runtime.rule.FactHandle;
 import org.drools.KnowledgeBase;
 import org.drools.KnowledgeBaseFactory;
 import org.drools.builder.*;

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicyDeployerTest.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicyDeployerTest.java b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicyDeployerTest.java
new file mode 100644
index 0000000..aa581e3
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicyDeployerTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.deployment.policy;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+
+import org.apache.stratos.autoscaler.policy.InvalidPolicyException;
+import org.apache.stratos.autoscaler.policy.deployers.DeploymentPolicyReader;
+import org.apache.stratos.cloud.controller.deployment.policy.DeploymentPolicy;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author nirmal
+ *
+ */
+public class DeploymentPolicyDeployerTest {
+    
+    DeploymentPolicyReader reader;
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        reader = new DeploymentPolicyReader(new File("src/test/resources/deployment-policy.xml"));
+    }
+
+    @Test
+    public void test() throws InvalidPolicyException {
+        
+        DeploymentPolicy policy = reader.read();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/test/resources/deployment-policy.xml
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/test/resources/deployment-policy.xml b/components/org.apache.stratos.autoscaler/src/test/resources/deployment-policy.xml
new file mode 100644
index 0000000..81e7865
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/test/resources/deployment-policy.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<deploymentPolicy id ="economy-deployment">
+                <partitionGroup id="group1" >
+                        <partitionAlgo>one-after-another</partitionAlgo>
+                        <partition id="P1" >
+                                <provider>ec2</provider>
+                                <property name="region">ap-southeast-1</property>
+                                <max>3</max>
+                                <min>1</min>
+                        </partition>
+                        <!--partition id="P2" >
+                                <max>5</max>
+                                <min>1</min>
+                        </partition-->
+                </partitionGroup>
+</deploymentPolicy>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/530af9eb/components/org.apache.stratos.autoscaler/src/test/resources/test-minimum-autoscaler-rule.drl
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/test/resources/test-minimum-autoscaler-rule.drl b/components/org.apache.stratos.autoscaler/src/test/resources/test-minimum-autoscaler-rule.drl
index c2f2a65..ba3105c 100644
--- a/components/org.apache.stratos.autoscaler/src/test/resources/test-minimum-autoscaler-rule.drl
+++ b/components/org.apache.stratos.autoscaler/src/test/resources/test-minimum-autoscaler-rule.drl
@@ -19,42 +19,16 @@
 
 package org.apache.stratos.autoscaler.rule;
 
-import org.apache.stratos.messaging.domain.topology.Service;
-import org.apache.stratos.messaging.domain.topology.Cluster;
-import org.apache.stratos.autoscaler.AutoscalerContext;
-import org.apache.stratos.autoscaler.ClusterContext;
-import org.apache.stratos.autoscaler.Constants;
-import org.apache.stratos.autoscaler.policy.PolicyManager;
-import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
-import org.apache.stratos.messaging.domain.policy.Partition;
-import org.apache.stratos.messaging.domain.policy.PartitionGroup;
-import org.apache.stratos.messaging.domain.policy.DeploymentPolicy;
-import org.apache.stratos.autoscaler.policy.model.RequestsInFlight;
-import org.apache.stratos.autoscaler.policy.model.LoadThresholds;
-import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
-import org.apache.stratos.autoscaler.algorithm.AutoscaleAlgorithm;
-import org.apache.stratos.autoscaler.algorithm.OneAfterAnother;
-import org.apache.stratos.autoscaler.algorithm.RoundRobin;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
-import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
-import org.apache.commons.logging.Log;
-import java.util.ArrayList;
 
-global org.apache.stratos.autoscaler.policy.PolicyManager $manager;
-global org.apache.stratos.autoscaler.AutoscalerContext $context; 
-global org.apache.commons.logging.Log log;
-global org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator $evaluator;
-global org.apache.stratos.messaging.domain.topology.Topology $topology;
-global org.apache.stratos.messaging.domain.policy.Partition pa;
 
 
-rule "Minimum Rule"
-dialect "mvel"
-       when
-	       $p : ArrayList()
-	       $x : String() from $p
-		   eval(true)
-
-       then
-			System.out.println($x+ "SSsSS");	       
-end
\ No newline at end of file
+#rule "Minimum Rule"
+#dialect "mvel"
+#       when
+#	       $p : ArrayList()
+#	       $x : String() from $p
+#		   eval(true)
+#
+ #      then
+#			System.out.println($x+ "SSsSS");	       
+#end
\ No newline at end of file