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;
-
     }
 }

Reply via email to