Repository: stratos Updated Branches: refs/heads/master 427d66ef5 -> d2615a5dc
Adding validation to avoid applications being deleted until its undeployment process is completed Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/d2615a5d Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/d2615a5d Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/d2615a5d Branch: refs/heads/master Commit: d2615a5dc76068a374cc054d124b3a0542b44ca1 Parents: 427d66e Author: Imesh Gunaratne <[email protected]> Authored: Sat Mar 28 02:59:28 2015 +0530 Committer: Imesh Gunaratne <[email protected]> Committed: Sat Mar 28 02:59:28 2015 +0530 ---------------------------------------------------------------------- .../applications/ApplicationHolder.java | 2 +- .../applications/topic/ApplicationBuilder.java | 19 +++--- .../services/impl/AutoscalerServiceImpl.java | 66 +++++++++++--------- .../services/impl/InstanceTerminator.java | 4 +- ...tionInstanceInactivatedMessageProcessor.java | 8 +-- 5 files changed, 51 insertions(+), 48 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/d2615a5d/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/ApplicationHolder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/ApplicationHolder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/ApplicationHolder.java index 60b3d9e..2f09880 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/ApplicationHolder.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/ApplicationHolder.java @@ -104,7 +104,7 @@ public class ApplicationHolder { getApplications().removeApplication(applicationId); AutoscalerUtil.removeApplication(applicationId); if (log.isDebugEnabled()) { - log.debug("Application [ " + applicationId + " ] removed from applications"); + log.debug("Application [ " + applicationId + " ] removed from application holder"); } } } http://git-wip-us.apache.org/repos/asf/stratos/blob/d2615a5d/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 52b43f5..ae34beb 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 @@ -183,26 +183,24 @@ public class ApplicationBuilder { public static void handleApplicationInstanceTerminatingEvent(String appId, String instanceId) { if (log.isDebugEnabled()) { - log.debug("Handling application Terminating event: [application-id] " + appId + + log.debug("Handling application terminating event: [application-id] " + appId + " [instance] " + instanceId); } Applications applications = ApplicationHolder.getApplications(); Application application = applications.getApplication(appId); - //update the status of the Group + // update the status of the Group if (application == null) { - log.warn(String.format("Application does not exist: [application-id] %s", - appId)); + log.warn(String.format("Application does not exist: [application-id] %s", appId)); return; } ApplicationStatus status = ApplicationStatus.Terminating; ApplicationInstance applicationInstance = application.getInstanceContexts(instanceId); if (applicationInstance.isStateTransitionValid(status)) { - //setting the status, persist and publish + // setting the status, persist and publish application.setStatus(status, instanceId); - updateApplicationMonitor(appId, status, applicationInstance.getNetworkPartitionId(), - instanceId); + updateApplicationMonitor(appId, status, applicationInstance.getNetworkPartitionId(), instanceId); ApplicationHolder.persistApplication(application); ApplicationsEventPublisher.sendApplicationInstanceInactivatedEvent(appId, instanceId); } else { @@ -248,6 +246,7 @@ public class ApplicationBuilder { appClusterDataToSend.add(newClusterData); } + AutoscalerContext.getInstance().removeApplicationContext(appId); ApplicationHolder.removeApplication(appId); } finally { @@ -299,8 +298,8 @@ public class ApplicationBuilder { //stopping application thread applicationMonitor.destroy(); AutoscalerContext.getInstance().removeAppMonitor(appId); - log.info("Application run time is removed: [application-id] " + appId); - //Removing the application from memory and registry + log.info("Application runtime is removed: [application-id] " + appId); + // Removing the application from memory and registry PrivilegedCarbonContext.startTenantFlow(); try { PrivilegedCarbonContext.getThreadLocalCarbonContext(). @@ -322,7 +321,7 @@ public class ApplicationBuilder { } } - public static boolean handleApplicationUndeployed(String applicationId) { + public static boolean handleApplicationUnDeployedEvent(String applicationId) { if (log.isDebugEnabled()) { log.debug("Handling application terminating event: [application-id] " + applicationId); } http://git-wip-us.apache.org/repos/asf/stratos/blob/d2615a5d/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java index 93812d5..25f9d7e 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java @@ -363,27 +363,27 @@ public class AutoscalerServiceImpl implements AutoscalerService { log.info("Starting to undeploy application: [application-id] " + applicationId); } - ApplicationContext application = AutoscalerContext.getInstance().getApplicationContext(applicationId); - if ( application == null){ - String msg = String.format("Application not found : [application-id] %s", applicationId); + ApplicationContext applicationContext = AutoscalerContext.getInstance().getApplicationContext(applicationId); + Application application = ApplicationHolder.getApplications().getApplication(applicationId); + if ((applicationContext == null) || (application == null)) { + String msg = String.format("Application not found: [application-id] %s", applicationId); throw new RuntimeException(msg); } - if (!application.getStatus().equals(ApplicationContext.STATUS_DEPLOYED)) { + if (!applicationContext.getStatus().equals(ApplicationContext.STATUS_DEPLOYED)) { String message = String.format("Application is not deployed: [application-id] %s", applicationId); log.error(message); throw new RuntimeException(message); } - // Remove Application SignUp(s) in stratos manager - removeApplicationSignUp(application); + // Remove application signup(s) in stratos manager + removeApplicationSignUp(applicationContext); // Remove network partition algorithm context AutoscalerContext.getInstance().removeNetworkPartitionAlgorithmContext(applicationId); - ApplicationBuilder.handleApplicationUndeployed(applicationId); + ApplicationBuilder.handleApplicationUnDeployedEvent(applicationId); - ApplicationContext applicationContext = AutoscalerContext.getInstance().getApplicationContext(applicationId); applicationContext.setStatus(ApplicationContext.STATUS_CREATED); AutoscalerContext.getInstance().updateApplicationContext(applicationContext); @@ -399,29 +399,35 @@ public class AutoscalerServiceImpl implements AutoscalerService { @Override public void deleteApplication(String applicationId) { - - ApplicationContext appContext = AutoscalerContext.getInstance().getApplicationContext(applicationId); - - if (appContext == null) { - String msg = String.format("Application not found : [application-id] %s", applicationId); - throw new RuntimeException(msg); - } - - if (ApplicationContext.STATUS_DEPLOYED.equals(appContext.getStatus())) { - String msg = String.format("Application is deployed : [application-id] %s. Please undeploy before deleting it.", applicationId); - throw new AutoScalerException(msg); - } - - AutoscalerContext.getInstance().removeApplicationContext(applicationId); - - if (ApplicationHolder.getApplications().getApplication(applicationId) == null) { - String msg = String.format("Application not found : [application-id] %s", applicationId); - throw new RuntimeException(msg); + + try { + ApplicationContext applicationContext = AutoscalerContext.getInstance().getApplicationContext(applicationId); + Application application = ApplicationHolder.getApplications().getApplication(applicationId); + if ((applicationContext == null) || (application == null)) { + String msg = String.format("Application not found: [application-id] %s", applicationId); + throw new RuntimeException(msg); + } + + if (ApplicationContext.STATUS_DEPLOYED.equals(applicationContext.getStatus())) { + String msg = String.format("Application is in deployed state, please undeploy it before deleting: " + + "[application-id] %s", applicationId); + throw new AutoScalerException(msg); + } + + if (application.getInstanceContextCount() > 0) { + String message = String.format("Application undeployment process is still in progress: " + + "[application-id] %s", applicationId); + log.error(message); + throw new RuntimeException(message); + } + + ApplicationBuilder.handleApplicationRemoval(applicationId); + log.info(String.format("Application deleted successfully: [application-id] %s", applicationId)); + } catch (Exception e) { + String message = String.format("Could not delete application: [application-id] %s", applicationId); + log.error(message, e); + throw new RuntimeException(message, e); } - ApplicationBuilder.handleApplicationRemoval(applicationId); - RegistryManager.getInstance().removeApplication(applicationId); - - log.info(String.format("Application deleted successfully: [application-id] ", applicationId)); } public void updateClusterMonitor(String clusterId, Properties properties) throws InvalidArgumentException { http://git-wip-us.apache.org/repos/asf/stratos/blob/d2615a5d/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceTerminator.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceTerminator.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceTerminator.java index 968cb9e..f950059 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceTerminator.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceTerminator.java @@ -41,10 +41,10 @@ public class InstanceTerminator implements Runnable { public InstanceTerminator(MemberContext memberContext) { String provider = memberContext.getPartition().getProvider(); - IaasProvider iaasProvider = CloudControllerContext.getInstance().getIaasProvider(memberContext.getCartridgeType(), provider); + IaasProvider iaasProvider = CloudControllerContext.getInstance() + .getIaasProvider(memberContext.getCartridgeType(), provider); this.iaas = iaasProvider.getIaas(); this.memberContext = memberContext; - } @Override http://git-wip-us.apache.org/repos/asf/stratos/blob/d2615a5d/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationInstanceInactivatedMessageProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationInstanceInactivatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationInstanceInactivatedMessageProcessor.java index 7e93050..bc680e1 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationInstanceInactivatedMessageProcessor.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/application/ApplicationInstanceInactivatedMessageProcessor.java @@ -92,23 +92,21 @@ public class ApplicationInstanceInactivatedMessageProcessor extends MessageProce ApplicationInstance context = application.getInstanceContexts(event.getInstanceId()); if (context == null) { if (log.isWarnEnabled()) { - log.warn(String.format("Application Instance not exists in Group: [AppId] %s" + - "[instanceId] %s", event.getAppId(), event.getInstanceId())); + log.warn(String.format("Application instance not exists in group: [application-id] %s" + + "[instance-id] %s", event.getAppId(), event.getInstanceId())); return false; } } ApplicationStatus status = ApplicationStatus.Inactive; if (!context.isStateTransitionValid(status)) { - log.error("Invalid State transfer from [ " + context.getStatus() + + log.error("Invalid state transfer from [ " + context.getStatus() + " ] to [ " + status + " ]"); } context.setStatus(status); - } // Notify event listeners notifyEventListeners(event); return true; - } }
