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/10 13:45:20 UTC
[01/14] git commit: adding container drool files
Repository: stratos
Updated Branches:
refs/heads/container-autoscaling d2976b28f -> ff3722268
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/2a5cabed
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/2a5cabed
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/2a5cabed
Branch: refs/heads/container-autoscaling
Commit: 2a5cabed4bf8780e442bf602349acb2e4dcda7b2
Parents: 7162325
Author: R-Rajkumar <rr...@gmail.com>
Authored: Thu Oct 9 10:50:08 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Thu Oct 9 10:50:08 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/2a5cabed/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 e244ea4..76d0c14 100755
--- a/products/stratos/modules/distribution/src/assembly/bin.xml
+++ b/products/stratos/modules/distribution/src/assembly/bin.xml
@@ -662,7 +662,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>
@@ -680,6 +680,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/2a5cabed/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/2a5cabed/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
+
[05/14] git commit: adding expand cluster logic to AS
Posted by ra...@apache.org.
adding expand cluster logic to AS
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/fce73223
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/fce73223
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/fce73223
Branch: refs/heads/container-autoscaling
Commit: fce73223d0187f91c4ed614b00fe752e2c824b91
Parents: fd69389
Author: R-Rajkumar <rr...@gmail.com>
Authored: Thu Oct 9 10:58:22 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Thu Oct 9 10:58:22 2014 +0530
----------------------------------------------------------------------
.../autoscaler/KubernetesClusterContext.java | 2 +-
.../cloud/controller/CloudControllerClient.java | 32 +++++++++++++++++---
.../monitor/ClusterMonitorFactory.java | 24 ++++++++++++++-
.../autoscaler/rule/RuleTasksDelegator.java | 15 +++++++++
4 files changed, 66 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/fce73223/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
index faa93bc..99ae4bc 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
@@ -50,7 +50,7 @@ public class KubernetesClusterContext implements Serializable {
private String serviceName;
private int minReplicas;
- private int maxReplicas;
+ private int maxReplicas = 10;
private int currentReplicas = 0;
// properties
http://git-wip-us.apache.org/repos/asf/stratos/blob/fce73223/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 d554cec..65035d0 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
@@ -19,21 +19,27 @@
package org.apache.stratos.autoscaler.client.cloud.controller;
+import java.rmi.RemoteException;
+
import org.apache.axis2.transport.http.HTTPConstants;
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.api.AutoScalerServiceImpl;
import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
import org.apache.stratos.autoscaler.exception.NonExistingKubernetesGroupException;
import org.apache.stratos.autoscaler.exception.PartitionValidationException;
import org.apache.stratos.autoscaler.exception.SpawningException;
import org.apache.stratos.autoscaler.exception.TerminationException;
-import org.apache.stratos.autoscaler.interfaces.AutoScalerServiceInterface;
import org.apache.stratos.autoscaler.kubernetes.KubernetesManager;
import org.apache.stratos.autoscaler.util.ConfUtil;
-import org.apache.stratos.cloud.controller.stub.*;
+import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeTypeExceptionException;
+import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidClusterExceptionException;
+import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidIaasProviderExceptionException;
+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.cloud.controller.stub.deployment.partition.Partition;
import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
import org.apache.stratos.cloud.controller.stub.pojo.Properties;
@@ -42,8 +48,6 @@ import org.apache.stratos.common.constants.StratosConstants;
import org.apache.stratos.common.kubernetes.KubernetesGroup;
import org.apache.stratos.common.kubernetes.KubernetesMaster;
-import java.rmi.RemoteException;
-
/**
* This class will call cloud controller web service to take the action decided by Autoscaler
@@ -306,4 +310,22 @@ public class CloudControllerClient {
}
}
+ public synchronized void updateKubernetesController(String clusterId, int replicas)
+ throws SpawningException {
+ try {
+ log.info(String.format("Updating kubernetes replication controller via cloud controller: " +
+ "[cluster] %s [replicas] %s", clusterId, replicas));
+ stub.updateKubernetesController(clusterId, replicas);
+ } catch (RemoteException e) {
+ String msg = "Error while updating kubernetes controller, cannot communicate with " +
+ "cloud controller service";
+ log.error(msg, e);
+ throw new SpawningException(e.getMessage(), e);
+ } catch (CloudControllerServiceInvalidClusterExceptionException e) {
+ String msg = "Error while updating kubernetes controller, invalid clusterId";
+ log.error(msg, e);
+ throw new SpawningException(e.getMessage(), e);
+ }
+ }
+
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/fce73223/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
index 208e4ce..856958d 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ClusterMonitorFactory.java
@@ -46,6 +46,8 @@ import org.apache.stratos.messaging.domain.topology.Cluster;
import org.apache.stratos.messaging.domain.topology.ClusterStatus;
import org.apache.stratos.messaging.domain.topology.Member;
import org.apache.stratos.messaging.domain.topology.MemberStatus;
+import org.apache.stratos.messaging.domain.topology.Service;
+import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
import org.apache.stratos.messaging.util.Constants;
/*
@@ -330,7 +332,8 @@ public class ClusterMonitorFactory {
* @param cluster - the cluster which needs to be monitored
* @return - the cluster monitor
*/
- private static KubernetesServiceClusterMonitor getDockerServiceClusterMonitor(Cluster cluster) {
+ private static KubernetesServiceClusterMonitor getDockerServiceClusterMonitor(Cluster cluster)
+ throws PolicyValidationException {
if (null == cluster) {
return null;
@@ -342,11 +345,30 @@ public class ClusterMonitorFactory {
}
AutoscalePolicy policy = PolicyManager.getInstance().getAutoscalePolicy(autoscalePolicyName);
+
+ if (policy == null) {
+ String msg = "Autoscale Policy is null. Policy name: " + autoscalePolicyName;
+ log.error(msg);
+ throw new PolicyValidationException(msg);
+ }
+
java.util.Properties props = cluster.getProperties();
String kubernetesHostClusterID = props.getProperty(StratosConstants.KUBERNETES_CLUSTER_ID);
KubernetesClusterContext kubernetesClusterCtxt = new KubernetesClusterContext(kubernetesHostClusterID,
cluster.getClusterId());
+ String minReplicasProperty = props.getProperty(StratosConstants.KUBERNETES_MIN_REPLICAS);
+ if (minReplicasProperty != null && !minReplicasProperty.isEmpty()) {
+ int minReplicas = Integer.parseInt(minReplicasProperty);
+ kubernetesClusterCtxt.setMinReplicas(minReplicas);
+ }
+
+ String maxReplicasProperty = props.getProperty(StratosConstants.KUBERNETES_MAX_REPLICAS);
+ if (maxReplicasProperty != null && !maxReplicasProperty.isEmpty()) {
+ int maxReplicas = Integer.parseInt(maxReplicasProperty);
+ kubernetesClusterCtxt.setMaxReplicas(maxReplicas);
+ }
+
KubernetesServiceClusterMonitor dockerClusterMonitor = new KubernetesServiceClusterMonitor(
kubernetesClusterCtxt,
cluster.getClusterId(),
http://git-wip-us.apache.org/repos/asf/stratos/blob/fce73223/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
index 94def43..246dcc2 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
@@ -199,4 +199,19 @@ public class RuleTasksDelegator {
}
}
+ public void delegateExpandCluster(String clusterId, int replicas) {
+ try {
+ CloudControllerClient.getInstance().updateKubernetesController(clusterId, replicas);
+ } catch (Throwable e) {
+ log.error("Cannot update kubernetes controller", e);
+ }
+ }
+
+ public int getPredictedReplicasForStat(int minReplicas, float statUpperLimit, float statPredictedValue) {
+ if (statUpperLimit == 0) {
+ return 0;
+ }
+ float predictedValue = ((minReplicas / statUpperLimit) * statPredictedValue);
+ return (int) Math.ceil(predictedValue);
+ }
}
[07/14] git commit: change logging level from info to debug
Posted by ra...@apache.org.
change logging level from info to debug
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/b59b4c0d
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/b59b4c0d
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/b59b4c0d
Branch: refs/heads/container-autoscaling
Commit: b59b4c0d769828cebb5d5e38f2c17c20e9b12dbc
Parents: 31daf2f
Author: R-Rajkumar <rr...@gmail.com>
Authored: Thu Oct 9 17:11:14 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Thu Oct 9 17:11:14 2014 +0530
----------------------------------------------------------------------
.../java/org/apache/stratos/cartridge/agent/CartridgeAgent.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/b59b4c0d/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/CartridgeAgent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/CartridgeAgent.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/CartridgeAgent.java
index 2db450a..3e81f06 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/CartridgeAgent.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/CartridgeAgent.java
@@ -88,7 +88,7 @@ public class CartridgeAgent implements Runnable {
// wait till the member spawned event
while (!CartridgeAgentConfiguration.getInstance().isInitialized()) {
try {
- if (log.isInfoEnabled()) {
+ if (log.isDebugEnabled()) {
log.info("Waiting for Cartridge Agent to be initialized...");
}
Thread.sleep(1000);
[04/14] git commit: adding getter/setters for stats in
MemberStatsContext
Posted by ra...@apache.org.
adding getter/setters for stats in MemberStatsContext
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/fd693898
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/fd693898
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/fd693898
Branch: refs/heads/container-autoscaling
Commit: fd6938986bf1175641355a0173285ef4ed728385
Parents: 7d8acf3
Author: R-Rajkumar <rr...@gmail.com>
Authored: Thu Oct 9 10:56:24 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Thu Oct 9 10:56:24 2014 +0530
----------------------------------------------------------------------
.../stratos/autoscaler/MemberStatsContext.java | 23 ++++++++++++++++++++
1 file changed, 23 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/fd693898/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/MemberStatsContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/MemberStatsContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/MemberStatsContext.java
index bd3a6c3..84e8854 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/MemberStatsContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/MemberStatsContext.java
@@ -77,4 +77,27 @@ public class MemberStatsContext {
memoryConsumption.setSecondDerivative(value);
}
+ public float getAverageLoadAverage() {
+ return loadAverage.getAverage();
+ }
+
+ public float getAverageMemoryConsumption() {
+ return memoryConsumption.getAverage();
+ }
+
+ public float getGradientOfLoadAverage() {
+ return loadAverage.getGradient();
+ }
+
+ public float getGradientOfMemoryConsumption() {
+ return memoryConsumption.getGradient();
+ }
+
+ public float getSecondDerivativeOfLoadAverage() {
+ return loadAverage.getSecondDerivative();
+ }
+
+ public float getSecondDerivativeOfMemoryConsumption() {
+ return memoryConsumption.getSecondDerivative();
+ }
}
[08/14] git commit: reading hostname from container for memberId
Posted by ra...@apache.org.
reading hostname from container for memberId
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/3a1e2f1c
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/3a1e2f1c
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/3a1e2f1c
Branch: refs/heads/container-autoscaling
Commit: 3a1e2f1c489b703425f5ba5f69f91df1c02feb16
Parents: b59b4c0
Author: R-Rajkumar <rr...@gmail.com>
Authored: Thu Oct 9 17:11:53 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Thu Oct 9 17:11:53 2014 +0530
----------------------------------------------------------------------
.../autoscaler/KubernetesClusterContext.java | 18 +++-----
.../KubernetesServiceClusterMonitor.java | 48 ++++----------------
.../autoscaler/rule/RuleTasksDelegator.java | 29 +++++++++++-
.../config/CartridgeAgentConfiguration.java | 24 ++++++++--
4 files changed, 62 insertions(+), 57 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/3a1e2f1c/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
index 99ae4bc..b75c0cc 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
@@ -30,8 +30,6 @@ import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
-import org.apache.stratos.autoscaler.exception.TerminationException;
import org.apache.stratos.autoscaler.policy.model.LoadAverage;
import org.apache.stratos.autoscaler.policy.model.MemoryConsumption;
import org.apache.stratos.autoscaler.policy.model.RequestsInFlight;
@@ -320,19 +318,13 @@ public class KubernetesClusterContext implements Serializable {
long pendingTime = System.currentTimeMillis()
- pendingMember.getInitTime();
if (pendingTime >= expiryTime) {
-
- // terminate all containers of this cluster
- try {
- CloudControllerClient.getInstance().terminateAllContainers(clusterId);
- iterator.remove();
- } catch (TerminationException e) {
- log.error(e.getMessage(), e);
- }
-
+ iterator.remove();
+ log.info("Pending state of member: " + pendingMember.getMemberId() +
+ " is expired. " + "Adding as an obsoleted member.");
+ ctxt.addObsoleteMember(pendingMember);
}
}
}
-
try {
// TODO find a constant
Thread.sleep(15000);
@@ -367,6 +359,8 @@ public class KubernetesClusterContext implements Serializable {
long obsoleteTime = System.currentTimeMillis() - obsoleteMember.getInitTime();
if (obsoleteTime >= obsoltedMemberExpiryTime) {
iterator.remove();
+ log.info("Obsolete state of member: " + obsoleteMember.getMemberId() +
+ " is expired. " + "Removing from obsolete member list");
}
}
try {
http://git-wip-us.apache.org/repos/asf/stratos/blob/3a1e2f1c/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
index d0d7668..068f21e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
@@ -18,8 +18,6 @@
*/
package org.apache.stratos.autoscaler.monitor;
-import java.util.Properties;
-
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -32,10 +30,7 @@ import org.apache.stratos.autoscaler.util.AutoScalerConstants;
import org.apache.stratos.autoscaler.util.ConfUtil;
import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
import org.apache.stratos.common.constants.StratosConstants;
-import org.apache.stratos.messaging.domain.topology.Cluster;
import org.apache.stratos.messaging.domain.topology.ClusterStatus;
-import org.apache.stratos.messaging.domain.topology.Service;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
/*
* It is monitoring a kubernetes service cluster periodically.
@@ -45,8 +40,6 @@ public final class KubernetesServiceClusterMonitor extends KubernetesClusterMoni
private static final Log log = LogFactory.getLog(KubernetesServiceClusterMonitor.class);
private String lbReferenceType;
- private int numberOfReplicasInServiceCluster = 0;
- int retryInterval = 60000;
public KubernetesServiceClusterMonitor(KubernetesClusterContext kubernetesClusterCtxt,
String serviceClusterID, String serviceId,
@@ -83,33 +76,14 @@ public final class KubernetesServiceClusterMonitor extends KubernetesClusterMoni
@Override
protected void monitor() {
- int minReplicas;
- try {
- TopologyManager.acquireReadLock();
- Service service = TopologyManager.getTopology().getService(getServiceId());
- Cluster cluster = service.getCluster(getClusterId());
- Properties props = cluster.getProperties();
- minReplicas = Integer.parseInt(props.getProperty(StratosConstants.KUBERNETES_MIN_REPLICAS));
- } finally {
- TopologyManager.releaseReadLock();
- }
-
String kubernetesClusterId = getKubernetesClusterCtxt().getKubernetesClusterID();
int activeMembers = getKubernetesClusterCtxt().getActiveMembers().size();
int pendingMembers = getKubernetesClusterCtxt().getPendingMembers().size();
- int nonTerminatedMembers = activeMembers + pendingMembers;
+ int nonTerminatedMembers = getKubernetesClusterCtxt().getNonTerminatedMemberCount();
log.info(KubernetesServiceClusterMonitor.class.getName()+" is running.... Active Members: "+activeMembers
+ " Pending Members: "+pendingMembers);
-
- if (nonTerminatedMembers > 0 && nonTerminatedMembers < minReplicas) {
- // update
- int requiredReplicas = minReplicas - nonTerminatedMembers;
- log.info("Required replicas : "+requiredReplicas);
-
- } else if (nonTerminatedMembers >= minReplicas) {
- // TODO autoscale
- log.info("Current member count : "+nonTerminatedMembers);
- } else {
+
+ if (nonTerminatedMembers == 0) {
try {
CloudControllerClient ccClient = CloudControllerClient.getInstance();
MemberContext[] memberContexts = ccClient.createContainers(kubernetesClusterId,
@@ -132,24 +106,20 @@ public final class KubernetesServiceClusterMonitor extends KubernetesClusterMoni
} catch (SpawningException spawningException) {
if (log.isDebugEnabled()) {
String message = "Cannot create containers, will retry in "
- + (retryInterval / 1000) + "s";
+ + (getMonitorIntervalMilliseconds() / 1000) + "s";
log.debug(message, spawningException);
}
} catch (Exception exception) {
if (log.isDebugEnabled()) {
String message = "Error while creating containers, will retry in "
- + (retryInterval / 1000) + "s";
+ + (getMonitorIntervalMilliseconds() / 1000) + "s";
log.debug(message, exception);
}
}
- try {
- Thread.sleep(retryInterval);
- } catch (InterruptedException ignored) {
- }
- }
-
- minCheck();
- scaleCheck();
+ } else {
+ minCheck();
+ scaleCheck();
+ }
}
private void scaleCheck() {
http://git-wip-us.apache.org/repos/asf/stratos/blob/3a1e2f1c/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
index 246dcc2..b062913 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
@@ -24,6 +24,7 @@ package org.apache.stratos.autoscaler.rule;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.autoscaler.Constants;
+import org.apache.stratos.autoscaler.KubernetesClusterContext;
import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
import org.apache.stratos.autoscaler.PartitionContext;
import org.apache.stratos.autoscaler.algorithm.AutoscaleAlgorithm;
@@ -198,12 +199,38 @@ public class RuleTasksDelegator {
log.error("Cannot terminate instance", e);
}
}
+
+ public void delegateCreateContainers(KubernetesClusterContext kubernetesClusterContext) {
+ try {
+ CloudControllerClient ccClient = CloudControllerClient.getInstance();
+ String kubernetesClusterId = kubernetesClusterContext.getKubernetesClusterID();
+ String clusterId = kubernetesClusterContext.getClusterId();
+ MemberContext[] memberContexts = ccClient.createContainers(kubernetesClusterId, clusterId);
+ for (MemberContext memberContext : memberContexts) {
+
+ if (null != memberContext) {
+ kubernetesClusterContext.addPendingMember(memberContext);
+ if (log.isDebugEnabled()) {
+ log.debug(String.format(
+ "Pending member added, [member] %s [kub cluster] %s",
+ memberContext.getMemberId(), kubernetesClusterId));
+ }
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("Returned member context is null, did not add to pending members");
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.error("Cannot create containers ", e);
+ }
+ }
public void delegateExpandCluster(String clusterId, int replicas) {
try {
CloudControllerClient.getInstance().updateKubernetesController(clusterId, replicas);
} catch (Throwable e) {
- log.error("Cannot update kubernetes controller", e);
+ log.error("Cannot update kubernetes controller ", e);
}
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/3a1e2f1c/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
index 970ba1a..febbcd3 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
@@ -28,6 +28,8 @@ import org.apache.stratos.cartridge.agent.util.CartridgeAgentConstants;
import org.apache.stratos.cartridge.agent.util.CartridgeAgentUtils;
import java.io.File;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
import java.util.*;
/**
@@ -81,7 +83,7 @@ public class CartridgeAgentConfiguration {
clusterId = readParameterValue(CartridgeAgentConstants.CLUSTER_ID);
networkPartitionId = readParameterValue(CartridgeAgentConstants.NETWORK_PARTITION_ID);
partitionId = readParameterValue(CartridgeAgentConstants.PARTITION_ID);
- memberId = readOrGenerateMemberIdValue(CartridgeAgentConstants.MEMBER_ID,clusterId);
+ memberId = readMemberIdValue(CartridgeAgentConstants.MEMBER_ID);
cartridgeKey = readParameterValue(CartridgeAgentConstants.CARTRIDGE_KEY);
appPath = readParameterValue(CartridgeAgentConstants.APP_PATH);
repoUrl = readParameterValue(CartridgeAgentConstants.REPO_URL);
@@ -144,15 +146,27 @@ public class CartridgeAgentConfiguration {
return kubernetesClusterIdValue;
}
- private String readOrGenerateMemberIdValue(String memberId, String clusterId) {
+ private String readMemberIdValue(String memberId) {
String memberIdValue = null;
if (parameters.containsKey(memberId) && parameters.get(memberId) != null) {
memberIdValue = parameters.get(memberId);
} else if (System.getProperty(memberId) != null) {
memberIdValue = System.getProperty(memberId);
- } else {
- memberIdValue = clusterId + UUID.randomUUID().toString();
- log.debug(" MemberId generated as ["+memberIdValue+"] ");
+ } else {
+ String hostname = "unknown";
+ try {
+ log.info("Reading hostname from container");
+ InetAddress addr;
+ addr = InetAddress.getLocalHost();
+ hostname = addr.getHostName();
+ } catch (UnknownHostException e) {
+ String msg = "Hostname can not be resolved";
+ log.error(msg, e);
+ }
+ memberIdValue = hostname;
+ if (log.isDebugEnabled()) {
+ log.debug("MemberId is taking the value of hostname : [" + memberIdValue + "] ");
+ }
}
return memberIdValue;
}
[12/14] git commit: Merge branch 'container-autoscaling' of
https://git-wip-us.apache.org/repos/asf/stratos into container-autoscaling
Posted by ra...@apache.org.
Merge branch 'container-autoscaling' of https://git-wip-us.apache.org/repos/asf/stratos into container-autoscaling
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/c3acfb74
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/c3acfb74
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/c3acfb74
Branch: refs/heads/container-autoscaling
Commit: c3acfb74f9ead9572e1b273ef4af3e30681abb96
Parents: 4e075bf d2976b2
Author: R-Rajkumar <rr...@gmail.com>
Authored: Fri Oct 10 10:39:30 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Fri Oct 10 10:39:30 2014 +0530
----------------------------------------------------------------------
.../exception/InvalidIaasProviderException.java | 2 -
.../MemberTerminationFailedException.java | 48 +
.../impl/CloudControllerServiceImpl.java | 51 ++
.../interfaces/CloudControllerService.java | 8 +
.../main/resources/CloudControllerService.wsdl | 903 ++++++++++---------
5 files changed, 585 insertions(+), 427 deletions(-)
----------------------------------------------------------------------
[11/14] git commit: fixing drools logic and adding comments
Posted by ra...@apache.org.
fixing drools logic and adding comments
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/4e075bfd
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/4e075bfd
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/4e075bfd
Branch: refs/heads/container-autoscaling
Commit: 4e075bfddfdda163c28230d89ba0c71953e65bb8
Parents: c632907
Author: R-Rajkumar <rr...@gmail.com>
Authored: Fri Oct 10 10:38:43 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Fri Oct 10 10:38:43 2014 +0530
----------------------------------------------------------------------
.../autoscaler/KubernetesClusterContext.java | 12 ++++
.../cloud/controller/CloudControllerClient.java | 22 +++---
.../KubernetesServiceClusterMonitor.java | 13 ++--
.../autoscaler/rule/RuleTasksDelegator.java | 71 ++++++++++++++------
.../src/main/conf/container-mincheck.drl | 23 ++++---
.../src/main/conf/container-scaling.drl | 27 ++++++--
6 files changed, 114 insertions(+), 54 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/4e075bfd/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
index b75c0cc..0dfea0c 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
@@ -50,6 +50,10 @@ public class KubernetesClusterContext implements Serializable {
private int minReplicas;
private int maxReplicas = 10;
private int currentReplicas = 0;
+
+ // it will tell whether the startContainers() method succeed or not for the 1st time
+ // we should call startContainers() only once
+ private boolean isServiceClusterCreated = false;
// properties
private Properties properties;
@@ -647,4 +651,12 @@ public class KubernetesClusterContext implements Serializable {
public void setClusterId(String clusterId) {
this.clusterId = clusterId;
}
+
+ public boolean isServiceClusterCreated() {
+ return isServiceClusterCreated;
+ }
+
+ public void setServiceClusterCreated(boolean isServiceClusterCreated) {
+ this.isServiceClusterCreated = isServiceClusterCreated;
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/4e075bfd/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 b7a476a..ce69875 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
@@ -244,7 +244,7 @@ public class CloudControllerClient {
* @return
* @throws SpawningException
*/
- public synchronized MemberContext[] createContainers(String kubernetesClusterId, String clusterId) throws SpawningException {
+ public synchronized MemberContext[] startContainers(String kubernetesClusterId, String clusterId) throws SpawningException {
try {
KubernetesManager kubernetesManager = KubernetesManager.getInstance();
@@ -310,22 +310,22 @@ public class CloudControllerClient {
}
}
- public synchronized void updateKubernetesController(String clusterId, int replicas)
- throws SpawningException {
+ public synchronized MemberContext[] updateContainers(String clusterId, int replicas)
+ throws SpawningException {
try {
log.info(String.format("Updating kubernetes replication controller via cloud controller: " +
"[cluster] %s [replicas] %s", clusterId, replicas));
- stub.updateKubernetesController(clusterId, replicas);
+ MemberContext[] memberContexts = stub.updateContainers(clusterId, replicas);
+ return memberContexts;
+ } catch (CloudControllerServiceUnregisteredCartridgeExceptionException e) {
+ String msg = "Error while updating kubernetes controller, cartridge not found for [cluster] " + clusterId;
+ log.error(msg, e);
+ throw new SpawningException(msg, e);
} catch (RemoteException e) {
String msg = "Error while updating kubernetes controller, cannot communicate with " +
"cloud controller service";
log.error(msg, e);
- throw new SpawningException(e.getMessage(), e);
- } catch (CloudControllerServiceInvalidClusterExceptionException e) {
- String msg = "Error while updating kubernetes controller, invalid clusterId";
- log.error(msg, e);
- throw new SpawningException(e.getMessage(), e);
- }
+ throw new SpawningException(msg, e);
+ }
}
-
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/4e075bfd/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
index fdff259..8bfc1a8 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
@@ -96,7 +96,7 @@ public final class KubernetesServiceClusterMonitor extends KubernetesClusterMoni
getScaleCheckKnowledgeSession().setGlobal("laReset", loadAverageReset);
if (log.isDebugEnabled()) {
log.debug(String.format(
- "Running scale check for kub-cluster %s ", kubernetesClusterID));
+ "Running scale check for [kub-cluster] : %s [cluster] : %s ", kubernetesClusterID, getClusterId()));
}
scaleCheckFactHandle = AutoscalerRuleEvaluator.evaluateScaleCheck(
getScaleCheckKnowledgeSession(), scaleCheckFactHandle, getKubernetesClusterCtxt());
@@ -105,16 +105,17 @@ public final class KubernetesServiceClusterMonitor extends KubernetesClusterMoni
getKubernetesClusterCtxt().setLoadAverageReset(false);
} else if (log.isDebugEnabled()) {
log.debug(String.format("Scale check will not run since none of the statistics have not received yet for "
- + "[kub-cluster] %s [cluster] %s", kubernetesClusterID, clusterId));
+ + "[kub-cluster] : %s [cluster] : %s", kubernetesClusterID, clusterId));
}
}
private void minCheck() {
getMinCheckKnowledgeSession().setGlobal("clusterId", getClusterId());
- if (log.isDebugEnabled()) {
- log.debug(String.format("Running minimum check for cluster %s ",
- getClusterId()));
- }
+ String kubernetesClusterID = getKubernetesClusterCtxt().getKubernetesClusterID();
+ if (log.isDebugEnabled()) {
+ log.debug(String.format(
+ "Running min check for [kub-cluster] : %s [cluster] : %s ", kubernetesClusterID, getClusterId()));
+ }
minCheckFactHandle = AutoscalerRuleEvaluator.evaluateMinCheck(
getMinCheckKnowledgeSession(), minCheckFactHandle,
getKubernetesClusterCtxt());
http://git-wip-us.apache.org/repos/asf/stratos/blob/4e075bfd/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
index 416aa31..9d3227a 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
@@ -199,36 +199,67 @@ public class RuleTasksDelegator {
log.error("Cannot terminate instance", e);
}
}
-
- public void delegateCreateContainers(KubernetesClusterContext kubernetesClusterContext) {
+
+ public void delegateStartContainers(KubernetesClusterContext kubernetesClusterContext) {
try {
- String kubernetesClusterId = kubernetesClusterContext.getKubernetesClusterID();
- String clusterId = kubernetesClusterContext.getClusterId();
+ String kubernetesClusterId = kubernetesClusterContext.getKubernetesClusterID();
+ String clusterId = kubernetesClusterContext.getClusterId();
CloudControllerClient ccClient = CloudControllerClient.getInstance();
- MemberContext[] memberContexts = ccClient.createContainers(kubernetesClusterId, clusterId);
- for (MemberContext memberContext : memberContexts) {
- if (null != memberContext) {
- kubernetesClusterContext.addPendingMember(memberContext);
- if (log.isDebugEnabled()) {
- log.debug(String.format(
- "Pending member added, [member] %s [kub cluster] %s",
- memberContext.getMemberId(), kubernetesClusterId));
- }
- } else {
- if (log.isDebugEnabled()) {
- log.debug("Returned member context is null, did not add to pending members");
+ MemberContext[] memberContexts = ccClient.startContainers(kubernetesClusterId, clusterId);
+ if (null != memberContexts) {
+ for (MemberContext memberContext : memberContexts) {
+ if (null != memberContext) {
+ kubernetesClusterContext.addPendingMember(memberContext);
+ kubernetesClusterContext.setServiceClusterCreated(true);
+ if (log.isDebugEnabled()) {
+ log.debug(String.format(
+ "Pending member added, [member] %s [kub cluster] %s",
+ memberContext.getMemberId(), kubernetesClusterId));
+ }
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("Returned member context is null, did not add any pending members");
+ }
}
}
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("Returned member context is null, did not add to pending members");
+ }
}
} catch (Throwable e) {
log.error("Cannot create containers ", e);
}
- }
+ }
- public void delegateExpandCluster(KubernetesClusterContext kubernetesClusterContext, int replicas) {
- String clusterId = kubernetesClusterContext.getClusterId();
+ public void delegateUpdateContainers(KubernetesClusterContext kubernetesClusterContext,
+ int replicas) {
+ String clusterId = kubernetesClusterContext.getClusterId();
try {
- CloudControllerClient.getInstance().updateKubernetesController(clusterId, replicas);
+ CloudControllerClient ccClient = CloudControllerClient.getInstance();
+ // getting newly created pods' member contexts
+ MemberContext[] memberContexts = ccClient.updateContainers(clusterId, replicas);
+ if (null != memberContexts) {
+ for (MemberContext memberContext : memberContexts) {
+ if (null != memberContext) {
+ kubernetesClusterContext.addPendingMember(memberContext);
+ if (log.isDebugEnabled()) {
+ String kubernetesClusterID = kubernetesClusterContext.getKubernetesClusterID();
+ log.debug(String.format(
+ "Pending member added, [member] %s [kub cluster] %s",
+ memberContext.getMemberId(), kubernetesClusterID));
+ }
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("Returned member context is null, did not add any pending members");
+ }
+ }
+ }
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("Returned array of member context is null, did not add to pending members");
+ }
+ }
} catch (Throwable e) {
log.error("Cannot update kubernetes controller ", e);
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/4e075bfd/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
index 9c3cf0f..605c553 100644
--- a/products/stratos/modules/distribution/src/main/conf/container-mincheck.drl
+++ b/products/stratos/modules/distribution/src/main/conf/container-mincheck.drl
@@ -33,22 +33,23 @@ dialect "mvel"
kubernetesClusterId : String() from $kubernetesClusterContext.getKubernetesClusterID()
minReplicas : Integer() from $kubernetesClusterContext.getMinReplicas()
nonTerminatedReplicas : Integer() from $kubernetesClusterContext.getNonTerminatedMemberCount()
+ isServiceClusterCreated : Boolean() from $kubernetesClusterContext.isServiceClusterCreated()
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(log.debug("[min-check] " + " [cluster] " + clusterId + " [Replicas] nonTerminated : " + nonTerminatedReplicas))
+ eval(log.debug("[min-check] " + " [cluster] " + clusterId + " [Replicas] minReplicas : " + minReplicas))
eval(nonTerminatedReplicas < minReplicas)
then
- if (nonTerminatedReplicas == 0) {
- log.info("[min-check] [kub-cluster] " + kubernetesClusterId
- + " [cluster] " + clusterId + " : min-rule not satisfied, no containers created yet, creating minReplicas : " + minReplicas);
- $delegator.delegateCreateContainers($kubernetesClusterContext);
+ 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, expanding cluster to minReplicas : " + minReplicas);
+ $delegator.delegateUpdateContainers($kubernetesClusterContext, minReplicas);
} else {
- log.info("[min-check] [kub-cluster] " + kubernetesClusterId
- + " [cluster] " + clusterId + " : min-rule not satisfied, expanding cluster to minReplicas : " + minReplicas);
- $delegator.delegateExpandCluster($kubernetesClusterContext, minReplicas);
+ // 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
http://git-wip-us.apache.org/repos/asf/stratos/blob/4e075bfd/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
index 6f20274..398049b 100644
--- a/products/stratos/modules/distribution/src/main/conf/container-scaling.drl
+++ b/products/stratos/modules/distribution/src/main/conf/container-scaling.drl
@@ -38,6 +38,7 @@ dialect "mvel"
kubernetesClusterId : String() from $kubernetesClusterContext.getKubernetesClusterID()
minReplicas : Integer() from $kubernetesClusterContext.getMinReplicas()
maxReplicas : Integer() from $kubernetesClusterContext.getMaxReplicas()
+ nonTerminatedReplicas : Integer() from $kubernetesClusterContext.getNonTerminatedMemberCount()
eval(log.debug("Running scaling rule : [kub-cluster] " + kubernetesClusterId + " [cluster] " + clusterId))
@@ -78,6 +79,7 @@ dialect "mvel"
scaleUp : Boolean() from (scaleUpForRif || scaleUpForMc || scaleUpForLa)
scaleDown : Boolean() from (scaleDownForRif && scaleDownForMc && scaleDownForLa)
+ eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [Replicas] nonTerminated : " + nonTerminatedReplicas))
eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [Replicas] minReplicas : " + minReplicas))
eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [Replicas] maxReplicas : " + maxReplicas))
@@ -101,7 +103,6 @@ dialect "mvel"
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);
@@ -135,14 +136,28 @@ dialect "mvel"
requiredReplicas = minReplicas;
}
//expand the cluster
- log.info("[scaling] " + " [cluster] " + clusterId + " valid number of replicas to expand : " + requiredReplicas);
- $delegator.delegateExpandCluster($kubernetesClusterContext, requiredReplicas);
+ 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.delegateUpdateContainers($kubernetesClusterContext, requiredReplicas);
+ }
+ //shrink the cluster
+ if (requiredReplicas < nonTerminatedReplicas) {
+ log.info("[scaling] Decided to scale-down : [cluster] " + clusterId);
+ log.info("[scaling-down] " + " [cluster] " + clusterId + " valid number of replicas to shrink : " + requiredReplicas);
+ $delegator.delegateUpdateContainers($kubernetesClusterContext, requiredReplicas);
+ }
+ if (requiredReplicas == nonTerminatedReplicas) {
+ log.info("[scaling] " + " [cluster] " + clusterId + "non terminated replicas and predicted replicas are same");
+ }
+
} else if (scaleDown) {
- log.debug("[scale-down] Decided to scale down : [kub-cluster] " + kubernetesClusterId + " [cluster] " + clusterId);
+ 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.delegateExpandCluster($kubernetesClusterContext, minReplicas);
+ $delegator.delegateUpdateContainers($kubernetesClusterContext, minReplicas);
} else {
- log.debug("[scaling] No decision made to either scale up or down ... ");
+ log.info("[scaling] No decision made to either scale up or down ... ");
}
end
[13/14] git commit: adding terminateContainer logic to AS and
refactoring drools logging
Posted by ra...@apache.org.
adding terminateContainer logic to AS and refactoring drools logging
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/17073da1
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/17073da1
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/17073da1
Branch: refs/heads/container-autoscaling
Commit: 17073da149f07f0b6ca6d202291117c5f63a0659
Parents: c3acfb7
Author: R-Rajkumar <rr...@gmail.com>
Authored: Fri Oct 10 16:38:52 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Fri Oct 10 16:38:52 2014 +0530
----------------------------------------------------------------------
.../cloud/controller/CloudControllerClient.java | 16 ++++++
.../monitor/KubernetesClusterMonitor.java | 33 +++++++++--
.../autoscaler/rule/RuleTasksDelegator.java | 9 +++
.../src/main/conf/container-mincheck.drl | 31 +++++++---
.../src/main/conf/container-scaling.drl | 60 ++++++++++----------
5 files changed, 107 insertions(+), 42 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/17073da1/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 ce69875..8ec9f8e 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
@@ -38,6 +38,7 @@ import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidClu
import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidIaasProviderExceptionException;
import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidMemberExceptionException;
import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidPartitionExceptionException;
+import org.apache.stratos.cloud.controller.stub.CloudControllerServiceMemberTerminationFailedExceptionException;
import org.apache.stratos.cloud.controller.stub.CloudControllerServiceStub;
import org.apache.stratos.cloud.controller.stub.CloudControllerServiceUnregisteredCartridgeExceptionException;
import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
@@ -328,4 +329,19 @@ public class CloudControllerClient {
throw new SpawningException(msg, e);
}
}
+
+ public synchronized void terminateContainer(String memberId) throws TerminationException{
+ try {
+ stub.terminateContainer(memberId);
+ } catch (RemoteException e) {
+ String msg = "Error while updating kubernetes controller, cannot communicate with " +
+ "cloud controller service";
+ log.error(msg, e);
+ throw new TerminationException(msg, e);
+ } catch (CloudControllerServiceMemberTerminationFailedExceptionException e) {
+ String msg = "Error while terminating container, member not valid for member id : " + memberId;
+ log.error(msg, e);
+ throw new TerminationException(msg, e);
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/17073da1/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesClusterMonitor.java
index d90e0b6..9375a8e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesClusterMonitor.java
@@ -381,7 +381,7 @@ public abstract class KubernetesClusterMonitor extends AbstractClusterMonitor {
// no need to do anything here
// we will not be receiving this event for containers
- // because we just kill the containers
+ // we will only receive member terminated event
}
@Override
@@ -390,16 +390,39 @@ public abstract class KubernetesClusterMonitor extends AbstractClusterMonitor {
// no need to do anything here
// we will not be receiving this event for containers
- // because we just kill the containers
+ // we will only receive member terminated event
}
@Override
public void handleMemberTerminatedEvent(
MemberTerminatedEvent memberTerminatedEvent) {
- // no need to do anything here
- // we will not be receiving this event for containers
- // because we just kill the containers
+ String memberId = memberTerminatedEvent.getMemberId();
+ if (getKubernetesClusterCtxt().removeTerminationPendingMember(memberId)) {
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Member is removed from termination pending members list: "
+ + "[member] %s", memberId));
+ }
+ } else if (getKubernetesClusterCtxt().removePendingMember(memberId)) {
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Member is removed from pending members list: "
+ + "[member] %s", memberId));
+ }
+ } else if (getKubernetesClusterCtxt().removeActiveMemberById(memberId)) {
+ log.warn(String.format("Member is in the wrong list and it is removed from "
+ + "active members list", memberId));
+ } else if (getKubernetesClusterCtxt().removeObsoleteMember(memberId)) {
+ log.warn(String.format("Member's obsolated timeout has been expired and "
+ + "it is removed from obsolated members list", memberId));
+ } else {
+ log.warn(String.format("Member is not available in any of the list active, "
+ + "pending and termination pending", memberId));
+ }
+
+ if (log.isInfoEnabled()) {
+ log.info(String.format("Member stat context has been removed successfully: "
+ + "[member] %s", memberId));
+ }
}
@Override
http://git-wip-us.apache.org/repos/asf/stratos/blob/17073da1/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
index 9d3227a..0a9bde3 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
@@ -264,6 +264,15 @@ public class RuleTasksDelegator {
log.error("Cannot update kubernetes controller ", e);
}
}
+
+ public void delegateTerminateContainer(KubernetesClusterContext kubernetesClusterContext, String memberId) {
+ try {
+ CloudControllerClient ccClient = CloudControllerClient.getInstance();
+ ccClient.terminateContainer(memberId);
+ } catch (Throwable e) {
+ log.error("Cannot delete container ", e);
+ }
+ }
public int getPredictedReplicasForStat(int minReplicas, float statUpperLimit, float statPredictedValue) {
if (statUpperLimit == 0) {
http://git-wip-us.apache.org/repos/asf/stratos/blob/17073da1/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
index 605c553..9798852 100644
--- a/products/stratos/modules/distribution/src/main/conf/container-mincheck.drl
+++ b/products/stratos/modules/distribution/src/main/conf/container-mincheck.drl
@@ -26,7 +26,7 @@ global org.apache.stratos.autoscaler.rule.RuleLog log;
global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator;
global java.lang.String clusterId;
-rule "Minimum Rule"
+rule "Container Minimum Rule"
dialect "mvel"
when
$kubernetesClusterContext : KubernetesClusterContext ()
@@ -36,20 +36,37 @@ dialect "mvel"
isServiceClusterCreated : Boolean() from $kubernetesClusterContext.isServiceClusterCreated()
eval(log.debug("Running minimum rule: [kub-cluster] " +kubernetesClusterId + " [cluster] " + clusterId))
- eval(log.debug("[min-check] " + " [cluster] " + clusterId + " [Replicas] nonTerminated : " + nonTerminatedReplicas))
- eval(log.debug("[min-check] " + " [cluster] " + clusterId + " [Replicas] minReplicas : " + minReplicas))
+ eval(log.debug("[min-check] " + " [cluster] : " + clusterId + " [Replicas] nonTerminated : " + nonTerminatedReplicas))
+ eval(log.debug("[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, expanding cluster to minReplicas : " + minReplicas);
+ log.info("[min-check] Decided to scale-up : [cluster] : " + clusterId);
+ log.info("[min-check] " + " [cluster] : " + clusterId + " ; min-rule not satisfied, expanding cluster to minReplicas : " + minReplicas);
$delegator.delegateUpdateContainers($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);
+ 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.debug("Running obsolete containers rule [kub-cluster] : " + kubernetesClusterId + " [cluster] : " + clusterId))
+ eval(log.debug("[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
+ $delegator.delegateTerminateContainer($kubernetesClusterContext, memberId);
+end
+
+
http://git-wip-us.apache.org/repos/asf/stratos/blob/17073da1/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
index 398049b..46d9aeb 100644
--- a/products/stratos/modules/distribution/src/main/conf/container-scaling.drl
+++ b/products/stratos/modules/distribution/src/main/conf/container-scaling.drl
@@ -40,7 +40,7 @@ dialect "mvel"
maxReplicas : Integer() from $kubernetesClusterContext.getMaxReplicas()
nonTerminatedReplicas : Integer() from $kubernetesClusterContext.getNonTerminatedMemberCount()
- eval(log.debug("Running scaling rule : [kub-cluster] " + kubernetesClusterId + " [cluster] " + clusterId))
+ eval(log.debug("Running scaling rule [kub-cluster] : " + kubernetesClusterId + " [cluster] : " + clusterId))
$loadThresholds : LoadThresholds() from autoscalePolicy.getLoadThresholds()
@@ -79,81 +79,81 @@ dialect "mvel"
scaleUp : Boolean() from (scaleUpForRif || scaleUpForMc || scaleUpForLa)
scaleDown : Boolean() from (scaleDownForRif && scaleDownForMc && scaleDownForLa)
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [Replicas] nonTerminated : " + nonTerminatedReplicas))
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [Replicas] minReplicas : " + minReplicas))
- eval(log.debug("[scaling] " + " [cluster] " + clusterId + " [Replicas] maxReplicas : " + maxReplicas))
+ eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " [Replicas] nonTerminated : " + nonTerminatedReplicas))
+ 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 + " [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 + " [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 + " [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))
+ eval(log.debug("[scaling] " + " [cluster] : " + clusterId + " scale-up action : " + scaleUp))
+ eval(log.debug("[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);
+ 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);
+ 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);
+ 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 : ");
+ 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 : ");
+ 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);
+ log.info("[scaling] Decided to scale-up : [cluster] : " + clusterId);
+ log.info("[scaling-up] " + " [cluster] : " + clusterId + " valid number of replicas to expand : " + requiredReplicas);
$delegator.delegateUpdateContainers($kubernetesClusterContext, requiredReplicas);
}
//shrink the cluster
if (requiredReplicas < nonTerminatedReplicas) {
- log.info("[scaling] Decided to scale-down : [cluster] " + clusterId);
- log.info("[scaling-down] " + " [cluster] " + clusterId + " valid number of replicas to shrink : " + requiredReplicas);
+ log.info("[scaling] Decided to scale-down : [cluster] : " + clusterId);
+ log.info("[scaling-down] " + " [cluster] : " + clusterId + " valid number of replicas to shrink : " + requiredReplicas);
$delegator.delegateUpdateContainers($kubernetesClusterContext, requiredReplicas);
}
if (requiredReplicas == nonTerminatedReplicas) {
- log.info("[scaling] " + " [cluster] " + clusterId + "non terminated replicas and predicted replicas are same");
+ log.info("[scaling] " + " [cluster] : " + clusterId + "non terminated replicas and predicted replicas are same");
}
} else if (scaleDown) {
- log.info("[scaling] Decided to scale-down : [cluster] " + clusterId);
- log.info("[scaling-down] " + " [cluster] " + clusterId + " shrink the cluster to minReplicas : " + 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.delegateUpdateContainers($kubernetesClusterContext, minReplicas);
} else {
[09/14] git commit: calling createContainers() from drool
Posted by ra...@apache.org.
calling createContainers() from drool
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/0724bdc2
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/0724bdc2
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/0724bdc2
Branch: refs/heads/container-autoscaling
Commit: 0724bdc2df9e8dcf070a472685dd2e49a7cf0189
Parents: 3a1e2f1
Author: R-Rajkumar <rr...@gmail.com>
Authored: Thu Oct 9 18:57:43 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Thu Oct 9 18:57:43 2014 +0530
----------------------------------------------------------------------
.../KubernetesServiceClusterMonitor.java | 50 +-------------------
.../autoscaler/rule/RuleTasksDelegator.java | 10 ++--
.../src/main/conf/container-mincheck.drl | 14 ++++--
.../src/main/conf/container-scaling.drl | 4 +-
4 files changed, 19 insertions(+), 59 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/0724bdc2/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
index 068f21e..fdff259 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
@@ -22,13 +22,10 @@ import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.autoscaler.KubernetesClusterContext;
-import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
-import org.apache.stratos.autoscaler.exception.SpawningException;
import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
import org.apache.stratos.autoscaler.util.AutoScalerConstants;
import org.apache.stratos.autoscaler.util.ConfUtil;
-import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
import org.apache.stratos.common.constants.StratosConstants;
import org.apache.stratos.messaging.domain.topology.ClusterStatus;
@@ -75,51 +72,8 @@ public final class KubernetesServiceClusterMonitor extends KubernetesClusterMoni
@Override
protected void monitor() {
-
- String kubernetesClusterId = getKubernetesClusterCtxt().getKubernetesClusterID();
- int activeMembers = getKubernetesClusterCtxt().getActiveMembers().size();
- int pendingMembers = getKubernetesClusterCtxt().getPendingMembers().size();
- int nonTerminatedMembers = getKubernetesClusterCtxt().getNonTerminatedMemberCount();
- log.info(KubernetesServiceClusterMonitor.class.getName()+" is running.... Active Members: "+activeMembers
- + " Pending Members: "+pendingMembers);
-
- if (nonTerminatedMembers == 0) {
- try {
- CloudControllerClient ccClient = CloudControllerClient.getInstance();
- MemberContext[] memberContexts = ccClient.createContainers(kubernetesClusterId,
- getClusterId());
- for (MemberContext memberContext : memberContexts) {
-
- if (null != memberContext) {
- getKubernetesClusterCtxt().addPendingMember(memberContext);
- if (log.isDebugEnabled()) {
- log.debug(String.format(
- "Pending member added, [member] %s [kub cluster] %s",
- memberContext.getMemberId(), kubernetesClusterId));
- }
- } else {
- if (log.isDebugEnabled()) {
- log.debug("Returned member context is null, did not add to pending members");
- }
- }
- }
- } catch (SpawningException spawningException) {
- if (log.isDebugEnabled()) {
- String message = "Cannot create containers, will retry in "
- + (getMonitorIntervalMilliseconds() / 1000) + "s";
- log.debug(message, spawningException);
- }
- } catch (Exception exception) {
- if (log.isDebugEnabled()) {
- String message = "Error while creating containers, will retry in "
- + (getMonitorIntervalMilliseconds() / 1000) + "s";
- log.debug(message, exception);
- }
- }
- } else {
- minCheck();
- scaleCheck();
- }
+ minCheck();
+ scaleCheck();
}
private void scaleCheck() {
http://git-wip-us.apache.org/repos/asf/stratos/blob/0724bdc2/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
index b062913..416aa31 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
@@ -202,12 +202,11 @@ public class RuleTasksDelegator {
public void delegateCreateContainers(KubernetesClusterContext kubernetesClusterContext) {
try {
+ String kubernetesClusterId = kubernetesClusterContext.getKubernetesClusterID();
+ String clusterId = kubernetesClusterContext.getClusterId();
CloudControllerClient ccClient = CloudControllerClient.getInstance();
- String kubernetesClusterId = kubernetesClusterContext.getKubernetesClusterID();
- String clusterId = kubernetesClusterContext.getClusterId();
MemberContext[] memberContexts = ccClient.createContainers(kubernetesClusterId, clusterId);
for (MemberContext memberContext : memberContexts) {
-
if (null != memberContext) {
kubernetesClusterContext.addPendingMember(memberContext);
if (log.isDebugEnabled()) {
@@ -221,12 +220,13 @@ public class RuleTasksDelegator {
}
}
}
- } catch (Exception e) {
+ } catch (Throwable e) {
log.error("Cannot create containers ", e);
}
}
- public void delegateExpandCluster(String clusterId, int replicas) {
+ public void delegateExpandCluster(KubernetesClusterContext kubernetesClusterContext, int replicas) {
+ String clusterId = kubernetesClusterContext.getClusterId();
try {
CloudControllerClient.getInstance().updateKubernetesController(clusterId, replicas);
} catch (Throwable e) {
http://git-wip-us.apache.org/repos/asf/stratos/blob/0724bdc2/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
index edea3cf..9c3cf0f 100644
--- a/products/stratos/modules/distribution/src/main/conf/container-mincheck.drl
+++ b/products/stratos/modules/distribution/src/main/conf/container-mincheck.drl
@@ -39,10 +39,16 @@ dialect "mvel"
+ " [cluster] " + clusterId + " Non terminated member count: " + nonTerminatedReplicas))
eval(log.debug("[min-check] [kub-cluster] " + kubernetesClusterId
+ " [cluster] " + clusterId + " Minimum member count: " + minReplicas))
- eval (nonTerminatedReplicas < 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);
+ if (nonTerminatedReplicas == 0) {
+ log.info("[min-check] [kub-cluster] " + kubernetesClusterId
+ + " [cluster] " + clusterId + " : min-rule not satisfied, no containers created yet, creating minReplicas : " + minReplicas);
+ $delegator.delegateCreateContainers($kubernetesClusterContext);
+ } else {
+ log.info("[min-check] [kub-cluster] " + kubernetesClusterId
+ + " [cluster] " + clusterId + " : min-rule not satisfied, expanding cluster to minReplicas : " + minReplicas);
+ $delegator.delegateExpandCluster($kubernetesClusterContext, minReplicas);
+ }
end
http://git-wip-us.apache.org/repos/asf/stratos/blob/0724bdc2/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
index c773264..6f20274 100644
--- a/products/stratos/modules/distribution/src/main/conf/container-scaling.drl
+++ b/products/stratos/modules/distribution/src/main/conf/container-scaling.drl
@@ -136,11 +136,11 @@ dialect "mvel"
}
//expand the cluster
log.info("[scaling] " + " [cluster] " + clusterId + " valid number of replicas to expand : " + requiredReplicas);
- $delegator.delegateExpandCluster(clusterId, requiredReplicas);
+ $delegator.delegateExpandCluster($kubernetesClusterContext, 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);
+ $delegator.delegateExpandCluster($kubernetesClusterContext, minReplicas);
} else {
log.debug("[scaling] No decision made to either scale up or down ... ");
}
[02/14] git commit: adding constants for drool files names
Posted by ra...@apache.org.
adding constants for drool files names
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/5db40af9
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/5db40af9
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/5db40af9
Branch: refs/heads/container-autoscaling
Commit: 5db40af957f8f0625508a3b17768636cb23abebf
Parents: 2a5cabe
Author: R-Rajkumar <rr...@gmail.com>
Authored: Thu Oct 9 10:51:38 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Thu Oct 9 10:51:38 2014 +0530
----------------------------------------------------------------------
.../org/apache/stratos/common/constants/StratosConstants.java | 7 +++++++
1 file changed, 7 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/5db40af9/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 1e36c15..5d3ad8c 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
@@ -150,8 +150,15 @@ public class StratosConstants {
public static final String KUBERNETES_DEPLOYER_TYPE = "kubernetes";
public static final String KUBERNETES_MASTER_IP = "KUBERNETES_MASTER_IP";
public static final String KUBERNETES_MIN_REPLICAS = "KUBERNETES_REPLICAS_MIN";
+ public static final String KUBERNETES_MAX_REPLICAS = "KUBERNETES_REPLICAS_MAX";
public static final String KUBERNETES_PORT_RANGE = "KUBERNETES_PORT_RANGE";
public static final String ALLOCATED_SERVICE_HOST_PORT = "ALLOCATED_SERVICE_HOST_PORT";
+
+ //drools related constants
+ 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";
+ public static final String VM_MIN_CHECK_DROOL_FILE = "mincheck.drl";
// Policy and definition related constants
public static final int PUBLIC_DEFINITION = 0;
[06/14] git commit: Merge branch 'container-autoscaling' of
https://git-wip-us.apache.org/repos/asf/stratos into container-autoscaling
Posted by ra...@apache.org.
Merge branch 'container-autoscaling' of https://git-wip-us.apache.org/repos/asf/stratos into container-autoscaling
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/31daf2f3
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/31daf2f3
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/31daf2f3
Branch: refs/heads/container-autoscaling
Commit: 31daf2f328e4a9abe988d926a3fe32d2556f7693
Parents: fce7322 30e08c8
Author: R-Rajkumar <rr...@gmail.com>
Authored: Thu Oct 9 11:09:31 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Thu Oct 9 11:09:31 2014 +0530
----------------------------------------------------------------------
.../cloud/controller/CloudControllerClient.java | 14 +-
.../KubernetesServiceClusterMonitor.java | 61 +-
...inerClusterContextToKubernetesContainer.java | 141 +++
...tainerClusterContextToKubernetesService.java | 64 ++
...erClusterContextToReplicationController.java | 90 ++
.../MemberContextToKubernetesContainer.java | 147 ---
.../MemberContextToKubernetesService.java | 65 --
.../MemberContextToReplicationController.java | 90 --
.../functions/PodToMemberContext.java | 46 +
.../impl/CloudControllerServiceImpl.java | 209 +++--
.../interfaces/CloudControllerService.java | 8 +-
.../pojo/ContainerClusterContext.java | 87 ++
.../cloud/controller/pojo/MemberContext.java | 29 +-
.../pom.xml | 2 +-
.../kubernetes/client/KubernetesApiClient.java | 202 +++--
.../KubernetesAPIClientInterface.java | 8 +
.../client/rest/KubernetesResponse.java | 56 ++
.../client/rest/KubernetesResponseHandler.java | 71 ++
.../kubernetes/client/rest/RestClient.java | 88 +-
.../pom.xml | 19 +
.../modules/distribution/src/assembly/bin.xml | 6 +-
.../main/resources/CloudControllerService.wsdl | 898 ++++++++++---------
22 files changed, 1393 insertions(+), 1008 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/31daf2f3/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/cloud/controller/CloudControllerClient.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/client/cloud/controller/CloudControllerClient.java
index 65035d0,eaa80c4..b7a476a
--- 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
@@@ -33,14 -31,9 +33,15 @@@ import org.apache.stratos.autoscaler.ex
import org.apache.stratos.autoscaler.exception.TerminationException;
import org.apache.stratos.autoscaler.kubernetes.KubernetesManager;
import org.apache.stratos.autoscaler.util.ConfUtil;
-import org.apache.stratos.cloud.controller.stub.*;
+import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeTypeExceptionException;
+import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidClusterExceptionException;
+import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidIaasProviderExceptionException;
+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.cloud.controller.stub.deployment.partition.Partition;
+ import org.apache.stratos.cloud.controller.stub.pojo.ContainerClusterContext;
import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
import org.apache.stratos.cloud.controller.stub.pojo.Properties;
import org.apache.stratos.cloud.controller.stub.pojo.Property;
http://git-wip-us.apache.org/repos/asf/stratos/blob/31daf2f3/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
index 1688df1,6362fc4..d0d7668
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
@@@ -119,75 -125,28 +128,75 @@@ public final class KubernetesServiceClu
log.debug("Returned member context is null, did not add to pending members");
}
}
- } catch (SpawningException spawningException) {
- if (log.isDebugEnabled()) {
- String message = "Cannot create containers, will retry in "
- + (retryInterval / 1000) + "s";
- log.debug(message, spawningException);
- }
- } catch (Exception exception) {
- if (log.isDebugEnabled()) {
- String message = "Error while creating containers, will retry in "
- + (retryInterval / 1000) + "s";
- log.debug(message, exception);
- }
}
- try {
- Thread.sleep(retryInterval);
- } catch (InterruptedException ignored) {
+ } catch (SpawningException spawningException) {
+ if (log.isDebugEnabled()) {
+ String message = "Cannot create containers, will retry in "
+ + (retryInterval / 1000) + "s";
+ log.debug(message, spawningException);
+ }
+ } catch (Exception exception) {
+ if (log.isDebugEnabled()) {
+ String message = "Error while creating containers, will retry in "
+ + (retryInterval / 1000) + "s";
+ log.debug(message, exception);
}
}
+ try {
+ Thread.sleep(retryInterval);
+ } catch (InterruptedException ignored) {
+ }
}
+
+ minCheck();
+ scaleCheck();
}
- @Override
+ private void scaleCheck() {
+ boolean rifReset = getKubernetesClusterCtxt().isRifReset();
+ boolean memoryConsumptionReset = getKubernetesClusterCtxt().isMemoryConsumptionReset();
+ boolean loadAverageReset = getKubernetesClusterCtxt().isLoadAverageReset();
+ if (log.isDebugEnabled()) {
+ log.debug("flag of rifReset : " + rifReset
+ + " flag of memoryConsumptionReset : "
+ + memoryConsumptionReset + " flag of loadAverageReset : "
+ + loadAverageReset);
+ }
+ String kubernetesClusterID = getKubernetesClusterCtxt().getKubernetesClusterID();
+ String clusterId = getClusterId();
+ if (rifReset || memoryConsumptionReset || loadAverageReset) {
+ getScaleCheckKnowledgeSession().setGlobal("clusterId", clusterId);
+ getScaleCheckKnowledgeSession().setGlobal("autoscalePolicy", autoscalePolicy);
+ getScaleCheckKnowledgeSession().setGlobal("rifReset", rifReset);
+ getScaleCheckKnowledgeSession().setGlobal("mcReset", memoryConsumptionReset);
+ getScaleCheckKnowledgeSession().setGlobal("laReset", loadAverageReset);
+ if (log.isDebugEnabled()) {
+ log.debug(String.format(
+ "Running scale check for kub-cluster %s ", kubernetesClusterID));
+ }
+ scaleCheckFactHandle = AutoscalerRuleEvaluator.evaluateScaleCheck(
+ getScaleCheckKnowledgeSession(), scaleCheckFactHandle, getKubernetesClusterCtxt());
+ getKubernetesClusterCtxt().setRifReset(false);
+ getKubernetesClusterCtxt().setMemoryConsumptionReset(false);
+ getKubernetesClusterCtxt().setLoadAverageReset(false);
+ } else if (log.isDebugEnabled()) {
+ log.debug(String.format("Scale check will not run since none of the statistics have not received yet for "
+ + "[kub-cluster] %s [cluster] %s", kubernetesClusterID, clusterId));
+ }
+ }
+
+ private void minCheck() {
+ getMinCheckKnowledgeSession().setGlobal("clusterId", getClusterId());
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Running minimum check for cluster %s ",
+ getClusterId()));
+ }
+ minCheckFactHandle = AutoscalerRuleEvaluator.evaluateMinCheck(
+ getMinCheckKnowledgeSession(), minCheckFactHandle,
+ getKubernetesClusterCtxt());
+ }
+
+ @Override
public void destroy() {
getMinCheckKnowledgeSession().dispose();
getScaleCheckKnowledgeSession().dispose();
http://git-wip-us.apache.org/repos/asf/stratos/blob/31daf2f3/products/stratos/modules/distribution/src/assembly/bin.xml
----------------------------------------------------------------------
[10/14] git commit: Merge branch 'container-autoscaling' of
https://git-wip-us.apache.org/repos/asf/stratos into container-autoscaling
Posted by ra...@apache.org.
Merge branch 'container-autoscaling' of https://git-wip-us.apache.org/repos/asf/stratos into container-autoscaling
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/c6329077
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/c6329077
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/c6329077
Branch: refs/heads/container-autoscaling
Commit: c6329077e8eb1c5c931b3c4be2b0cb48ead20e22
Parents: 0724bdc 4d59205
Author: R-Rajkumar <rr...@gmail.com>
Authored: Thu Oct 9 19:09:07 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Thu Oct 9 19:09:07 2014 +0530
----------------------------------------------------------------------
.../autoscaler/NetworkPartitionContext.java | 7 +-
.../deployment/policy/DeploymentPolicy.java | 10 +-
.../autoscaler/partition/PartitionGroup.java | 8 +-
.../agent/data/publisher/DataContext.java | 20 +-
.../stratos/cli/beans/cartridge/Cartridge.java | 13 +-
.../controller/axiom/AxiomXpathParserUtil.java | 20 +-
.../impl/CloudControllerServiceImpl.java | 135 ++-
.../interfaces/CloudControllerService.java | 33 +-
.../internal/CloudControllerDSComponent.java | 30 +-
.../controller/pojo/NetworkInterfaces.java | 6 +-
.../cloud/controller/pojo/Persistence.java | 7 +-
.../cloud/controller/pojo/Properties.java | 6 +-
.../common/kubernetes/KubernetesGroup.java | 6 +-
.../stratos/common/kubernetes/Properties.java | 6 +-
.../apache/stratos/manager/dto/Cartridge.java | 15 +-
.../manager/dto/RepositoryInformation.java | 7 +-
.../manager/service/RepositoryInfoBean.java | 26 +-
.../stratos/messaging/util/Properties.java | 12 +-
.../endpoint/bean/kubernetes/Properties.java | 6 +-
.../activity/beans/PaginatedTenantDataBean.java | 7 +-
.../mgt/beans/PaginatedTenantInfoBean.java | 7 +-
components/pom.xml | 2 +-
.../main/resources/CloudControllerService.wsdl | 890 ++++++++++---------
23 files changed, 753 insertions(+), 526 deletions(-)
----------------------------------------------------------------------
[14/14] git commit: avoid catching throwable
Posted by ra...@apache.org.
avoid catching throwable
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/ff372226
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/ff372226
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/ff372226
Branch: refs/heads/container-autoscaling
Commit: ff3722268c5a9b5283c16958f66c0dc9e3b83095
Parents: 17073da
Author: R-Rajkumar <rr...@gmail.com>
Authored: Fri Oct 10 16:45:00 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Fri Oct 10 16:45:00 2014 +0530
----------------------------------------------------------------------
.../stratos/autoscaler/rule/RuleTasksDelegator.java | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/ff372226/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
index 0a9bde3..1154ac3 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
@@ -32,6 +32,8 @@ import org.apache.stratos.autoscaler.algorithm.OneAfterAnother;
import org.apache.stratos.autoscaler.algorithm.RoundRobin;
import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
import org.apache.stratos.autoscaler.client.cloud.controller.InstanceNotificationClient;
+import org.apache.stratos.autoscaler.exception.SpawningException;
+import org.apache.stratos.autoscaler.exception.TerminationException;
import org.apache.stratos.autoscaler.partition.PartitionManager;
import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
@@ -227,7 +229,7 @@ public class RuleTasksDelegator {
log.debug("Returned member context is null, did not add to pending members");
}
}
- } catch (Throwable e) {
+ } catch (Exception e) {
log.error("Cannot create containers ", e);
}
}
@@ -260,7 +262,7 @@ public class RuleTasksDelegator {
log.debug("Returned array of member context is null, did not add to pending members");
}
}
- } catch (Throwable e) {
+ } catch (Exception e) {
log.error("Cannot update kubernetes controller ", e);
}
}
@@ -269,9 +271,9 @@ public class RuleTasksDelegator {
try {
CloudControllerClient ccClient = CloudControllerClient.getInstance();
ccClient.terminateContainer(memberId);
- } catch (Throwable e) {
+ } catch (TerminationException e) {
log.error("Cannot delete container ", e);
- }
+ }
}
public int getPredictedReplicasForStat(int minReplicas, float statUpperLimit, float statPredictedValue) {
[03/14] git commit: making drool files as arguments to
AutoscalerRuleEvaluator
Posted by ra...@apache.org.
making drool files as arguments to AutoscalerRuleEvaluator
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/7d8acf3e
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/7d8acf3e
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/7d8acf3e
Branch: refs/heads/container-autoscaling
Commit: 7d8acf3e8c44f71704152a1634285f099f4da552
Parents: 5db40af
Author: R-Rajkumar <rr...@gmail.com>
Authored: Thu Oct 9 10:55:15 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Thu Oct 9 10:55:15 2014 +0530
----------------------------------------------------------------------
.../KubernetesServiceClusterMonitor.java | 54 +++++++++++++++++++-
.../autoscaler/monitor/VMLbClusterMonitor.java | 6 ++-
.../monitor/VMServiceClusterMonitor.java | 5 +-
.../rule/AutoscalerRuleEvaluator.java | 24 +++++----
4 files changed, 75 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/7d8acf3e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
index 6e14ce0..1688df1 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/KubernetesServiceClusterMonitor.java
@@ -52,7 +52,10 @@ public final class KubernetesServiceClusterMonitor extends KubernetesClusterMoni
String serviceClusterID, String serviceId,
AutoscalePolicy autoscalePolicy) {
super(serviceClusterID, serviceId, kubernetesClusterCtxt,
- new AutoscalerRuleEvaluator(), autoscalePolicy);
+ new AutoscalerRuleEvaluator(
+ StratosConstants.CONTAINER_MIN_CHECK_DROOL_FILE,
+ StratosConstants.CONTAINER_SCALE_CHECK_DROOL_FILE),
+ autoscalePolicy);
readConfigurations();
}
@@ -135,9 +138,56 @@ public final class KubernetesServiceClusterMonitor extends KubernetesClusterMoni
}
}
}
+
+ minCheck();
+ scaleCheck();
}
- @Override
+ private void scaleCheck() {
+ boolean rifReset = getKubernetesClusterCtxt().isRifReset();
+ boolean memoryConsumptionReset = getKubernetesClusterCtxt().isMemoryConsumptionReset();
+ boolean loadAverageReset = getKubernetesClusterCtxt().isLoadAverageReset();
+ if (log.isDebugEnabled()) {
+ log.debug("flag of rifReset : " + rifReset
+ + " flag of memoryConsumptionReset : "
+ + memoryConsumptionReset + " flag of loadAverageReset : "
+ + loadAverageReset);
+ }
+ String kubernetesClusterID = getKubernetesClusterCtxt().getKubernetesClusterID();
+ String clusterId = getClusterId();
+ if (rifReset || memoryConsumptionReset || loadAverageReset) {
+ getScaleCheckKnowledgeSession().setGlobal("clusterId", clusterId);
+ getScaleCheckKnowledgeSession().setGlobal("autoscalePolicy", autoscalePolicy);
+ getScaleCheckKnowledgeSession().setGlobal("rifReset", rifReset);
+ getScaleCheckKnowledgeSession().setGlobal("mcReset", memoryConsumptionReset);
+ getScaleCheckKnowledgeSession().setGlobal("laReset", loadAverageReset);
+ if (log.isDebugEnabled()) {
+ log.debug(String.format(
+ "Running scale check for kub-cluster %s ", kubernetesClusterID));
+ }
+ scaleCheckFactHandle = AutoscalerRuleEvaluator.evaluateScaleCheck(
+ getScaleCheckKnowledgeSession(), scaleCheckFactHandle, getKubernetesClusterCtxt());
+ getKubernetesClusterCtxt().setRifReset(false);
+ getKubernetesClusterCtxt().setMemoryConsumptionReset(false);
+ getKubernetesClusterCtxt().setLoadAverageReset(false);
+ } else if (log.isDebugEnabled()) {
+ log.debug(String.format("Scale check will not run since none of the statistics have not received yet for "
+ + "[kub-cluster] %s [cluster] %s", kubernetesClusterID, clusterId));
+ }
+ }
+
+ private void minCheck() {
+ getMinCheckKnowledgeSession().setGlobal("clusterId", getClusterId());
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Running minimum check for cluster %s ",
+ getClusterId()));
+ }
+ minCheckFactHandle = AutoscalerRuleEvaluator.evaluateMinCheck(
+ getMinCheckKnowledgeSession(), minCheckFactHandle,
+ getKubernetesClusterCtxt());
+ }
+
+ @Override
public void destroy() {
getMinCheckKnowledgeSession().dispose();
getScaleCheckKnowledgeSession().dispose();
http://git-wip-us.apache.org/repos/asf/stratos/blob/7d8acf3e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMLbClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMLbClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMLbClusterMonitor.java
index 1c27380..8e7d0e1 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMLbClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMLbClusterMonitor.java
@@ -34,6 +34,7 @@ import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
import org.apache.stratos.autoscaler.util.AutoScalerConstants;
import org.apache.stratos.autoscaler.util.ConfUtil;
+import org.apache.stratos.common.constants.StratosConstants;
import org.apache.stratos.messaging.domain.topology.ClusterStatus;
import org.apache.stratos.messaging.event.topology.ClusterRemovedEvent;
@@ -48,7 +49,10 @@ public class VMLbClusterMonitor extends VMClusterMonitor {
public VMLbClusterMonitor(String clusterId, String serviceId, DeploymentPolicy deploymentPolicy,
AutoscalePolicy autoscalePolicy) {
- super(clusterId, serviceId, new AutoscalerRuleEvaluator(),
+ super(clusterId, serviceId,
+ new AutoscalerRuleEvaluator(
+ StratosConstants.VM_MIN_CHECK_DROOL_FILE,
+ StratosConstants.VM_SCALE_CHECK_DROOL_FILE),
deploymentPolicy, autoscalePolicy,
new ConcurrentHashMap<String, NetworkPartitionContext>());
readConfigurations();
http://git-wip-us.apache.org/repos/asf/stratos/blob/7d8acf3e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMServiceClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMServiceClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMServiceClusterMonitor.java
index 6f9fb26..adf750d 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMServiceClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/VMServiceClusterMonitor.java
@@ -35,6 +35,7 @@ import org.apache.stratos.autoscaler.util.ConfUtil;
import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
import org.apache.stratos.cloud.controller.stub.pojo.Properties;
import org.apache.stratos.cloud.controller.stub.pojo.Property;
+import org.apache.stratos.common.constants.StratosConstants;
import org.apache.stratos.messaging.domain.topology.ClusterStatus;
/**
@@ -51,7 +52,9 @@ public class VMServiceClusterMonitor extends VMClusterMonitor {
public VMServiceClusterMonitor(String clusterId, String serviceId,
DeploymentPolicy deploymentPolicy,
AutoscalePolicy autoscalePolicy) {
- super(clusterId, serviceId, new AutoscalerRuleEvaluator(),
+ super(clusterId, serviceId,
+ new AutoscalerRuleEvaluator(StratosConstants.VM_MIN_CHECK_DROOL_FILE,
+ StratosConstants.VM_SCALE_CHECK_DROOL_FILE),
deploymentPolicy, autoscalePolicy,
new ConcurrentHashMap<String, NetworkPartitionContext>());
readConfigurations();
http://git-wip-us.apache.org/repos/asf/stratos/blob/7d8acf3e/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 4bf9207..a402ab4 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
@@ -44,32 +44,36 @@ public class AutoscalerRuleEvaluator {
private static final Log log = LogFactory.getLog(AutoscalerRuleEvaluator.class);
- private static final String DRL_FILE_NAME = "mincheck.drl";
- private static final String SCALING_DRL_FILE_NAME = "scaling.drl";
- private static final String TERMINATE_ALL_DRL_FILE_NAME = "terminateall.drl";
+ //vm drool files as default
+ private String minCheckDroolFileName = "mincheck.drl";
+ private String scaleCheckDroolFileName = "scaling.drl";
+ private String terminateAllDroolFileName = "terminateall.drl";
private static KnowledgeBase minCheckKbase;
private static KnowledgeBase scaleCheckKbase;
@SuppressWarnings("unused")
private static KnowledgeBase terminateAllKbase;
- public AutoscalerRuleEvaluator(){
+ public AutoscalerRuleEvaluator(String minCheckDroolFileName, String scaleCheckDroolFileName){
+
+ this.minCheckDroolFileName = minCheckDroolFileName;
+ this.scaleCheckDroolFileName = scaleCheckDroolFileName;
- minCheckKbase = readKnowledgeBase(DRL_FILE_NAME);
+ minCheckKbase = readKnowledgeBase(this.minCheckDroolFileName);
if (log.isDebugEnabled()) {
- log.debug("Minimum check rule is parsed successfully");
+ log.debug("Minimum check rule is parsed successfully : " + this.minCheckDroolFileName);
}
- scaleCheckKbase = readKnowledgeBase(SCALING_DRL_FILE_NAME);
+ scaleCheckKbase = readKnowledgeBase(this.scaleCheckDroolFileName);
if (log.isDebugEnabled()) {
- log.debug("Scale check rule is parsed successfully");
+ log.debug("Scale check rule is parsed successfully : " + this.scaleCheckDroolFileName);
}
- terminateAllKbase = readKnowledgeBase(TERMINATE_ALL_DRL_FILE_NAME);
+ terminateAllKbase = readKnowledgeBase(this.terminateAllDroolFileName);
if (log.isDebugEnabled()) {
- log.debug("Terminate all rule is parsed successfully");
+ log.debug("Terminate all rule is parsed successfully : " + this.terminateAllDroolFileName);
}
}