http://git-wip-us.apache.org/repos/asf/stratos/blob/4f2c1b70/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMServiceClusterMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMServiceClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMServiceClusterMonitor.java index 25836b7..83d5374 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMServiceClusterMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMServiceClusterMonitor.java @@ -21,14 +21,14 @@ package org.apache.stratos.autoscaler.monitor.cluster; import org.apache.commons.configuration.XMLConfiguration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.stratos.autoscaler.context.cluster.AbstractClusterContext; +import org.apache.stratos.autoscaler.context.cluster.ClusterInstanceContext; import org.apache.stratos.autoscaler.context.cluster.VMClusterContext; -import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetworkPartitionContext; import org.apache.stratos.autoscaler.context.partition.ClusterLevelPartitionContext; +import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetworkPartitionContext; import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher; -import org.apache.stratos.autoscaler.monitor.events.builder.MonitorStatusEventBuilder; import org.apache.stratos.autoscaler.monitor.events.MonitorScalingEvent; import org.apache.stratos.autoscaler.monitor.events.MonitorStatusEvent; +import org.apache.stratos.autoscaler.monitor.events.builder.MonitorStatusEventBuilder; import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator; import org.apache.stratos.autoscaler.util.AutoScalerConstants; import org.apache.stratos.autoscaler.util.ConfUtil; @@ -40,9 +40,8 @@ import org.apache.stratos.messaging.domain.applications.ApplicationStatus; import org.apache.stratos.messaging.domain.applications.GroupStatus; import java.util.ArrayList; +import java.util.Collection; import java.util.List; -import java.util.Map; -import java.util.Set; /** * Is responsible for monitoring a service cluster which is based on VMs. This runs periodically @@ -58,9 +57,9 @@ public class VMServiceClusterMonitor extends VMClusterMonitor { public VMServiceClusterMonitor(String serviceType, String clusterId) { super(serviceType, clusterId, new AutoscalerRuleEvaluator( - StratosConstants.VM_MIN_CHECK_DROOL_FILE, - StratosConstants.VM_OBSOLETE_CHECK_DROOL_FILE, - StratosConstants.VM_SCALE_CHECK_DROOL_FILE)); + StratosConstants.VM_MIN_CHECK_DROOL_FILE, + StratosConstants.VM_OBSOLETE_CHECK_DROOL_FILE, + StratosConstants.VM_SCALE_CHECK_DROOL_FILE)); readConfigurations(); } @@ -71,10 +70,10 @@ public class VMServiceClusterMonitor extends VMClusterMonitor { /* TODO ***********if (((getStatus().getCode() <= ClusterStatus.Active.getCode()) || (getStatus() == ClusterStatus.Inactive && !hasStartupDependents)) && !this.hasFaultyMember && !stop) {*/ - if (log.isDebugEnabled()) { - log.debug("Cluster monitor is running.. " + this.toString()); - } - monitor(); + if (log.isDebugEnabled()) { + log.debug("Cluster monitor is running.. " + this.toString()); + } + monitor(); /*} else { if (log.isDebugEnabled()) { log.debug("Cluster monitor is suspended as the cluster is in " + @@ -113,98 +112,107 @@ public class VMServiceClusterMonitor extends VMClusterMonitor { } public void monitor() { - - Set<Map.Entry<String, AbstractClusterContext>> instanceIdToClusterCtxtEntries = instanceIdToClusterContextMap.entrySet(); - for (final Map.Entry<String, AbstractClusterContext> instanceIdToClusterCtxtEntry : instanceIdToClusterCtxtEntries) { - Runnable monitoringRunnable = new Runnable() { - @Override - public void run() { - for (ClusterLevelNetworkPartitionContext networkPartitionContext : - getNetworkPartitionCtxts(instanceIdToClusterCtxtEntry.getKey()).values()) { - // store primary members in the network partition context - List<String> primaryMemberListInNetworkPartition = new ArrayList<String>(); - //minimum check per partition - for (ClusterLevelPartitionContext partitionContext : networkPartitionContext.getPartitionCtxts().values()) { - // store primary members in the partition context - List<String> primaryMemberListInPartition = new ArrayList<String>(); - // get active primary members in this partition context - for (MemberContext memberContext : partitionContext.getActiveMembers()) { - if (isPrimaryMember(memberContext)) { - primaryMemberListInPartition.add(memberContext.getMemberId()); + final Collection<ClusterLevelNetworkPartitionContext> clusterLevelNetworkPartitionContexts = + ((VMClusterContext) this.clusterContext).getNetworkPartitionCtxts().values(); + Runnable monitoringRunnable = new Runnable() { + @Override + public void run() { + for (ClusterLevelNetworkPartitionContext networkPartitionContext : + clusterLevelNetworkPartitionContexts) { + // store primary members in the network partition context + List<String> primaryMemberListInNetworkPartition = new ArrayList<String>(); + //minimum check per partition + for (ClusterInstanceContext instanceContext : networkPartitionContext. + getClusterInstanceContextMap().values()) { + //FIXME to check the status of the instance + if (true) { + for (ClusterLevelPartitionContext partitionContext : + instanceContext.getPartitionCtxts().values()) { + // store primary members in the partition context + List<String> primaryMemberListInPartition = new ArrayList<String>(); + // get active primary members in this partition context + for (MemberContext memberContext : partitionContext.getActiveMembers()) { + if (isPrimaryMember(memberContext)) { + primaryMemberListInPartition.add(memberContext.getMemberId()); + } } - } - // get pending primary members in this partition context - for (MemberContext memberContext : partitionContext.getPendingMembers()) { - if (isPrimaryMember(memberContext)) { - primaryMemberListInPartition.add(memberContext.getMemberId()); + // get pending primary members in this partition context + for (MemberContext memberContext : partitionContext.getPendingMembers()) { + if (isPrimaryMember(memberContext)) { + primaryMemberListInPartition.add(memberContext.getMemberId()); + } + } + primaryMemberListInNetworkPartition.addAll(primaryMemberListInPartition); + getMinCheckKnowledgeSession().setGlobal("clusterId", getClusterId()); + getMinCheckKnowledgeSession().setGlobal("lbRef", lbReferenceType); + getMinCheckKnowledgeSession().setGlobal("isPrimary", hasPrimary); + getMinCheckKnowledgeSession().setGlobal("instanceId", + instanceContext.getId()); + + if (log.isDebugEnabled()) { + log.debug(String.format("Running minimum check for partition %s ", + partitionContext.getPartitionId())); } - } - primaryMemberListInNetworkPartition.addAll(primaryMemberListInPartition); - getMinCheckKnowledgeSession().setGlobal("clusterId", getClusterId()); - getMinCheckKnowledgeSession().setGlobal("lbRef", lbReferenceType); - getMinCheckKnowledgeSession().setGlobal("isPrimary", hasPrimary); - getMinCheckKnowledgeSession().setGlobal("instanceId", instanceIdToClusterCtxtEntry.getKey()); - - if (log.isDebugEnabled()) { - log.debug(String.format("Running minimum check for partition %s ", partitionContext.getPartitionId())); - } - - minCheckFactHandle = AutoscalerRuleEvaluator.evaluateMinCheck(getMinCheckKnowledgeSession() - , minCheckFactHandle, partitionContext); - - obsoleteCheckFactHandle = AutoscalerRuleEvaluator.evaluateObsoleteCheck(getObsoleteCheckKnowledgeSession(), - obsoleteCheckFactHandle, partitionContext); - - //checking the status of the cluster - - - } - boolean rifReset = networkPartitionContext.isRifReset(); - boolean memoryConsumptionReset = networkPartitionContext.isMemoryConsumptionReset(); - boolean loadAverageReset = networkPartitionContext.isLoadAverageReset(); - if (log.isDebugEnabled()) { - log.debug("flag of rifReset: " + rifReset + " flag of memoryConsumptionReset" + memoryConsumptionReset - + " flag of loadAverageReset" + loadAverageReset); - } - if (rifReset || memoryConsumptionReset || loadAverageReset) { + minCheckFactHandle = AutoscalerRuleEvaluator. + evaluateMinCheck(getMinCheckKnowledgeSession() + , minCheckFactHandle, partitionContext); + obsoleteCheckFactHandle = AutoscalerRuleEvaluator. + evaluateObsoleteCheck(getObsoleteCheckKnowledgeSession(), + obsoleteCheckFactHandle, partitionContext); - VMClusterContext vmClusterContext = (VMClusterContext) instanceIdToClusterCtxtEntry.getValue(); + //checking the status of the cluster - getScaleCheckKnowledgeSession().setGlobal("instanceId", instanceIdToClusterCtxtEntry.getKey()); - getScaleCheckKnowledgeSession().setGlobal("clusterId", getClusterId()); - getScaleCheckKnowledgeSession().setGlobal("autoscalePolicy", vmClusterContext.getAutoscalePolicy()); - getScaleCheckKnowledgeSession().setGlobal("rifReset", rifReset); - getScaleCheckKnowledgeSession().setGlobal("mcReset", memoryConsumptionReset); - getScaleCheckKnowledgeSession().setGlobal("laReset", loadAverageReset); - getScaleCheckKnowledgeSession().setGlobal("lbRef", lbReferenceType); - getScaleCheckKnowledgeSession().setGlobal("isPrimary", false); - getScaleCheckKnowledgeSession().setGlobal("primaryMembers", primaryMemberListInNetworkPartition); + boolean rifReset = instanceContext.isRifReset(); + boolean memoryConsumptionReset = instanceContext.isMemoryConsumptionReset(); + boolean loadAverageReset = instanceContext.isLoadAverageReset(); - if (log.isDebugEnabled()) { - log.debug(String.format("Running scale check for network partition %s ", networkPartitionContext.getId())); - log.debug(" Primary members : " + primaryMemberListInNetworkPartition); + if (log.isDebugEnabled()) { + log.debug("flag of rifReset: " + rifReset + " flag of memoryConsumptionReset" + memoryConsumptionReset + + " flag of loadAverageReset" + loadAverageReset); + } + if (rifReset || memoryConsumptionReset || loadAverageReset) { + + + VMClusterContext vmClusterContext = (VMClusterContext) clusterContext; + + getScaleCheckKnowledgeSession().setGlobal("instanceId", + instanceContext.getId()); + getScaleCheckKnowledgeSession().setGlobal("clusterId", getClusterId()); + getScaleCheckKnowledgeSession().setGlobal("autoscalePolicy", vmClusterContext.getAutoscalePolicy()); + getScaleCheckKnowledgeSession().setGlobal("rifReset", rifReset); + getScaleCheckKnowledgeSession().setGlobal("mcReset", memoryConsumptionReset); + getScaleCheckKnowledgeSession().setGlobal("laReset", loadAverageReset); + getScaleCheckKnowledgeSession().setGlobal("lbRef", lbReferenceType); + getScaleCheckKnowledgeSession().setGlobal("isPrimary", false); + getScaleCheckKnowledgeSession().setGlobal("primaryMembers", primaryMemberListInNetworkPartition); + + if (log.isDebugEnabled()) { + log.debug(String.format("Running scale check for network partition %s ", networkPartitionContext.getId())); + log.debug(" Primary members : " + primaryMemberListInNetworkPartition); + } + + scaleCheckFactHandle = AutoscalerRuleEvaluator.evaluateScaleCheck(getScaleCheckKnowledgeSession() + , scaleCheckFactHandle, networkPartitionContext); + + instanceContext.setRifReset(false); + instanceContext.setMemoryConsumptionReset(false); + instanceContext.setLoadAverageReset(false); + } else if (log.isDebugEnabled()) { + log.debug(String.format("Scale rule will not run since the LB statistics have not received before this " + + "cycle for network partition %s", networkPartitionContext.getId())); + } } - scaleCheckFactHandle = AutoscalerRuleEvaluator.evaluateScaleCheck(getScaleCheckKnowledgeSession() - , scaleCheckFactHandle, networkPartitionContext); - - networkPartitionContext.setRifReset(false); - networkPartitionContext.setMemoryConsumptionReset(false); - networkPartitionContext.setLoadAverageReset(false); - } else if (log.isDebugEnabled()) { - log.debug(String.format("Scale rule will not run since the LB statistics have not received before this " + - "cycle for network partition %s", networkPartitionContext.getId())); } - } } - }; - monitoringRunnable.run(); - } + } + }; + monitoringRunnable.run(); } @Override @@ -279,16 +287,18 @@ public class VMServiceClusterMonitor extends VMClusterMonitor { @Override public void onParentScalingEvent(MonitorScalingEvent scalingEvent) { - if(log.isDebugEnabled()){ + if (log.isDebugEnabled()) { log.debug("Parent scaling event received to [cluster]: " + this.getClusterId() - + ", [network partition]: " + scalingEvent.getNetworkPartitionId() + + ", [network partition]: " + scalingEvent.getNetworkPartitionId() + ", [event] " + scalingEvent.getId() + ", [group instance] " + scalingEvent.getInstanceId()); } this.scalingFactorBasedOnDependencies = scalingEvent.getFactor(); - VMClusterContext vmClusterContext = (VMClusterContext) instanceIdToClusterContextMap.get(scalingEvent.getInstanceId()); + VMClusterContext vmClusterContext = (VMClusterContext) clusterContext; + String instanceId = scalingEvent.getInstanceId(); - ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext = getNetworkPartitionCtxt(null, scalingEvent.getNetworkPartitionId()); + ClusterInstanceContext clusterLevelNetworkPartitionContext = + getClusterInstanceContext(scalingEvent.getNetworkPartitionId(), instanceId); //TODO get min instance count from instance context
http://git-wip-us.apache.org/repos/asf/stratos/blob/4f2c1b70/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java index 58a02a6..b332b15 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java @@ -200,53 +200,66 @@ public class ApplicationMonitor extends ParentComponentMonitor { List<String> instanceIds = new ArrayList<String>(); DeploymentPolicy deploymentPolicy = getDeploymentPolicy(application); String instanceId; - for (ApplicationLevelNetworkPartition networkPartition : deploymentPolicy.getApplicationLevelNetworkPartitions()) { - if (networkPartition.isActiveByDefault()) { - ApplicationLevelNetworkPartitionContext context = - new ApplicationLevelNetworkPartitionContext(networkPartition.getId()); - instanceId = createApplicationInstance(application, networkPartition.getId()); - context.addInstanceContext(application.getInstanceContexts(instanceId)); - - this.networkPartitionCtxts.put(context.getId(), context); - - instanceIds.add(instanceId); - log.info("Application instance has been added for the [network partition] " + - networkPartition.getId() + " [appInstanceId] " + instanceId); - } - } - startDependency(application, instanceIds); + if(deploymentPolicy == null) { + //FIXME for docker with deployment policy + instanceId = createApplicationInstance(application, null); + instanceIds.add(instanceId); + } else { + for (ApplicationLevelNetworkPartition networkPartition : + deploymentPolicy.getApplicationLevelNetworkPartitions()) { + if (networkPartition.isActiveByDefault()) { + ApplicationLevelNetworkPartitionContext context = + new ApplicationLevelNetworkPartitionContext(networkPartition.getId()); + instanceId = createApplicationInstance(application, networkPartition.getId()); + context.addInstanceContext(application.getInstanceContexts(instanceId)); + + this.networkPartitionCtxts.put(context.getId(), context); + instanceIds.add(instanceId); + log.info("Application instance has been added for the [network partition] " + + networkPartition.getId() + " [appInstanceId] " + instanceId); + } + } + } + startDependency(application, instanceIds); } public void createInstanceOnBurstingForApplication() throws TopologyInConsistentException, PolicyValidationException, ParentMonitorNotFoundException { - //TODO get lock Application application = ApplicationHolder.getApplications().getApplication(appId); if (application == null) { String msg = "Application cannot be found in the Topology."; throw new TopologyInConsistentException(msg); } + boolean burstNPFound = false; DeploymentPolicy deploymentPolicy = getDeploymentPolicy(application); String instanceId = null; //Find out the inActive network partition - boolean burstNPFound = false; - for (ApplicationLevelNetworkPartition networkPartition : deploymentPolicy.getApplicationLevelNetworkPartitions()) { - if (!networkPartition.isActiveByDefault()) { - if (!this.networkPartitionCtxts.containsKey(networkPartition.getId())) { - ApplicationLevelNetworkPartitionContext context = - new ApplicationLevelNetworkPartitionContext(networkPartition.getId()); - context.setCreatedOnBurst(true); - instanceId = createApplicationInstance(application, networkPartition.getId()); - context.addInstanceContext(application.getInstanceContexts(instanceId)); - this.networkPartitionCtxts.put(context.getId(), context); - burstNPFound = true; + if(deploymentPolicy == null) { + //FIXME for docker with deployment policy + instanceId = createApplicationInstance(application, null); + + } else { + for (ApplicationLevelNetworkPartition networkPartition : deploymentPolicy. + getApplicationLevelNetworkPartitions()) { + if (!networkPartition.isActiveByDefault()) { + if (!this.networkPartitionCtxts.containsKey(networkPartition.getId())) { + ApplicationLevelNetworkPartitionContext context = + new ApplicationLevelNetworkPartitionContext(networkPartition.getId()); + context.setCreatedOnBurst(true); + instanceId = createApplicationInstance(application, networkPartition.getId()); + context.addInstanceContext(application.getInstanceContexts(instanceId)); + this.networkPartitionCtxts.put(context.getId(), context); + burstNPFound = true; + } } } } + if (!burstNPFound) { log.warn("[Application] " + appId + " cannot be burst as no available resources found"); } else { @@ -257,22 +270,21 @@ public class ApplicationMonitor extends ParentComponentMonitor { private DeploymentPolicy getDeploymentPolicy(Application application) throws PolicyValidationException { String deploymentPolicyName = application.getDeploymentPolicy(); - if (deploymentPolicyName == null) { + /*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) { +*/ DeploymentPolicy deploymentPolicy = null; + if(deploymentPolicyName != null) { + deploymentPolicy = PolicyManager.getInstance() + .getDeploymentPolicy(deploymentPolicyName); if (deploymentPolicy == null) { String msg = "Deployment policy is null: [policy-name] " + deploymentPolicyName; log.error(msg); throw new PolicyValidationException(msg); } - } + } return deploymentPolicy; } http://git-wip-us.apache.org/repos/asf/stratos/blob/4f2c1b70/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ApplicationLevelNetworkPartition.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ApplicationLevelNetworkPartition.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ApplicationLevelNetworkPartition.java index ee6c877..3e7d6e6 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ApplicationLevelNetworkPartition.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ApplicationLevelNetworkPartition.java @@ -85,4 +85,13 @@ public class ApplicationLevelNetworkPartition implements Serializable{ public void setActiveByDefault(boolean activeByDefault) { this.activeByDefault = activeByDefault; } + + public Partition getPartition(String partitionId) { + for(Partition partition : partitions) { + if(partition.getId().equals(partitionId)) { + return partition; + } + } + return null; + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/4f2c1b70/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ChildLevelNetworkPartition.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ChildLevelNetworkPartition.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ChildLevelNetworkPartition.java index a8d6707..83af824 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ChildLevelNetworkPartition.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/deployment/partition/network/ChildLevelNetworkPartition.java @@ -92,4 +92,5 @@ public class ChildLevelNetworkPartition implements Serializable { public void setChildLevelPartitions(ChildLevelPartition[] childLevelPartitions) { this.childLevelPartitions = childLevelPartitions; } + } http://git-wip-us.apache.org/repos/asf/stratos/blob/4f2c1b70/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java index 50c59b8..330036a 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java @@ -28,7 +28,9 @@ import org.apache.stratos.autoscaler.algorithm.OneAfterAnother; import org.apache.stratos.autoscaler.algorithm.RoundRobin; import org.apache.stratos.autoscaler.client.CloudControllerClient; import org.apache.stratos.autoscaler.client.InstanceNotificationClient; +import org.apache.stratos.autoscaler.context.cluster.ClusterInstanceContext; import org.apache.stratos.autoscaler.context.cluster.KubernetesClusterContext; +import org.apache.stratos.autoscaler.context.cluster.VMClusterContext; import org.apache.stratos.autoscaler.context.member.MemberStatsContext; import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetworkPartitionContext; import org.apache.stratos.autoscaler.context.partition.ClusterLevelPartitionContext; @@ -185,11 +187,10 @@ public class RuleTasksDelegator { //Calculate accumulation of minimum counts of all the partition of current network partition int minimumCountOfNetworkPartition = 0; VMClusterMonitor vmClusterMonitor = (VMClusterMonitor) AutoscalerContext.getInstance().getClusterMonitor(clusterId); - for (ClusterLevelPartitionContext partitionContextOfCurrentNetworkClusterMonitorPartition : vmClusterMonitor.getNetworkPartitionCtxt(instanceId, nwPartitionId). - getPartitionCtxts().values()) { - - minimumCountOfNetworkPartition += partitionContextOfCurrentNetworkClusterMonitorPartition.getMinimumMemberCount(); - } + VMClusterContext clusterContext = (VMClusterContext) vmClusterMonitor.getClusterContext(); + ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext = clusterContext.getNetworkPartitionCtxt(nwPartitionId); + ClusterInstanceContext clusterInstanceContext = clusterLevelNetworkPartitionContext.getClusterInstanceContext(instanceId); + minimumCountOfNetworkPartition = clusterInstanceContext.getMinInstanceCount(); MemberContext memberContext = CloudControllerClient.getInstance() .spawnAnInstance(clusterMonitorPartitionContext.getPartition(), @@ -477,11 +478,11 @@ public class RuleTasksDelegator { return (int) Math.ceil(predictedValue); } - public double getLoadAveragePredictedValue(ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext) { + public double getLoadAveragePredictedValue(String instanceId, ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext) { double loadAveragePredicted = 0.0d; int totalMemberCount = 0; - - for (ClusterLevelPartitionContext partitionContext : clusterLevelNetworkPartitionContext.getPartitionCtxts().values()) { + ClusterInstanceContext clusterInstanceContext = clusterLevelNetworkPartitionContext.getClusterInstanceContext(instanceId); + for (ClusterLevelPartitionContext partitionContext : clusterInstanceContext.getPartitionCtxts().values()) { for (MemberStatsContext memberStatsContext : partitionContext.getMemberStatsContexts().values()) { float memberAverageLoadAverage = memberStatsContext.getLoadAverage().getAverage(); @@ -505,11 +506,11 @@ public class RuleTasksDelegator { } } - public double getMemoryConsumptionPredictedValue(ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext) { + public double getMemoryConsumptionPredictedValue(String instanceId, ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext) { double memoryConsumptionPredicted = 0.0d; int totalMemberCount = 0; - - for (ClusterLevelPartitionContext partitionContext : clusterLevelNetworkPartitionContext.getPartitionCtxts().values()) { + ClusterInstanceContext clusterInstanceContext = clusterLevelNetworkPartitionContext.getClusterInstanceContext(instanceId); + for (ClusterLevelPartitionContext partitionContext : clusterInstanceContext.getPartitionCtxts().values()) { for (MemberStatsContext memberStatsContext : partitionContext.getMemberStatsContexts().values()) { float memberMemoryConsumptionAverage = memberStatsContext.getMemoryConsumption().getAverage(); http://git-wip-us.apache.org/repos/asf/stratos/blob/4f2c1b70/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusChecker.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusChecker.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusChecker.java index 1645cad..daff8ba 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusChecker.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusChecker.java @@ -172,7 +172,7 @@ public class StatusChecker { */ private boolean clusterActive(VMClusterMonitor monitor) { boolean clusterActive = false; - for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext : monitor.getAllNetworkPartitionCtxts().values()) { + /*for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext : monitor.getAllNetworkPartitionCtxts().values()) { //minimum check per partition for (ClusterLevelPartitionContext clusterMonitorPartitionContext : clusterLevelNetworkPartitionContext.getPartitionCtxts().values()) { if (clusterMonitorPartitionContext.getMinimumMemberCount() == clusterMonitorPartitionContext.getActiveMemberCount()) { @@ -184,7 +184,7 @@ public class StatusChecker { return false; } } - } + }*/ return clusterActive; } @@ -198,13 +198,13 @@ public class StatusChecker { boolean hasMember = false; for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext : monitor.getAllNetworkPartitionCtxts().values()) { //minimum check per partition - for (ClusterLevelPartitionContext partitionContext : clusterLevelNetworkPartitionContext.getPartitionCtxts().values()) { + /*for (ClusterLevelPartitionContext partitionContext : clusterLevelNetworkPartitionContext.getPartitionCtxts().values()) { if (partitionContext.getNonTerminatedMemberCount() > 0) { hasMember = true; } else { hasMember = false; } - } + }*/ } return hasMember; } @@ -262,13 +262,13 @@ public class StatusChecker { private boolean getClusterInactive(VMClusterMonitor monitor, String partitionId) { boolean clusterInActive = false; for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext : monitor.getAllNetworkPartitionCtxts().values()) { - for (ClusterLevelPartitionContext partition : clusterLevelNetworkPartitionContext.getPartitionCtxts().values()) { + /*for (ClusterLevelPartitionContext partition : clusterLevelNetworkPartitionContext.getPartitionCtxts().values()) { if (partitionId.equals(partition.getPartitionId()) && partition.getActiveMemberCount() <= partition.getMinimumMemberCount()) { clusterInActive = true; return clusterInActive; } - } + }*/ } return clusterInActive; http://git-wip-us.apache.org/repos/asf/stratos/blob/4f2c1b70/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java index 4b745f2..d6dc59e 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java @@ -21,6 +21,8 @@ package org.apache.stratos.autoscaler.status.processor.cluster; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.autoscaler.context.AutoscalerContext; +import org.apache.stratos.autoscaler.context.cluster.ClusterInstanceContext; +import org.apache.stratos.autoscaler.context.cluster.VMClusterContext; import org.apache.stratos.autoscaler.context.partition.ClusterLevelPartitionContext; import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetworkPartitionContext; import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher; @@ -65,9 +67,10 @@ public class ClusterStatusActiveProcessor extends ClusterStatusProcessor { VMClusterMonitor monitor = (VMClusterMonitor) AutoscalerContext.getInstance(). getClusterMonitor(clusterId); boolean clusterActive = false; - for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext : monitor.getNetworkPartitionCtxts(instanceId).values()) { + for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext : monitor.getNetworkPartitionCtxts()) { //minimum check per partition - for (ClusterLevelPartitionContext clusterMonitorPartitionContext : clusterLevelNetworkPartitionContext.getPartitionCtxts().values()) { + ClusterInstanceContext instanceContext = clusterLevelNetworkPartitionContext.getClusterInstanceContext(instanceId); + for (ClusterLevelPartitionContext clusterMonitorPartitionContext : instanceContext.getPartitionCtxts().values()) { if (clusterMonitorPartitionContext.getMinimumMemberCount() == clusterMonitorPartitionContext.getActiveMemberCount()) { clusterActive = true; } else if (clusterMonitorPartitionContext.getActiveMemberCount() > clusterMonitorPartitionContext.getMinimumMemberCount()) { http://git-wip-us.apache.org/repos/asf/stratos/blob/4f2c1b70/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java index b536371..01daa54 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInActiveProcessor.java @@ -21,6 +21,7 @@ package org.apache.stratos.autoscaler.status.processor.cluster; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.autoscaler.context.AutoscalerContext; +import org.apache.stratos.autoscaler.context.cluster.ClusterInstanceContext; import org.apache.stratos.autoscaler.context.partition.ClusterLevelPartitionContext; import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetworkPartitionContext; import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher; @@ -65,7 +66,7 @@ public class ClusterStatusInActiveProcessor extends ClusterStatusProcessor { getClusterMonitor(clusterId); boolean clusterInActive; - clusterInActive = getClusterInactive(monitor); + clusterInActive = getClusterInactive(instanceId, monitor); if(clusterInActive) { //if the monitor is dependent, temporarily pausing it if (monitor.hasStartupDependents()) { @@ -89,10 +90,11 @@ public class ClusterStatusInActiveProcessor extends ClusterStatusProcessor { return clusterInActive; } - private boolean getClusterInactive(VMClusterMonitor monitor) { + private boolean getClusterInactive(String instanceId, VMClusterMonitor monitor) { boolean clusterInActive = false; for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext : monitor.getAllNetworkPartitionCtxts().values()) { - for (ClusterLevelPartitionContext partition : clusterLevelNetworkPartitionContext.getPartitionCtxts().values()) { + ClusterInstanceContext instanceContext = clusterLevelNetworkPartitionContext.getClusterInstanceContext(instanceId); + for (ClusterLevelPartitionContext partition : instanceContext.getPartitionCtxts().values()) { if (partition.getActiveMemberCount() <= partition.getMinimumMemberCount()) { clusterInActive = true; return clusterInActive; http://git-wip-us.apache.org/repos/asf/stratos/blob/4f2c1b70/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java index 706ad9d..ec3528f 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java @@ -21,6 +21,7 @@ package org.apache.stratos.autoscaler.status.processor.cluster; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.autoscaler.context.AutoscalerContext; +import org.apache.stratos.autoscaler.context.cluster.ClusterInstanceContext; import org.apache.stratos.autoscaler.context.partition.ClusterLevelPartitionContext; import org.apache.stratos.autoscaler.context.partition.network.ClusterLevelNetworkPartitionContext; import org.apache.stratos.autoscaler.applications.ApplicationHolder; @@ -122,13 +123,18 @@ public class ClusterStatusTerminatedProcessor extends ClusterStatusProcessor { boolean hasMember = false; for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext : monitor.getAllNetworkPartitionCtxts().values()) { //minimum check per partition - for (ClusterLevelPartitionContext partitionContext : clusterLevelNetworkPartitionContext.getPartitionCtxts().values()) { - if (partitionContext.getNonTerminatedMemberCount() > 0) { - hasMember = true; - } else { - hasMember = false; + for(ClusterInstanceContext clusterInstanceContext : + clusterLevelNetworkPartitionContext.getClusterInstanceContextMap().values()) { + for (ClusterLevelPartitionContext partitionContext : + clusterInstanceContext.getPartitionCtxts().values()) { + if (partitionContext.getNonTerminatedMemberCount() > 0) { + hasMember = true; + } else { + hasMember = false; + } } } + } return hasMember; } http://git-wip-us.apache.org/repos/asf/stratos/blob/4f2c1b70/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ClusterDataHolder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ClusterDataHolder.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ClusterDataHolder.java index 6989238..d095c37 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ClusterDataHolder.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ClusterDataHolder.java @@ -35,6 +35,9 @@ public class ClusterDataHolder implements Serializable { // Cluster id private String clusterId; + private int minInstances; + private int maxInstances; + public ClusterDataHolder (String serviceType, String clusterId) { this.serviceType = serviceType; @@ -48,4 +51,20 @@ public class ClusterDataHolder implements Serializable { public String getClusterId() { return clusterId; } + + public int getMinInstances() { + return minInstances; + } + + public void setMinInstances(int minInstances) { + this.minInstances = minInstances; + } + + public int getMaxInstances() { + return maxInstances; + } + + public void setMaxInstances(int maxInstances) { + this.maxInstances = maxInstances; + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/4f2c1b70/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java index 1a6aaf6..bd737c2 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java @@ -55,10 +55,12 @@ public class Cluster implements Serializable { private String appId; + private String parentId; + private String loadBalanceAlgorithmName; @XmlJavaTypeAdapter(MapAdapter.class) private Properties properties; - protected Map<String, ClusterInstance> instanceIdToInstanceContextMap; + private Map<String, ClusterInstance> instanceIdToInstanceContextMap; //private LifeCycleStateManager<ClusterStatus> clusterStateManager; public Cluster(String serviceName, String clusterId, String deploymentPolicyName, @@ -70,7 +72,7 @@ public class Cluster implements Serializable { this.setHostNames(new ArrayList<String>()); this.memberMap = new HashMap<String, Member>(); this.appId = appId; - this.instanceIdToInstanceContextMap = new HashMap<String, ClusterInstance>(); + this.setInstanceIdToInstanceContextMap(new HashMap<String, ClusterInstance>()); //this.clusterStateManager = new LifeCycleStateManager<ClusterStatus>(ClusterStatus.Created, clusterId); // temporary; should be removed //this.status = ClusterStatus.Created; @@ -213,44 +215,44 @@ public class Cluster implements Serializable { } public boolean isStateTransitionValid(ClusterStatus newState, String clusterInstanceId) { - return instanceIdToInstanceContextMap.get(clusterInstanceId).isStateTransitionValid(newState); + return getInstanceIdToInstanceContextMap().get(clusterInstanceId).isStateTransitionValid(newState); } public Stack<ClusterStatus> getTransitionedStates(String clusterInstanceId) { - return instanceIdToInstanceContextMap.get(clusterInstanceId).getTransitionedStates(); + return getInstanceIdToInstanceContextMap().get(clusterInstanceId).getTransitionedStates(); } public ClusterStatus getStatus(String applicationInstanceId) { //return status; - return instanceIdToInstanceContextMap.get(applicationInstanceId).getStatus(); + return getInstanceIdToInstanceContextMap().get(applicationInstanceId).getStatus(); } public boolean setStatus(ClusterStatus newStatus, String applicationInstanceId) { - return instanceIdToInstanceContextMap.get(applicationInstanceId).setStatus(newStatus); + return getInstanceIdToInstanceContextMap().get(applicationInstanceId).setStatus(newStatus); } public void addInstanceContext (String instanceId, ClusterInstance instanceContext) { - instanceIdToInstanceContextMap.put(instanceId, instanceContext); + getInstanceIdToInstanceContextMap().put(instanceId, instanceContext); } public ClusterInstance getInstanceContexts (String instanceId) { // if map is empty, return null - if (instanceIdToInstanceContextMap.isEmpty()) { + if (getInstanceIdToInstanceContextMap().isEmpty()) { return null; } // if instanceId is null, just get the first InstanceContext if (instanceId == null) { - return instanceIdToInstanceContextMap.entrySet().iterator().next().getValue(); + return getInstanceIdToInstanceContextMap().entrySet().iterator().next().getValue(); } - return instanceIdToInstanceContextMap.get(instanceId); + return getInstanceIdToInstanceContextMap().get(instanceId); } public int getInstanceContextCount () { - return instanceIdToInstanceContextMap.keySet().size(); + return getInstanceIdToInstanceContextMap().keySet().size(); } public boolean equals(Object other) { @@ -278,6 +280,25 @@ public class Cluster implements Serializable { this.hostNames = hostNames; } + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public Map<String, ClusterInstance> getInstanceIdToInstanceContextMap() { + return instanceIdToInstanceContextMap; + } + + public void setInstanceIdToInstanceContextMap(Map<String, ClusterInstance> instanceIdToInstanceContextMap) { + this.instanceIdToInstanceContextMap = instanceIdToInstanceContextMap; + } + + public Collection<ClusterInstance> getClusterInstances() { + return this.instanceIdToInstanceContextMap.values(); + } // public ClusterStatus getTempStatus() { // return status; // } http://git-wip-us.apache.org/repos/asf/stratos/blob/4f2c1b70/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/AverageRequestsServingCapabilityEvent.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/AverageRequestsServingCapabilityEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/AverageRequestsServingCapabilityEvent.java index 011c75a..47fbf7e 100755 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/AverageRequestsServingCapabilityEvent.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/AverageRequestsServingCapabilityEvent.java @@ -8,12 +8,14 @@ public class AverageRequestsServingCapabilityEvent extends Event{ private final String networkPartitionId; private final String clusterId; private final float value; + private final String instanceId; - public AverageRequestsServingCapabilityEvent(String networkPartitionId, String clusterId, float value) { + public AverageRequestsServingCapabilityEvent(String networkPartitionId, String clusterId, float value, String instanceId) { this.networkPartitionId = networkPartitionId; this.clusterId = clusterId; this.value = value; + this.instanceId = instanceId; } public String getClusterId() { return clusterId; @@ -28,4 +30,7 @@ public class AverageRequestsServingCapabilityEvent extends Event{ } + public String getInstanceId() { + return instanceId; + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/4f2c1b70/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberFaultEvent.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberFaultEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberFaultEvent.java index da358ff..e576ba8 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberFaultEvent.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberFaultEvent.java @@ -29,15 +29,17 @@ public class MemberFaultEvent extends Event { private final String memberId; private final String partitionId; private final String instanceId; + private final String networkPartitionId; private final float value; public MemberFaultEvent(String clusterId, String memberId, String partitionId, - String instanceId, float value) { + String instanceId, String networkPartitionId, float value) { this.clusterId = clusterId; this.instanceId = instanceId; this.memberId = memberId; this.partitionId = partitionId; + this.networkPartitionId = networkPartitionId; this.value = value; } @@ -61,4 +63,8 @@ public class MemberFaultEvent extends Event { public String getInstanceId() { return instanceId; } + + public String getNetworkPartitionId() { + return networkPartitionId; + } }
