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 <[email protected]> Authored: Thu Oct 9 17:11:53 2014 +0530 Committer: R-Rajkumar <[email protected]> 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; }
