adding network partition context to cluster and application
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/746bdc10 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/746bdc10 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/746bdc10 Branch: refs/heads/master Commit: 746bdc10356d1d21fc5b1653829c0a6b699cc19e Parents: 7587568 Author: reka <[email protected]> Authored: Thu Nov 27 16:11:37 2014 +0530 Committer: reka <[email protected]> Committed: Thu Nov 27 16:26:13 2014 +0530 ---------------------------------------------------------------------- .../autoscaler/ClusterContextFactory.java | 20 +- .../ClusterLevelNetworkPartitionContext.java | 443 +++++++++++++++++++ .../autoscaler/NetworkPartitionContext.java | 278 ++---------- ...ntComponentLevelNetworkPartitionContext.java | 222 ++++++++++ .../stratos/autoscaler/VMClusterContext.java | 16 +- .../autoscaler/VMServiceClusterContext.java | 3 +- .../algorithm/AutoscaleAlgorithm.java | 8 +- .../autoscaler/algorithm/OneAfterAnother.java | 34 +- .../autoscaler/algorithm/RoundRobin.java | 32 +- .../applications/topic/ApplicationBuilder.java | 4 +- .../AutoscalerTopologyEventReceiver.java | 8 +- .../monitor/ParentComponentMonitor.java | 52 ++- .../monitor/application/ApplicationMonitor.java | 49 +- .../application/ApplicationMonitorFactory.java | 10 +- .../monitor/cluster/VMClusterMonitor.java | 103 ++--- .../monitor/cluster/VMLbClusterMonitor.java | 2 +- .../cluster/VMServiceClusterMonitor.java | 10 +- .../autoscaler/monitor/group/GroupMonitor.java | 35 +- .../autoscaler/rule/RuleTasksDelegator.java | 12 +- .../status/processor/StatusChecker.java | 16 +- .../cluster/ClusterStatusActiveProcessor.java | 6 +- .../cluster/ClusterStatusInActiveProcessor.java | 6 +- .../ClusterStatusTerminatedProcessor.java | 8 +- 23 files changed, 981 insertions(+), 396 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContextFactory.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContextFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContextFactory.java index 4e17b2a..7a9d4d6 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContextFactory.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContextFactory.java @@ -85,12 +85,12 @@ public class ClusterContextFactory { CloudControllerClient.getInstance().validateDeploymentPolicy(cluster.getServiceName(), deploymentPolicy); - Map<String, NetworkPartitionContext> networkPartitionContextMap = new HashMap<String, NetworkPartitionContext>(); + Map<String, ClusterLevelNetworkPartitionContext> networkPartitionContextMap = new HashMap<String, ClusterLevelNetworkPartitionContext>(); for (PartitionGroup partitionGroup : deploymentPolicy.getPartitionGroups()) { String networkPartitionId = partitionGroup.getId(); - NetworkPartitionContext networkPartitionContext = new NetworkPartitionContext(networkPartitionId, + ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext = new ClusterLevelNetworkPartitionContext(networkPartitionId, partitionGroup.getPartitionAlgo(), partitionGroup.getPartitions()); @@ -137,17 +137,17 @@ public class ClusterContextFactory { } } - networkPartitionContext.addPartitionContext(clusterMonitorPartitionContext); + clusterLevelNetworkPartitionContext.addPartitionContext(clusterMonitorPartitionContext); if (log.isInfoEnabled()) { log.info(String.format("Partition context has been added: [partition] %s", clusterMonitorPartitionContext.getPartitionId())); } } - networkPartitionContextMap.put(networkPartitionId, networkPartitionContext); + networkPartitionContextMap.put(networkPartitionId, clusterLevelNetworkPartitionContext); if (log.isInfoEnabled()) { log.info(String.format("Network partition context has been added: [network partition] %s", - networkPartitionContext.getId())); + clusterLevelNetworkPartitionContext.getId())); } } @@ -186,7 +186,7 @@ public class ClusterContextFactory { String clusterId = cluster.getClusterId(); - Map<String, NetworkPartitionContext> networkPartitionContextMap = new HashMap<String, NetworkPartitionContext>(); + Map<String, ClusterLevelNetworkPartitionContext> networkPartitionContextMap = new HashMap<String, ClusterLevelNetworkPartitionContext>(); // partition group = network partition context for (PartitionGroup partitionGroup : deploymentPolicy.getPartitionGroups()) { @@ -206,12 +206,12 @@ public class ClusterContextFactory { clusterMonitorPartitionContext.setNetworkPartitionId(networkPartitionId); clusterMonitorPartitionContext.setMinimumMemberCount(1);//Here it hard codes the minimum value as one for LB cartridge partitions - NetworkPartitionContext networkPartitionContext = new NetworkPartitionContext(networkPartitionId, + ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext = new ClusterLevelNetworkPartitionContext(networkPartitionId, partitionGroup.getPartitionAlgo(), partitionGroup.getPartitions()); for (Member member : cluster.getMembers()) { String memberId = member.getMemberId(); - if (member.getNetworkPartitionId().equalsIgnoreCase(networkPartitionContext.getId())) { + if (member.getNetworkPartitionId().equalsIgnoreCase(clusterLevelNetworkPartitionContext.getId())) { MemberContext memberContext = new MemberContext(); memberContext.setClusterId(member.getClusterId()); memberContext.setMemberId(memberId); @@ -245,7 +245,7 @@ public class ClusterContextFactory { } } - networkPartitionContext.addPartitionContext(clusterMonitorPartitionContext); + clusterLevelNetworkPartitionContext.addPartitionContext(clusterMonitorPartitionContext); // populate lb cluster id in network partition context. java.util.Properties props = cluster.getProperties(); @@ -273,7 +273,7 @@ public class ClusterContextFactory { } } - networkPartitionContextMap.put(networkPartitionId, networkPartitionContext); + networkPartitionContextMap.put(networkPartitionId, clusterLevelNetworkPartitionContext); } return new VMClusterContext(clusterId, cluster.getServiceName(), autoscalePolicy, http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterLevelNetworkPartitionContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterLevelNetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterLevelNetworkPartitionContext.java new file mode 100644 index 0000000..73f1bce --- /dev/null +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterLevelNetworkPartitionContext.java @@ -0,0 +1,443 @@ +/* + * 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.policy.model.LoadAverage; +import org.apache.stratos.autoscaler.policy.model.MemoryConsumption; +import org.apache.stratos.autoscaler.policy.model.RequestsInFlight; +import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition; +import org.apache.stratos.messaging.domain.instance.context.InstanceContext; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * Holds runtime data of a network partition. + * + */ +public class ClusterLevelNetworkPartitionContext extends NetworkPartitionContext implements Serializable { + + private static final Log log = LogFactory.getLog(ClusterLevelNetworkPartitionContext.class); + private static final long serialVersionUID = 572769304374110159L; + private final String id; + private int scaleDownRequestsCount = 0; + private float averageRequestsServedPerInstance; + private float requestsServedPerInstance; + + private int minInstanceCount = 0, maxInstanceCount = 0; + private int requiredInstanceCountBasedOnStats; + private int requiredInstanceCountBasedOnDependencies; + + private Map<String, InstanceContext> instanceIdToInstanceContextMap; + + + private final String partitionAlgorithm; + + //boolean values to keep whether the requests in flight parameters are reset or not + private boolean rifReset = false, averageRifReset = false, gradientRifReset = false, secondDerivativeRifRest = false; + //boolean values to keep whether the memory consumption parameters are reset or not + private boolean memoryConsumptionReset = false, averageMemoryConsumptionReset = false, + gradientMemoryConsumptionReset = false, secondDerivativeMemoryConsumptionRest = false; + //boolean values to keep whether the load average parameters are reset or not + private boolean loadAverageReset = false, averageLoadAverageReset = false, gradientLoadAverageReset = false, + secondDerivativeLoadAverageRest = false; + //boolean values to keep whether average requests served per instance parameters are reset or not + private boolean averageRequestServedPerInstanceReset = false; + + private final Partition[] partitions; + + //Following information will keep events details + private RequestsInFlight requestsInFlight; + private MemoryConsumption memoryConsumption; + private LoadAverage loadAverage; + + //details required for partition selection algorithms + private int currentPartitionIndex; + + //partitions of this network partition + private final Map<String, ClusterLevelPartitionContext> partitionCtxts; + + public ClusterLevelNetworkPartitionContext(String id, String partitionAlgo, Partition[] partitions) { + + super(id, partitionAlgo, partitions); + this.id = id; + this.partitionAlgorithm = partitionAlgo; + if (partitions == null) { + this.partitions = new Partition[0]; + } else { + this.partitions = Arrays.copyOf(partitions, partitions.length); + } + partitionCtxts = new HashMap<String, ClusterLevelPartitionContext>(); + requestsInFlight = new RequestsInFlight(); + loadAverage = new LoadAverage(); + memoryConsumption = new MemoryConsumption(); + for (Partition partition : partitions) { + minInstanceCount += partition.getPartitionMin(); + maxInstanceCount += partition.getPartitionMax(); + } + requiredInstanceCountBasedOnStats = minInstanceCount; + requiredInstanceCountBasedOnDependencies = minInstanceCount; + instanceIdToInstanceContextMap = new HashMap<String, InstanceContext>(); + + } + + public int getMinInstanceCount() { + return minInstanceCount; + } + + public void setMinInstanceCount(int minInstanceCount) { + this.minInstanceCount = minInstanceCount; + } + + public int getMaxInstanceCount() { + return maxInstanceCount; + } + + public void setMaxInstanceCount(int maxInstanceCount) { + this.maxInstanceCount = maxInstanceCount; + } + + public int hashCode() { + + final int prime = 31; + int result = 1; + result = prime * result + ((this.id == null) ? 0 : this.id.hashCode()); + return result; + + } + + public boolean equals(final Object obj) { + + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof ClusterLevelNetworkPartitionContext)) { + return false; + } + final ClusterLevelNetworkPartitionContext other = (ClusterLevelNetworkPartitionContext) obj; + if (this.id == null) { + if (other.id != null) { + return false; + } + } else if (!this.id.equals(other.id)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "NetworkPartitionContext [id=" + id + "partitionAlgorithm=" + partitionAlgorithm + ", minInstanceCount=" + + minInstanceCount + ", maxInstanceCount=" + maxInstanceCount + "]"; + } + + public int getCurrentPartitionIndex() { + return currentPartitionIndex; + } + + public void setCurrentPartitionIndex(int currentPartitionIndex) { + this.currentPartitionIndex = currentPartitionIndex; + } + + public float getAverageRequestsServedPerInstance() { + return averageRequestsServedPerInstance; + } + + public void setAverageRequestsServedPerInstance(float averageRequestServedPerInstance) { + this.averageRequestsServedPerInstance = averageRequestServedPerInstance; + averageRequestServedPerInstanceReset = true; + + if (log.isDebugEnabled()) { + log.debug(String.format("Average Requesets Served Per Instance stats are reset, ready to do scale check [network partition] %s" + , this.id)); + + } + } + + public float getRequestsServedPerInstance() { + return requestsServedPerInstance; + } + + public float getAverageRequestsInFlight() { + return requestsInFlight.getAverage(); + } + + public void setAverageRequestsInFlight(float averageRequestsInFlight) { + requestsInFlight.setAverage(averageRequestsInFlight); + averageRifReset = true; + if (secondDerivativeRifRest && gradientRifReset) { + rifReset = true; + if (log.isDebugEnabled()) { + log.debug(String.format("Requests in flights stats are reset, ready to do scale check [network partition] %s" + , this.id)); + } + } + } + + public float getRequestsInFlightSecondDerivative() { + return requestsInFlight.getSecondDerivative(); + } + + public void setRequestsInFlightSecondDerivative(float requestsInFlightSecondDerivative) { + requestsInFlight.setSecondDerivative(requestsInFlightSecondDerivative); + secondDerivativeRifRest = true; + if (averageRifReset && gradientRifReset) { + rifReset = true; + if (log.isDebugEnabled()) { + log.debug(String.format("Requests in flights stats are reset, ready to do scale check [network partition] %s" + , this.id)); + } + } + } + + public float getRequestsInFlightGradient() { + return requestsInFlight.getGradient(); + } + + public void setRequestsInFlightGradient(float requestsInFlightGradient) { + requestsInFlight.setGradient(requestsInFlightGradient); + gradientRifReset = true; + if (secondDerivativeRifRest && averageRifReset) { + rifReset = true; + if (log.isDebugEnabled()) { + log.debug(String.format("Requests in flights stats are reset, ready to do scale check [network partition] %s" + , this.id)); + } + } + } + + public boolean isRifReset() { + return rifReset; + } + + public void setRifReset(boolean rifReset) { + this.rifReset = rifReset; + this.averageRifReset = rifReset; + this.gradientRifReset = rifReset; + this.secondDerivativeRifRest = rifReset; + } + + + public float getAverageMemoryConsumption() { + return memoryConsumption.getAverage(); + } + + public void setAverageMemoryConsumption(float averageMemoryConsumption) { + memoryConsumption.setAverage(averageMemoryConsumption); + averageMemoryConsumptionReset = true; + if (secondDerivativeMemoryConsumptionRest && gradientMemoryConsumptionReset) { + memoryConsumptionReset = true; + if (log.isDebugEnabled()) { + log.debug(String.format("Memory consumption stats are reset, ready to do scale check [network partition] %s" + , this.id)); + } + } + } + + public float getMemoryConsumptionSecondDerivative() { + return memoryConsumption.getSecondDerivative(); + } + + public void setMemoryConsumptionSecondDerivative(float memoryConsumptionSecondDerivative) { + memoryConsumption.setSecondDerivative(memoryConsumptionSecondDerivative); + secondDerivativeMemoryConsumptionRest = true; + if (averageMemoryConsumptionReset && gradientMemoryConsumptionReset) { + memoryConsumptionReset = true; + if (log.isDebugEnabled()) { + log.debug(String.format("Memory consumption stats are reset, ready to do scale check [network partition] %s" + , this.id)); + } + } + } + + public float getMemoryConsumptionGradient() { + return memoryConsumption.getGradient(); + } + + public void setMemoryConsumptionGradient(float memoryConsumptionGradient) { + memoryConsumption.setGradient(memoryConsumptionGradient); + gradientMemoryConsumptionReset = true; + if (secondDerivativeMemoryConsumptionRest && averageMemoryConsumptionReset) { + memoryConsumptionReset = true; + if (log.isDebugEnabled()) { + log.debug(String.format("Memory consumption stats are reset, ready to do scale check [network partition] %s" + , this.id)); + } + } + } + + public boolean isMemoryConsumptionReset() { + return memoryConsumptionReset; + } + + public void setMemoryConsumptionReset(boolean memoryConsumptionReset) { + this.memoryConsumptionReset = memoryConsumptionReset; + this.averageMemoryConsumptionReset = memoryConsumptionReset; + this.gradientMemoryConsumptionReset = memoryConsumptionReset; + this.secondDerivativeMemoryConsumptionRest = memoryConsumptionReset; + } + + + public float getAverageLoadAverage() { + return loadAverage.getAverage(); + } + + public void setAverageLoadAverage(float averageLoadAverage) { + loadAverage.setAverage(averageLoadAverage); + averageLoadAverageReset = true; + if (secondDerivativeLoadAverageRest && gradientLoadAverageReset) { + loadAverageReset = true; + if (log.isDebugEnabled()) { + log.debug(String.format("Load average stats are reset, ready to do scale check [network partition] %s" + , this.id)); + } + } + } + + public float getLoadAverageSecondDerivative() { + return loadAverage.getSecondDerivative(); + } + + public void setLoadAverageSecondDerivative(float loadAverageSecondDerivative) { + loadAverage.setSecondDerivative(loadAverageSecondDerivative); + secondDerivativeLoadAverageRest = true; + if (averageLoadAverageReset && gradientLoadAverageReset) { + loadAverageReset = true; + if (log.isDebugEnabled()) { + log.debug(String.format("Load average stats are reset, ready to do scale check [network partition] %s" + , this.id)); + } + } + } + + public float getLoadAverageGradient() { + return loadAverage.getGradient(); + } + + public void setLoadAverageGradient(float loadAverageGradient) { + loadAverage.setGradient(loadAverageGradient); + gradientLoadAverageReset = true; + if (secondDerivativeLoadAverageRest && averageLoadAverageReset) { + loadAverageReset = true; + if (log.isDebugEnabled()) { + log.debug(String.format("Load average stats are reset, ready to do scale check [network partition] %s" + , this.id)); + } + } + } + + public boolean isLoadAverageReset() { + return loadAverageReset; + } + + public void setLoadAverageReset(boolean loadAverageReset) { + this.loadAverageReset = loadAverageReset; + this.averageLoadAverageReset = loadAverageReset; + this.gradientLoadAverageReset = loadAverageReset; + this.secondDerivativeLoadAverageRest = loadAverageReset; + } + + + public String getId() { + return id; + } + + public Map<String, ClusterLevelPartitionContext> getPartitionCtxts() { + return partitionCtxts; + } + + public ClusterLevelPartitionContext getPartitionCtxt(String partitionId) { + return partitionCtxts.get(partitionId); + } + + public void addPartitionContext(ClusterLevelPartitionContext partitionContext) { + partitionCtxts.put(partitionContext.getPartitionId(), partitionContext); + } + + public String getPartitionAlgorithm() { + return partitionAlgorithm; + } + + public Partition[] getPartitions() { + return partitions; + } + + public int getNonTerminatedMemberCountOfPartition(String partitionId) { + if (partitionCtxts.containsKey(partitionId)) { + return getPartitionCtxt(partitionId).getNonTerminatedMemberCount(); + } + return 0; + } + + public int getActiveMemberCount(String currentPartitionId) { + if (partitionCtxts.containsKey(currentPartitionId)) { + return getPartitionCtxt(currentPartitionId).getActiveMemberCount(); + } + return 0; + } + + public int getScaleDownRequestsCount() { + return scaleDownRequestsCount; + } + + public void resetScaleDownRequestsCount() { + this.scaleDownRequestsCount = 0; + } + + public void increaseScaleDownRequestsCount() { + this.scaleDownRequestsCount += 1; + } + + public float getRequiredInstanceCountBasedOnStats() { + return requiredInstanceCountBasedOnStats; + } + + public void setRequiredInstanceCountBasedOnStats(int requiredInstanceCountBasedOnStats) { + this.requiredInstanceCountBasedOnStats = requiredInstanceCountBasedOnStats; + } + + public int getRequiredInstanceCountBasedOnDependencies() { + return requiredInstanceCountBasedOnDependencies; + } + + public void setRequiredInstanceCountBasedOnDependencies(int requiredInstanceCountBasedOnDependencies) { + this.requiredInstanceCountBasedOnDependencies = requiredInstanceCountBasedOnDependencies; + } + + public Map<String, InstanceContext> getInstanceIdToInstanceContextMap() { + return instanceIdToInstanceContextMap; + } + + public void setInstanceIdToInstanceContextMap(Map<String, InstanceContext> instanceIdToInstanceContextMap) { + this.instanceIdToInstanceContextMap = instanceIdToInstanceContextMap; + } + + public void addInstanceContext(InstanceContext context) { + this.instanceIdToInstanceContextMap.put(context.getInstanceId(), context); + + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/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 8fc7bf7..9ca60ca 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 @@ -1,18 +1,18 @@ /* * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file + * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file + * 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 + * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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 + * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ @@ -20,54 +20,33 @@ package org.apache.stratos.autoscaler; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.stratos.autoscaler.policy.model.LoadAverage; -import org.apache.stratos.autoscaler.policy.model.MemoryConsumption; -import org.apache.stratos.autoscaler.policy.model.RequestsInFlight; import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition; +import org.apache.stratos.messaging.domain.instance.context.InstanceContext; -import java.io.Serializable; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** - * Holds runtime data of a network partition. - * + * This will keep track of network partition level information. */ -public class NetworkPartitionContext implements Serializable{ - - private static final Log log = LogFactory.getLog(NetworkPartitionContext.class); - private static final long serialVersionUID = 572769304374110159L; +public abstract class NetworkPartitionContext { + private static final Log log = LogFactory.getLog(ParentComponentLevelNetworkPartitionContext.class); private final String id; private int scaleDownRequestsCount = 0; private float averageRequestsServedPerInstance; - private float requestsServedPerInstance; private int minInstanceCount = 0, maxInstanceCount = 0; private int requiredInstanceCountBasedOnStats; private int requiredInstanceCountBasedOnDependencies; + private Map<String, InstanceContext> instanceIdToInstanceContextMap; - private final String partitionAlgorithm; - //boolean values to keep whether the requests in flight parameters are reset or not - private boolean rifReset = false, averageRifReset = false, gradientRifReset = false, secondDerivativeRifRest = false; - //boolean values to keep whether the memory consumption parameters are reset or not - private boolean memoryConsumptionReset = false, averageMemoryConsumptionReset = false, - gradientMemoryConsumptionReset = false, secondDerivativeMemoryConsumptionRest = false; - //boolean values to keep whether the load average parameters are reset or not - private boolean loadAverageReset = false, averageLoadAverageReset = false, gradientLoadAverageReset = false, - secondDerivativeLoadAverageRest = false; - //boolean values to keep whether average requests served per instance parameters are reset or not - private boolean averageRequestServedPerInstanceReset= false; + private final String partitionAlgorithm; private final Partition[] partitions; - //Following information will keep events details - private RequestsInFlight requestsInFlight; - private MemoryConsumption memoryConsumption; - private LoadAverage loadAverage; - //details required for partition selection algorithms private int currentPartitionIndex; @@ -79,21 +58,19 @@ public class NetworkPartitionContext implements Serializable{ super(); this.id = id; this.partitionAlgorithm = partitionAlgo; - if(partitions == null) { + if (partitions == null) { this.partitions = new Partition[0]; } else { this.partitions = Arrays.copyOf(partitions, partitions.length); } partitionCtxts = new HashMap<String, ClusterLevelPartitionContext>(); - requestsInFlight = new RequestsInFlight(); - loadAverage = new LoadAverage(); - memoryConsumption = new MemoryConsumption(); - for(Partition partition : partitions){ + for (Partition partition : partitions) { minInstanceCount += partition.getPartitionMin(); maxInstanceCount += partition.getPartitionMax(); } requiredInstanceCountBasedOnStats = minInstanceCount; requiredInstanceCountBasedOnDependencies = minInstanceCount; + instanceIdToInstanceContextMap = new HashMap<String, InstanceContext>(); } @@ -130,16 +107,15 @@ public class NetworkPartitionContext implements Serializable{ if (obj == null) { return false; } - if (!(obj instanceof NetworkPartitionContext)) { + if (!(obj instanceof ParentComponentLevelNetworkPartitionContext)) { return false; } - final NetworkPartitionContext other = (NetworkPartitionContext) obj; + final ParentComponentLevelNetworkPartitionContext other = (ParentComponentLevelNetworkPartitionContext) obj; if (this.id == null) { - if (other.id != null) { + if (this.id != null) { return false; } - } - else if (!this.id.equals(other.id)) { + } else if (!this.id.equals(this.id)) { return false; } return true; @@ -148,7 +124,7 @@ public class NetworkPartitionContext implements Serializable{ @Override public String toString() { return "NetworkPartitionContext [id=" + id + "partitionAlgorithm=" + partitionAlgorithm + ", minInstanceCount=" + - minInstanceCount + ", maxInstanceCount=" + maxInstanceCount + "]"; + minInstanceCount + ", maxInstanceCount=" + maxInstanceCount + "]"; } public int getCurrentPartitionIndex() { @@ -159,202 +135,6 @@ public class NetworkPartitionContext implements Serializable{ this.currentPartitionIndex = currentPartitionIndex; } - public float getAverageRequestsServedPerInstance() { return averageRequestsServedPerInstance;} - - public void setAverageRequestsServedPerInstance(float averageRequestServedPerInstance) { - this.averageRequestsServedPerInstance = averageRequestServedPerInstance; - averageRequestServedPerInstanceReset = true; - - if(log.isDebugEnabled()){ - log.debug(String.format("Average Requesets Served Per Instance stats are reset, ready to do scale check [network partition] %s" - , this.id)); - - } - } - - public float getRequestsServedPerInstance() { return requestsServedPerInstance;} - - public float getAverageRequestsInFlight() { - return requestsInFlight.getAverage(); - } - - public void setAverageRequestsInFlight(float averageRequestsInFlight) { - requestsInFlight.setAverage(averageRequestsInFlight); - averageRifReset = true; - if(secondDerivativeRifRest && gradientRifReset){ - rifReset = true; - if(log.isDebugEnabled()){ - log.debug(String.format("Requests in flights stats are reset, ready to do scale check [network partition] %s" - , this.id)); - } - } - } - - public float getRequestsInFlightSecondDerivative() { - return requestsInFlight.getSecondDerivative(); - } - - public void setRequestsInFlightSecondDerivative(float requestsInFlightSecondDerivative) { - requestsInFlight.setSecondDerivative(requestsInFlightSecondDerivative); - secondDerivativeRifRest = true; - if(averageRifReset && gradientRifReset){ - rifReset = true; - if(log.isDebugEnabled()){ - log.debug(String.format("Requests in flights stats are reset, ready to do scale check [network partition] %s" - , this.id)); - } - } - } - - public float getRequestsInFlightGradient() { - return requestsInFlight.getGradient(); - } - - public void setRequestsInFlightGradient(float requestsInFlightGradient) { - requestsInFlight.setGradient(requestsInFlightGradient); - gradientRifReset = true; - if(secondDerivativeRifRest && averageRifReset){ - rifReset = true; - if(log.isDebugEnabled()){ - log.debug(String.format("Requests in flights stats are reset, ready to do scale check [network partition] %s" - , this.id)); - } - } - } - - public boolean isRifReset() { - return rifReset; - } - - public void setRifReset(boolean rifReset) { - this.rifReset = rifReset; - this.averageRifReset = rifReset; - this.gradientRifReset = rifReset; - this.secondDerivativeRifRest = rifReset; - } - - - public float getAverageMemoryConsumption() { - return memoryConsumption.getAverage(); - } - - public void setAverageMemoryConsumption(float averageMemoryConsumption) { - memoryConsumption.setAverage(averageMemoryConsumption); - averageMemoryConsumptionReset = true; - if(secondDerivativeMemoryConsumptionRest && gradientMemoryConsumptionReset){ - memoryConsumptionReset = true; - if(log.isDebugEnabled()){ - log.debug(String.format("Memory consumption stats are reset, ready to do scale check [network partition] %s" - , this.id)); - } - } - } - - public float getMemoryConsumptionSecondDerivative() { - return memoryConsumption.getSecondDerivative(); - } - - public void setMemoryConsumptionSecondDerivative(float memoryConsumptionSecondDerivative) { - memoryConsumption.setSecondDerivative(memoryConsumptionSecondDerivative); - secondDerivativeMemoryConsumptionRest = true; - if(averageMemoryConsumptionReset && gradientMemoryConsumptionReset){ - memoryConsumptionReset = true; - if(log.isDebugEnabled()){ - log.debug(String.format("Memory consumption stats are reset, ready to do scale check [network partition] %s" - , this.id)); - } - } - } - - public float getMemoryConsumptionGradient() { - return memoryConsumption.getGradient(); - } - - public void setMemoryConsumptionGradient(float memoryConsumptionGradient) { - memoryConsumption.setGradient(memoryConsumptionGradient); - gradientMemoryConsumptionReset = true; - if(secondDerivativeMemoryConsumptionRest && averageMemoryConsumptionReset){ - memoryConsumptionReset = true; - if(log.isDebugEnabled()){ - log.debug(String.format("Memory consumption stats are reset, ready to do scale check [network partition] %s" - , this.id)); - } - } - } - - public boolean isMemoryConsumptionReset() { - return memoryConsumptionReset; - } - - public void setMemoryConsumptionReset(boolean memoryConsumptionReset) { - this.memoryConsumptionReset = memoryConsumptionReset; - this.averageMemoryConsumptionReset = memoryConsumptionReset; - this.gradientMemoryConsumptionReset = memoryConsumptionReset; - this.secondDerivativeMemoryConsumptionRest = memoryConsumptionReset; - } - - - public float getAverageLoadAverage() { - return loadAverage.getAverage(); - } - - public void setAverageLoadAverage(float averageLoadAverage) { - loadAverage.setAverage(averageLoadAverage); - averageLoadAverageReset = true; - if(secondDerivativeLoadAverageRest && gradientLoadAverageReset){ - loadAverageReset = true; - if(log.isDebugEnabled()){ - log.debug(String.format("Load average stats are reset, ready to do scale check [network partition] %s" - , this.id)); - } - } - } - - public float getLoadAverageSecondDerivative() { - return loadAverage.getSecondDerivative(); - } - - public void setLoadAverageSecondDerivative(float loadAverageSecondDerivative) { - loadAverage.setSecondDerivative(loadAverageSecondDerivative); - secondDerivativeLoadAverageRest = true; - if(averageLoadAverageReset && gradientLoadAverageReset){ - loadAverageReset = true; - if(log.isDebugEnabled()){ - log.debug(String.format("Load average stats are reset, ready to do scale check [network partition] %s" - , this.id)); - } - } - } - - public float getLoadAverageGradient() { - return loadAverage.getGradient(); - } - - public void setLoadAverageGradient(float loadAverageGradient) { - loadAverage.setGradient(loadAverageGradient); - gradientLoadAverageReset = true; - if(secondDerivativeLoadAverageRest && averageLoadAverageReset){ - loadAverageReset = true; - if(log.isDebugEnabled()){ - log.debug(String.format("Load average stats are reset, ready to do scale check [network partition] %s" - , this.id)); - } - } - } - - public boolean isLoadAverageReset() { - return loadAverageReset; - } - - public void setLoadAverageReset(boolean loadAverageReset) { - this.loadAverageReset = loadAverageReset; - this.averageLoadAverageReset = loadAverageReset; - this.gradientLoadAverageReset = loadAverageReset; - this.secondDerivativeLoadAverageRest = loadAverageReset; - } - - - public String getId() { return id; } @@ -380,14 +160,14 @@ public class NetworkPartitionContext implements Serializable{ } public int getNonTerminatedMemberCountOfPartition(String partitionId) { - if(partitionCtxts.containsKey(partitionId)){ + if (partitionCtxts.containsKey(partitionId)) { return getPartitionCtxt(partitionId).getNonTerminatedMemberCount(); } return 0; } public int getActiveMemberCount(String currentPartitionId) { - if(partitionCtxts.containsKey(currentPartitionId)){ + if (partitionCtxts.containsKey(currentPartitionId)) { return getPartitionCtxt(currentPartitionId).getActiveMemberCount(); } return 0; @@ -400,6 +180,7 @@ public class NetworkPartitionContext implements Serializable{ public void resetScaleDownRequestsCount() { this.scaleDownRequestsCount = 0; } + public void increaseScaleDownRequestsCount() { this.scaleDownRequestsCount += 1; } @@ -419,4 +200,17 @@ public class NetworkPartitionContext implements Serializable{ public void setRequiredInstanceCountBasedOnDependencies(int requiredInstanceCountBasedOnDependencies) { this.requiredInstanceCountBasedOnDependencies = requiredInstanceCountBasedOnDependencies; } -} \ No newline at end of file + + public Map<String, InstanceContext> getInstanceIdToInstanceContextMap() { + return instanceIdToInstanceContextMap; + } + + public void setInstanceIdToInstanceContextMap(Map<String, InstanceContext> instanceIdToInstanceContextMap) { + this.instanceIdToInstanceContextMap = instanceIdToInstanceContextMap; + } + + public void addInstanceContext(InstanceContext context) { + this.instanceIdToInstanceContextMap.put(context.getInstanceId(), context); + + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ParentComponentLevelNetworkPartitionContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ParentComponentLevelNetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ParentComponentLevelNetworkPartitionContext.java new file mode 100644 index 0000000..e9ca470 --- /dev/null +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ParentComponentLevelNetworkPartitionContext.java @@ -0,0 +1,222 @@ +/* + * 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.policy.model.LoadAverage; +import org.apache.stratos.autoscaler.policy.model.MemoryConsumption; +import org.apache.stratos.autoscaler.policy.model.RequestsInFlight; +import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition; +import org.apache.stratos.messaging.domain.instance.context.InstanceContext; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * Holds runtime data of a network partition. + * + */ +public class ParentComponentLevelNetworkPartitionContext extends NetworkPartitionContext implements Serializable { + private static final Log log = LogFactory.getLog(ParentComponentLevelNetworkPartitionContext.class); + private final String id; + private int scaleDownRequestsCount = 0; + private float averageRequestsServedPerInstance; + + private int minInstanceCount = 0, maxInstanceCount = 0; + private int requiredInstanceCountBasedOnStats; + private int requiredInstanceCountBasedOnDependencies; + + private Map<String, InstanceContext> instanceIdToInstanceContextMap; + + + private final String partitionAlgorithm; + + private final Partition[] partitions; + + //details required for partition selection algorithms + private int currentPartitionIndex; + + //partitions of this network partition + private final Map<String, PartitionContext> partitionCtxts; + + public ParentComponentLevelNetworkPartitionContext(String id, String partitionAlgo, Partition[] partitions) { + + super(id, partitionAlgo, partitions); + this.id = id; + this.partitionAlgorithm = partitionAlgo; + if (partitions == null) { + this.partitions = new Partition[0]; + } else { + this.partitions = Arrays.copyOf(partitions, partitions.length); + } + partitionCtxts = new HashMap<String, PartitionContext>(); + for (Partition partition : partitions) { + minInstanceCount += partition.getPartitionMin(); + maxInstanceCount += partition.getPartitionMax(); + } + requiredInstanceCountBasedOnStats = minInstanceCount; + requiredInstanceCountBasedOnDependencies = minInstanceCount; + instanceIdToInstanceContextMap = new HashMap<String, InstanceContext>(); + + } + + public int getMinInstanceCount() { + return minInstanceCount; + } + + public void setMinInstanceCount(int minInstanceCount) { + this.minInstanceCount = minInstanceCount; + } + + public int getMaxInstanceCount() { + return maxInstanceCount; + } + + public void setMaxInstanceCount(int maxInstanceCount) { + this.maxInstanceCount = maxInstanceCount; + } + + public int hashCode() { + + final int prime = 31; + int result = 1; + result = prime * result + ((this.id == null) ? 0 : this.id.hashCode()); + return result; + + } + + public boolean equals(final Object obj) { + + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof ParentComponentLevelNetworkPartitionContext)) { + return false; + } + final ParentComponentLevelNetworkPartitionContext other = (ParentComponentLevelNetworkPartitionContext) obj; + if (this.id == null) { + if (other.id != null) { + return false; + } + } else if (!this.id.equals(other.id)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "NetworkPartitionContext [id=" + id + "partitionAlgorithm=" + partitionAlgorithm + ", minInstanceCount=" + + minInstanceCount + ", maxInstanceCount=" + maxInstanceCount + "]"; + } + + public int getCurrentPartitionIndex() { + return currentPartitionIndex; + } + + public void setCurrentPartitionIndex(int currentPartitionIndex) { + this.currentPartitionIndex = currentPartitionIndex; + } + + public String getId() { + return id; + } + + public Map<String, PartitionContext> getPartitionCtxts() { + return partitionCtxts; + } + + public PartitionContext getPartitionCtxt(String partitionId) { + return partitionCtxts.get(partitionId); + } + + public void addPartitionContext(PartitionContext partitionContext) { + partitionCtxts.put(partitionContext.getPartitionId(), partitionContext); + } + + public String getPartitionAlgorithm() { + return partitionAlgorithm; + } + + public Partition[] getPartitions() { + return partitions; + } + + public int getNonTerminatedMemberCountOfPartition(String partitionId) { + if (partitionCtxts.containsKey(partitionId)) { + return getPartitionCtxt(partitionId).getNonTerminatedMemberCount(); + } + return 0; + } + + public int getActiveMemberCount(String currentPartitionId) { + if (partitionCtxts.containsKey(currentPartitionId)) { + return getPartitionCtxt(currentPartitionId).getActiveMemberCount(); + } + return 0; + } + + public int getScaleDownRequestsCount() { + return scaleDownRequestsCount; + } + + public void resetScaleDownRequestsCount() { + this.scaleDownRequestsCount = 0; + } + + public void increaseScaleDownRequestsCount() { + this.scaleDownRequestsCount += 1; + } + + public float getRequiredInstanceCountBasedOnStats() { + return requiredInstanceCountBasedOnStats; + } + + public void setRequiredInstanceCountBasedOnStats(int requiredInstanceCountBasedOnStats) { + this.requiredInstanceCountBasedOnStats = requiredInstanceCountBasedOnStats; + } + + public int getRequiredInstanceCountBasedOnDependencies() { + return requiredInstanceCountBasedOnDependencies; + } + + public void setRequiredInstanceCountBasedOnDependencies(int requiredInstanceCountBasedOnDependencies) { + this.requiredInstanceCountBasedOnDependencies = requiredInstanceCountBasedOnDependencies; + } + + public Map<String, InstanceContext> getInstanceIdToInstanceContextMap() { + return instanceIdToInstanceContextMap; + } + + public void setInstanceIdToInstanceContextMap(Map<String, InstanceContext> instanceIdToInstanceContextMap) { + this.instanceIdToInstanceContextMap = instanceIdToInstanceContextMap; + } + + public void addInstanceContext(InstanceContext context) { + this.instanceIdToInstanceContextMap.put(context.getInstanceId(), context); + + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMClusterContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMClusterContext.java index 1c031a5..b492d76 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMClusterContext.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMClusterContext.java @@ -33,12 +33,12 @@ public class VMClusterContext extends AbstractClusterContext { private static final Log log = LogFactory.getLog(VMClusterContext.class); // Map<NetworkpartitionId, Network Partition Context> - protected Map<String, NetworkPartitionContext> networkPartitionCtxts; + protected Map<String, ClusterLevelNetworkPartitionContext> networkPartitionCtxts; protected DeploymentPolicy deploymentPolicy; protected AutoscalePolicy autoscalePolicy; public VMClusterContext(String clusterId, String serviceId, AutoscalePolicy autoscalePolicy, DeploymentPolicy deploymentPolicy, - Map<String, NetworkPartitionContext> networkPartitionCtxts) { + Map<String, ClusterLevelNetworkPartitionContext> networkPartitionCtxts) { super(clusterId, serviceId); this.deploymentPolicy = deploymentPolicy; @@ -47,7 +47,7 @@ public class VMClusterContext extends AbstractClusterContext { } - public Map<String, NetworkPartitionContext> getNetworkPartitionCtxts(){ + public Map<String, ClusterLevelNetworkPartitionContext> getNetworkPartitionCtxts(){ return networkPartitionCtxts; } @@ -67,11 +67,11 @@ public class VMClusterContext extends AbstractClusterContext { this.autoscalePolicy = autoscalePolicy; } - public NetworkPartitionContext getNetworkPartitionCtxt(String networkPartitionId) { + public ClusterLevelNetworkPartitionContext getNetworkPartitionCtxt(String networkPartitionId) { return networkPartitionCtxts.get(networkPartitionId); } - public void setPartitionCtxt(Map<String, NetworkPartitionContext> partitionCtxt) { + public void setPartitionCtxt(Map<String, ClusterLevelNetworkPartitionContext> partitionCtxt) { this.networkPartitionCtxts = partitionCtxt; } @@ -79,15 +79,15 @@ public class VMClusterContext extends AbstractClusterContext { return networkPartitionCtxts.containsKey(partitionId); } - public void addNetworkPartitionCtxt(NetworkPartitionContext ctxt) { + public void addNetworkPartitionCtxt(ClusterLevelNetworkPartitionContext ctxt) { this.networkPartitionCtxts.put(ctxt.getId(), ctxt); } - public NetworkPartitionContext getPartitionCtxt(String id) { + public ClusterLevelNetworkPartitionContext getPartitionCtxt(String id) { return this.networkPartitionCtxts.get(id); } - public NetworkPartitionContext getNetworkPartitionCtxt(Member member) { + public ClusterLevelNetworkPartitionContext getNetworkPartitionCtxt(Member member) { log.info("***** getNetworkPartitionCtxt " + member.getNetworkPartitionId()); String networkPartitionId = member.getNetworkPartitionId(); if (networkPartitionCtxts.containsKey(networkPartitionId)) { http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMServiceClusterContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMServiceClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMServiceClusterContext.java index 6b9fefd..6c9d359 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMServiceClusterContext.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/VMServiceClusterContext.java @@ -22,7 +22,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy; import org.apache.stratos.autoscaler.policy.model.DeploymentPolicy; -import org.apache.stratos.messaging.domain.topology.Member; import java.util.Map; @@ -36,7 +35,7 @@ public class VMServiceClusterContext extends VMClusterContext { protected AutoscalePolicy autoscalePolicy; public VMServiceClusterContext(String clusterId, String serviceId, AutoscalePolicy autoscalePolicy, DeploymentPolicy deploymentPolicy, - Map<String, NetworkPartitionContext> networkPartitionCtxts) { + Map<String, ClusterLevelNetworkPartitionContext> networkPartitionCtxts) { super(clusterId, serviceId, autoscalePolicy, deploymentPolicy, networkPartitionCtxts); this.autoscalePolicy = autoscalePolicy; http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/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 8ae0fb6..c27cc1e 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 @@ -46,18 +46,18 @@ public interface AutoscaleAlgorithm { /** * Returns a {@link Partition} to scale up from the given {@link PartitionGroup} according to algorithm - * @param networkPartitionContext {@link org.apache.stratos.autoscaler.NetworkPartitionContext} which need the {@link Partition} + * @param clusterLevelNetworkPartitionContext {@link org.apache.stratos.autoscaler.ClusterLevelNetworkPartitionContext} 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(NetworkPartitionContext networkPartitionContext, String clusterId); + public Partition getNextScaleUpPartition(NetworkPartitionContext clusterLevelNetworkPartitionContext, String clusterId); /** * Returns a {@link Partition} to scale down from the given {@link PartitionGroup} according to algorithm - * @param networkPartitionContext {@link org.apache.stratos.autoscaler.NetworkPartitionContext} which need the {@link Partition} + * @param clusterLevelNetworkPartitionContext {@link org.apache.stratos.autoscaler.ClusterLevelNetworkPartitionContext} 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(NetworkPartitionContext networkPartitionContext, String clusterId); + public Partition getNextScaleDownPartition(NetworkPartitionContext clusterLevelNetworkPartitionContext, String clusterId); } http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/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 e234713..afae0e8 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 @@ -35,7 +35,7 @@ import java.util.List; /** * This class is used for selecting a {@link Partition} one after another and checking availability of - * partitions of a {@link NetworkPartitionContext} + * partitions of a {@link org.apache.stratos.autoscaler.ClusterLevelNetworkPartitionContext} * One after another means it completes partitions in the order defined in * {@link org.apache.stratos.autoscaler.policy.model.DeploymentPolicy}, and go to next if current one * reached the max limit @@ -44,23 +44,23 @@ public class OneAfterAnother implements AutoscaleAlgorithm { private static final Log log = LogFactory.getLog(OneAfterAnother.class); - public Partition getNextScaleUpPartition(NetworkPartitionContext networkPartitionContext, String clusterId) { + public Partition getNextScaleUpPartition(NetworkPartitionContext clusterLevelNetworkPartitionContext, String clusterId) { try { if (log.isDebugEnabled()) log.debug(String.format("Searching for a partition to up [network partition] %s", - networkPartitionContext.getId())) ; - int currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex(); - List<?> partitions = Arrays.asList(networkPartitionContext.getPartitions()); + clusterLevelNetworkPartitionContext.getId())) ; + int currentPartitionIndex = clusterLevelNetworkPartitionContext.getCurrentPartitionIndex(); + List<?> partitions = Arrays.asList(clusterLevelNetworkPartitionContext.getPartitions()); int noOfPartitions = partitions.size(); for (int i = currentPartitionIndex; i < noOfPartitions; i++) { if (partitions.get(currentPartitionIndex) instanceof Partition) { - currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex(); + currentPartitionIndex = clusterLevelNetworkPartitionContext.getCurrentPartitionIndex(); Partition currentPartition = (Partition) partitions.get(currentPartitionIndex); String currentPartitionId = currentPartition.getId(); - int nonTerminatedMemberCountOfPartition = networkPartitionContext.getNonTerminatedMemberCountOfPartition(currentPartitionId); + int nonTerminatedMemberCountOfPartition = clusterLevelNetworkPartitionContext.getNonTerminatedMemberCountOfPartition(currentPartitionId); if (nonTerminatedMemberCountOfPartition < currentPartition.getPartitionMax()) { // current partition is free if (log.isDebugEnabled()) @@ -75,37 +75,37 @@ public class OneAfterAnother implements AutoscaleAlgorithm { return null; } - networkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex + 1); + clusterLevelNetworkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex + 1); } } } if (log.isDebugEnabled()) - log.debug(String.format("No free partition found at network partition %s" , networkPartitionContext)); + log.debug(String.format("No free partition found at network partition %s" , clusterLevelNetworkPartitionContext)); } catch (Exception e) { log.error("Error occurred while searching for next scale up partition", e); } return null; } - public Partition getNextScaleDownPartition(NetworkPartitionContext networkPartitionContext, String clusterId) { + public Partition getNextScaleDownPartition(NetworkPartitionContext clusterLevelNetworkPartitionContext, String clusterId) { try { if (log.isDebugEnabled()) log.debug(String.format("Searching for a partition to scale down [network partition] %s", - networkPartitionContext.getId())) ; - int currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex(); - List<?> partitions = Arrays.asList(networkPartitionContext.getPartitions()); + clusterLevelNetworkPartitionContext.getId())) ; + int currentPartitionIndex = clusterLevelNetworkPartitionContext.getCurrentPartitionIndex(); + List<?> partitions = Arrays.asList(clusterLevelNetworkPartitionContext.getPartitions()); for (int i = currentPartitionIndex; i >= 0; i--) { if (partitions.get(currentPartitionIndex) instanceof Partition) { - currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex(); + currentPartitionIndex = clusterLevelNetworkPartitionContext.getCurrentPartitionIndex(); Partition currentPartition = (Partition) partitions.get(currentPartitionIndex); String currentPartitionId = currentPartition.getId(); // has more than minimum instances. - int currentlyActiveMemberCount = networkPartitionContext.getActiveMemberCount(currentPartitionId); + int currentlyActiveMemberCount = clusterLevelNetworkPartitionContext.getActiveMemberCount(currentPartitionId); if ( currentlyActiveMemberCount > currentPartition.getPartitionMin()) { // current partition is free if (log.isDebugEnabled()) @@ -122,13 +122,13 @@ public class OneAfterAnother implements AutoscaleAlgorithm { } // Set next partition as current partition in Autoscaler Context currentPartitionIndex = currentPartitionIndex - 1; - networkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex); + clusterLevelNetworkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex); } } } if (log.isDebugEnabled()) - log.debug("No space found in this network partition " + networkPartitionContext.getId()); + log.debug("No space found in this network partition " + clusterLevelNetworkPartitionContext.getId()); } catch (Exception e) { log.error("Error occurred while searching for scale down partition", e); } http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/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 9f54039..db24696 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 @@ -29,38 +29,38 @@ 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 org.apache.stratos.autoscaler.NetworkPartitionContext} + * {@link Partition}s of a {@link org.apache.stratos.autoscaler.ClusterLevelNetworkPartitionContext} * */ public class RoundRobin implements AutoscaleAlgorithm{ private static final Log log = LogFactory.getLog(RoundRobin.class); - public Partition getNextScaleUpPartition(NetworkPartitionContext networkPartitionContext, String clusterId){ + public Partition getNextScaleUpPartition(NetworkPartitionContext clusterLevelNetworkPartitionContext, String clusterId){ try{ if (log.isDebugEnabled()) log.debug(String.format("Searching for a partition to scale up [network partition] %s", - networkPartitionContext.getId())) ; - List<?> partitions = Arrays.asList(networkPartitionContext.getPartitions()); + clusterLevelNetworkPartitionContext.getId())) ; + List<?> partitions = Arrays.asList(clusterLevelNetworkPartitionContext.getPartitions()); int noOfPartitions = partitions.size(); for(int i=0; i < noOfPartitions; i++) { - int currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex(); + int currentPartitionIndex = clusterLevelNetworkPartitionContext.getCurrentPartitionIndex(); if (partitions.get(currentPartitionIndex) instanceof Partition) { Partition currentPartition = (Partition) partitions.get(currentPartitionIndex); String currentPartitionId = currentPartition.getId(); // point to next partition int nextPartitionIndex = currentPartitionIndex == noOfPartitions - 1 ? 0 : currentPartitionIndex+1; - networkPartitionContext.setCurrentPartitionIndex(nextPartitionIndex); - int nonTerminatedMemberCountOfPartition = networkPartitionContext.getNonTerminatedMemberCountOfPartition(currentPartitionId); + clusterLevelNetworkPartitionContext.setCurrentPartitionIndex(nextPartitionIndex); + int nonTerminatedMemberCountOfPartition = clusterLevelNetworkPartitionContext.getNonTerminatedMemberCountOfPartition(currentPartitionId); if(nonTerminatedMemberCountOfPartition < currentPartition.getPartitionMax()){ // current partition is free if (log.isDebugEnabled()) log.debug(String.format("A free space found for scale up in partition %s [current] %s [max] %s", - currentPartitionId, networkPartitionContext.getNonTerminatedMemberCountOfPartition(currentPartitionId), + currentPartitionId, clusterLevelNetworkPartitionContext.getNonTerminatedMemberCountOfPartition(currentPartitionId), currentPartition.getPartitionMax())) ; return currentPartition; } @@ -73,7 +73,7 @@ public class RoundRobin implements AutoscaleAlgorithm{ // none of the partitions were free. if(log.isDebugEnabled()) { - log.debug("No free partition found at network partition " + networkPartitionContext); + log.debug("No free partition found at network partition " + clusterLevelNetworkPartitionContext); } } catch (Exception e) { log.error("Error occurred while searching for next scale up partition", e); @@ -83,16 +83,16 @@ public class RoundRobin implements AutoscaleAlgorithm{ @Override - public Partition getNextScaleDownPartition(NetworkPartitionContext networkPartitionContext, String clusterId) { + public Partition getNextScaleDownPartition(NetworkPartitionContext clusterLevelNetworkPartitionContext, String clusterId) { try{ if (log.isDebugEnabled()) log.debug(String.format("Searching for a partition to scale up [network partition] %s", - networkPartitionContext.getId())) ; - List<?> partitions = Arrays.asList(networkPartitionContext.getPartitions()); + clusterLevelNetworkPartitionContext.getId())) ; + List<?> partitions = Arrays.asList(clusterLevelNetworkPartitionContext.getPartitions()); int noOfPartitions = partitions.size(); for (int i = 0; i < noOfPartitions; i++) { - int currentPartitionIndex = networkPartitionContext.getCurrentPartitionIndex(); + int currentPartitionIndex = clusterLevelNetworkPartitionContext.getCurrentPartitionIndex(); // point to next partition if (currentPartitionIndex == 0) { @@ -103,7 +103,7 @@ public class RoundRobin implements AutoscaleAlgorithm{ } // Set next partition as current partition in Autoscaler Context - networkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex); + clusterLevelNetworkPartitionContext.setCurrentPartitionIndex(currentPartitionIndex); if (partitions.get(currentPartitionIndex) instanceof Partition) { @@ -111,7 +111,7 @@ public class RoundRobin implements AutoscaleAlgorithm{ String currentPartitionId = currentPartition.getId(); // has more than minimum instances. - int currentlyActiveMemberCount = networkPartitionContext.getActiveMemberCount(currentPartitionId); + int currentlyActiveMemberCount = clusterLevelNetworkPartitionContext.getActiveMemberCount(currentPartitionId); if (currentlyActiveMemberCount > currentPartition.getPartitionMin()) { // current partition is free if (log.isDebugEnabled()) @@ -133,7 +133,7 @@ public class RoundRobin implements AutoscaleAlgorithm{ if (log.isDebugEnabled()) log.debug("No partition found for scale down at network partition " + - networkPartitionContext.getId()); + clusterLevelNetworkPartitionContext.getId()); // none of the partitions were free. } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java index 4dcff2a..31f5763 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java @@ -78,7 +78,8 @@ public class ApplicationBuilder { ApplicationsEventPublisher.sendApplicationCreatedEvent(application); } - public static void handleApplicationInstanceCreatedEvent(String appId, String instanceId) { + public static void handleApplicationInstanceCreatedEvent(String appId, String instanceId, + String networkPartitionId) { if (log.isDebugEnabled()) { log.debug("Handling application activation event: [application-id] " + appId); } @@ -99,6 +100,7 @@ public class ApplicationBuilder { //setting the status, persist and publish ApplicationInstanceContext context = new ApplicationInstanceContext(appId, instanceId); context.setStatus(status); + context.setNetworkPartitionId(networkPartitionId); application.addInstanceContext(instanceId, context); //updateApplicationMonitor(appId, status); ApplicationHolder.persistApplication(application); http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java index 63e7055..6d91db3 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java @@ -546,7 +546,13 @@ public class AutoscalerTopologyEventReceiver implements Runnable { log.debug("application monitor is going to be started for [application] " + appId); } - applicationMonitor = ApplicationMonitorFactory.getApplicationMonitor(appId); + try { + applicationMonitor = ApplicationMonitorFactory.getApplicationMonitor(appId); + } catch (PolicyValidationException e) { + String msg = "Application monitor creation failed for Application: "; + log.warn(msg, e); + retries--; + } long end = System.currentTimeMillis(); log.info("Time taken to start app monitor: " + (end - start) / 1000); success = true; http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java index 77832b0..1c563ee 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java @@ -20,6 +20,12 @@ package org.apache.stratos.autoscaler.monitor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.stratos.autoscaler.Constants; +import org.apache.stratos.autoscaler.ClusterLevelNetworkPartitionContext; +import org.apache.stratos.autoscaler.ParentComponentLevelNetworkPartitionContext; +import org.apache.stratos.autoscaler.algorithm.AutoscaleAlgorithm; +import org.apache.stratos.autoscaler.algorithm.OneAfterAnother; +import org.apache.stratos.autoscaler.algorithm.RoundRobin; import org.apache.stratos.autoscaler.applications.ApplicationHolder; import org.apache.stratos.autoscaler.applications.dependency.DependencyBuilder; import org.apache.stratos.autoscaler.applications.dependency.DependencyTree; @@ -27,7 +33,6 @@ import org.apache.stratos.autoscaler.applications.dependency.context.Application import org.apache.stratos.autoscaler.applications.dependency.context.ClusterChildContext; import org.apache.stratos.autoscaler.applications.dependency.context.GroupChildContext; import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder; -import org.apache.stratos.autoscaler.client.CloudControllerClient; import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher; import org.apache.stratos.autoscaler.exception.DependencyBuilderException; import org.apache.stratos.autoscaler.exception.PartitionValidationException; @@ -62,11 +67,15 @@ public abstract class ParentComponentMonitor extends Monitor { protected List<String> inactiveMonitorsList; //terminating monitors list protected List<String> terminatingMonitorsList; + //network partition contexts + protected Map<String, ParentComponentLevelNetworkPartitionContext> networkPartitionCtxts; + public ParentComponentMonitor(ParentComponent component) throws DependencyBuilderException { aliasToActiveMonitorsMap = new HashMap<String, Monitor>(); inactiveMonitorsList = new ArrayList<String>(); terminatingMonitorsList = new ArrayList<String>(); + networkPartitionCtxts = new HashMap<String, ParentComponentLevelNetworkPartitionContext>(); //clusterIdToClusterMonitorsMap = new HashMap<String, AbstractClusterMonitor>(); this.id = component.getUniqueIdentifier(); //Building the startup dependencies for this monitor within the immediate children @@ -496,6 +505,27 @@ public abstract class ParentComponentMonitor extends Monitor { this.terminatingMonitorsList = terminatingMonitorsList; } + public Map<String, ParentComponentLevelNetworkPartitionContext> getNetworkPartitionCtxts() { + return networkPartitionCtxts; + } + + public void setNetworkPartitionCtxts(Map<String, ParentComponentLevelNetworkPartitionContext> networkPartitionCtxts) { + this.networkPartitionCtxts = networkPartitionCtxts; + } + + public void addNetworkPartitionContext(ParentComponentLevelNetworkPartitionContext clusterLevelNetworkPartitionContext) { + this.networkPartitionCtxts.put(clusterLevelNetworkPartitionContext.getId(), clusterLevelNetworkPartitionContext); + } + + public InstanceContext getInstanceContext(String instanceId) { + for(ParentComponentLevelNetworkPartitionContext context : this.networkPartitionCtxts.values()) { + if(context.getInstanceIdToInstanceContextMap().containsKey(instanceId)) { + return context.getInstanceIdToInstanceContextMap().get(instanceId); + } + } + return null; + } + private class MonitorAdder implements Runnable { private ApplicationChildContext context; private ParentComponentMonitor parent; @@ -566,4 +596,24 @@ public abstract class ParentComponentMonitor extends Monitor { } } + public AutoscaleAlgorithm getAutoscaleAlgorithm(String partitionAlgorithm) { + AutoscaleAlgorithm autoscaleAlgorithm = null; + if (log.isDebugEnabled()) { + log.debug(String.format("Partition algorithm is ", partitionAlgorithm)); + } + if (Constants.ROUND_ROBIN_ALGORITHM_ID.equals(partitionAlgorithm)) { + + autoscaleAlgorithm = new RoundRobin(); + } else if (Constants.ONE_AFTER_ANOTHER_ALGORITHM_ID.equals(partitionAlgorithm)) { + + autoscaleAlgorithm = new OneAfterAnother(); + } else { + if (log.isErrorEnabled()) { + log.error(String.format("Partition algorithm %s could not be identified !", partitionAlgorithm)); + } + } + return autoscaleAlgorithm; + } + + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/stratos/blob/746bdc10/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java index 6d9ffdc..096cf06 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java @@ -20,8 +20,10 @@ package org.apache.stratos.autoscaler.monitor.application; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.stratos.autoscaler.ParentComponentLevelNetworkPartitionContext; import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder; import org.apache.stratos.autoscaler.exception.DependencyBuilderException; +import org.apache.stratos.autoscaler.exception.PolicyValidationException; import org.apache.stratos.autoscaler.exception.TopologyInConsistentException; import org.apache.stratos.autoscaler.monitor.Monitor; import org.apache.stratos.autoscaler.monitor.MonitorStatusEventBuilder; @@ -29,6 +31,9 @@ import org.apache.stratos.autoscaler.monitor.ParentComponentMonitor; import org.apache.stratos.autoscaler.monitor.events.ApplicationStatusEvent; import org.apache.stratos.autoscaler.monitor.events.MonitorScalingEvent; import org.apache.stratos.autoscaler.monitor.events.MonitorStatusEvent; +import org.apache.stratos.autoscaler.partition.PartitionGroup; +import org.apache.stratos.autoscaler.policy.PolicyManager; +import org.apache.stratos.autoscaler.policy.model.DeploymentPolicy; import org.apache.stratos.messaging.domain.applications.Application; import org.apache.stratos.messaging.domain.applications.ApplicationStatus; import org.apache.stratos.messaging.domain.applications.GroupStatus; @@ -51,7 +56,7 @@ public class ApplicationMonitor extends ParentComponentMonitor { //setting the appId for the application this.appId = application.getUniqueIdentifier(); //starting the first set of dependencies from its children - startMinimumDependencies(application); + //TODO startMinimumDependencies(application); } @@ -166,8 +171,8 @@ public class ApplicationMonitor extends ParentComponentMonitor { } - private void startMinimumDependencies(Application application) - throws TopologyInConsistentException { + public void startMinimumDependencies(Application application) + throws TopologyInConsistentException, PolicyValidationException { //There will be one application instance if (application.getInstanceContextCount() > 0) { startDependency(application); @@ -178,16 +183,44 @@ public class ApplicationMonitor extends ParentComponentMonitor { } private void createInstanceAndStartDependency(Application application) - throws TopologyInConsistentException { - String instanceId = createApplicationInstance(application); + throws TopologyInConsistentException, PolicyValidationException { List<String> instanceIds = new ArrayList<String>(); - instanceIds.add(instanceId); + String deploymentPolicyName = application.getDeploymentPolicy(); + if (deploymentPolicyName == null) { + String msg = "Deployment Policy is not specified to the [Application]:" + appId; + log.error(msg); + throw new PolicyValidationException(msg); + } + + DeploymentPolicy deploymentPolicy = + PolicyManager.getInstance() + .getDeploymentPolicy(deploymentPolicyName); + if (deploymentPolicy == null) { + if (deploymentPolicy == null) { + String msg = "Deployment policy is null: [policy-name] " + deploymentPolicyName; + log.error(msg); + throw new PolicyValidationException(msg); + } + } + String instanceId; + for (PartitionGroup partitionGroup : deploymentPolicy.getPartitionGroups()) { + instanceId = createApplicationInstance(application, partitionGroup.getId()); + ParentComponentLevelNetworkPartitionContext context = new ParentComponentLevelNetworkPartitionContext(partitionGroup.getId(), + partitionGroup.getPartitionAlgo(), + partitionGroup.getPartitions()); + context.addInstanceContext(application.getInstanceContexts(instanceId)); + this.addNetworkPartitionContext(context); + + instanceIds.add(instanceId); + } startDependency(application, instanceIds); + + } - private String createApplicationInstance(Application application) { + private String createApplicationInstance(Application application, String networkPartitionId) { String instanceId = this.generateInstanceId(application); - ApplicationBuilder.handleApplicationInstanceCreatedEvent(appId, instanceId); + ApplicationBuilder.handleApplicationInstanceCreatedEvent(appId, instanceId, networkPartitionId); return instanceId; }
