Repository: stratos Updated Branches: refs/heads/master f784929b9 -> ff9379f66
adding removing runtime support back which got removed in the refactoring and fixing float issue Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/3745d568 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/3745d568 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/3745d568 Branch: refs/heads/master Commit: 3745d5685c20816312f734894d2c96865b8347e8 Parents: f784929 Author: reka <[email protected]> Authored: Thu Dec 18 19:31:17 2014 +0530 Committer: reka <[email protected]> Committed: Thu Dec 18 19:31:44 2014 +0530 ---------------------------------------------------------------------- .../applications/topic/ApplicationBuilder.java | 75 +++++++++++++++++++- .../autoscaler/rule/RuleTasksDelegator.java | 3 +- 2 files changed, 76 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/3745d568/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 ffaa00c..d1de9ce 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 @@ -25,6 +25,7 @@ import org.apache.stratos.autoscaler.applications.pojo.ApplicationClusterContext import org.apache.stratos.autoscaler.client.CloudControllerClient; import org.apache.stratos.autoscaler.context.AutoscalerContext; import org.apache.stratos.autoscaler.context.partition.network.GroupLevelNetworkPartitionContext; +import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher; import org.apache.stratos.autoscaler.exception.policy.InvalidPolicyException; import org.apache.stratos.autoscaler.monitor.Monitor; import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor; @@ -32,10 +33,15 @@ import org.apache.stratos.autoscaler.monitor.component.GroupMonitor; import org.apache.stratos.autoscaler.pojo.policy.PolicyManager; import org.apache.stratos.messaging.domain.applications.*; import org.apache.stratos.messaging.domain.instance.ApplicationInstance; +import org.apache.stratos.messaging.domain.instance.ClusterInstance; import org.apache.stratos.messaging.domain.instance.GroupInstance; +import org.apache.stratos.messaging.domain.topology.Cluster; +import org.apache.stratos.messaging.domain.topology.Service; +import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; import org.wso2.carbon.base.MultitenantConstants; import org.wso2.carbon.context.PrivilegedCarbonContext; +import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -200,7 +206,8 @@ public class ApplicationBuilder { PolicyManager.getInstance().getDeploymentPolicyByApplication(appId); if (policy != null) { log.warn(String.format("Application has been found in the ApplicationsTopology" + - ": [application-id] %s, Please unDeploy the Application Policy before deleting the Application definition.", + ": [application-id] %s, Please unDeploy the Application Policy " + + "before deleting the Application definition.", appId)); return; } @@ -286,6 +293,72 @@ public class ApplicationBuilder { } } + public static boolean handleApplicationPolicyUndeployed(String appId) { + if (log.isDebugEnabled()) { + log.debug("Handling application terminating event: [application-id] " + appId); + } + Set<ClusterDataHolder> clusterData; + ApplicationHolder.acquireWriteLock(); + try { + Applications applications = ApplicationHolder.getApplications(); + Application application = applications.getApplication(appId); + //update the status of the Group + if (application == null) { + log.warn(String.format("Application does not exist: [application-id] %s", + appId)); + return false; + } + clusterData = application.getClusterDataRecursively(); + Collection<ApplicationInstance> context = application. + getInstanceIdToInstanceContextMap().values(); + ApplicationStatus status = ApplicationStatus.Terminating; + for (ApplicationInstance context1 : context) { + if (context1.isStateTransitionValid(status)) { + //setting the status, persist and publish + application.setStatus(status, context1.getInstanceId()); + updateApplicationMonitor(appId, status, context1.getInstanceId()); + ApplicationHolder.persistApplication(application); + ApplicationsEventPublisher.sendApplicationInstanceTerminatingEvent(appId, context1.getInstanceId()); + } else { + log.warn(String.format("Application Instance state transition is not valid: [application-id] %s " + + " [instance-id] %s [current-status] %s [status-requested] %s", appId, + context1.getInstanceId() + context1.getStatus(), status)); + } + } + } finally { + ApplicationHolder.releaseWriteLock(); + } + + // if monitors is not found for any cluster, assume cluster is not there and send cluster terminating event. + // this assumes the cluster monitor will not fail after creating members, but will only fail before + for (ClusterDataHolder aClusterData : clusterData) { + if (AutoscalerContext.getInstance().getClusterMonitor(aClusterData.getClusterId()) == null) { + TopologyManager.acquireReadLockForCluster(aClusterData.getServiceType(), + aClusterData.getClusterId()); + try { + Service service = TopologyManager.getTopology().getService(aClusterData.getServiceType()); + if (service != null) { + Cluster cluster = service.getCluster(aClusterData.getClusterId()); + if (cluster != null) { + for (ClusterInstance instance : cluster.getInstanceIdToInstanceContextMap().values()) { + ClusterStatusEventPublisher.sendClusterTerminatingEvent(appId, + aClusterData.getServiceType(), + aClusterData.getClusterId(), + instance.getInstanceId()); + } + } + } + } finally { + TopologyManager.releaseReadLockForCluster(aClusterData.getServiceType(), + aClusterData.getClusterId()); + } + + } + } + return true; + } + + public static void handleGroupInstanceTerminatedEvent(String appId, String groupId, String instanceId) { if (log.isDebugEnabled()) { log.debug("Handling group terminated event: [group-id] " + groupId + http://git-wip-us.apache.org/repos/asf/stratos/blob/3745d568/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 b7b50e7..6b51ea6 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 @@ -319,7 +319,8 @@ public class RuleTasksDelegator { } //Notify parent for checking scaling dependencies AbstractClusterMonitor clusterMonitor = AutoscalerContext.getInstance().getClusterMonitor(clusterId); - float factor = requiredInstanceCount / minimumInstanceCount; + float fMinimumInstanceCount = minimumInstanceCount; + float factor = requiredInstanceCount / fMinimumInstanceCount; if (clusterMonitor instanceof VMClusterMonitor) { VMClusterMonitor vmClusterMonitor = (VMClusterMonitor) clusterMonitor;
