You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by la...@apache.org on 2013/12/11 14:48:04 UTC
[2/2] git commit: Autoscaler improvements with proper Scaling,
lb cluster monitor etc.
Autoscaler improvements with proper Scaling, lb cluster monitor etc.
Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/a39a1e15
Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/a39a1e15
Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/a39a1e15
Branch: refs/heads/master
Commit: a39a1e1582e8b9841ae687213bcc7c76cece391b
Parents: 6d2d3eb
Author: Lahiru Sandaruwan <la...@apache.org>
Authored: Wed Dec 11 19:22:36 2013 +0530
Committer: Lahiru Sandaruwan <la...@apache.org>
Committed: Wed Dec 11 19:22:36 2013 +0530
----------------------------------------------------------------------
.../stratos/autoscaler/AutoscalerContext.java | 54 ++--
.../stratos/autoscaler/ClusterContext.java | 282 -------------------
.../stratos/autoscaler/ClusterMonitor.java | 181 ++++++++----
.../stratos/autoscaler/LbClusterMonitor.java | 206 ++++++++++++++
.../stratos/autoscaler/MemberStatsContext.java | 24 +-
.../autoscaler/NetworkPartitionContext.java | 218 +++++++++-----
.../stratos/autoscaler/PartitionContext.java | 51 +++-
.../algorithm/AutoscaleAlgorithm.java | 9 +-
.../autoscaler/algorithm/OneAfterAnother.java | 60 ++--
.../PartitionGroupOneAfterAnother.java | 164 -----------
.../autoscaler/algorithm/RoundRobin.java | 69 +++--
.../autoscaler/api/AutoScalerServiceImpl.java | 6 +-
.../cloud/controller/CloudControllerClient.java | 13 +-
.../deployment/policy/DeploymentPolicy.java | 8 +-
.../internal/AutoscalerServerComponent.java | 11 +-
.../health/HealthEventMessageDelegator.java | 29 +-
.../receiver/health/HealthEventQueue.java | 2 +-
.../autoscaler/partition/PartitionManager.java | 117 ++++----
.../partition/deployers/PartitionDeployer.java | 10 +-
.../policy/model/AutoscalePolicy.java | 4 +-
.../rule/AutoscalerRuleEvaluator.java | 157 ++++++-----
.../topology/AutoscalerTopologyReceiver.java | 169 ++++++-----
.../stratos/autoscaler/util/AutoscalerUtil.java | 154 ++++++++--
23 files changed, 1035 insertions(+), 963 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/AutoscalerContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/AutoscalerContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/AutoscalerContext.java
index cd9d93c..5fae337 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/AutoscalerContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/AutoscalerContext.java
@@ -1,5 +1,8 @@
package org.apache.stratos.autoscaler;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
import java.util.HashMap;
import java.util.Map;
@@ -8,11 +11,18 @@ import java.util.Map;
*/
public class AutoscalerContext {
private static volatile AutoscalerContext instance;
- Map<String, ClusterContext> clusterContextMap;
+// Map<String, ClusterContext> clusterContextMap;
+ private static final Log log = LogFactory.getLog(AutoscalerContext.class);
private AutoscalerContext() {
- clusterContextMap = new HashMap<String, ClusterContext>();
+ try {
+ setMonitors(new HashMap<String, ClusterMonitor>());
+ } catch (Exception e) {
+ log.error("Rule evaluateMinCheck error", e);
+ }
}
+ private Map<String, ClusterMonitor> monitors;
+ private Map<String, LbClusterMonitor> lbMonitors;
public static AutoscalerContext getInstance() {
if (instance == null) {
@@ -25,34 +35,32 @@ public class AutoscalerContext {
return instance;
}
- /**
- *
- * @param clusterContext will be added to map
- */
- public void addClusterContext(ClusterContext clusterContext) {
-
- clusterContextMap.put(clusterContext.getClusterId(), clusterContext);
+ public void addMonitor(ClusterMonitor monitor) {
+ monitors.put(monitor.getClusterId(), monitor);
}
- /**
- * {@link ClusterContext} which carries clusterId will be removed from map
- * @param clusterId
- */
- public void removeClusterContext(String clusterId){
+ public ClusterMonitor getMonitor(String clusterId) {
+ return monitors.get(clusterId);
+ }
- clusterContextMap.remove(clusterId);
+ public ClusterMonitor removeMonitor(String clusterId) {
+ return monitors.remove(clusterId);
}
-
- public boolean clusterExists(String clusterId){
- return clusterContextMap.containsKey(clusterId);
+
+ public Map<String, ClusterMonitor> getMonitors() {
+ return monitors;
}
- public ClusterContext getClusterContext(String clusterId) {
- return clusterContextMap.get(clusterId);
+ public void setMonitors(Map<String, ClusterMonitor> monitors) {
+ this.monitors = monitors;
+ }
+
+ public void setLbMonitors(Map<String, LbClusterMonitor> monitors) {
+ this.lbMonitors = monitors;
}
- public Map<String, ClusterContext> getClusterContexes() {
- return clusterContextMap;
- }
+ public void addLbMonitor(LbClusterMonitor monitor) {
+ lbMonitors.put(monitor.getClusterId(), monitor);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java
deleted file mode 100644
index b844ccc..0000000
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * 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;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
-import org.apache.stratos.cloud.controller.deployment.partition.Partition;
-import org.drools.runtime.StatefulKnowledgeSession;
-import org.drools.runtime.rule.FactHandle;
-
-/**
- * Defines cluster context properties.
- */
-public class ClusterContext {
-
- private String serviceId;
-
- private String clusterId;
-
- private float averageRequestsInFlight;
-
- private float requestsInFlightSecondDerivative;
-
- private float requestsInFlightGradient;
-
- private int memberCount;
-
- private StatefulKnowledgeSession ksession;
- private FactHandle facthandle;
-
- //This map will keep number of currently spawned instance count against partitionId
- private Map<String, Integer> partitionCountMap;
-
- private List<Partition> partitionsOfThisCluster;
-
- private int currentPartitionIndex;
- private int currentPartitionGroupIndex;
-
- private Properties properties;
-
- private Map<String, MemberStatsContext> memberContextMap;
- // Key- MemberId Value- partitionId
- private Map<String, String> memberPartitionMap;
- private DeploymentPolicy deploymentPolicy;
-
- public ClusterContext(String clusterId, String serviceId, DeploymentPolicy deploymentPolicy, Partition[] partitions) {
-
- this.clusterId = clusterId;
- this.serviceId = serviceId;
- this.setDeploymentPolicy(deploymentPolicy);
- partitionsOfThisCluster = new ArrayList<Partition>();
- memberContextMap = new HashMap<String, MemberStatsContext>();
- setMemberPartitionMap(new HashMap<String, String>());
- partitionCountMap = new HashMap<String, Integer>();
-
- for (Partition partition : partitions) {
- partitionsOfThisCluster.add(partition);
- this.addPartitionCount(partition.getId(), 0);
- }
-
- memberCount = 0;
- }
-
- public String getClusterId() {
-
- return clusterId;
- }
-
- public Properties getProperties() {
-
- return properties;
- }
-
- public void setProperties(Properties properties) {
-
- this.properties = properties;
- }
-
- public float getAverageRequestsInFlight() {
- return averageRequestsInFlight;
- }
-
- public void setAverageRequestsInFlight(float averageRequestsInFlight) {
-
- this.averageRequestsInFlight = averageRequestsInFlight;
- }
-
- public float getRequestsInFlightSecondDerivative() {
-
- return requestsInFlightSecondDerivative;
- }
-
- public void setRequestsInFlightSecondDerivative(float requestsInFlightSecondDerivative) {
-
- this.requestsInFlightSecondDerivative = requestsInFlightSecondDerivative;
- }
-
- public float getRequestsInFlightGradient() {
-
- return requestsInFlightGradient;
- }
-
- public void setRequestsInFlightGradient(float requestsInFlightGradient) {
-
- this.requestsInFlightGradient = requestsInFlightGradient;
- }
-
- /**
- *
- * @param memberContext will be added to map
- */
- public void addMemberContext(MemberStatsContext memberContext) {
-
- memberContextMap.put(memberContext.getMemberId(), memberContext);
- }
-
- /**
- * {@link MemberStatsContext} which carries memberId will be removed from map
- * @param memberId
- */
- public void removeMemberContext(String memberId){
-
- memberContextMap.remove(memberId);
- }
-
- public void increaseMemberCount(int count){
- memberCount += count;
-
- }
- public void decreaseMemberCount(){
- memberCount --;
-
- }
-
- public void increaseMemberCountInPartitionBy(String partitionId, int count){
-
- partitionCountMap.put(partitionId, getMemberCount(partitionId) + count);
- }
-
- public void decreaseMemberCountInPartitionBy(String partitionId, int count){
-
- partitionCountMap.put(partitionId, getMemberCount(partitionId) - count);
- }
-
- public void addPartitionCount(String partitionId, int count){
- partitionCountMap.put(partitionId, count);
- }
-
- public void removePartitionCount(String partitionId){
-
- partitionCountMap.remove(partitionId);
- }
-
- public boolean partitionCountExists(String partitionId){
- return partitionCountMap.containsKey(partitionId);
- }
-
- public int getMemberCount(String partitionId){
- if(partitionCountMap.containsKey(partitionId)) {
- return partitionCountMap.get(partitionId);
- }
- return 0;
- }
-
- public void setMemberContextMap(Map<String, MemberStatsContext> memberContextMap) {
-
- this.memberContextMap = memberContextMap;
- }
-
- public String getServiceId() {
- return serviceId;
- }
-
- public int getCurrentPartitionIndex() {
- return currentPartitionIndex;
- }
-
- public void setCurrentPartitionIndex(int currentPartitionIndex) {
- this.currentPartitionIndex = currentPartitionIndex;
- }
-
- public int getMemberCount() {
- return memberCount;
- }
-
- public void setMemberCount(int memberCount) {
- this.memberCount = memberCount;
- }
-
- public int getCurrentPartitionGroupIndex() {
- return currentPartitionGroupIndex;
- }
-
- public void setCurrentPartitionGroupIndex(int currentPartitionGroupIndex) {
- this.currentPartitionGroupIndex = currentPartitionGroupIndex;
- }
-
- public List<Partition> getAllPartitions() {
- return partitionsOfThisCluster;
- }
-
- public void setPartitionsOfThisCluster(List<Partition> partitionsOfThisCluster) {
- this.partitionsOfThisCluster = partitionsOfThisCluster;
- }
-
- public StatefulKnowledgeSession getKsession() {
- return ksession;
- }
-
- public void setKsession(StatefulKnowledgeSession ksession) {
- this.ksession = ksession;
- }
-
- public FactHandle getFacthandle() {
- return facthandle;
- }
-
- public void setFacthandle(FactHandle facthandle) {
- this.facthandle = facthandle;
- }
-
- public DeploymentPolicy getDeploymentPolicy() {
- return deploymentPolicy;
- }
-
- public void setDeploymentPolicy(DeploymentPolicy deploymentPolicy) {
- this.deploymentPolicy = deploymentPolicy;
- }
-
- /**
- * @return the memberPartitionMap
- */
- public Map<String, String> getMemberPartitionMap() {
- return memberPartitionMap;
- }
-
- /**
- * @param memberPartitionMap the memberPartitionMap to set
- */
- public void setMemberPartitionMap(Map<String, String> memberPartitionMap) {
- this.memberPartitionMap = memberPartitionMap;
- }
-
- public void addMemberpartition(String memberId, String partitionId){
- this.memberPartitionMap.put(memberId, partitionId);
- }
-
- public String removeMemberPartition(String memberId){
- return this.memberPartitionMap.remove(memberId);
- }
-
- public String getPartitonOfMember(String memberId){
- return this.memberPartitionMap.get(memberId);
- }
-
- public boolean memberExist(String memberId){
- return this.memberPartitionMap.containsKey(memberId);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java
index 9e81c84..81a74e3 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterMonitor.java
@@ -18,41 +18,60 @@
*/
package org.apache.stratos.autoscaler;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
+import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
-import org.apache.stratos.cloud.controller.deployment.partition.Partition;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.FactHandle;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
/**
* Is responsible for monitoring a service cluster. This runs periodically
* and perform minimum instance check and scaling check using the underlying
* rules engine.
- * @author nirmal
*
*/
public class ClusterMonitor implements Runnable{
private static final Log log = LogFactory.getLog(ClusterMonitor.class);
private String clusterId;
- private ClusterContext clusterCtxt;
- private List<MemberStatsContext> memberCtxt;
- private Map<String, PartitionContext> partitionCtxts;
- private StatefulKnowledgeSession ksession;
+
+ private String serviceId;
+
+ private Map<String, NetworkPartitionContext> networkPartitionCtxts;
+
+
+ private StatefulKnowledgeSession minCheckKnowledgeSession;
+ private StatefulKnowledgeSession scaleCheckKnowledgeSession;
private boolean isDestroyed;
-
- private FactHandle facthandle;
-
- public ClusterMonitor(String clusterId, ClusterContext ctxt, StatefulKnowledgeSession ksession) {
+
+ private DeploymentPolicy deploymentPolicy;
+ private AutoscalePolicy autoscalePolicy;
+
+ // Key- MemberId Value- partitionId
+ private Map<String, String> memberPartitionMap;
+
+ private FactHandle minCheckFactHandle;
+ private FactHandle scaleCheckFactHandle;
+
+ private AutoscalerRuleEvaluator autoscalerRuleEvaluator;
+
+ public ClusterMonitor(String clusterId, String serviceId, DeploymentPolicy deploymentPolicy,
+ AutoscalePolicy autoscalePolicy) {
this.clusterId = clusterId;
- this.clusterCtxt = ctxt;
- this.ksession = ksession;
- partitionCtxts = new ConcurrentHashMap<String, PartitionContext>();
+ this.serviceId = serviceId;
+
+ this.autoscalerRuleEvaluator = new AutoscalerRuleEvaluator();
+ this.scaleCheckKnowledgeSession = autoscalerRuleEvaluator.getScaleCheckStatefulSession();
+ this.minCheckKnowledgeSession = autoscalerRuleEvaluator.getMinCheckStatefulSession();
+
+ this.deploymentPolicy = deploymentPolicy;
+ this.deploymentPolicy = deploymentPolicy;
+ networkPartitionCtxts = new ConcurrentHashMap<String, NetworkPartitionContext>();
}
public String getClusterId() {
@@ -63,52 +82,44 @@ public class ClusterMonitor implements Runnable{
this.clusterId = clusterId;
}
- public ClusterContext getClusterCtxt() {
- return clusterCtxt;
+ public Map<String, NetworkPartitionContext> getNetworkPartitionCtxts() {
+ return networkPartitionCtxts;
}
- public void setClusterCtxt(ClusterContext clusterCtxt) {
- this.clusterCtxt = clusterCtxt;
+ public NetworkPartitionContext getNetworkPartitionCtxt(String networkPartitionId) {
+ return networkPartitionCtxts.get(networkPartitionId);
}
- public List<MemberStatsContext> getMemberCtxt() {
- return memberCtxt;
+ public void setPartitionCtxt(Map<String, NetworkPartitionContext> partitionCtxt) {
+ this.networkPartitionCtxts = partitionCtxt;
}
- public void setMemberCtxt(List<MemberStatsContext> memberCtxt) {
- this.memberCtxt = memberCtxt;
+ public boolean partitionCtxtAvailable(String partitionId) {
+ return networkPartitionCtxts.containsKey(partitionId);
}
- public Map<String, PartitionContext> getPartitionCtxt() {
- return partitionCtxts;
- }
-
- public void setPartitionCtxt(Map<String, PartitionContext> partitionCtxt) {
- this.partitionCtxts = partitionCtxt;
- }
-
- public void addPartitionCtxt(PartitionContext ctxt) {
- this.partitionCtxts.put(ctxt.getPartitionId(), ctxt);
+ public void addNetworkPartitionCtxt(NetworkPartitionContext ctxt) {
+ this.networkPartitionCtxts.put(ctxt.getId(), ctxt);
}
- public PartitionContext getPartitionCtxt(String id) {
- return this.partitionCtxts.get(id);
+ public NetworkPartitionContext getPartitionCtxt(String id) {
+ return this.networkPartitionCtxts.get(id);
}
- public StatefulKnowledgeSession getKsession() {
- return ksession;
+ public StatefulKnowledgeSession getMinCheckKnowledgeSession() {
+ return minCheckKnowledgeSession;
}
- public void setKsession(StatefulKnowledgeSession ksession) {
- this.ksession = ksession;
+ public void setMinCheckKnowledgeSession(StatefulKnowledgeSession minCheckKnowledgeSession) {
+ this.minCheckKnowledgeSession = minCheckKnowledgeSession;
}
- public FactHandle getFacthandle() {
- return facthandle;
+ public FactHandle getMinCheckFactHandle() {
+ return minCheckFactHandle;
}
- public void setFacthandle(FactHandle facthandle) {
- this.facthandle = facthandle;
+ public void setMinCheckFactHandle(FactHandle minCheckFactHandle) {
+ this.minCheckFactHandle = minCheckFactHandle;
}
@Override
@@ -119,11 +130,10 @@ public class ClusterMonitor implements Runnable{
log.debug("Cluster monitor is running..");
}
try {
- minInstanceCountCheck();
+ monitor();
} catch (Exception e) {
- log.error("Cluster monitor: min instance count check failed.", e);
+ log.error("Cluster monitor: Monitor failed.", e);
}
- // TODO scale
try {
// TODO make this configurable
Thread.sleep(30000);
@@ -132,26 +142,43 @@ public class ClusterMonitor implements Runnable{
}
}
- private void minInstanceCountCheck() {
- if(clusterCtxt != null ) {
- ksession.setGlobal("clusterId", clusterId);
+ private void monitor() {
+// if(clusterCtxt != null ) {
//TODO make this concurrent
- for (Partition partition : clusterCtxt.getAllPartitions()) {
- String id = partition.getId();
- PartitionContext ctxt = partitionCtxts.get(id);
- if(ctxt == null) {
- ctxt = new PartitionContext(partition);
- partitionCtxts.put(id, ctxt);
+ for (NetworkPartitionContext networkPartitionContext : networkPartitionCtxts.values()) {
+
+ //minimum check per partition
+ for(PartitionContext partitionContext: networkPartitionContext.getPartitionCtxts().values()){
+
+ minCheckKnowledgeSession.setGlobal("clusterId", clusterId);
+
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Running minimum check for partition %s ", partitionContext.getPartitionId()));
}
- ctxt.setMinimumMemberCount(partition.getPartitionMin());
-
- facthandle = AutoscalerRuleEvaluator.evaluate(ksession, facthandle, ctxt);
+
+ minCheckFactHandle = AutoscalerRuleEvaluator.evaluateMinCheck(minCheckKnowledgeSession
+ , minCheckFactHandle, partitionContext);
+
+ }
+
+ scaleCheckKnowledgeSession.setGlobal("clusterId", clusterId);
+ scaleCheckKnowledgeSession.setGlobal("deploymentPolicy", deploymentPolicy);
+ scaleCheckKnowledgeSession.setGlobal("autoscalePolicy", autoscalePolicy);
+
+ if (log.isDebugEnabled()) {
+ log.debug(String.format("Running scale check for network partition %s ", networkPartitionContext.getId()));
}
+
+ scaleCheckFactHandle = AutoscalerRuleEvaluator.evaluateScaleCheck(scaleCheckKnowledgeSession
+ , scaleCheckFactHandle, networkPartitionContext);
+
}
}
+
public void destroy() {
- ksession.dispose();
+ minCheckKnowledgeSession.dispose();
+ scaleCheckKnowledgeSession.dispose();
setDestroyed(true);
if(log.isDebugEnabled()) {
log.debug("Cluster Monitor Drools session has been disposed.");
@@ -165,4 +192,36 @@ public class ClusterMonitor implements Runnable{
public void setDestroyed(boolean isDestroyed) {
this.isDestroyed = isDestroyed;
}
+
+ public String getServiceId() {
+ return serviceId;
+ }
+
+ public void setServiceId(String serviceId) {
+ this.serviceId = serviceId;
+ }
+
+ public DeploymentPolicy getDeploymentPolicy() {
+ return deploymentPolicy;
+ }
+
+ public void setDeploymentPolicy(DeploymentPolicy deploymentPolicy) {
+ this.deploymentPolicy = deploymentPolicy;
+ }
+
+ public AutoscalePolicy getAutoscalePolicy() {
+ return autoscalePolicy;
+ }
+
+ public void setAutoscalePolicy(AutoscalePolicy autoscalePolicy) {
+ this.autoscalePolicy = autoscalePolicy;
+ }
+
+ public String getPartitonOfMember(String memberId){
+ return this.memberPartitionMap.get(memberId);
+ }
+
+ public boolean memberExist(String memberId){
+ return this.memberPartitionMap.containsKey(memberId);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/LbClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/LbClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/LbClusterMonitor.java
new file mode 100644
index 0000000..9e3b4a5
--- /dev/null
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/LbClusterMonitor.java
@@ -0,0 +1,206 @@
+/*
+ * 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;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
+import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
+import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.rule.FactHandle;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Is responsible for monitoring a service cluster. This runs periodically
+ * and perform minimum instance check and scaling check using the underlying
+ * rules engine.
+ *
+ */
+public class LbClusterMonitor implements Runnable{
+
+ private static final Log log = LogFactory.getLog(LbClusterMonitor.class);
+ private String clusterId;
+ private String serviceId;
+
+ private Map<String, NetworkPartitionContext> networkPartitionCtxts;
+
+ private StatefulKnowledgeSession minCheckKnowledgeSession;
+ private StatefulKnowledgeSession scaleCheckKnowledgeSession;
+ private boolean isDestroyed;
+
+ private DeploymentPolicy deploymentPolicy;
+ private AutoscalePolicy autoscalePolicy;
+
+ // Key- MemberId Value- partitionId
+ private Map<String, String> memberPartitionMap;
+
+ private FactHandle minCheckFactHandle;
+ private FactHandle scaleCheckFactHandle;
+
+ private AutoscalerRuleEvaluator autoscalerRuleEvaluator;
+
+ public LbClusterMonitor(String clusterId, String serviceId, DeploymentPolicy deploymentPolicy,
+ AutoscalePolicy autoscalePolicy) {
+ this.clusterId = clusterId;
+ this.serviceId = serviceId;
+
+ this.autoscalerRuleEvaluator = new AutoscalerRuleEvaluator();
+ this.scaleCheckKnowledgeSession = autoscalerRuleEvaluator.getScaleCheckStatefulSession();
+ this.minCheckKnowledgeSession = autoscalerRuleEvaluator.getMinCheckStatefulSession();
+
+ this.deploymentPolicy = deploymentPolicy;
+ this.deploymentPolicy = deploymentPolicy;
+ networkPartitionCtxts = new ConcurrentHashMap<String, NetworkPartitionContext>();
+ }
+
+ public String getClusterId() {
+ return clusterId;
+ }
+
+ public void setClusterId(String clusterId) {
+ this.clusterId = clusterId;
+ }
+
+ public Map<String, NetworkPartitionContext> getNetworkPartitionCtxts() {
+ return networkPartitionCtxts;
+ }
+
+ public NetworkPartitionContext getNetworkPartitionCtxt(String networkPartitionId) {
+ return networkPartitionCtxts.get(networkPartitionId);
+ }
+
+ public void setPartitionCtxt(Map<String, NetworkPartitionContext> partitionCtxt) {
+ this.networkPartitionCtxts = partitionCtxt;
+ }
+
+ public boolean partitionCtxtAvailable(String partitionId) {
+ return networkPartitionCtxts.containsKey(partitionId);
+ }
+
+ public void addNetworkPartitionCtxt(NetworkPartitionContext ctxt) {
+ this.networkPartitionCtxts.put(ctxt.getId(), ctxt);
+ }
+
+ public NetworkPartitionContext getPartitionCtxt(String id) {
+ return this.networkPartitionCtxts.get(id);
+ }
+
+ public StatefulKnowledgeSession getMinCheckKnowledgeSession() {
+ return minCheckKnowledgeSession;
+ }
+
+ public void setMinCheckKnowledgeSession(StatefulKnowledgeSession minCheckKnowledgeSession) {
+ this.minCheckKnowledgeSession = minCheckKnowledgeSession;
+ }
+
+ public FactHandle getMinCheckFactHandle() {
+ return minCheckFactHandle;
+ }
+
+ public void setMinCheckFactHandle(FactHandle minCheckFactHandle) {
+ this.minCheckFactHandle = minCheckFactHandle;
+ }
+
+ @Override
+ public void run() {
+
+ while (!isDestroyed()) {
+ if (log.isDebugEnabled()) {
+ log.debug("Cluster monitor is running..");
+ }
+ try {
+ monitor();
+ } catch (Exception e) {
+ log.error("Cluster monitor: Monitor failed.", e);
+ }
+ try {
+ // TODO make this configurable
+ Thread.sleep(30000);
+ } catch (InterruptedException ignore) {
+ }
+ }
+ }
+
+ private void monitor() {
+// if(clusterCtxt != null ) {
+ //TODO make this concurrent
+ for (NetworkPartitionContext networkPartitionContext : networkPartitionCtxts.values()) {
+
+ minCheckKnowledgeSession.setGlobal("clusterId", clusterId);
+ log.info("partition " + networkPartitionContext.getId());
+ minCheckFactHandle = AutoscalerRuleEvaluator.evaluateMinCheck(minCheckKnowledgeSession
+ , minCheckFactHandle, networkPartitionContext);
+
+
+ }
+ }
+
+
+ public void destroy() {
+ minCheckKnowledgeSession.dispose();
+ scaleCheckKnowledgeSession.dispose();
+ setDestroyed(true);
+ if(log.isDebugEnabled()) {
+ log.debug("Cluster Monitor Drools session has been disposed.");
+ }
+ }
+
+ public boolean isDestroyed() {
+ return isDestroyed;
+ }
+
+ public void setDestroyed(boolean isDestroyed) {
+ this.isDestroyed = isDestroyed;
+ }
+
+ public String getServiceId() {
+ return serviceId;
+ }
+
+ public void setServiceId(String serviceId) {
+ this.serviceId = serviceId;
+ }
+
+ public DeploymentPolicy getDeploymentPolicy() {
+ return deploymentPolicy;
+ }
+
+ public void setDeploymentPolicy(DeploymentPolicy deploymentPolicy) {
+ this.deploymentPolicy = deploymentPolicy;
+ }
+
+ public AutoscalePolicy getAutoscalePolicy() {
+ return autoscalePolicy;
+ }
+
+ public void setAutoscalePolicy(AutoscalePolicy autoscalePolicy) {
+ this.autoscalePolicy = autoscalePolicy;
+ }
+
+ public String getPartitonOfMember(String memberId){
+ return this.memberPartitionMap.get(memberId);
+ }
+
+ public boolean memberExist(String memberId){
+ return this.memberPartitionMap.containsKey(memberId);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/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 da85cee..98b75dd 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
@@ -19,13 +19,16 @@
package org.apache.stratos.autoscaler;
+import org.apache.stratos.autoscaler.policy.model.LoadAverage;
+import org.apache.stratos.autoscaler.policy.model.MemoryConsumption;
+
/**
* This class will keep additional parameters such as load average and memory consumption
*/
public class MemberStatsContext {
- private float loadAverage;
- private float memoryConsumption;
+ private LoadAverage loadAverage;
+ private MemoryConsumption memoryConsumption;
private String memberId;
public MemberStatsContext(String memberId){
@@ -40,19 +43,20 @@ public class MemberStatsContext {
this.memberId = memberId;
}
- public float getMemoryConsumption() {
- return memoryConsumption;
+
+ public LoadAverage getLoadAverage() {
+ return loadAverage;
}
- public void setMemoryConsumption(float memoryConsumption) {
- this.memoryConsumption = memoryConsumption;
+ public void setLoadAverage(LoadAverage loadAverage) {
+ this.loadAverage = loadAverage;
}
- public float getLoadAverage() {
- return loadAverage;
+ public MemoryConsumption getMemoryConsumption() {
+ return memoryConsumption;
}
- public void setLoadAverage(float loadAverage) {
- this.loadAverage = loadAverage;
+ public void setMemoryConsumption(MemoryConsumption memoryConsumption) {
+ this.memoryConsumption = memoryConsumption;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java
index 964168e..18a0715 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java
@@ -6,9 +6,9 @@
* 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
@@ -28,10 +28,6 @@ import java.util.*;
public class NetworkPartitionContext {
private String id;
-
- private String provider;
-
- private String region;
private String defaultLbClusterId;
@@ -39,65 +35,27 @@ public class NetworkPartitionContext {
private Map<String, String> clusterIdToLBClusterIdMap;
- public NetworkPartitionContext(final String provider, final String region) {
-
- super();
- this.provider = provider;
- this.region = region;
- this.setServiceToLBClusterId(new HashMap<String, String>());
- this.setClusterIdToLBClusterIdMap(new HashMap<String, String>());
-
- }
-
- public boolean isLBExist(final String clusterId) {
-
- return clusterId != null &&
- (clusterId.equals(this.defaultLbClusterId) ||
- this.serviceNameToLBClusterIdMap.containsValue(clusterId) || this.clusterIdToLBClusterIdMap.containsValue(clusterId));
-
- }
-
- public boolean isDefaultLBExist() {
-
- return defaultLbClusterId != null;
-
- }
-
- public boolean isServiceLBExist(String serviceName) {
-
- return this.serviceNameToLBClusterIdMap.containsKey(serviceName) &&
- this.serviceNameToLBClusterIdMap.get(serviceName) != null;
-
- }
-
- public boolean isClusterLBExist(String clusterId) {
+ private String partitionAlgorithm;
- return this.clusterIdToLBClusterIdMap.containsKey(clusterId) &&
- this.clusterIdToLBClusterIdMap.get(clusterId) != null;
- }
+ //Following information will keep events details
+ private float averageRequestsInFlight;
+ private float requestsInFlightSecondDerivative;
+ private float requestsInFlightGradient;
- public String getProvider() {
+ //details required for partition selection algorithms
+ private int currentPartitionIndex;
+ private Map<String, Integer> partitionCountMap;
- return this.provider;
+ //partitions of this network partition
+ private Map<String, PartitionContext> partitionCtxts;
- }
+ public NetworkPartitionContext(String id) {
- public void setProvider(final String provider) {
-
- this.provider = provider;
-
- }
-
- public String getRegion() {
-
- return this.region;
-
- }
-
- public void setRegion(final String region) {
-
- this.region = region;
+ super();
+ this.id = id;
+ this.setServiceToLBClusterId(new HashMap<String, String>());
+ this.setClusterIdToLBClusterIdMap(new HashMap<String, String>());
}
@@ -149,20 +107,40 @@ public class NetworkPartitionContext {
}
- public String getId() {
- return id;
+
+ public boolean isLBExist(final String clusterId) {
+
+ return clusterId != null &&
+ (clusterId.equals(this.defaultLbClusterId) ||
+ this.serviceNameToLBClusterIdMap.containsValue(clusterId) || this.clusterIdToLBClusterIdMap.containsValue(clusterId));
+
}
- public void setId(String id) {
- this.id = id;
+ public boolean isDefaultLBExist() {
+
+ return defaultLbClusterId != null;
+
+ }
+
+ public boolean isServiceLBExist(String serviceName) {
+
+ return this.serviceNameToLBClusterIdMap.containsKey(serviceName) &&
+ this.serviceNameToLBClusterIdMap.get(serviceName) != null;
+
+ }
+
+ public boolean isClusterLBExist(String clusterId) {
+
+ return this.clusterIdToLBClusterIdMap.containsKey(clusterId) &&
+ this.clusterIdToLBClusterIdMap.get(clusterId) != null;
+
}
public int hashCode() {
final int prime = 31;
int result = 1;
- result = 31 * result + ((this.provider == null) ? 0 : this.provider.hashCode());
- result = 31 * result + ((this.region == null) ? 0 : this.region.hashCode());
+ result = 31 * result + ((this.id == null) ? 0 : this.id.hashCode());
return result;
}
@@ -179,23 +157,111 @@ public class NetworkPartitionContext {
return false;
}
final NetworkPartitionContext other = (NetworkPartitionContext) obj;
- if (this.provider == null) {
- if (other.provider != null) {
- return false;
- }
- }
- else if (!this.provider.equals(other.provider)) {
- return false;
- }
- if (this.region == null) {
- if (other.region != null) {
+ if (this.id == null) {
+ if (other.id != null) {
return false;
}
}
- else if (!this.region.equals(other.region)) {
+ else if (!this.id.equals(other.id)) {
return false;
}
return true;
}
+
+
+ public int getCurrentPartitionIndex() {
+ return currentPartitionIndex;
+ }
+
+ public void setCurrentPartitionIndex(int currentPartitionIndex) {
+ this.currentPartitionIndex = currentPartitionIndex;
+ }
+
+ public float getAverageRequestsInFlight() {
+ return averageRequestsInFlight;
+ }
+
+ public void setAverageRequestsInFlight(float averageRequestsInFlight) {
+ this.averageRequestsInFlight = averageRequestsInFlight;
+ }
+
+ public float getRequestsInFlightSecondDerivative() {
+ return requestsInFlightSecondDerivative;
+ }
+
+ public void setRequestsInFlightSecondDerivative(float requestsInFlightSecondDerivative) {
+ this.requestsInFlightSecondDerivative = requestsInFlightSecondDerivative;
+ }
+
+ public float getRequestsInFlightGradient() {
+ return requestsInFlightGradient;
+ }
+
+ public void setRequestsInFlightGradient(float requestsInFlightGradient) {
+ this.requestsInFlightGradient = requestsInFlightGradient;
+ }
+
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public void increaseMemberCountInPartitionBy(String partitionId, int count){
+
+ partitionCountMap.put(partitionId, getMemberCount(partitionId) + count);
+ }
+
+ public void decreaseMemberCountInPartitionBy(String partitionId, int count){
+
+ partitionCountMap.put(partitionId, getMemberCount(partitionId) - count);
+ }
+
+ public void addPartitionCount(String partitionId, int count){
+ partitionCountMap.put(partitionId, count);
+ }
+
+ public void removePartitionCount(String partitionId){
+
+ partitionCountMap.remove(partitionId);
+ }
+
+ public boolean partitionCountExists(String partitionId){
+ return partitionCountMap.containsKey(partitionId);
+ }
+
+ public int getMemberCount(String partitionId){
+ if(partitionCountMap.containsKey(partitionId)) {
+ return partitionCountMap.get(partitionId);
+ }
+ return 0;
+ }
+
+ public Map<String, PartitionContext> getPartitionCtxts() {
+ return partitionCtxts;
+ }
+
+ public PartitionContext getPartitionCtxt(String partitionId) {
+ return partitionCtxts.get(partitionId);
+ }
+
+ public void setPartitionCtxts(Map<String, PartitionContext> partitionCtxts) {
+ this.partitionCtxts = partitionCtxts;
+ }
+
+ public void addPartitionContext(PartitionContext partitionContext) {
+ partitionCtxts.put(partitionContext.getPartitionId(), partitionContext);
+ }
+
+ public String getPartitionAlgorithm() {
+ return partitionAlgorithm;
+ }
+
+ public void setPartitionAlgorithm(String partitionAlgorithm) {
+ this.partitionAlgorithm = partitionAlgorithm;
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java
index 10cd652..1980f08 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/PartitionContext.java
@@ -18,16 +18,18 @@
*/
package org.apache.stratos.autoscaler;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.cloud.controller.deployment.partition.Partition;
import org.apache.stratos.cloud.controller.pojo.MemberContext;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
/**
* This is an object that inserted to the rules engine.
@@ -35,10 +37,12 @@ import org.apache.stratos.cloud.controller.pojo.MemberContext;
* @author nirmal
*
*/
+
public class PartitionContext {
private static final Log log = LogFactory.getLog(PartitionContext.class);
private String partitionId;
+ private String networkPartitionId;
private Partition partition;
private int currentMemberCount = 0;
private int minimumMemberCount = 0;
@@ -55,6 +59,8 @@ public class PartitionContext {
// active members
private List<MemberContext> activeMembers;
+
+ private Map<String, MemberStatsContext> memberStatsContexts;
public PartitionContext(Partition partition) {
this.setPartition(partition);
@@ -63,6 +69,7 @@ public class PartitionContext {
this.activeMembers = new ArrayList<MemberContext>();
this.obsoletedMembers = new CopyOnWriteArrayList<String>();
this.faultyMembers = new CopyOnWriteArrayList<String>();
+ memberStatsContexts = new ConcurrentHashMap<String, MemberStatsContext>();
Thread th = new Thread(new PendingMemberWatcher(this));
th.start();
}
@@ -193,6 +200,40 @@ public class PartitionContext {
this.obsoletedMembers = obsoletedMembers;
}
+ public String getNetworkPartitionId() {
+ return networkPartitionId;
+ }
+
+ public void setNetworkPartitionId(String networkPartitionId) {
+ this.networkPartitionId = networkPartitionId;
+ }
+
+
+ public Map<String, MemberStatsContext> getMemberStatsContexts() {
+ return memberStatsContexts;
+ }
+
+ public MemberStatsContext getMemberStatsContext(String memberId) {
+ return memberStatsContexts.get(networkPartitionId);
+ }
+
+ public void addMemberStatsContext(MemberStatsContext ctxt) {
+ this.memberStatsContexts.put(ctxt.getMemberId(), ctxt);
+ }
+
+ public void removeMemberStatsContext(String memberId) {
+ this.memberStatsContexts.remove(memberId);
+ }
+
+ public MemberStatsContext getPartitionCtxt(String id) {
+ return this.memberStatsContexts.get(id);
+ }
+
+// public boolean memberExist(String memberId) {
+// return memberStatsContexts.containsKey(memberId);
+// }
+
+
private class PendingMemberWatcher implements Runnable {
private PartitionContext ctxt;
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java
index 8f003aa..58a3ff6 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java
@@ -19,6 +19,7 @@
package org.apache.stratos.autoscaler.algorithm;
+import org.apache.stratos.autoscaler.NetworkPartitionContext;
import org.apache.stratos.autoscaler.partition.PartitionGroup;
import org.apache.stratos.cloud.controller.deployment.partition.Partition;
@@ -45,18 +46,18 @@ public interface AutoscaleAlgorithm {
/**
* Returns a {@link Partition} to scale up from the given {@link PartitionGroup} according to algorithm
- * @param partitionGroup {@link PartitionGroup} which need the {@link Partition}
+ * @param networkPartitionContext {@link org.apache.stratos.autoscaler.NetworkPartitionContext} which need the {@link Partition}
* @param clusterId Id of the cluster which need the {@link Partition}
* @return {@link Partition} to scale up
*/
- public Partition getNextScaleUpPartition(PartitionGroup partitionGroup, String clusterId);
+ public Partition getNextScaleUpPartition(NetworkPartitionContext networkPartitionContext, String clusterId);
/**
* Returns a {@link Partition} to scale down from the given {@link PartitionGroup} according to algorithm
- * @param partitionGroup {@link PartitionGroup} which need the {@link Partition}
+ * @param networkPartitionContext {@link org.apache.stratos.autoscaler.NetworkPartitionContext} which need the {@link Partition}
* @param clusterId Id of the cluster which need the {@link Partition}
* @return {@link Partition} to scale down
*/
- public Partition getNextScaleDownPartition(PartitionGroup partitionGroup, String clusterId);
+ public Partition getNextScaleDownPartition(NetworkPartitionContext networkPartitionContext, String clusterId);
}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java
index ae01360..7b0dce3 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java
@@ -19,22 +19,22 @@
package org.apache.stratos.autoscaler.algorithm;
-import edu.emory.mathcs.backport.java.util.Arrays;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.autoscaler.AutoscalerContext;
-import org.apache.stratos.autoscaler.ClusterContext;
-import org.apache.stratos.autoscaler.partition.PartitionGroup;
+import org.apache.stratos.autoscaler.NetworkPartitionContext;
import org.apache.stratos.cloud.controller.deployment.partition.Partition;
+import java.util.Arrays;
import java.util.List;
+//import org.apache.stratos.autoscaler.partition.networkPartitionContext;
+
/**
*
*/
/**
* This class is used for selecting a {@link Partition} one after another and checking availability of
- * partitions of a {@link PartitionGroup}
+ * partitions of a {@link NetworkPartitionContext}
* One after another means it completes partitions in the order defined in
* {@link org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy}, and go to next if current one
* reached the max limit
@@ -44,27 +44,26 @@ public class OneAfterAnother implements AutoscaleAlgorithm {
private static final Log log = LogFactory.getLog(OneAfterAnother.class);
- public Partition getNextScaleUpPartition(PartitionGroup partitionGroup, String clusterId) {
-
- ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);
- int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
- List<?> partitions = Arrays.asList(partitionGroup.getPartitions());
- int noOfPartitions = partitions.size();
+ public Partition getNextScaleUpPartition(NetworkPartitionContext networkPartitionContext, String clusterId) {
+
+ int currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex();
+ List<?> partitionContexts = Arrays.asList(networkPartitionContext.getPartitionCtxts());
+ int noOfPartitions = partitionContexts.size();
for(int i=currentPartitionIndex; i< noOfPartitions; i++)
{
- if (partitions.get(currentPartitionIndex) instanceof Partition) {
- currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
- Partition currentPartition = (Partition) partitions.get(currentPartitionIndex);
+ if (partitionContexts.get(currentPartitionIndex) instanceof Partition) {
+ currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex();
+ Partition currentPartition = (Partition) partitionContexts.get(currentPartitionIndex);
String currentPartitionId = currentPartition.getId();
- if (clusterContext.partitionCountExists(currentPartitionId)) {
- clusterContext.addPartitionCount(currentPartitionId, 0);
+ if (networkPartitionContext.partitionCountExists(currentPartitionId)) {
+ networkPartitionContext.addPartitionCount(currentPartitionId, 0);
}
- if (clusterContext.getMemberCount(currentPartitionId) < currentPartition.getPartitionMax()) {
+ if (networkPartitionContext.getMemberCount(currentPartitionId) < currentPartition.getPartitionMax()) {
// current partition is free
- clusterContext.increaseMemberCountInPartitionBy(currentPartitionId, 1);
+ networkPartitionContext.increaseMemberCountInPartitionBy(currentPartitionId, 1);
if (log.isDebugEnabled())
log.debug("Free space found in partition " + currentPartition.getId());
@@ -77,34 +76,33 @@ public class OneAfterAnother implements AutoscaleAlgorithm {
return null;
}
- clusterContext.setCurrentPartitionIndex(currentPartitionIndex + 1);
+ networkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex + 1);
}
}
}
if(log.isDebugEnabled())
- log.debug("No free partition found at partition group" + partitionGroup);
+ log.debug("No free partition found at network partition " + networkPartitionContext);
return null;
}
- public Partition getNextScaleDownPartition(PartitionGroup partitionGroup, String clusterId) {
+ public Partition getNextScaleDownPartition(NetworkPartitionContext networkPartitionContext, String clusterId) {
- ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);
- int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
- List<?> partitions = Arrays.asList(partitionGroup.getPartitions());
+ int currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex();
+ List<?> partitionContexts = Arrays.asList(networkPartitionContext.getPartitionCtxts());
for(int i = currentPartitionIndex; i >= 0; i--)
{
- if (partitions.get(currentPartitionIndex) instanceof Partition) {
- currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
- Partition currentPartition = (Partition) partitions.get(currentPartitionIndex);
+ if (partitionContexts.get(currentPartitionIndex) instanceof Partition) {
+ currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex();
+ Partition currentPartition = (Partition) partitionContexts.get(currentPartitionIndex);
String currentPartitionId = currentPartition.getId();
// has more than minimum instances.
- if (clusterContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMin()) {
+ if (networkPartitionContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMin()) {
// current partition is free
- clusterContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1);
+ networkPartitionContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1);
if (log.isDebugEnabled())
log.debug("A free space found for scale down in partition" +
currentPartition.getId());
@@ -117,13 +115,13 @@ public class OneAfterAnother implements AutoscaleAlgorithm {
}
// Set next partition as current partition in Autoscaler Context
currentPartitionIndex = currentPartitionIndex - 1;
- clusterContext.setCurrentPartitionIndex(currentPartitionIndex);
+ networkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex);
}
}
}
if(log.isDebugEnabled())
- log.debug("No space found in this partition group " + partitionGroup.getId());
+ log.debug("No space found in this network partition " + networkPartitionContext.getId());
return null;
}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java
deleted file mode 100644
index 91e7e38..0000000
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
-* 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.algorithm;
-
-import edu.emory.mathcs.backport.java.util.Arrays;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.autoscaler.AutoscalerContext;
-import org.apache.stratos.autoscaler.ClusterContext;
-import org.apache.stratos.autoscaler.partition.PartitionGroup;
-import org.apache.stratos.autoscaler.policy.PolicyManager;
-import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
-import org.apache.stratos.cloud.controller.deployment.partition.Partition;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
-
-import java.util.List;
-
-/**
- * Completes {@link PartitionGroup} in the order defined in * {@link org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy}, and go to next if current one
- * reached the max limit policy, go to next if current one reached the max limit
- */
-public class PartitionGroupOneAfterAnother implements AutoscaleAlgorithm {
-
- private static final Log log = LogFactory.getLog(PartitionGroupOneAfterAnother.class);
-
- public Partition getNextScaleUpPartition(String clusterId) {
-
- ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);
- String serviceId = AutoscalerContext.getInstance().getClusterContext(clusterId).getServiceId();
-
- //Find relevant policyId using topology
- String policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getDeploymentPolicyName();
-
- List<?> partitionGroups = Arrays.asList(PolicyManager.getInstance().getDeploymentPolicy(policyId).getPartitionGroups());
- int currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();
-
- for(int i= currentPartitionGroupIndex; i< partitionGroups.size(); i++)
- {
- if (partitionGroups.get(currentPartitionGroupIndex) instanceof PartitionGroup) {
- currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();
- PartitionGroup currentPartitionGroup =
- (PartitionGroup) partitionGroups.get(currentPartitionGroupIndex);
- String alogirthm = currentPartitionGroup.getPartitionAlgo();
-
- if (log.isDebugEnabled())
- log.debug("Trying current partition group " + currentPartitionGroup.getId());
- // search withing the partition group
- Partition partition =
- AutoscalerRuleEvaluator.getInstance()
- .getAutoscaleAlgorithm(alogirthm)
- .getNextScaleUpPartition(currentPartitionGroup,
- clusterId);
-
- if (partition != null) {
- if (log.isDebugEnabled())
- log.debug("No partition found in partition group" +
- currentPartitionGroup.getId());
- return partition;
- } else {
- clusterContext.setCurrentPartitionIndex(0);
- // last partition group has reached
- if (currentPartitionGroupIndex == partitionGroups.size() - 1) {
- if (log.isDebugEnabled())
- log.debug("First partition group has reached wihtout space ");
- return null;
- }
- // current partition group is filled
- clusterContext.setCurrentPartitionGroupIndex(currentPartitionGroupIndex + 1);
- }
- }
- }
-
- return null;
- }
-
- public Partition getNextScaleDownPartition(String clusterId) {
- ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);
- String serviceId = AutoscalerContext.getInstance().getClusterContext(clusterId).getServiceId();
-
- //Find relevant policyId using topology
- String policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getDeploymentPolicyName();
- int currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();
-
- List<?> partitionGroups = Arrays.asList(PolicyManager.getInstance().getDeploymentPolicy(policyId).getPartitionGroups());
-
- for(int i = currentPartitionGroupIndex; i >= 0; i--)
- {
- if (partitionGroups.get(currentPartitionGroupIndex) instanceof PartitionGroup) {
- currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex();
- PartitionGroup currentPartitionGroup =
- (PartitionGroup) partitionGroups.get(currentPartitionGroupIndex);
- String alogirthm = currentPartitionGroup.getPartitionAlgo();
- if (log.isDebugEnabled())
- log.debug("Trying scale down in partition group " +
- currentPartitionGroup.getId());
- // search within the partition group
- Partition partition =
- AutoscalerRuleEvaluator.getInstance()
- .getAutoscaleAlgorithm(alogirthm)
- .getNextScaleDownPartition(currentPartitionGroup,
- clusterId);
-
- if (partition != null) {
- if (log.isDebugEnabled())
- log.debug("No free partition in partition group" +
- currentPartitionGroup.getId());
- return partition;
- } else {
- clusterContext.setCurrentPartitionIndex(0);
- // first partition group has reached. None of the partitions group has less than
- // minimum instance count.
- if (currentPartitionGroupIndex == 0)
- return null;
-
- // current partition group has no extra instances
- clusterContext.setCurrentPartitionGroupIndex(currentPartitionGroupIndex - 1);
- }
- }
- }
- // none of the partitions groups are free.
- return null;
- }
-
- @Override
- public boolean scaleUpPartitionAvailable(String clusterId) {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public boolean scaleDownPartitionAvailable(String clusterId) {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public Partition getNextScaleUpPartition(PartitionGroup partitionGroup,
- String clusterId) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Partition getNextScaleDownPartition(PartitionGroup partitionGroup,
- String clusterId) {
- // TODO Auto-generated method stub
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java
index 01b63fc..9597c74 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java
@@ -22,48 +22,46 @@ package org.apache.stratos.autoscaler.algorithm;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.autoscaler.AutoscalerContext;
-import org.apache.stratos.autoscaler.ClusterContext;
-import org.apache.stratos.autoscaler.partition.PartitionGroup;
+import org.apache.stratos.autoscaler.NetworkPartitionContext;
import org.apache.stratos.cloud.controller.deployment.partition.Partition;
-import edu.emory.mathcs.backport.java.util.Arrays;
-
+import java.util.Arrays;
import java.util.List;
/**
* This class is used for selecting a {@link Partition} in round robin manner and checking availability of
- * {@link Partition}s of a {@link PartitionGroup}
+ * {@link Partition}s of a {@link org.apache.stratos.autoscaler.NetworkPartitionContext}
*
*/
public class RoundRobin implements AutoscaleAlgorithm{
private static final Log log = LogFactory.getLog(RoundRobin.class);
- public Partition getNextScaleUpPartition(PartitionGroup partitionGroup, String clusterId){
-
+ public Partition getNextScaleUpPartition(NetworkPartitionContext networkPartitionContext, String clusterId){
- ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId);
- List<?> partitions = Arrays.asList(partitionGroup.getPartitions());
- int noOfPartitions = partitions.size();
+ List<?> partitionContexts = Arrays.asList(networkPartitionContext.getPartitionCtxts());
+ int noOfPartitions = partitionContexts.size();
for(int i=0; i < noOfPartitions; i++)
{
- int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
- if (partitions.get(currentPartitionIndex) instanceof Partition) {
- Partition currentPartition = (Partition) partitions.get(currentPartitionIndex);
+ int currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex();
+ if (partitionContexts.get(currentPartitionIndex) instanceof Partition) {
+ Partition currentPartition = (Partition) partitionContexts.get(currentPartitionIndex);
String currentPartitionId = currentPartition.getId();
// point to next partition
int nextPartitionIndex = currentPartitionIndex == noOfPartitions - 1 ? 0 : currentPartitionIndex+1;
- clusterContext.setCurrentPartitionIndex(nextPartitionIndex);
+ networkPartitionContext.setCurrentPartitionIndex(nextPartitionIndex);
// current partition has no partitionid-instanceid info in cluster context
- if(!clusterContext.partitionCountExists(currentPartitionId))
- AutoscalerContext.getInstance().getClusterContext(clusterId).addPartitionCount(currentPartitionId, 0);
+ if(!networkPartitionContext.partitionCountExists(currentPartitionId))
+ AutoscalerContext.getInstance().getMonitor(clusterId)
+ .getNetworkPartitionCtxt(networkPartitionContext.getId())
+ .addPartitionCount(currentPartitionId, 0);
- if(clusterContext.getMemberCount(currentPartitionId) < currentPartition.getPartitionMax()){
+ if(networkPartitionContext.getMemberCount(currentPartitionId) < currentPartition.getPartitionMax()){
// current partition is free
- clusterContext.increaseMemberCountInPartitionBy(currentPartitionId, 1);
+ networkPartitionContext.increaseMemberCountInPartitionBy(currentPartitionId, 1);
if(log.isDebugEnabled())
log.debug("Free space found in partition " + currentPartition.getId());
return currentPartition;
@@ -77,24 +75,20 @@ public class RoundRobin implements AutoscaleAlgorithm{
// none of the partitions were free.
if(log.isDebugEnabled()) {
- log.debug("No free partition found at partition group " + partitionGroup);
+ log.debug("No free partition found at partition group " + networkPartitionContext);
}
return null;
}
@Override
- public Partition getNextScaleDownPartition(PartitionGroup partitionGroup, String clusterId) {
-
- ClusterContext clusterContext =
- AutoscalerContext.getInstance()
- .getClusterContext(clusterId);
+ public Partition getNextScaleDownPartition(NetworkPartitionContext networkPartitionContext, String clusterId) {
- List<?> partitions = Arrays.asList(partitionGroup.getPartitions());
- int noOfPartitions = partitions.size();
+ List<?> partitionContexts = Arrays.asList(networkPartitionContext.getPartitionCtxts());
+ int noOfPartitions = partitionContexts.size();
for (int i = 0; i < noOfPartitions; i++) {
- int currentPartitionIndex = clusterContext.getCurrentPartitionIndex();
+ int currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex();
// point to next partition
if (currentPartitionIndex == 0) {
@@ -105,20 +99,21 @@ public class RoundRobin implements AutoscaleAlgorithm{
}
// Set next partition as current partition in Autoscaler Context
- clusterContext.setCurrentPartitionIndex(currentPartitionIndex);
+ networkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex);
- if (partitions.get(currentPartitionIndex) instanceof Partition) {
+ if (partitionContexts.get(currentPartitionIndex) instanceof Partition) {
- Partition currentPartition = (Partition) partitions.get(currentPartitionIndex);
+ Partition currentPartition = (Partition) partitionContexts.get(currentPartitionIndex);
String currentPartitionId = currentPartition.getId();
- if (!clusterContext.partitionCountExists(currentPartitionId))
- AutoscalerContext.getInstance().getClusterContext(clusterId)
- .addPartitionCount(currentPartitionId, 0);
+ if (!networkPartitionContext.partitionCountExists(currentPartitionId))
+ AutoscalerContext.getInstance().getMonitor(clusterId)
+ .getNetworkPartitionCtxt(networkPartitionContext.getId())
+ .addPartitionCount(currentPartitionId, 0);
// has more than minimum instances.
- if (clusterContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMin()) {
+ if (networkPartitionContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMin()) {
// current partition is free
- clusterContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1);
+ networkPartitionContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1);
if (log.isDebugEnabled()) {
log.debug("Returning partition for scaling down " +
currentPartition.getId());
@@ -133,8 +128,8 @@ public class RoundRobin implements AutoscaleAlgorithm{
}
if (log.isDebugEnabled())
- log.debug("No partition found for scale down at partition group " +
- partitionGroup.getId());
+ log.debug("No partition found for scale down at network partition " +
+ networkPartitionContext.getId());
// none of the partitions were free.
return null;
}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/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 9255980..c114e62 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
@@ -18,8 +18,6 @@
*/
package org.apache.stratos.autoscaler.api;
-import java.util.ArrayList;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.autoscaler.NetworkPartitionContext;
@@ -35,6 +33,8 @@ import org.apache.stratos.autoscaler.policy.PolicyManager;
import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy;
import org.apache.stratos.cloud.controller.deployment.partition.Partition;
+import java.util.ArrayList;
+
/**
* Auto Scaler Service API is responsible getting Partitions and Policies.
*/
@@ -70,7 +70,7 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface{
@Override
public boolean addPartition(Partition partition) {
- return PartitionManager.getInstance().deployNewPartitoion(partition);
+ return PartitionManager.getInstance().deployNewPartiotion(partition);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/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 1531c88..583b346 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
@@ -28,13 +28,7 @@ import org.apache.stratos.autoscaler.exception.SpawningException;
import org.apache.stratos.autoscaler.exception.TerminationException;
import org.apache.stratos.autoscaler.util.ConfUtil;
import org.apache.stratos.cloud.controller.deployment.partition.Partition;
-import org.apache.stratos.cloud.controller.stub.CloudControllerServiceIllegalArgumentExceptionException;
-import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidCartridgeTypeExceptionException;
-import org.apache.stratos.cloud.controller.stub.CloudControllerServiceInvalidClusterExceptionException;
-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.*;
import java.rmi.RemoteException;
@@ -77,6 +71,7 @@ public class CloudControllerClient {
public void spawnInstances(Partition partition, String clusterId, int memberCountToBeIncreased) throws SpawningException {
//call CC spawnInstances method
+
log.info("Calling CC for spawning instances in cluster " + clusterId);
log.info("Member count to be increased: " + memberCountToBeIncreased);
@@ -103,7 +98,8 @@ public class CloudControllerClient {
} catch (CloudControllerServiceInvalidCartridgeTypeExceptionException e) {
log.error(e.getMessage());
throw new PartitionValidationException(e);
- }
+ }
+
}
/*
@@ -119,6 +115,7 @@ public class CloudControllerClient {
} catch (CloudControllerServiceInvalidPartitionExceptionException e) {
throw new PartitionValidationException(e.getMessage(),e);
}
+
}
public org.apache.stratos.cloud.controller.pojo.MemberContext spawnAnInstance(Partition partition, String clusterId) throws SpawningException {
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicy.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicy.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicy.java
index e8b3478..d930cb6 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicy.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/deployment/policy/DeploymentPolicy.java
@@ -19,14 +19,12 @@
package org.apache.stratos.autoscaler.deployment.policy;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
import org.apache.stratos.autoscaler.partition.PartitionGroup;
import org.apache.stratos.cloud.controller.deployment.partition.Partition;
-import edu.emory.mathcs.backport.java.util.Arrays;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
/**
* The model class for Deployment-Policy definition.
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java
index c4f4ae0..3bd037e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java
@@ -18,9 +18,6 @@
*/
package org.apache.stratos.autoscaler.internal;
-import java.util.ArrayList;
-import java.util.Iterator;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy;
@@ -43,6 +40,9 @@ import org.osgi.service.component.ComponentContext;
import org.wso2.carbon.registry.api.RegistryException;
import org.wso2.carbon.registry.core.service.RegistryService;
+import java.util.ArrayList;
+import java.util.Iterator;
+
/**
* @scr.component name=org.apache.stratos.autoscaler.internal.AutoscalerServerComponent"
* immediate="true"
@@ -79,11 +79,12 @@ public class AutoscalerServerComponent {
// Adding the registry stored AS policies to the information model.
try {
- Thread th = new Thread(new AutoscalerTopologyReceiver());
- th.start();
+ Thread topologyTopicSubscriberThread = new Thread(new AutoscalerTopologyReceiver());
+ topologyTopicSubscriberThread.start();
if (log.isDebugEnabled()) {
log.debug("Topology message processor thread started");
}
+
TopicSubscriber healthStatTopicSubscriber = new TopicSubscriber(
Constants.HEALTH_STAT_TOPIC);
healthStatTopicSubscriber
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/a39a1e15/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java
index e16ea63..7e6ef90 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/health/HealthEventMessageDelegator.java
@@ -19,22 +19,17 @@
package org.apache.stratos.autoscaler.message.receiver.health;
import com.google.gson.stream.JsonReader;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.autoscaler.AutoscalerContext;
-import org.apache.stratos.autoscaler.ClusterContext;
import org.apache.stratos.autoscaler.ClusterMonitor;
import org.apache.stratos.autoscaler.Constants;
-import org.apache.stratos.autoscaler.PartitionContext;
import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient;
import org.apache.stratos.autoscaler.exception.SpawningException;
import org.apache.stratos.autoscaler.exception.TerminationException;
-import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator;
import org.apache.stratos.cloud.controller.deployment.partition.Partition;
import javax.jms.TextMessage;
-
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
@@ -50,6 +45,7 @@ public class HealthEventMessageDelegator implements Runnable {
private static final Log log = LogFactory.getLog(HealthEventMessageDelegator.class);
private String eventName;
private String clusterId;
+ private String networkPartitionId;
private Map<String, String> messageProperties;
@Override
public void run() {
@@ -69,15 +65,18 @@ public class HealthEventMessageDelegator implements Runnable {
if(Constants.AVERAGE_REQUESTS_IN_FLIGHT.equals(eventName)){
Float messageValue = Float.parseFloat(messageProperties.get("value"));
- AutoscalerContext.getInstance().getClusterContext(clusterId).setAverageRequestsInFlight(messageValue);
+ AutoscalerContext.getInstance().getMonitor(clusterId).getNetworkPartitionCtxt(networkPartitionId)
+ .setAverageRequestsInFlight(messageValue);
} else if(Constants.GRADIENT_OF_REQUESTS_IN_FLIGHT.equals(eventName)){
Float messageValue = Float.parseFloat(messageProperties.get("value"));
- AutoscalerContext.getInstance().getClusterContext(clusterId).setRequestsInFlightGradient(messageValue);
+ AutoscalerContext.getInstance().getMonitor(clusterId).getNetworkPartitionCtxt(networkPartitionId)
+ .setRequestsInFlightGradient(messageValue);
} else if(Constants.SECOND_DERIVATIVE_OF_REQUESTS_IN_FLIGHT.equals(eventName)){
Float messageValue = Float.parseFloat(messageProperties.get("value"));
- AutoscalerContext.getInstance().getClusterContext(clusterId).setRequestsInFlightSecondDerivative(messageValue);
+ AutoscalerContext.getInstance().getMonitor(clusterId).getNetworkPartitionCtxt(networkPartitionId)
+ .setRequestsInFlightSecondDerivative(messageValue);
}else if (Constants.MEMBER_FAULT_EVENT_NAME.equals(eventName)){
@@ -100,10 +99,9 @@ public class HealthEventMessageDelegator implements Runnable {
private void handleMemberfaultEvent(String memberId) {
try {
- ClusterMonitor monitor = AutoscalerRuleEvaluator.getInstance().getMonitor(this.clusterId);
- ClusterContext clusCtx = monitor.getClusterCtxt();
-
- if(!clusCtx.memberExist(memberId)){
+ ClusterMonitor monitor = AutoscalerContext.getInstance().getMonitor(this.clusterId);
+// TopologyManager.getTopology().get
+ if(!monitor.memberExist(memberId)){
// member has already terminated. So no action required
return;
}
@@ -113,9 +111,9 @@ public class HealthEventMessageDelegator implements Runnable {
ccClient.terminate(memberId);
// start a new member in the same Partition
- //ClusterContext clsCtx = AutoscalerContext.getInstance().getClusterContext(clusterId);
- String partitionId = clusCtx.getPartitonOfMember(memberId);
- Partition partition = clusCtx.getDeploymentPolicy().getPartitionById(partitionId);
+ //ClusterContext clsCtx = AutoscalerContext.getInstance().getClusterMonitor(clusterId);
+ String partitionId = monitor.getPartitonOfMember(memberId);
+ Partition partition = monitor.getDeploymentPolicy().getPartitionById(partitionId);
ccClient.spawnAnInstance(partition, clusterId);
} catch (TerminationException e) {
@@ -132,7 +130,6 @@ public class HealthEventMessageDelegator implements Runnable {
JsonReader reader = new JsonReader(bufferedReader);
try {
-
reader.beginObject();
if(reader.hasNext()) {