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);
         }
     }