You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ra...@apache.org on 2014/10/14 16:28:03 UTC
[2/3] git commit: Fixing STRATOS-889
Fixing STRATOS-889
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/d189b136
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/d189b136
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/d189b136
Branch: refs/heads/master
Commit: d189b136e7134b531714e22550eb1e785c0786de
Parents: 27f2a6d
Author: R-Rajkumar <rr...@gmail.com>
Authored: Tue Oct 14 19:49:04 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Tue Oct 14 19:49:04 2014 +0530
----------------------------------------------------------------------
.../rule/AutoscalerRuleEvaluator.java | 4 +-
.../stratos/autoscaler/TestRulesPackaged.java | 6 +-
.../common/constants/StratosConstants.java | 1 +
.../modules/distribution/src/assembly/bin.xml | 22 +-
.../src/main/conf/container-mincheck.drl | 73 -------
.../src/main/conf/container-scaling.drl | 173 ----------------
.../src/main/conf/drools/container-mincheck.drl | 73 +++++++
.../src/main/conf/drools/container-scaling.drl | 173 ++++++++++++++++
.../src/main/conf/drools/mincheck.drl | 83 ++++++++
.../src/main/conf/drools/scaling.drl | 205 +++++++++++++++++++
.../src/main/conf/drools/terminateall.drl | 44 ++++
.../distribution/src/main/conf/mincheck.drl | 83 --------
.../distribution/src/main/conf/scaling.drl | 205 -------------------
.../distribution/src/main/conf/terminateall.drl | 44 ----
14 files changed, 597 insertions(+), 592 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/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 a402ab4..094aa86 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
@@ -24,6 +24,7 @@ import org.apache.commons.logging.LogFactory;
import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
import org.apache.stratos.autoscaler.PartitionContext;
import org.apache.stratos.autoscaler.partition.PartitionManager;
+import org.apache.stratos.common.constants.StratosConstants;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.*;
@@ -176,7 +177,8 @@ public class AutoscalerRuleEvaluator {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
String configDir = CarbonUtils.getCarbonConfigDirPath();
- Resource resource = ResourceFactory.newFileResource(configDir + File.separator + drlFileName );
+ String droolsDir = configDir + File.separator + StratosConstants.DROOLS_DIR_NAME;
+ Resource resource = ResourceFactory.newFileResource(droolsDir + File.separator + drlFileName);
kbuilder.add(resource, ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestRulesPackaged.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestRulesPackaged.java b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestRulesPackaged.java
index 1c6c687..f6f0148 100644
--- a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestRulesPackaged.java
+++ b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestRulesPackaged.java
@@ -32,9 +32,9 @@ import static org.junit.Assert.assertEquals;
public class TestRulesPackaged {
private static final Log log = LogFactory.getLog(TestRulesPackaged.class);
- private String minCheckDrlFilePath = "../../products/stratos/modules/distribution/src/main/conf/mincheck.drl";
- private String scalingDrlFilePath = "../../products/stratos/modules/distribution/src/main/conf/scaling.drl";
- private String terminateAllDrlFilePath = "../../products/stratos/modules/distribution/src/main/conf/terminateall.drl";
+ private String minCheckDrlFilePath = "../../products/stratos/modules/distribution/src/main/conf/drools/mincheck.drl";
+ private String scalingDrlFilePath = "../../products/stratos/modules/distribution/src/main/conf/drools/scaling.drl";
+ private String terminateAllDrlFilePath = "../../products/stratos/modules/distribution/src/main/conf/drools/terminateall.drl";
private KnowledgeBase kbase;
private StatefulKnowledgeSession ksession;
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java
index 5d3ad8c..72cbb26 100644
--- a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java
+++ b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/constants/StratosConstants.java
@@ -155,6 +155,7 @@ public class StratosConstants {
public static final String ALLOCATED_SERVICE_HOST_PORT = "ALLOCATED_SERVICE_HOST_PORT";
//drools related constants
+ public static final String DROOLS_DIR_NAME = "drools";
public static final String CONTAINER_SCALE_CHECK_DROOL_FILE = "container-scaling.drl";
public static final String VM_SCALE_CHECK_DROOL_FILE = "scaling.drl";
public static final String CONTAINER_MIN_CHECK_DROOL_FILE = "container-mincheck.drl";
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/products/stratos/modules/distribution/src/assembly/bin.xml
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/assembly/bin.xml b/products/stratos/modules/distribution/src/assembly/bin.xml
index 4295576..8614acf 100755
--- a/products/stratos/modules/distribution/src/assembly/bin.xml
+++ b/products/stratos/modules/distribution/src/assembly/bin.xml
@@ -660,38 +660,40 @@
<filtered>true</filtered>
<fileMode>755</fileMode>
</file>
+ <!-- drools files start-->
<file>
- <source>src/main/conf/mincheck.drl</source>
- <outputDirectory>${pom.artifactId}-${pom.version}/repository/conf</outputDirectory>
+ <source>src/main/conf/drools/mincheck.drl</source>
+ <outputDirectory>${pom.artifactId}-${pom.version}/repository/conf/drools</outputDirectory>
<filtered>true</filtered>
<fileMode>755</fileMode>
</file>
<file>
- <source>src/main/conf/scaling.drl</source>
- <outputDirectory>${pom.artifactId}-${pom.version}/repository/conf</outputDirectory>
+ <source>src/main/conf/drools/scaling.drl</source>
+ <outputDirectory>${pom.artifactId}-${pom.version}/repository/conf/drools</outputDirectory>
<filtered>true</filtered>
<fileMode>755</fileMode>
</file>
<file>
- <source>src/main/conf/terminateall.drl</source>
- <outputDirectory>${pom.artifactId}-${pom.version}/repository/conf</outputDirectory>
+ <source>src/main/conf/drools/terminateall.drl</source>
+ <outputDirectory>${pom.artifactId}-${pom.version}/repository/conf/drools</outputDirectory>
<filtered>true</filtered>
<fileMode>755</fileMode>
</file>
<!-- container-drools files -->
<file>
- <source>src/main/conf/container-mincheck.drl</source>
- <outputDirectory>${pom.artifactId}-${pom.version}/repository/conf</outputDirectory>
+ <source>src/main/conf/drools/container-mincheck.drl</source>
+ <outputDirectory>${pom.artifactId}-${pom.version}/repository/conf/drools</outputDirectory>
<filtered>true</filtered>
<fileMode>755</fileMode>
</file>
<file>
- <source>src/main/conf/container-scaling.drl</source>
- <outputDirectory>${pom.artifactId}-${pom.version}/repository/conf</outputDirectory>
+ <source>src/main/conf/drools/container-scaling.drl</source>
+ <outputDirectory>${pom.artifactId}-${pom.version}/repository/conf/drools</outputDirectory>
<filtered>true</filtered>
<fileMode>755</fileMode>
</file>
<!-- container-drools files -->
+ <!-- /drools files end-->
<!-- autoscaler -->
<file>
<source>${project.basedir}/INSTALL.txt</source>
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/products/stratos/modules/distribution/src/main/conf/container-mincheck.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/container-mincheck.drl b/products/stratos/modules/distribution/src/main/conf/container-mincheck.drl
deleted file mode 100644
index f87a556..0000000
--- a/products/stratos/modules/distribution/src/main/conf/container-mincheck.drl
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.rule;
-
-import org.apache.commons.logging.Log;
-import org.apache.stratos.autoscaler.KubernetesClusterContext;
-
-global org.apache.stratos.autoscaler.rule.RuleLog log;
-global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator;
-global java.lang.String clusterId;
-
-rule "Container Minimum Rule"
-dialect "mvel"
- when
- $kubernetesClusterContext : KubernetesClusterContext ()
- kubernetesClusterId : String() from $kubernetesClusterContext.getKubernetesClusterID()
- minReplicas : Integer() from $kubernetesClusterContext.getMinReplicas()
- nonTerminatedReplicas : Integer() from $kubernetesClusterContext.getNonTerminatedMemberCount()
- isServiceClusterCreated : Boolean() from $kubernetesClusterContext.isServiceClusterCreated()
-
- eval(log.info("Running minimum rule: [kub-cluster] " + kubernetesClusterId + " [cluster] " + clusterId))
- eval(log.info("[min-check] " + " [cluster] : " + clusterId + " [Replicas] nonTerminated : " + nonTerminatedReplicas))
- eval(log.info("[min-check] " + " [cluster] : " + clusterId + " [Replicas] minReplicas : " + minReplicas))
- eval(nonTerminatedReplicas < minReplicas)
- then
- if (isServiceClusterCreated) {
- // we suceeded calling startContainer() once, can't call it again
- log.info("[min-check] Decided to scale-up : [cluster] : " + clusterId);
- log.info("[min-check] " + " [cluster] : " + clusterId + " ; min-rule not satisfied, scaling up to minReplicas : " + minReplicas);
- $delegator.delegateScaleUpContainers($kubernetesClusterContext, minReplicas);
- } else {
- // we should call startContainer
- log.info("[min-check] Decided to create the cluster : [cluster] : " + clusterId);
- log.info("[min-check] " + " [cluster] : " + clusterId + " ; min-rule not satisfied, no containers created yet, creating minReplicas : " + minReplicas);
- $delegator.delegateStartContainers($kubernetesClusterContext);
- }
-end
-
-rule "Terminate Obsoleted Containers"
-dialect "mvel"
- when
- $kubernetesClusterContext : KubernetesClusterContext ()
- kubernetesClusterId : String() from $kubernetesClusterContext.getKubernetesClusterID()
- obsoleteReplicas : Integer() from $kubernetesClusterContext.getObsoletedMembers().size()
-
- eval(log.info("Running obsolete containers rule [kub-cluster] : " + kubernetesClusterId + " [cluster] : " + clusterId))
- eval(log.info("[obsolete-check] " + "[cluster] : " + clusterId + " [Replicas] obsoleteReplicas : " + obsoleteReplicas))
- eval($kubernetesClusterContext.getObsoletedMembers().keySet().size() > 0)
- memberId : String() from $kubernetesClusterContext.getObsoletedMembers().keySet()
- eval(log.debug("[obsolete-check] [kub-cluster] : " + kubernetesClusterId + " [cluster] : " + clusterId + " Member id : " + memberId))
- then
- log.info("[obsolete-check] Terminating the obsolete member with id : " + memberId + " in the cluster : " + clusterId);
- $delegator.delegateTerminateContainer($kubernetesClusterContext, memberId);
-end
-
-
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/products/stratos/modules/distribution/src/main/conf/container-scaling.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/container-scaling.drl b/products/stratos/modules/distribution/src/main/conf/container-scaling.drl
deleted file mode 100644
index c5d4272..0000000
--- a/products/stratos/modules/distribution/src/main/conf/container-scaling.drl
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * 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.rule;
-
-import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
-import org.apache.stratos.autoscaler.policy.model.LoadThresholds;
-import org.apache.stratos.autoscaler.KubernetesClusterContext;
-
-global org.apache.stratos.autoscaler.rule.RuleLog log;
-global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator;
-global org.apache.stratos.autoscaler.policy.model.AutoscalePolicy autoscalePolicy;
-global java.lang.String clusterId;
-global java.lang.Boolean rifReset;
-global java.lang.Boolean mcReset;
-global java.lang.Boolean laReset;
-
-rule "Containers Scaling Rule"
-dialect "mvel"
- when
- $kubernetesClusterContext : KubernetesClusterContext ()
- kubernetesClusterId : String() from $kubernetesClusterContext.getKubernetesClusterID()
- minReplicas : Integer() from $kubernetesClusterContext.getMinReplicas()
- maxReplicas : Integer() from $kubernetesClusterContext.getMaxReplicas()
- nonTerminatedReplicas : Integer() from $kubernetesClusterContext.getNonTerminatedMemberCount()
- activeReplicas : Integer() from $kubernetesClusterContext.getActiveMemberCount()
-
- eval(log.info("Running scaling rule [kub-cluster] : " + kubernetesClusterId + " [cluster] : " + clusterId))
-
- $loadThresholds : LoadThresholds() from autoscalePolicy.getLoadThresholds()
-
- rifUpperLimit : Float() from $loadThresholds.getRequestsInFlight().getUpperLimit()
- rifLowerLimit : Float() from $loadThresholds.getRequestsInFlight().getLowerLimit()
-
- rifAverage : Float() from $kubernetesClusterContext.getAverageRequestsInFlight()
- rifGradient : Float() from $kubernetesClusterContext.getRequestsInFlightGradient()
- rifSecondDerivative : Float() from $kubernetesClusterContext.getRequestsInFlightSecondDerivative()
- rifPredictedValue : Double() from $delegator.getPredictedValueForNextMinute(rifAverage, rifGradient, rifSecondDerivative, 1)
-
- mcUpperLimit : Float() from $loadThresholds.getMemoryConsumption().getUpperLimit()
- mcLowerLimit : Float() from $loadThresholds.getMemoryConsumption().getLowerLimit()
-
- memoryConsumptionAverage : Float() from $kubernetesClusterContext.getAverageMemoryConsumption()
- memoryConsumptionGradient : Float() from $kubernetesClusterContext.getMemoryConsumptionGradient()
- memoryConsumptionSecondDerivative : Float() from $kubernetesClusterContext.getMemoryConsumptionSecondDerivative()
- mcPredictedValue : Double() from $delegator.getPredictedValueForNextMinute(memoryConsumptionAverage, memoryConsumptionGradient, memoryConsumptionSecondDerivative, 1)
-
- laUpperLimit : Float() from $loadThresholds.getLoadAverage().getUpperLimit()
- laLowerLimit : Float() from $loadThresholds.getLoadAverage().getLowerLimit()
-
- loadAverageAverage : Float() from $kubernetesClusterContext.getAverageLoadAverage()
- loadAverageGradient : Float() from $kubernetesClusterContext.getLoadAverageGradient()
- loadAverageSecondDerivative : Float() from $kubernetesClusterContext.getLoadAverageSecondDerivative()
- laPredictedValue : Double() from $delegator.getPredictedValueForNextMinute(loadAverageAverage, loadAverageGradient, loadAverageSecondDerivative, 1)
-
- scaleUpForRif : Boolean() from (rifReset && (rifPredictedValue > rifUpperLimit))
- scaleUpForMc : Boolean() from (mcReset && (mcPredictedValue > mcUpperLimit))
- scaleUpForLa : Boolean() from (laReset && (laPredictedValue > laUpperLimit))
-
- scaleDownForRif : Boolean() from (rifPredictedValue < rifUpperLimit)
- scaleDownForMc : Boolean() from (mcReset && (mcPredictedValue < mcUpperLimit))
- scaleDownForLa : Boolean() from (laReset && (laPredictedValue < laUpperLimit))
-
- scaleUp : Boolean() from (scaleUpForRif || scaleUpForMc || scaleUpForLa)
- scaleDown : Boolean() from (scaleDownForRif && scaleDownForMc && scaleDownForLa)
-
- eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [Replicas] minReplicas : " + minReplicas))
- eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [Replicas] maxReplicas : " + maxReplicas))
- eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [Replicas] nonTerminated : " + nonTerminatedReplicas))
- eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [Replicas] activeReplicas : " + activeReplicas))
-
- eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " [RequestInFlight] resetted ? : " + rifReset))
- eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " [RequestInFlight] predicted value : " + rifPredictedValue))
- eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " [RequestInFlight] upper limit : " + rifUpperLimit))
- eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " [RequestInFlight] lower limit : " + rifLowerLimit))
-
- eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " [MemoryConsumption] resetted ? : " + mcReset))
- eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [MemoryConsumption] predicted value : " + mcPredictedValue))
- eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [MemoryConsumption] upper limit : " + mcUpperLimit))
- eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [MemoryConsumption] lower limit : " + mcLowerLimit))
-
- eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " [LoadAverage] resetted ? : " + laReset))
- eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [LoadAverage] predicted value : " + laPredictedValue))
- eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [LoadAverage] upper limit : " + laUpperLimit))
- eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [LoadAverage] lower limit : " + laLowerLimit))
-
- eval(log.info("[scaling] " + " [cluster] : " + clusterId + " scale-up action : " + scaleUp))
- eval(log.info("[scaling] " + " [cluster] : " + clusterId + " scale-down action : " + scaleDown))
-
- then
- if (scaleUp) {
- int requiredReplicas = 0;
- if (scaleUpForRif) {
- int predictedReplicasForRif = $delegator.getPredictedReplicasForStat(minReplicas, rifUpperLimit, rifPredictedValue);
- log.info("[scaling] " + " [cluster] : " + clusterId + " [RequestInFlight] predicted replicas : " + predictedReplicasForRif);
- if (predictedReplicasForRif > requiredReplicas ) {
- requiredReplicas = predictedReplicasForRif;
- }
- }
- if (scaleUpForMc) {
- int predictedReplicasForMc = $delegator.getPredictedReplicasForStat(minReplicas, mcUpperLimit, mcPredictedValue);
- log.info("[scaling] " + " [cluster] : " + clusterId + " [MemoryConsumption] predicted replicas : " + predictedReplicasForMc);
- if (predictedReplicasForMc > requiredReplicas ) {
- requiredReplicas = predictedReplicasForMc;
- }
- }
- if (scaleUpForLa) {
- int predictedReplicasForLa = $delegator.getPredictedReplicasForStat(minReplicas, laUpperLimit, laPredictedValue);
- log.info("[scaling] " + " [cluster] : " + clusterId + " [LoadAverage] predicted replicas : " + predictedReplicasForLa);
- if (predictedReplicasForLa > requiredReplicas ) {
- requiredReplicas = predictedReplicasForLa;
- }
- }
- //max-check
- if (requiredReplicas > maxReplicas) {
- log.info("[scaling] " + " [cluster] : " + clusterId + " predicted replicas > max replicas : ");
- requiredReplicas = maxReplicas;
- }
- //min-check
- if (requiredReplicas < minReplicas) {
- log.info("[scaling] " + " [cluster] : " + clusterId + " predicted replicas < min replicas : ");
- requiredReplicas = minReplicas;
- }
- //expand the cluster
- if (requiredReplicas > nonTerminatedReplicas) {
- log.info("[scaling] Decided to scale-up : [cluster] : " + clusterId);
- log.info("[scaling-up] " + " [cluster] : " + clusterId + " valid number of replicas to expand : " + requiredReplicas);
- $delegator.delegateScaleUpContainers($kubernetesClusterContext, requiredReplicas);
- }
- //shrink the cluster
- if (requiredReplicas < nonTerminatedReplicas) {
- if (requiredReplicas < activeReplicas) {
- log.info("[scaling] Decided to scale-down : [cluster] : " + clusterId);
- log.info("[scaling-down] " + " [cluster] : " + clusterId + " valid number of replicas to shrink : " + requiredReplicas);
- $delegator.delegateScaleDownContainers($kubernetesClusterContext, requiredReplicas);
- } else {
- log.info("[scaling] " + " [cluster] : " + clusterId + " Even if requiredReplicas < nonTerminatedReplicas, still requiredReplicas >= activeReplicas ; hence not scaling down ");
- }
- }
- if (requiredReplicas == nonTerminatedReplicas) {
- log.info("[scaling] " + " [cluster] : " + clusterId + " Non terminated replicas and predicted replicas are same");
- }
-
- } else if (scaleDown) {
- if (activeReplicas > minReplicas) {
- log.info("[scaling] Decided to scale-down [cluster] : " + clusterId);
- log.info("[scaling-down] " + " [cluster] : " + clusterId + " shrink the cluster to minReplicas : " + minReplicas);
- //shrink the cluster to minReplicas
- $delegator.delegateScaleDownContainers($kubernetesClusterContext, minReplicas);
- } else {
- log.info("[scaling] " + " [cluster] : " + clusterId + " Even if all predicted stats < upperLimit, still activeReplicas <= minReplicas ; hence not scaling down ");
- }
- } else {
- log.info("[scaling] No decision made to either scale up or down ... ");
- }
-end
-
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/products/stratos/modules/distribution/src/main/conf/drools/container-mincheck.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/drools/container-mincheck.drl b/products/stratos/modules/distribution/src/main/conf/drools/container-mincheck.drl
new file mode 100644
index 0000000..f87a556
--- /dev/null
+++ b/products/stratos/modules/distribution/src/main/conf/drools/container-mincheck.drl
@@ -0,0 +1,73 @@
+/*
+ * 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.rule;
+
+import org.apache.commons.logging.Log;
+import org.apache.stratos.autoscaler.KubernetesClusterContext;
+
+global org.apache.stratos.autoscaler.rule.RuleLog log;
+global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator;
+global java.lang.String clusterId;
+
+rule "Container Minimum Rule"
+dialect "mvel"
+ when
+ $kubernetesClusterContext : KubernetesClusterContext ()
+ kubernetesClusterId : String() from $kubernetesClusterContext.getKubernetesClusterID()
+ minReplicas : Integer() from $kubernetesClusterContext.getMinReplicas()
+ nonTerminatedReplicas : Integer() from $kubernetesClusterContext.getNonTerminatedMemberCount()
+ isServiceClusterCreated : Boolean() from $kubernetesClusterContext.isServiceClusterCreated()
+
+ eval(log.info("Running minimum rule: [kub-cluster] " + kubernetesClusterId + " [cluster] " + clusterId))
+ eval(log.info("[min-check] " + " [cluster] : " + clusterId + " [Replicas] nonTerminated : " + nonTerminatedReplicas))
+ eval(log.info("[min-check] " + " [cluster] : " + clusterId + " [Replicas] minReplicas : " + minReplicas))
+ eval(nonTerminatedReplicas < minReplicas)
+ then
+ if (isServiceClusterCreated) {
+ // we suceeded calling startContainer() once, can't call it again
+ log.info("[min-check] Decided to scale-up : [cluster] : " + clusterId);
+ log.info("[min-check] " + " [cluster] : " + clusterId + " ; min-rule not satisfied, scaling up to minReplicas : " + minReplicas);
+ $delegator.delegateScaleUpContainers($kubernetesClusterContext, minReplicas);
+ } else {
+ // we should call startContainer
+ log.info("[min-check] Decided to create the cluster : [cluster] : " + clusterId);
+ log.info("[min-check] " + " [cluster] : " + clusterId + " ; min-rule not satisfied, no containers created yet, creating minReplicas : " + minReplicas);
+ $delegator.delegateStartContainers($kubernetesClusterContext);
+ }
+end
+
+rule "Terminate Obsoleted Containers"
+dialect "mvel"
+ when
+ $kubernetesClusterContext : KubernetesClusterContext ()
+ kubernetesClusterId : String() from $kubernetesClusterContext.getKubernetesClusterID()
+ obsoleteReplicas : Integer() from $kubernetesClusterContext.getObsoletedMembers().size()
+
+ eval(log.info("Running obsolete containers rule [kub-cluster] : " + kubernetesClusterId + " [cluster] : " + clusterId))
+ eval(log.info("[obsolete-check] " + "[cluster] : " + clusterId + " [Replicas] obsoleteReplicas : " + obsoleteReplicas))
+ eval($kubernetesClusterContext.getObsoletedMembers().keySet().size() > 0)
+ memberId : String() from $kubernetesClusterContext.getObsoletedMembers().keySet()
+ eval(log.debug("[obsolete-check] [kub-cluster] : " + kubernetesClusterId + " [cluster] : " + clusterId + " Member id : " + memberId))
+ then
+ log.info("[obsolete-check] Terminating the obsolete member with id : " + memberId + " in the cluster : " + clusterId);
+ $delegator.delegateTerminateContainer($kubernetesClusterContext, memberId);
+end
+
+
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/products/stratos/modules/distribution/src/main/conf/drools/container-scaling.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/drools/container-scaling.drl b/products/stratos/modules/distribution/src/main/conf/drools/container-scaling.drl
new file mode 100644
index 0000000..c5d4272
--- /dev/null
+++ b/products/stratos/modules/distribution/src/main/conf/drools/container-scaling.drl
@@ -0,0 +1,173 @@
+/*
+ * 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.rule;
+
+import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
+import org.apache.stratos.autoscaler.policy.model.LoadThresholds;
+import org.apache.stratos.autoscaler.KubernetesClusterContext;
+
+global org.apache.stratos.autoscaler.rule.RuleLog log;
+global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator;
+global org.apache.stratos.autoscaler.policy.model.AutoscalePolicy autoscalePolicy;
+global java.lang.String clusterId;
+global java.lang.Boolean rifReset;
+global java.lang.Boolean mcReset;
+global java.lang.Boolean laReset;
+
+rule "Containers Scaling Rule"
+dialect "mvel"
+ when
+ $kubernetesClusterContext : KubernetesClusterContext ()
+ kubernetesClusterId : String() from $kubernetesClusterContext.getKubernetesClusterID()
+ minReplicas : Integer() from $kubernetesClusterContext.getMinReplicas()
+ maxReplicas : Integer() from $kubernetesClusterContext.getMaxReplicas()
+ nonTerminatedReplicas : Integer() from $kubernetesClusterContext.getNonTerminatedMemberCount()
+ activeReplicas : Integer() from $kubernetesClusterContext.getActiveMemberCount()
+
+ eval(log.info("Running scaling rule [kub-cluster] : " + kubernetesClusterId + " [cluster] : " + clusterId))
+
+ $loadThresholds : LoadThresholds() from autoscalePolicy.getLoadThresholds()
+
+ rifUpperLimit : Float() from $loadThresholds.getRequestsInFlight().getUpperLimit()
+ rifLowerLimit : Float() from $loadThresholds.getRequestsInFlight().getLowerLimit()
+
+ rifAverage : Float() from $kubernetesClusterContext.getAverageRequestsInFlight()
+ rifGradient : Float() from $kubernetesClusterContext.getRequestsInFlightGradient()
+ rifSecondDerivative : Float() from $kubernetesClusterContext.getRequestsInFlightSecondDerivative()
+ rifPredictedValue : Double() from $delegator.getPredictedValueForNextMinute(rifAverage, rifGradient, rifSecondDerivative, 1)
+
+ mcUpperLimit : Float() from $loadThresholds.getMemoryConsumption().getUpperLimit()
+ mcLowerLimit : Float() from $loadThresholds.getMemoryConsumption().getLowerLimit()
+
+ memoryConsumptionAverage : Float() from $kubernetesClusterContext.getAverageMemoryConsumption()
+ memoryConsumptionGradient : Float() from $kubernetesClusterContext.getMemoryConsumptionGradient()
+ memoryConsumptionSecondDerivative : Float() from $kubernetesClusterContext.getMemoryConsumptionSecondDerivative()
+ mcPredictedValue : Double() from $delegator.getPredictedValueForNextMinute(memoryConsumptionAverage, memoryConsumptionGradient, memoryConsumptionSecondDerivative, 1)
+
+ laUpperLimit : Float() from $loadThresholds.getLoadAverage().getUpperLimit()
+ laLowerLimit : Float() from $loadThresholds.getLoadAverage().getLowerLimit()
+
+ loadAverageAverage : Float() from $kubernetesClusterContext.getAverageLoadAverage()
+ loadAverageGradient : Float() from $kubernetesClusterContext.getLoadAverageGradient()
+ loadAverageSecondDerivative : Float() from $kubernetesClusterContext.getLoadAverageSecondDerivative()
+ laPredictedValue : Double() from $delegator.getPredictedValueForNextMinute(loadAverageAverage, loadAverageGradient, loadAverageSecondDerivative, 1)
+
+ scaleUpForRif : Boolean() from (rifReset && (rifPredictedValue > rifUpperLimit))
+ scaleUpForMc : Boolean() from (mcReset && (mcPredictedValue > mcUpperLimit))
+ scaleUpForLa : Boolean() from (laReset && (laPredictedValue > laUpperLimit))
+
+ scaleDownForRif : Boolean() from (rifPredictedValue < rifUpperLimit)
+ scaleDownForMc : Boolean() from (mcReset && (mcPredictedValue < mcUpperLimit))
+ scaleDownForLa : Boolean() from (laReset && (laPredictedValue < laUpperLimit))
+
+ scaleUp : Boolean() from (scaleUpForRif || scaleUpForMc || scaleUpForLa)
+ scaleDown : Boolean() from (scaleDownForRif && scaleDownForMc && scaleDownForLa)
+
+ eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [Replicas] minReplicas : " + minReplicas))
+ eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [Replicas] maxReplicas : " + maxReplicas))
+ eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [Replicas] nonTerminated : " + nonTerminatedReplicas))
+ eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [Replicas] activeReplicas : " + activeReplicas))
+
+ eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " [RequestInFlight] resetted ? : " + rifReset))
+ eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " [RequestInFlight] predicted value : " + rifPredictedValue))
+ eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " [RequestInFlight] upper limit : " + rifUpperLimit))
+ eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " [RequestInFlight] lower limit : " + rifLowerLimit))
+
+ eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " [MemoryConsumption] resetted ? : " + mcReset))
+ eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [MemoryConsumption] predicted value : " + mcPredictedValue))
+ eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [MemoryConsumption] upper limit : " + mcUpperLimit))
+ eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [MemoryConsumption] lower limit : " + mcLowerLimit))
+
+ eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " [LoadAverage] resetted ? : " + laReset))
+ eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [LoadAverage] predicted value : " + laPredictedValue))
+ eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [LoadAverage] upper limit : " + laUpperLimit))
+ eval(log.info("[scaling] " + " [cluster] : " + clusterId + " [LoadAverage] lower limit : " + laLowerLimit))
+
+ eval(log.info("[scaling] " + " [cluster] : " + clusterId + " scale-up action : " + scaleUp))
+ eval(log.info("[scaling] " + " [cluster] : " + clusterId + " scale-down action : " + scaleDown))
+
+ then
+ if (scaleUp) {
+ int requiredReplicas = 0;
+ if (scaleUpForRif) {
+ int predictedReplicasForRif = $delegator.getPredictedReplicasForStat(minReplicas, rifUpperLimit, rifPredictedValue);
+ log.info("[scaling] " + " [cluster] : " + clusterId + " [RequestInFlight] predicted replicas : " + predictedReplicasForRif);
+ if (predictedReplicasForRif > requiredReplicas ) {
+ requiredReplicas = predictedReplicasForRif;
+ }
+ }
+ if (scaleUpForMc) {
+ int predictedReplicasForMc = $delegator.getPredictedReplicasForStat(minReplicas, mcUpperLimit, mcPredictedValue);
+ log.info("[scaling] " + " [cluster] : " + clusterId + " [MemoryConsumption] predicted replicas : " + predictedReplicasForMc);
+ if (predictedReplicasForMc > requiredReplicas ) {
+ requiredReplicas = predictedReplicasForMc;
+ }
+ }
+ if (scaleUpForLa) {
+ int predictedReplicasForLa = $delegator.getPredictedReplicasForStat(minReplicas, laUpperLimit, laPredictedValue);
+ log.info("[scaling] " + " [cluster] : " + clusterId + " [LoadAverage] predicted replicas : " + predictedReplicasForLa);
+ if (predictedReplicasForLa > requiredReplicas ) {
+ requiredReplicas = predictedReplicasForLa;
+ }
+ }
+ //max-check
+ if (requiredReplicas > maxReplicas) {
+ log.info("[scaling] " + " [cluster] : " + clusterId + " predicted replicas > max replicas : ");
+ requiredReplicas = maxReplicas;
+ }
+ //min-check
+ if (requiredReplicas < minReplicas) {
+ log.info("[scaling] " + " [cluster] : " + clusterId + " predicted replicas < min replicas : ");
+ requiredReplicas = minReplicas;
+ }
+ //expand the cluster
+ if (requiredReplicas > nonTerminatedReplicas) {
+ log.info("[scaling] Decided to scale-up : [cluster] : " + clusterId);
+ log.info("[scaling-up] " + " [cluster] : " + clusterId + " valid number of replicas to expand : " + requiredReplicas);
+ $delegator.delegateScaleUpContainers($kubernetesClusterContext, requiredReplicas);
+ }
+ //shrink the cluster
+ if (requiredReplicas < nonTerminatedReplicas) {
+ if (requiredReplicas < activeReplicas) {
+ log.info("[scaling] Decided to scale-down : [cluster] : " + clusterId);
+ log.info("[scaling-down] " + " [cluster] : " + clusterId + " valid number of replicas to shrink : " + requiredReplicas);
+ $delegator.delegateScaleDownContainers($kubernetesClusterContext, requiredReplicas);
+ } else {
+ log.info("[scaling] " + " [cluster] : " + clusterId + " Even if requiredReplicas < nonTerminatedReplicas, still requiredReplicas >= activeReplicas ; hence not scaling down ");
+ }
+ }
+ if (requiredReplicas == nonTerminatedReplicas) {
+ log.info("[scaling] " + " [cluster] : " + clusterId + " Non terminated replicas and predicted replicas are same");
+ }
+
+ } else if (scaleDown) {
+ if (activeReplicas > minReplicas) {
+ log.info("[scaling] Decided to scale-down [cluster] : " + clusterId);
+ log.info("[scaling-down] " + " [cluster] : " + clusterId + " shrink the cluster to minReplicas : " + minReplicas);
+ //shrink the cluster to minReplicas
+ $delegator.delegateScaleDownContainers($kubernetesClusterContext, minReplicas);
+ } else {
+ log.info("[scaling] " + " [cluster] : " + clusterId + " Even if all predicted stats < upperLimit, still activeReplicas <= minReplicas ; hence not scaling down ");
+ }
+ } else {
+ log.info("[scaling] No decision made to either scale up or down ... ");
+ }
+end
+
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/products/stratos/modules/distribution/src/main/conf/drools/mincheck.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/drools/mincheck.drl b/products/stratos/modules/distribution/src/main/conf/drools/mincheck.drl
new file mode 100755
index 0000000..71187d6
--- /dev/null
+++ b/products/stratos/modules/distribution/src/main/conf/drools/mincheck.drl
@@ -0,0 +1,83 @@
+/*
+ * 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.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.Constants;
+import org.apache.stratos.autoscaler.policy.PolicyManager;
+import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
+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.autoscaler.PartitionContext;
+import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
+import org.apache.commons.logging.Log;
+import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
+import org.apache.stratos.autoscaler.partition.PartitionGroup;
+import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
+
+global org.apache.stratos.autoscaler.rule.RuleLog log;
+global org.apache.stratos.autoscaler.policy.PolicyManager $manager;
+global org.apache.stratos.autoscaler.AutoscalerContext $context;
+global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator;
+global org.apache.stratos.messaging.domain.topology.Topology $topology;
+global java.util.Map partitionCtxts;
+global java.lang.String clusterId;
+global java.lang.String lbRef;
+global java.lang.Boolean isPrimary;
+global Integer primaryMemberCount;
+
+rule "Minimum Rule"
+dialect "mvel"
+ when
+ $ctxt : PartitionContext ()
+ eval(log.debug("Running minimum rule: [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId()))
+ eval(log.debug("[min-check] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() + " Non terminated member count: " + $ctxt.getNonTerminatedMemberCount()))
+ eval(log.debug("[min-check] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() + " Minimum member count: " + $ctxt.getMinimumMemberCount()))
+ eval ( (isPrimary && (primaryMemberCount < $ctxt.getMinimumMemberCount() )) || ( !isPrimary && ($ctxt.getNonTerminatedMemberCount() < $ctxt.getMinimumMemberCount() )) )
+ then
+ if (isPrimary){
+ log.debug("[min-check] true [primary] true [primary member count] " + primaryMemberCount);
+ } else{
+ log.debug("[min-check] true [primary] false");
+ }
+ $delegator.delegateSpawn($ctxt, clusterId, lbRef, isPrimary);
+end
+
+rule "Terminate Obsoleted Instances"
+dialect "mvel"
+ when
+ $ctxt : PartitionContext ()
+ eval(log.debug("Running obsolete instances rule: [partition] " + $ctxt.getPartitionId() + " [network-partition] " + $ctxt.getNetworkPartitionId()))
+ eval(log.debug("[obsolete-check] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() +" Obsolete member count: " + $ctxt.getObsoletedMembers().size()))
+ eval($ctxt.getObsoletedMembers().keySet().size() > 0)
+ memberId : String() from $ctxt.getObsoletedMembers().keySet()
+ eval(log.debug("[obsolete-check] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() + " Member id: " + memberId))
+ then
+ $delegator.terminateObsoleteInstance(memberId);
+end
+
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl b/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl
new file mode 100644
index 0000000..bd331e7
--- /dev/null
+++ b/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl
@@ -0,0 +1,205 @@
+/*
+ * 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.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.MemberStatsContext;
+import org.apache.stratos.autoscaler.Constants;
+import org.apache.stratos.autoscaler.NetworkPartitionContext;
+import org.apache.stratos.autoscaler.policy.PolicyManager;
+import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
+import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
+import org.apache.stratos.autoscaler.policy.model.RequestsInFlight;
+import org.apache.stratos.autoscaler.policy.model.LoadThresholds;
+import org.apache.stratos.autoscaler.policy.model.MemoryConsumption;
+import org.apache.stratos.autoscaler.policy.model.LoadAverage;
+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.autoscaler.PartitionContext;
+import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
+import org.apache.stratos.autoscaler.partition.PartitionGroup;
+import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
+
+import org.apache.stratos.autoscaler.policy.model.LoadAverage
+import org.apache.stratos.autoscaler.policy.model.MemoryConsumption
+
+global org.apache.stratos.autoscaler.rule.RuleLog log;
+global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator;
+global org.apache.stratos.autoscaler.policy.model.AutoscalePolicy autoscalePolicy;
+global java.lang.String clusterId;
+global java.lang.String lbRef;
+global java.lang.Boolean rifReset;
+global java.lang.Boolean mcReset;
+global java.lang.Boolean laReset;
+global java.lang.Boolean isPrimary;
+global java.util.List primaryMembers;
+
+rule "Scaling Rule"
+dialect "mvel"
+ when
+ $networkPartitionContext : NetworkPartitionContext ()
+
+ $loadThresholds : LoadThresholds() from autoscalePolicy.getLoadThresholds()
+ algorithmName : String() from $networkPartitionContext.getPartitionAlgorithm();
+ autoscaleAlgorithm : AutoscaleAlgorithm() from $delegator.getAutoscaleAlgorithm(algorithmName)
+
+ eval(log.debug("Running scale up rule: [network-partition] " + $networkPartitionContext.getId() + " [cluster] " + clusterId))
+ eval(log.debug("[scaling] [network-partition] " + $networkPartitionContext.getId() + " [cluster] " + clusterId + " Algorithm name: " + algorithmName))
+ eval(log.debug("[scaling] [network-partition] " + $networkPartitionContext.getId() + " [cluster] " + clusterId + " Algorithm: " + autoscaleAlgorithm))
+
+
+ rifUpperLimit : Float() from $loadThresholds.getRequestsInFlight().getUpperLimit()
+ rifLowerLimit : Float() from $loadThresholds.getRequestsInFlight().getLowerLimit()
+
+ rifAverage : Float() from $networkPartitionContext.getAverageRequestsInFlight()
+ rifGradient : Float() from $networkPartitionContext.getRequestsInFlightGradient()
+ rifSecondDerivative : Float() from $networkPartitionContext.getRequestsInFlightSecondDerivative()
+ rifPredictedValue : Double() from $delegator.getPredictedValueForNextMinute(rifAverage, rifGradient, rifSecondDerivative, 1)
+
+ mcUpperLimit : Float() from $loadThresholds.getMemoryConsumption().getUpperLimit()
+ mcLowerLimit : Float() from $loadThresholds.getMemoryConsumption().getLowerLimit()
+
+ memoryConsumptionAverage : Float() from $networkPartitionContext.getAverageMemoryConsumption()
+ memoryConsumptionGradient : Float() from $networkPartitionContext.getMemoryConsumptionGradient()
+ memoryConsumptionSecondDerivative : Float() from $networkPartitionContext.getMemoryConsumptionSecondDerivative()
+ mcPredictedValue : Double() from $delegator.getPredictedValueForNextMinute(memoryConsumptionAverage, memoryConsumptionGradient, memoryConsumptionSecondDerivative, 1)
+
+ laUpperLimit : Float() from $loadThresholds.getLoadAverage().getUpperLimit()
+ laLowerLimit : Float() from $loadThresholds.getLoadAverage().getLowerLimit()
+
+ loadAverageAverage : Float() from $networkPartitionContext.getAverageLoadAverage()
+ loadAverageGradient : Float() from $networkPartitionContext.getLoadAverageGradient()
+ loadAverageSecondDerivative : Float() from $networkPartitionContext.getLoadAverageSecondDerivative()
+ laPredictedValue : Double() from $delegator.getPredictedValueForNextMinute(loadAverageAverage, loadAverageGradient, loadAverageSecondDerivative, 1)
+
+ scaleUp : Boolean() from ((rifReset && (rifPredictedValue > rifUpperLimit)) || (mcReset && (mcPredictedValue > mcUpperLimit)) || (laReset && (laPredictedValue > laUpperLimit)))
+ scaleDown : Boolean() from ((rifReset && (rifPredictedValue < rifLowerLimit )) && (mcReset && (mcPredictedValue < mcLowerLimit)) && (laReset && (laPredictedValue < laLowerLimit)))
+
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " RIF Resetted?: " + rifReset))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " RIF predicted value: " + rifPredictedValue))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " RIF upper limit: " + rifUpperLimit))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " RIF lower limit: " + rifLowerLimit))
+
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " MC predicted value: " + mcPredictedValue))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " MC upper limit: " + mcUpperLimit))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " MC lower limit: " + mcLowerLimit))
+
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " LA predicted value: " + laPredictedValue))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " LA upper limit: " + laUpperLimit))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " LA lower limit: " + laLowerLimit))
+
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " Scale-up action: " + scaleUp))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " Scale-down action: " + scaleDown))
+
+ then
+ if(scaleUp){
+
+ $networkPartitionContext.resetScaleDownRequestsCount();
+ Partition partition = autoscaleAlgorithm.getNextScaleUpPartition($networkPartitionContext, clusterId);
+ if(partition != null){
+ log.info("[scale-up] Partition available, hence trying to spawn an instance to scale up!" );
+ log.debug("[scale-up] " + " [partition] " + partition.getId() + " [cluster] " + clusterId );
+ $delegator.delegateSpawn($networkPartitionContext.getPartitionCtxt(partition.getId()), clusterId, lbRef, isPrimary);
+ }
+ } else if(scaleDown){
+
+ log.debug("[scale-down] Decided to Scale down [cluster] " + clusterId);
+ if($networkPartitionContext.getScaleDownRequestsCount() > 5 ){
+ log.debug("[scale-down] Reached scale down requests threshold [cluster] " + clusterId + " Count " + $networkPartitionContext.getScaleDownRequestsCount());
+ $networkPartitionContext.resetScaleDownRequestsCount();
+ MemberStatsContext selectedMemberStatsContext = null;
+ double lowestOverallLoad = 0.0;
+ boolean foundAValue = false;
+ Partition partition = autoscaleAlgorithm.getNextScaleDownPartition($networkPartitionContext, clusterId);
+ if(partition != null){
+ log.info("[scale-down] Partition available to scale down ");
+ log.debug("[scale-down] " + " [partition] " + partition.getId() + " [cluster] " + clusterId);
+ partitionContext = $networkPartitionContext.getPartitionCtxt(partition.getId());
+
+
+ // In partition context member stat context, all the primary members need to be
+ // avoided being selected as the member to terminated
+
+
+ for(MemberStatsContext memberStatsContext: partitionContext.getMemberStatsContexts().values()){
+
+ if( !primaryMembers.contains(memberStatsContext.getMemberId()) ) {
+
+ LoadAverage loadAverage = memberStatsContext.getLoadAverage();
+ log.debug("[scale-down] " + " [cluster] "
+ + clusterId + " [member] " + memberStatsContext.getMemberId() + " Load average: " + loadAverage);
+
+ MemoryConsumption memoryConsumption = memberStatsContext.getMemoryConsumption();
+ log.debug("[scale-down] " + " [partition] " + partition.getId() + " [cluster] "
+ + clusterId + " [member] " + memberStatsContext.getMemberId() + " Memory consumption: " + memoryConsumption);
+
+ double predictedCpu = $delegator.getPredictedValueForNextMinute(loadAverage.getAverage(),loadAverage.getGradient(),loadAverage.getSecondDerivative(), 1);
+ log.debug("[scale-down] " + " [partition] " + partition.getId() + " [cluster] "
+ + clusterId + " [member] " + memberStatsContext.getMemberId() + " Predicted CPU: " + predictedCpu);
+
+ double predictedMemoryConsumption = $delegator.getPredictedValueForNextMinute(memoryConsumption.getAverage(),memoryConsumption.getGradient(),memoryConsumption.getSecondDerivative(), 1);
+ log.debug("[scale-down] " + " [partition] " + partition.getId() + " [cluster] "
+ + clusterId + " [member] " + memberStatsContext.getMemberId() + " Predicted memory consumption: " + predictedMemoryConsumption);
+
+ double overallLoad = (predictedCpu + predictedMemoryConsumption) / 2;
+ log.debug("[scale-down] " + " [partition] " + partition.getId() + " [cluster] "
+ + clusterId + " [member] " + memberStatsContext.getMemberId() + " Overall load: " + overallLoad);
+
+ if(!foundAValue){
+ foundAValue = true;
+ selectedMemberStatsContext = memberStatsContext;
+ lowestOverallLoad = overallLoad;
+ } else if(overallLoad < lowestOverallLoad){
+ selectedMemberStatsContext = memberStatsContext;
+ lowestOverallLoad = overallLoad;
+ }
+
+
+ }
+
+ }
+ if(selectedMemberStatsContext != null) {
+ log.info("[scale-down] Trying to terminating an instace to scale down!" );
+ log.debug("[scale-down] " + " [partition] " + partition.getId() + " [cluster] "
+ + clusterId + " Member with lowest overall load: " + selectedMemberStatsContext.getMemberId());
+
+ $delegator.delegateTerminate(partitionContext, selectedMemberStatsContext.getMemberId());
+ }
+ }
+ } else{
+ log.debug("[scale-down] Not reached scale down requests threshold. " + clusterId + " Count " + $networkPartitionContext.getScaleDownRequestsCount());
+ $networkPartitionContext.increaseScaleDownRequestsCount();
+
+ }
+ } else{
+ log.debug("[scaling] No decision made to either scale up or scale down ... ");
+
+ }
+
+end
+
+
+
+
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/products/stratos/modules/distribution/src/main/conf/drools/terminateall.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/drools/terminateall.drl b/products/stratos/modules/distribution/src/main/conf/drools/terminateall.drl
new file mode 100644
index 0000000..75c26fc
--- /dev/null
+++ b/products/stratos/modules/distribution/src/main/conf/drools/terminateall.drl
@@ -0,0 +1,44 @@
+/*
+ * 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.rule;
+
+import org.apache.stratos.messaging.domain.topology.Cluster;
+import org.apache.stratos.autoscaler.PartitionContext;
+
+global org.apache.stratos.autoscaler.rule.RuleLog log;
+global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator;
+
+rule "Terminate all Rule"
+
+dialect "mvel"
+ when
+ $ctxt : PartitionContext ()
+ eval(log.debug("Running terminate all rule: [partition] " + $ctxt.getPartitionId() + " [network-partition] " + $ctxt.getNetworkPartitionId()))
+ eval(log.debug("[terminate all] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() +" Member count: " + $ctxt.getMemberStatsContexts().size()))
+ eval($ctxt.getMemberStatsContexts().size() > 0)
+ memberId : String() from $ctxt.getMemberStatsContexts().keySet()
+ eval(log.debug("[terminate all] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() + " Member id: " + memberId))
+
+ then
+ $delegator.delegateTerminate($ctxt, memberId);
+end
+
+
+
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/products/stratos/modules/distribution/src/main/conf/mincheck.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/mincheck.drl b/products/stratos/modules/distribution/src/main/conf/mincheck.drl
deleted file mode 100755
index 71187d6..0000000
--- a/products/stratos/modules/distribution/src/main/conf/mincheck.drl
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.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.Constants;
-import org.apache.stratos.autoscaler.policy.PolicyManager;
-import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
-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.autoscaler.PartitionContext;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
-import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
-import org.apache.commons.logging.Log;
-import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
-import org.apache.stratos.autoscaler.partition.PartitionGroup;
-import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
-import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
-
-global org.apache.stratos.autoscaler.rule.RuleLog log;
-global org.apache.stratos.autoscaler.policy.PolicyManager $manager;
-global org.apache.stratos.autoscaler.AutoscalerContext $context;
-global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator;
-global org.apache.stratos.messaging.domain.topology.Topology $topology;
-global java.util.Map partitionCtxts;
-global java.lang.String clusterId;
-global java.lang.String lbRef;
-global java.lang.Boolean isPrimary;
-global Integer primaryMemberCount;
-
-rule "Minimum Rule"
-dialect "mvel"
- when
- $ctxt : PartitionContext ()
- eval(log.debug("Running minimum rule: [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId()))
- eval(log.debug("[min-check] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() + " Non terminated member count: " + $ctxt.getNonTerminatedMemberCount()))
- eval(log.debug("[min-check] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() + " Minimum member count: " + $ctxt.getMinimumMemberCount()))
- eval ( (isPrimary && (primaryMemberCount < $ctxt.getMinimumMemberCount() )) || ( !isPrimary && ($ctxt.getNonTerminatedMemberCount() < $ctxt.getMinimumMemberCount() )) )
- then
- if (isPrimary){
- log.debug("[min-check] true [primary] true [primary member count] " + primaryMemberCount);
- } else{
- log.debug("[min-check] true [primary] false");
- }
- $delegator.delegateSpawn($ctxt, clusterId, lbRef, isPrimary);
-end
-
-rule "Terminate Obsoleted Instances"
-dialect "mvel"
- when
- $ctxt : PartitionContext ()
- eval(log.debug("Running obsolete instances rule: [partition] " + $ctxt.getPartitionId() + " [network-partition] " + $ctxt.getNetworkPartitionId()))
- eval(log.debug("[obsolete-check] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() +" Obsolete member count: " + $ctxt.getObsoletedMembers().size()))
- eval($ctxt.getObsoletedMembers().keySet().size() > 0)
- memberId : String() from $ctxt.getObsoletedMembers().keySet()
- eval(log.debug("[obsolete-check] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() + " Member id: " + memberId))
- then
- $delegator.terminateObsoleteInstance(memberId);
-end
-
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/products/stratos/modules/distribution/src/main/conf/scaling.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/scaling.drl b/products/stratos/modules/distribution/src/main/conf/scaling.drl
deleted file mode 100644
index bd331e7..0000000
--- a/products/stratos/modules/distribution/src/main/conf/scaling.drl
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * 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.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.MemberStatsContext;
-import org.apache.stratos.autoscaler.Constants;
-import org.apache.stratos.autoscaler.NetworkPartitionContext;
-import org.apache.stratos.autoscaler.policy.PolicyManager;
-import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
-import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
-import org.apache.stratos.autoscaler.policy.model.RequestsInFlight;
-import org.apache.stratos.autoscaler.policy.model.LoadThresholds;
-import org.apache.stratos.autoscaler.policy.model.MemoryConsumption;
-import org.apache.stratos.autoscaler.policy.model.LoadAverage;
-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.autoscaler.PartitionContext;
-import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
-import org.apache.stratos.autoscaler.partition.PartitionGroup;
-import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
-import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
-
-import org.apache.stratos.autoscaler.policy.model.LoadAverage
-import org.apache.stratos.autoscaler.policy.model.MemoryConsumption
-
-global org.apache.stratos.autoscaler.rule.RuleLog log;
-global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator;
-global org.apache.stratos.autoscaler.policy.model.AutoscalePolicy autoscalePolicy;
-global java.lang.String clusterId;
-global java.lang.String lbRef;
-global java.lang.Boolean rifReset;
-global java.lang.Boolean mcReset;
-global java.lang.Boolean laReset;
-global java.lang.Boolean isPrimary;
-global java.util.List primaryMembers;
-
-rule "Scaling Rule"
-dialect "mvel"
- when
- $networkPartitionContext : NetworkPartitionContext ()
-
- $loadThresholds : LoadThresholds() from autoscalePolicy.getLoadThresholds()
- algorithmName : String() from $networkPartitionContext.getPartitionAlgorithm();
- autoscaleAlgorithm : AutoscaleAlgorithm() from $delegator.getAutoscaleAlgorithm(algorithmName)
-
- eval(log.debug("Running scale up rule: [network-partition] " + $networkPartitionContext.getId() + " [cluster] " + clusterId))
- eval(log.debug("[scaling] [network-partition] " + $networkPartitionContext.getId() + " [cluster] " + clusterId + " Algorithm name: " + algorithmName))
- eval(log.debug("[scaling] [network-partition] " + $networkPartitionContext.getId() + " [cluster] " + clusterId + " Algorithm: " + autoscaleAlgorithm))
-
-
- rifUpperLimit : Float() from $loadThresholds.getRequestsInFlight().getUpperLimit()
- rifLowerLimit : Float() from $loadThresholds.getRequestsInFlight().getLowerLimit()
-
- rifAverage : Float() from $networkPartitionContext.getAverageRequestsInFlight()
- rifGradient : Float() from $networkPartitionContext.getRequestsInFlightGradient()
- rifSecondDerivative : Float() from $networkPartitionContext.getRequestsInFlightSecondDerivative()
- rifPredictedValue : Double() from $delegator.getPredictedValueForNextMinute(rifAverage, rifGradient, rifSecondDerivative, 1)
-
- mcUpperLimit : Float() from $loadThresholds.getMemoryConsumption().getUpperLimit()
- mcLowerLimit : Float() from $loadThresholds.getMemoryConsumption().getLowerLimit()
-
- memoryConsumptionAverage : Float() from $networkPartitionContext.getAverageMemoryConsumption()
- memoryConsumptionGradient : Float() from $networkPartitionContext.getMemoryConsumptionGradient()
- memoryConsumptionSecondDerivative : Float() from $networkPartitionContext.getMemoryConsumptionSecondDerivative()
- mcPredictedValue : Double() from $delegator.getPredictedValueForNextMinute(memoryConsumptionAverage, memoryConsumptionGradient, memoryConsumptionSecondDerivative, 1)
-
- laUpperLimit : Float() from $loadThresholds.getLoadAverage().getUpperLimit()
- laLowerLimit : Float() from $loadThresholds.getLoadAverage().getLowerLimit()
-
- loadAverageAverage : Float() from $networkPartitionContext.getAverageLoadAverage()
- loadAverageGradient : Float() from $networkPartitionContext.getLoadAverageGradient()
- loadAverageSecondDerivative : Float() from $networkPartitionContext.getLoadAverageSecondDerivative()
- laPredictedValue : Double() from $delegator.getPredictedValueForNextMinute(loadAverageAverage, loadAverageGradient, loadAverageSecondDerivative, 1)
-
- scaleUp : Boolean() from ((rifReset && (rifPredictedValue > rifUpperLimit)) || (mcReset && (mcPredictedValue > mcUpperLimit)) || (laReset && (laPredictedValue > laUpperLimit)))
- scaleDown : Boolean() from ((rifReset && (rifPredictedValue < rifLowerLimit )) && (mcReset && (mcPredictedValue < mcLowerLimit)) && (laReset && (laPredictedValue < laLowerLimit)))
-
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " RIF Resetted?: " + rifReset))
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " RIF predicted value: " + rifPredictedValue))
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " RIF upper limit: " + rifUpperLimit))
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " RIF lower limit: " + rifLowerLimit))
-
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " MC predicted value: " + mcPredictedValue))
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " MC upper limit: " + mcUpperLimit))
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " MC lower limit: " + mcLowerLimit))
-
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " LA predicted value: " + laPredictedValue))
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " LA upper limit: " + laUpperLimit))
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " LA lower limit: " + laLowerLimit))
-
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " Scale-up action: " + scaleUp))
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " Scale-down action: " + scaleDown))
-
- then
- if(scaleUp){
-
- $networkPartitionContext.resetScaleDownRequestsCount();
- Partition partition = autoscaleAlgorithm.getNextScaleUpPartition($networkPartitionContext, clusterId);
- if(partition != null){
- log.info("[scale-up] Partition available, hence trying to spawn an instance to scale up!" );
- log.debug("[scale-up] " + " [partition] " + partition.getId() + " [cluster] " + clusterId );
- $delegator.delegateSpawn($networkPartitionContext.getPartitionCtxt(partition.getId()), clusterId, lbRef, isPrimary);
- }
- } else if(scaleDown){
-
- log.debug("[scale-down] Decided to Scale down [cluster] " + clusterId);
- if($networkPartitionContext.getScaleDownRequestsCount() > 5 ){
- log.debug("[scale-down] Reached scale down requests threshold [cluster] " + clusterId + " Count " + $networkPartitionContext.getScaleDownRequestsCount());
- $networkPartitionContext.resetScaleDownRequestsCount();
- MemberStatsContext selectedMemberStatsContext = null;
- double lowestOverallLoad = 0.0;
- boolean foundAValue = false;
- Partition partition = autoscaleAlgorithm.getNextScaleDownPartition($networkPartitionContext, clusterId);
- if(partition != null){
- log.info("[scale-down] Partition available to scale down ");
- log.debug("[scale-down] " + " [partition] " + partition.getId() + " [cluster] " + clusterId);
- partitionContext = $networkPartitionContext.getPartitionCtxt(partition.getId());
-
-
- // In partition context member stat context, all the primary members need to be
- // avoided being selected as the member to terminated
-
-
- for(MemberStatsContext memberStatsContext: partitionContext.getMemberStatsContexts().values()){
-
- if( !primaryMembers.contains(memberStatsContext.getMemberId()) ) {
-
- LoadAverage loadAverage = memberStatsContext.getLoadAverage();
- log.debug("[scale-down] " + " [cluster] "
- + clusterId + " [member] " + memberStatsContext.getMemberId() + " Load average: " + loadAverage);
-
- MemoryConsumption memoryConsumption = memberStatsContext.getMemoryConsumption();
- log.debug("[scale-down] " + " [partition] " + partition.getId() + " [cluster] "
- + clusterId + " [member] " + memberStatsContext.getMemberId() + " Memory consumption: " + memoryConsumption);
-
- double predictedCpu = $delegator.getPredictedValueForNextMinute(loadAverage.getAverage(),loadAverage.getGradient(),loadAverage.getSecondDerivative(), 1);
- log.debug("[scale-down] " + " [partition] " + partition.getId() + " [cluster] "
- + clusterId + " [member] " + memberStatsContext.getMemberId() + " Predicted CPU: " + predictedCpu);
-
- double predictedMemoryConsumption = $delegator.getPredictedValueForNextMinute(memoryConsumption.getAverage(),memoryConsumption.getGradient(),memoryConsumption.getSecondDerivative(), 1);
- log.debug("[scale-down] " + " [partition] " + partition.getId() + " [cluster] "
- + clusterId + " [member] " + memberStatsContext.getMemberId() + " Predicted memory consumption: " + predictedMemoryConsumption);
-
- double overallLoad = (predictedCpu + predictedMemoryConsumption) / 2;
- log.debug("[scale-down] " + " [partition] " + partition.getId() + " [cluster] "
- + clusterId + " [member] " + memberStatsContext.getMemberId() + " Overall load: " + overallLoad);
-
- if(!foundAValue){
- foundAValue = true;
- selectedMemberStatsContext = memberStatsContext;
- lowestOverallLoad = overallLoad;
- } else if(overallLoad < lowestOverallLoad){
- selectedMemberStatsContext = memberStatsContext;
- lowestOverallLoad = overallLoad;
- }
-
-
- }
-
- }
- if(selectedMemberStatsContext != null) {
- log.info("[scale-down] Trying to terminating an instace to scale down!" );
- log.debug("[scale-down] " + " [partition] " + partition.getId() + " [cluster] "
- + clusterId + " Member with lowest overall load: " + selectedMemberStatsContext.getMemberId());
-
- $delegator.delegateTerminate(partitionContext, selectedMemberStatsContext.getMemberId());
- }
- }
- } else{
- log.debug("[scale-down] Not reached scale down requests threshold. " + clusterId + " Count " + $networkPartitionContext.getScaleDownRequestsCount());
- $networkPartitionContext.increaseScaleDownRequestsCount();
-
- }
- } else{
- log.debug("[scaling] No decision made to either scale up or scale down ... ");
-
- }
-
-end
-
-
-
-
http://git-wip-us.apache.org/repos/asf/stratos/blob/d189b136/products/stratos/modules/distribution/src/main/conf/terminateall.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/terminateall.drl b/products/stratos/modules/distribution/src/main/conf/terminateall.drl
deleted file mode 100644
index 75c26fc..0000000
--- a/products/stratos/modules/distribution/src/main/conf/terminateall.drl
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.rule;
-
-import org.apache.stratos.messaging.domain.topology.Cluster;
-import org.apache.stratos.autoscaler.PartitionContext;
-
-global org.apache.stratos.autoscaler.rule.RuleLog log;
-global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator;
-
-rule "Terminate all Rule"
-
-dialect "mvel"
- when
- $ctxt : PartitionContext ()
- eval(log.debug("Running terminate all rule: [partition] " + $ctxt.getPartitionId() + " [network-partition] " + $ctxt.getNetworkPartitionId()))
- eval(log.debug("[terminate all] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() +" Member count: " + $ctxt.getMemberStatsContexts().size()))
- eval($ctxt.getMemberStatsContexts().size() > 0)
- memberId : String() from $ctxt.getMemberStatsContexts().keySet()
- eval(log.debug("[terminate all] [network-partition] " + $ctxt.getNetworkPartitionId() + " [partition] " + $ctxt.getPartitionId() + " Member id: " + memberId))
-
- then
- $delegator.delegateTerminate($ctxt, memberId);
-end
-
-
-