Implement manual scaling - for Kubernetes Clusters.

Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/8209dfa4
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/8209dfa4
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/8209dfa4

Branch: refs/heads/master
Commit: 8209dfa415ab191e1cd930682278b2b5d7b22c31
Parents: ec1da2c
Author: Nirmal Fernando <[email protected]>
Authored: Sun Oct 12 19:24:04 2014 +0530
Committer: Nirmal Fernando <[email protected]>
Committed: Sun Oct 12 19:25:44 2014 +0530

----------------------------------------------------------------------
 .../autoscaler/api/AutoScalerServiceImpl.java   | 17 +++++++++++
 .../interfaces/AutoScalerServiceInterface.java  |  8 +++++
 .../monitor/AbstractClusterMonitor.java         |  3 ++
 .../KubernetesServiceClusterMonitor.java        | 32 ++++++++++++++++++++
 .../autoscaler/monitor/VMLbClusterMonitor.java  |  7 +++++
 .../monitor/VMServiceClusterMonitor.java        |  6 ++++
 6 files changed, 73 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/8209dfa4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
index ecbe058..69532b1 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
@@ -20,17 +20,20 @@ package org.apache.stratos.autoscaler.api;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.AutoscalerContext;
 import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
 import 
org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
 import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
 import org.apache.stratos.autoscaler.exception.*;
 import org.apache.stratos.autoscaler.interfaces.AutoScalerServiceInterface;
 import org.apache.stratos.autoscaler.kubernetes.KubernetesManager;
+import org.apache.stratos.autoscaler.monitor.AbstractClusterMonitor;
 import org.apache.stratos.autoscaler.partition.PartitionGroup;
 import org.apache.stratos.autoscaler.partition.PartitionManager;
 import org.apache.stratos.autoscaler.policy.PolicyManager;
 import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
 import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.stub.pojo.Properties;
 import org.apache.stratos.common.kubernetes.KubernetesGroup;
 import org.apache.stratos.common.kubernetes.KubernetesHost;
 import org.apache.stratos.common.kubernetes.KubernetesMaster;
@@ -324,5 +327,19 @@ public class AutoScalerServiceImpl implements 
AutoScalerServiceInterface {
 
     }
 
+    public void updateClusterMonitor(String clusterId, Properties properties) {
+        if (log.isDebugEnabled()) {
+            log.debug(String.format("Updating Cluster monitor [Cluster id] %s 
", clusterId));
+        }
+        AutoscalerContext asCtx = AutoscalerContext.getInstance();
+        AbstractClusterMonitor monitor = asCtx.getClusterMonitor(clusterId);
+        
+        if (monitor != null) {
+            monitor.handleDynamicUpdates(properties);
+        } else {
+            log.debug(String.format("Updating Cluster monitor failed: Cluster 
monitor [Cluster id] %s not found.", 
+                    clusterId));
+        }
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/8209dfa4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java
index 9e562b8..fe2801d 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/interfaces/AutoScalerServiceInterface.java
@@ -26,6 +26,7 @@ import org.apache.stratos.autoscaler.exception.*;
 import org.apache.stratos.autoscaler.partition.PartitionGroup;
 import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
 import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition;
+import org.apache.stratos.cloud.controller.stub.pojo.Properties;
 import org.apache.stratos.common.kubernetes.KubernetesGroup;
 import org.apache.stratos.common.kubernetes.KubernetesHost;
 import org.apache.stratos.common.kubernetes.KubernetesMaster;
@@ -177,4 +178,11 @@ public interface AutoScalerServiceInterface {
     public String getDefaultLBClusterId(String deploymentPolicyName);
 
     public String getServiceLBClusterId(String serviceType, String 
deploymentPolicyName);
+    
+    /**
+     * Dynamically update the properties of an Autoscaling Cluster Monitor
+     * @param clusterId id of the cluster.
+     * @param properties updated properties.
+     */
+    void updateClusterMonitor(String clusterId, Properties properties);
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/8209dfa4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
index 3238d46..774fd2e 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/AbstractClusterMonitor.java
@@ -23,6 +23,7 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
+import org.apache.stratos.cloud.controller.stub.pojo.Properties;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.event.health.stat.AverageLoadAverageEvent;
 import 
org.apache.stratos.messaging.event.health.stat.AverageMemoryConsumptionEvent;
@@ -157,6 +158,8 @@ public abstract class AbstractClusterMonitor implements 
Runnable {
     public abstract void handleMemberTerminatedEvent(MemberTerminatedEvent 
memberTerminatedEvent);
 
     public abstract void handleClusterRemovedEvent(ClusterRemovedEvent 
clusterRemovedEvent);
+    
+    public abstract void handleDynamicUpdates(Properties properties);
 
     public String getClusterId() {
         return clusterId;

http://git-wip-us.apache.org/repos/asf/stratos/blob/8209dfa4/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 8bfc1a8..3d47296 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,7 +18,12 @@
  */
 package org.apache.stratos.autoscaler.monitor;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.collections.ListUtils;
 import org.apache.commons.configuration.XMLConfiguration;
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.KubernetesClusterContext;
@@ -26,9 +31,13 @@ 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.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;
 
+import edu.emory.mathcs.backport.java.util.Arrays;
+
 /*
  * It is monitoring a kubernetes service cluster periodically.
  */
@@ -157,4 +166,27 @@ public final class KubernetesServiceClusterMonitor extends 
KubernetesClusterMoni
     public void setLbReferenceType(String lbReferenceType) {
         this.lbReferenceType = lbReferenceType;
     }
+
+    @Override
+    public void handleDynamicUpdates(Properties properties) {
+        
+        if (properties != null) {
+            Property[] propertyArray = properties.getProperties();
+            if (propertyArray == null) {
+                return;
+            }
+            List<Property> propertyList = Arrays.asList(propertyArray);
+            
+            for (Property property : propertyList) {
+                String key = property.getName();
+                String value = property.getValue();
+                
+                if (StratosConstants.KUBERNETES_MIN_REPLICAS.equals(key)) {
+                    
getKubernetesClusterCtxt().setMinReplicas(Integer.parseInt(value));
+                    break;
+                }
+            }
+            
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/stratos/blob/8209dfa4/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 8e7d0e1..112f7ba 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.cloud.controller.stub.pojo.Properties;
 import org.apache.stratos.common.constants.StratosConstants;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.event.topology.ClusterRemovedEvent;
@@ -164,4 +165,10 @@ public class VMLbClusterMonitor extends VMClusterMonitor {
     public String toString() {
         return "VMLbClusterMonitor [clusterId=" + getClusterId() + ", 
serviceId=" + getServiceId() + "]";
     }
+
+    @Override
+    public void handleDynamicUpdates(Properties properties) {
+        // TODO 
+        
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/8209dfa4/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 adf750d..e102ee9 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
@@ -225,4 +225,10 @@ public class VMServiceClusterMonitor extends 
VMClusterMonitor {
     public void setHasPrimary(boolean hasPrimary) {
         this.hasPrimary = hasPrimary;
     }
+
+    @Override
+    public void handleDynamicUpdates(Properties properties) {
+        // TODO 
+        
+    }
 }

Reply via email to