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 + + } }
