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