Validate whether multi-tenant applications have active signups, before undeploying the application
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/89c821f6 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/89c821f6 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/89c821f6 Branch: refs/heads/stratos-4.1.x Commit: 89c821f641275ba5ece35546ccfdac37aecbbd78 Parents: 3af354c Author: Dinithi <[email protected]> Authored: Thu Sep 10 16:28:17 2015 +0530 Committer: Dinithi <[email protected]> Committed: Thu Sep 10 16:28:17 2015 +0530 ---------------------------------------------------------------------- .../UnremovableApplicationException.java | 27 + .../autoscaler/services/AutoscalerService.java | 2 +- .../services/impl/AutoscalerServiceImpl.java | 76 +- .../common/client/AutoscalerServiceClient.java | 5 +- .../rest/endpoint/api/StratosApiV41Utils.java | 9 +- .../src/main/resources/AutoscalerService.wsdl | 754 ++++++++++--------- 6 files changed, 500 insertions(+), 373 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/89c821f6/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/exception/application/UnremovableApplicationException.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/exception/application/UnremovableApplicationException.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/exception/application/UnremovableApplicationException.java new file mode 100644 index 0000000..1d8fcb0 --- /dev/null +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/exception/application/UnremovableApplicationException.java @@ -0,0 +1,27 @@ +/* + * 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.exception.application; + +import org.apache.stratos.autoscaler.exception.AutoScalerException; + +public class UnremovableApplicationException extends AutoScalerException { + public UnremovableApplicationException(String msg) { + super(msg); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/89c821f6/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/AutoscalerService.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/AutoscalerService.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/AutoscalerService.java index d984d64..c5091a4 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/AutoscalerService.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/AutoscalerService.java @@ -136,7 +136,7 @@ public interface AutoscalerService { * @return */ - public boolean undeployApplication(String applicationId, boolean force); + public boolean undeployApplication(String applicationId, boolean force) throws Exception; /** * Delete an application http://git-wip-us.apache.org/repos/asf/stratos/blob/89c821f6/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 738ced9..47b03bb 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 @@ -39,6 +39,7 @@ import org.apache.stratos.autoscaler.exception.*; import org.apache.stratos.autoscaler.exception.application.ApplicationDefinitionException; import org.apache.stratos.autoscaler.exception.application.InvalidApplicationPolicyException; import org.apache.stratos.autoscaler.exception.application.InvalidServiceGroupException; +import org.apache.stratos.autoscaler.exception.application.UnremovableApplicationException; import org.apache.stratos.autoscaler.exception.policy.*; import org.apache.stratos.autoscaler.monitor.cluster.ClusterMonitor; import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor; @@ -63,6 +64,7 @@ import org.apache.stratos.common.constants.StratosConstants; import org.apache.stratos.common.partition.NetworkPartitionRef; import org.apache.stratos.common.partition.PartitionRef; import org.apache.stratos.common.util.CommonUtil; +import org.apache.stratos.manager.service.stub.StratosManagerServiceApplicationSignUpExceptionException; import org.apache.stratos.manager.service.stub.domain.application.signup.ApplicationSignUp; import org.apache.stratos.manager.service.stub.domain.application.signup.ArtifactRepository; import org.apache.stratos.messaging.domain.application.Application; @@ -464,7 +466,8 @@ public class AutoscalerServiceImpl implements AutoscalerService { } } - public boolean undeployApplication(String applicationId, boolean force) { + public boolean undeployApplication(String applicationId, boolean force) throws RemoteException, + StratosManagerServiceApplicationSignUpExceptionException, UnremovableApplicationException { AutoscalerContext asCtx = AutoscalerContext.getInstance(); ApplicationMonitor appMonitor = asCtx.getAppMonitor(applicationId); @@ -474,39 +477,58 @@ public class AutoscalerServiceImpl implements AutoscalerService { "hence returning", applicationId)); return false; } - if (!force) { - // Graceful un-deployment flow - if (appMonitor.isTerminating()) { - log.info("Application monitor is already in terminating, graceful " + - "un-deployment is has already been attempted thus not invoking again"); - return false; - } else { - log.info(String.format("Gracefully un-deploying the [application] %s ", applicationId)); - appMonitor.setTerminating(true); - undeployApplicationGracefully(applicationId); + + boolean applicationSignUpExists =false; + + ApplicationContext applicationContext = RegistryManager.getInstance().getApplicationContext(applicationId); + if(applicationContext.isMultiTenant()){ + StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance(); + ApplicationSignUp applicationSignUps[] = serviceClient.getApplicationSignUps(applicationId); + + if (applicationSignUps != null) { + applicationSignUpExists = true; } - } else { - // force un-deployment flow - if (appMonitor.isTerminating()) { + } - if (appMonitor.isForce()) { - log.warn(String.format("Force un-deployment is already in progress, " + - "hence not invoking again " + - "[application-id] %s", applicationId)); + if (!applicationSignUpExists) { + if (!force) { + // Graceful un-deployment flow + if (appMonitor.isTerminating()) { + log.info("Application monitor is already in terminating, graceful " + + "un-deployment is has already been attempted thus not invoking again"); return false; } else { - log.info(String.format("Previous graceful un-deployment is in progress for " + - "[application-id] %s , thus terminating instances directly", - applicationId)); - appMonitor.setForce(true); - terminateAllMembersAndClustersForcefully(applicationId); + log.info(String.format("Gracefully un-deploying the [application] %s ", applicationId)); + appMonitor.setTerminating(true); + undeployApplicationGracefully(applicationId); } } else { - log.info(String.format("Forcefully un-deploying the application " + applicationId)); - appMonitor.setTerminating(true); - appMonitor.setForce(true); - undeployApplicationGracefully(applicationId); + // force un-deployment flow + if (appMonitor.isTerminating()) { + + if (appMonitor.isForce()) { + log.warn(String.format("Force un-deployment is already in progress, " + + "hence not invoking again " + + "[application-id] %s", applicationId)); + return false; + } else { + log.info(String.format("Previous graceful un-deployment is in progress for " + + "[application-id] %s , thus terminating instances directly", + applicationId)); + appMonitor.setForce(true); + terminateAllMembersAndClustersForcefully(applicationId); + } + } else { + log.info(String.format("Forcefully un-deploying the application " + applicationId)); + appMonitor.setTerminating(true); + appMonitor.setForce(true); + undeployApplicationGracefully(applicationId); + } } + } else { + String msg = "Application could not undeploy since it has application signups"; + log.error(msg); + throw new UnremovableApplicationException(msg); } return true; } http://git-wip-us.apache.org/repos/asf/stratos/blob/89c821f6/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/AutoscalerServiceClient.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/AutoscalerServiceClient.java b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/AutoscalerServiceClient.java index 5d6bf16..fdbc54d 100644 --- a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/AutoscalerServiceClient.java +++ b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/client/AutoscalerServiceClient.java @@ -152,7 +152,10 @@ public class AutoscalerServiceClient { } public void undeployApplication(String applicationId, boolean force) throws - AutoscalerServiceApplicationDefinitionExceptionException, RemoteException { + AutoscalerServiceApplicationDefinitionExceptionException, RemoteException, + AutoscalerServiceRemoteExceptionException, + AutoscalerServiceStratosManagerServiceApplicationSignUpExceptionExceptionException, + AutoscalerServiceUnremovableApplicationExceptionException { stub.undeployApplication(applicationId, force); } http://git-wip-us.apache.org/repos/asf/stratos/blob/89c821f6/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java index b584cfe..6402251 100644 --- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java +++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java @@ -1896,12 +1896,15 @@ public class StratosApiV41Utils { if (autoscalerServiceClient != null) { try { autoscalerServiceClient.undeployApplication(applicationId, force); - } catch (RemoteException e) { + } catch (RemoteException | AutoscalerServiceApplicationDefinitionExceptionException + | AutoscalerServiceRemoteExceptionException | + AutoscalerServiceStratosManagerServiceApplicationSignUpExceptionExceptionException e) { String message = "Could not undeploy application: [application-id] " + applicationId; log.error(message, e); throw new RestAPIException(message, e); - } catch (AutoscalerServiceApplicationDefinitionExceptionException e) { - String message = "Could not undeploy application: [application-id] " + applicationId; + } catch (AutoscalerServiceUnremovableApplicationExceptionException e) { + String message = "Could not undeploy application: [application-id] " + applicationId + " since it has" + + " application signups"; log.error(message, e); throw new RestAPIException(message, e); }
