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 2014/10/11 06:13:07 UTC
[21/50] [abbrv] git commit: adding container drool files
adding container drool files
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/36c40b00
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/36c40b00
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/36c40b00
Branch: refs/heads/master
Commit: 36c40b0055eb4287aa55e4d5e027fbf06a35a45c
Parents: 742a08d
Author: R-Rajkumar <rr...@gmail.com>
Authored: Thu Oct 9 10:50:08 2014 +0530
Committer: Nirmal Fernando <ni...@gmail.com>
Committed: Sat Oct 11 09:30:56 2014 +0530
----------------------------------------------------------------------
.../modules/distribution/src/assembly/bin.xml | 16 +-
.../src/main/conf/container-mincheck.drl | 48 ++++++
.../src/main/conf/container-scaling.drl | 148 +++++++++++++++++++
3 files changed, 211 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/36c40b00/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 a318f5c..4295576 100755
--- a/products/stratos/modules/distribution/src/assembly/bin.xml
+++ b/products/stratos/modules/distribution/src/assembly/bin.xml
@@ -660,7 +660,7 @@
<filtered>true</filtered>
<fileMode>755</fileMode>
</file>
- <file>
+ <file>
<source>src/main/conf/mincheck.drl</source>
<outputDirectory>${pom.artifactId}-${pom.version}/repository/conf</outputDirectory>
<filtered>true</filtered>
@@ -678,6 +678,20 @@
<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>
+ <filtered>true</filtered>
+ <fileMode>755</fileMode>
+ </file>
+ <file>
+ <source>src/main/conf/container-scaling.drl</source>
+ <outputDirectory>${pom.artifactId}-${pom.version}/repository/conf</outputDirectory>
+ <filtered>true</filtered>
+ <fileMode>755</fileMode>
+ </file>
+ <!-- container-drools files -->
<!-- autoscaler -->
<file>
<source>${project.basedir}/INSTALL.txt</source>
http://git-wip-us.apache.org/repos/asf/stratos/blob/36c40b00/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
new file mode 100644
index 0000000..edea3cf
--- /dev/null
+++ b/products/stratos/modules/distribution/src/main/conf/container-mincheck.drl
@@ -0,0 +1,48 @@
+/*
+ * 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 "Minimum Rule"
+dialect "mvel"
+ when
+ $kubernetesClusterContext : KubernetesClusterContext ()
+ kubernetesClusterId : String() from $kubernetesClusterContext.getKubernetesClusterID()
+ minReplicas : Integer() from $kubernetesClusterContext.getMinReplicas()
+ nonTerminatedReplicas : Integer() from $kubernetesClusterContext.getNonTerminatedMemberCount()
+
+ eval(log.debug("Running minimum rule: [kub-cluster] " +kubernetesClusterId + " [cluster] " + clusterId))
+ eval(log.debug("[min-check] [kub-cluster] " + kubernetesClusterId
+ + " [cluster] " + clusterId + " Non terminated member count: " + nonTerminatedReplicas))
+ eval(log.debug("[min-check] [kub-cluster] " + kubernetesClusterId
+ + " [cluster] " + clusterId + " Minimum member count: " + minReplicas))
+ eval (nonTerminatedReplicas < minReplicas)
+ then
+ log.info("[min-check] [kub-cluster] " + kubernetesClusterId
+ + " [cluster] " + clusterId + " : min-rule not satisfied, creating more containers")
+ $delegator.delegateExpandCluster($kubernetesClusterContext.getClusterId(), minReplicas);
+end
+
http://git-wip-us.apache.org/repos/asf/stratos/blob/36c40b00/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
new file mode 100644
index 0000000..c773264
--- /dev/null
+++ b/products/stratos/modules/distribution/src/main/conf/container-scaling.drl
@@ -0,0 +1,148 @@
+/*
+ * 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 "Scaling Rule"
+dialect "mvel"
+ when
+ $kubernetesClusterContext : KubernetesClusterContext ()
+ kubernetesClusterId : String() from $kubernetesClusterContext.getKubernetesClusterID()
+ minReplicas : Integer() from $kubernetesClusterContext.getMinReplicas()
+ maxReplicas : Integer() from $kubernetesClusterContext.getMaxReplicas()
+
+ eval(log.debug("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 (rifReset && (rifPredictedValue < rifLowerLimit))
+ scaleDownForMc : Boolean() from (mcReset && (mcPredictedValue < mcLowerLimit))
+ scaleDownForLa : Boolean() from (laReset && (laPredictedValue < laLowerLimit))
+
+ scaleUp : Boolean() from (scaleUpForRif || scaleUpForMc || scaleUpForLa)
+ scaleDown : Boolean() from (scaleDownForRif && scaleDownForMc && scaleDownForLa)
+
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [Replicas] minReplicas : " + minReplicas))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [Replicas] maxReplicas : " + maxReplicas))
+
+ 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.debug("[scaling] " + " [cluster] " + clusterId + " [MemoryConsumption] predicted value : " + mcPredictedValue))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [MemoryConsumption] upper limit : " + mcUpperLimit))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [MemoryConsumption] lower limit : " + mcLowerLimit))
+
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [LoadAverage] resetted ? : " + laReset))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [LoadAverage] predicted value : " + laPredictedValue))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [LoadAverage] upper limit : " + laUpperLimit))
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [LoadAverage] 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) {
+ log.info("[scale-up] Decided to scale up : [kub-cluster] " + kubernetesClusterId + " [cluster] " + clusterId);
+ 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
+ log.info("[scaling] " + " [cluster] " + clusterId + " valid number of replicas to expand : " + requiredReplicas);
+ $delegator.delegateExpandCluster(clusterId, requiredReplicas);
+ } else if (scaleDown) {
+ log.debug("[scale-down] Decided to scale down : [kub-cluster] " + kubernetesClusterId + " [cluster] " + clusterId);
+ //shrink the cluster to minReplicas
+ $delegator.delegateExpandCluster(clusterId, minReplicas);
+ } else {
+ log.debug("[scaling] No decision made to either scale up or down ... ");
+ }
+end
+