writing test for autoscaling policy removal in autoscaler by abstracting out the methods
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/729ef7ab Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/729ef7ab Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/729ef7ab Branch: refs/heads/master Commit: 729ef7abb623752137c05a4f5a0e38e57f6d55ca Parents: b7897af Author: reka <[email protected]> Authored: Fri Jun 26 16:37:04 2015 +0530 Committer: reka <[email protected]> Committed: Tue Jun 30 11:23:49 2015 +0530 ---------------------------------------------------------------------- .../applications/topic/ApplicationBuilder.java | 3 + .../autoscaler/context/AutoscalerContext.java | 19 +-- .../internal/AutoscalerServiceComponent.java | 4 + .../services/impl/AutoscalerServiceImpl.java | 128 +++++-------------- .../stratos/autoscaler/util/AutoscalerUtil.java | 82 +++++++++++- .../stratos/autoscaler/AutoscalerUtilTest.java | 65 ++++++++++ 6 files changed, 187 insertions(+), 114 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/729ef7ab/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 1aafd00..44a6786 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 @@ -31,6 +31,7 @@ import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher import org.apache.stratos.autoscaler.monitor.Monitor; import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor; import org.apache.stratos.autoscaler.monitor.component.GroupMonitor; +import org.apache.stratos.autoscaler.registry.RegistryManager; import org.apache.stratos.messaging.domain.application.*; import org.apache.stratos.messaging.domain.instance.ApplicationInstance; import org.apache.stratos.messaging.domain.instance.ClusterInstance; @@ -246,6 +247,7 @@ public class ApplicationBuilder { } AutoscalerContext.getInstance().removeApplicationContext(appId); + RegistryManager.getInstance().removeApplicationContext(appId); ApplicationHolder.removeApplication(appId); } finally { @@ -307,6 +309,7 @@ public class ApplicationBuilder { // update application status in application context applicationContext.setStatus(ApplicationContext.STATUS_CREATED); AutoscalerContext.getInstance().updateApplicationContext(applicationContext); + RegistryManager.getInstance().persistApplicationContext(applicationContext); log.info("Application un-deployed successfully: [application-id] " + applicationId); } http://git-wip-us.apache.org/repos/asf/stratos/blob/729ef7ab/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java index 51e9d16..3a988e6 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java @@ -76,29 +76,16 @@ public class AutoscalerContext { // Initialize distributed object provider distributedObjectProvider = ServiceReferenceHolder.getInstance().getDistributedObjectProvider(); - applicationContextMap = readApplicationContextsFromRegistry(); if (applicationContextMap == null) { applicationContextMap = distributedObjectProvider.getMap(AS_APPLICATION_ID_TO_APPLICATION_CTX_MAP);//new ConcurrentHashMap<String, ApplicationContext>(); } setClusterMonitors(distributedObjectProvider.getMap(AS_CLUSTER_ID_TO_CLUSTER_MONITOR_MAP)); setApplicationMonitors(distributedObjectProvider.getMap(AS_APPLICATION_ID_TO_APPLICATION_MONITOR_MAP)); pendingApplicationMonitors = distributedObjectProvider.getList(AS_PENDING_APPLICATION_MONITOR_LIST);//new ArrayList<String>(); - applicationIdToNetworkPartitionAlgorithmContextMap = distributedObjectProvider.getMap(AS_APPLICATIOIN_ID_TO_NETWORK_PARTITION_ALGO_CTX_MAP); + applicationIdToNetworkPartitionAlgorithmContextMap = + distributedObjectProvider.getMap(AS_APPLICATIOIN_ID_TO_NETWORK_PARTITION_ALGO_CTX_MAP); } - private Map<String, ApplicationContext> readApplicationContextsFromRegistry() { - String[] resourcePaths = RegistryManager.getInstance().getApplicationContextResourcePaths(); - if ((resourcePaths == null) || (resourcePaths.length == 0)) { - return null; - } - - Map<String, ApplicationContext> applicationContextMap = distributedObjectProvider.getMap(AS_APPLICATION_ID_TO_APPLICATION_CTX_MAP);//new ConcurrentHashMap<String, ApplicationContext>(); - for (String resourcePath : resourcePaths) { - ApplicationContext applicationContext = RegistryManager.getInstance().getApplicationContextByResourcePath(resourcePath); - applicationContextMap.put(applicationContext.getApplicationId(), applicationContext); - } - return applicationContextMap; - } public static AutoscalerContext getInstance() { if (instance == null) { @@ -169,11 +156,9 @@ public class AutoscalerContext { public void addApplicationContext(ApplicationContext applicationContext) { applicationContextMap.put(applicationContext.getApplicationId(), applicationContext); - RegistryManager.getInstance().persistApplicationContext(applicationContext); } public ApplicationContext removeApplicationContext(String applicationId) { - RegistryManager.getInstance().removeApplicationContext(applicationId); return applicationContextMap.remove(applicationId); } http://git-wip-us.apache.org/repos/asf/stratos/blob/729ef7ab/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServiceComponent.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServiceComponent.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServiceComponent.java index b5fd144..65d75b2 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServiceComponent.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServiceComponent.java @@ -40,6 +40,7 @@ import org.apache.stratos.autoscaler.registry.RegistryManager; import org.apache.stratos.autoscaler.status.processor.cluster.ClusterStatusProcessorChain; import org.apache.stratos.autoscaler.status.processor.group.GroupStatusProcessorChain; import org.apache.stratos.autoscaler.util.AutoscalerConstants; +import org.apache.stratos.autoscaler.util.AutoscalerUtil; import org.apache.stratos.autoscaler.util.ConfUtil; import org.apache.stratos.autoscaler.util.ServiceReferenceHolder; import org.apache.stratos.common.Component; @@ -209,6 +210,9 @@ public class AutoscalerServiceComponent { AutoscalerContext.getInstance().addNetworkPartitionAlgorithmContext(algorithmContext); } + //Adding application context from registry + AutoscalerUtil.readApplicationContextsFromRegistry(); + //starting the processor chain ClusterStatusProcessorChain clusterStatusProcessorChain = new ClusterStatusProcessorChain(); ServiceReferenceHolder.getInstance().setClusterStatusProcessorChain(clusterStatusProcessorChain); http://git-wip-us.apache.org/repos/asf/stratos/blob/729ef7ab/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 3f2120c..963136f 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 @@ -110,7 +110,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { @Override public boolean removeAutoScalingPolicy(String autoscalePolicyId) throws UnremovablePolicyException, PolicyDoesNotExistException { - if (removableAutoScalerPolicy(autoscalePolicyId)) { + if (AutoscalerUtil.removableAutoScalerPolicy(autoscalePolicyId)) { return PolicyManager.getInstance().removeAutoscalePolicy(autoscalePolicyId); } else { throw new UnremovablePolicyException("This autoscaler policy cannot be removed, " + @@ -119,76 +119,6 @@ public class AutoscalerServiceImpl implements AutoscalerService { } } - /** - * Validate the Auto Scalar policy removal - * - * @param autoscalePolicyId Auto Scalar policy id boolean - * @return - */ - private boolean removableAutoScalerPolicy(String autoscalePolicyId) { - Collection<ApplicationContext> applicationContexts = AutoscalerContext.getInstance(). - getApplicationContexts(); - for (ApplicationContext applicationContext : applicationContexts) { - if(applicationContext.getComponents().getCartridgeContexts() != null) { - for(CartridgeContext cartridgeContext : applicationContext.getComponents(). - getCartridgeContexts()) { - if(autoscalePolicyId.equals(cartridgeContext.getSubscribableInfoContext(). - getAutoscalingPolicy())) { - return false; - } - } - } - - if(applicationContext.getComponents().getGroupContexts() != null) { - return findAutoscalingPolicyInGroup(applicationContext.getComponents().getGroupContexts(), - autoscalePolicyId); - } - } - return true; - } - - - private boolean findAutoscalingPolicyInGroup(GroupContext[] groupContexts, - String autoscalePolicyId) { - for(GroupContext groupContext : groupContexts) { - if(groupContext.getCartridgeContexts() != null) { - for(CartridgeContext cartridgeContext : groupContext.getCartridgeContexts()) { - if(autoscalePolicyId.equals(cartridgeContext.getSubscribableInfoContext(). - getAutoscalingPolicy())) { - return false; - } - } - - } - if(groupContext.getGroupContexts() != null) { - return findAutoscalingPolicyInGroup(groupContext.getGroupContexts(), - autoscalePolicyId); - } - } - return true; - } - - /** - * Validate the deployment policy removal - * - * @param deploymentPolicyId - * @return - */ - private boolean removableDeploymentPolicy(String deploymentPolicyId) { - boolean canRemove = true; - Map<String, Application> applications = ApplicationHolder.getApplications().getApplications(); - for (Application application : applications.values()) { - List<String> deploymentPolicyIdsReferredInApplication = AutoscalerUtil. - getDeploymentPolicyIdsReferredInApplication(application.getUniqueIdentifier()); - for (String deploymentPolicyIdInApp : deploymentPolicyIdsReferredInApplication) { - if (deploymentPolicyId.equals(deploymentPolicyIdInApp)) { - canRemove = false; - } - } - } - return canRemove; - } - @Override public AutoscalePolicy getAutoscalingPolicy(String autoscalingPolicyId) { return PolicyManager.getInstance().getAutoscalePolicy(autoscalingPolicyId); @@ -215,6 +145,8 @@ public class AutoscalerServiceImpl implements AutoscalerService { applicationContext.setStatus(ApplicationContext.STATUS_CREATED); AutoscalerContext.getInstance().addApplicationContext(applicationContext); + //Persisting the application + RegistryManager.getInstance().persistApplicationContext(applicationContext); if (log.isInfoEnabled()) { log.info(String.format("Application added successfully: [application-id] %s", @@ -955,6 +887,9 @@ public class AutoscalerServiceImpl implements AutoscalerService { // validating application policy AutoscalerUtil.validateApplicationPolicy(applicationPolicy); + //Update application Monitor + + // updating application policy PolicyManager.getInstance().updateApplicationPolicy(applicationPolicy); return true; @@ -1205,31 +1140,32 @@ public class AutoscalerServiceImpl implements AutoscalerService { for (NetworkPartitionRef networkPartition : deploymentPolicy.getNetworkPartitionRefs()) { ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext = clusterMonitor.getClusterContext().getNetworkPartitionCtxt(networkPartition.getId()); - - try { - addNewPartitionsToClusterMonitor(clusterLevelNetworkPartitionContext, networkPartition, - deploymentPolicy.getDeploymentPolicyID(), clusterMonitor.getClusterContext().getServiceId()); - } catch (RemoteException e) { - - String message = "Connection to cloud controller failed, Cluster monitor update failed for" + - " [deployment-policy] " + deploymentPolicy.getDeploymentPolicyID(); - log.error(message); - throw new CloudControllerConnectionException(message, e); - } catch (CloudControllerServiceInvalidPartitionExceptionException e) { - - String message = "Invalid partition, Cluster monitor update failed for [deployment-policy] " - + deploymentPolicy.getDeploymentPolicyID(); - log.error(message); - throw new InvalidDeploymentPolicyException(message, e); - } catch (CloudControllerServiceInvalidCartridgeTypeExceptionException e) { - - String message = "Invalid cartridge type, Cluster monitor update failed for [deployment-policy] " - + deploymentPolicy.getDeploymentPolicyID() + " [cartridge] " - + clusterMonitor.getClusterContext().getServiceId(); - log.error(message); - throw new InvalidDeploymentPolicyException(message, e); + if(clusterLevelNetworkPartitionContext != null) { + try { + addNewPartitionsToClusterMonitor(clusterLevelNetworkPartitionContext, networkPartition, + deploymentPolicy.getDeploymentPolicyID(), clusterMonitor.getClusterContext().getServiceId()); + } catch (RemoteException e) { + + String message = "Connection to cloud controller failed, Cluster monitor update failed for" + + " [deployment-policy] " + deploymentPolicy.getDeploymentPolicyID(); + log.error(message); + throw new CloudControllerConnectionException(message, e); + } catch (CloudControllerServiceInvalidPartitionExceptionException e) { + + String message = "Invalid partition, Cluster monitor update failed for [deployment-policy] " + + deploymentPolicy.getDeploymentPolicyID(); + log.error(message); + throw new InvalidDeploymentPolicyException(message, e); + } catch (CloudControllerServiceInvalidCartridgeTypeExceptionException e) { + + String message = "Invalid cartridge type, Cluster monitor update failed for [deployment-policy] " + + deploymentPolicy.getDeploymentPolicyID() + " [cartridge] " + + clusterMonitor.getClusterContext().getServiceId(); + log.error(message); + throw new InvalidDeploymentPolicyException(message, e); + } + removeOldPartitionsFromClusterMonitor(clusterLevelNetworkPartitionContext, networkPartition); } - removeOldPartitionsFromClusterMonitor(clusterLevelNetworkPartitionContext, networkPartition); } } } @@ -1309,7 +1245,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { log.error(message); throw new DeploymentPolicyNotExistsException(message); } - if (removableDeploymentPolicy(deploymentPolicyID)) { + if (AutoscalerUtil.removableDeploymentPolicy(deploymentPolicyID)) { PolicyManager.getInstance().removeDeploymentPolicy(deploymentPolicyID); } else { throw new UnremovablePolicyException("This deployment policy cannot be removed, since it is used in an " + http://git-wip-us.apache.org/repos/asf/stratos/blob/729ef7ab/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java index 2f78fe7..db43650 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java @@ -937,7 +937,87 @@ public class AutoscalerUtil { } } - public void updateMonitors() { + /** + * Validate the Auto Scalar policy removal + * + * @param autoscalePolicyId Auto Scalar policy id boolean + * @return + */ + public static boolean removableAutoScalerPolicy(String autoscalePolicyId) { + Collection<ApplicationContext> applicationContexts = AutoscalerContext.getInstance(). + getApplicationContexts(); + for (ApplicationContext applicationContext : applicationContexts) { + if(applicationContext.getComponents().getCartridgeContexts() != null) { + for(CartridgeContext cartridgeContext : applicationContext.getComponents(). + getCartridgeContexts()) { + if(autoscalePolicyId.equals(cartridgeContext.getSubscribableInfoContext(). + getAutoscalingPolicy())) { + return false; + } + } + } + + if(applicationContext.getComponents().getGroupContexts() != null) { + return findAutoscalingPolicyInGroup(applicationContext.getComponents().getGroupContexts(), + autoscalePolicyId); + } + } + return true; + } + + public static boolean findAutoscalingPolicyInGroup(GroupContext[] groupContexts, + String autoscalePolicyId) { + for(GroupContext groupContext : groupContexts) { + if(groupContext.getCartridgeContexts() != null) { + for(CartridgeContext cartridgeContext : groupContext.getCartridgeContexts()) { + if(autoscalePolicyId.equals(cartridgeContext.getSubscribableInfoContext(). + getAutoscalingPolicy())) { + return false; + } + } + + } + if(groupContext.getGroupContexts() != null) { + return findAutoscalingPolicyInGroup(groupContext.getGroupContexts(), + autoscalePolicyId); + } + } + return true; + } + + + /** + * Validate the deployment policy removal + * + * @param deploymentPolicyId + * @return + */ + public static boolean removableDeploymentPolicy(String deploymentPolicyId) { + boolean canRemove = true; + Map<String, Application> applications = ApplicationHolder.getApplications().getApplications(); + for (Application application : applications.values()) { + List<String> deploymentPolicyIdsReferredInApplication = AutoscalerUtil. + getDeploymentPolicyIdsReferredInApplication(application.getUniqueIdentifier()); + for (String deploymentPolicyIdInApp : deploymentPolicyIdsReferredInApplication) { + if (deploymentPolicyId.equals(deploymentPolicyIdInApp)) { + canRemove = false; + } + } + } + return canRemove; + } + + public static void readApplicationContextsFromRegistry() { + String[] resourcePaths = RegistryManager.getInstance().getApplicationContextResourcePaths(); + if ((resourcePaths == null) || (resourcePaths.length == 0)) { + return; + } + for (String resourcePath : resourcePaths) { + ApplicationContext applicationContext = RegistryManager.getInstance(). + getApplicationContextByResourcePath(resourcePath); + AutoscalerContext.getInstance().addApplicationContext( applicationContext); + } } + } http://git-wip-us.apache.org/repos/asf/stratos/blob/729ef7ab/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/AutoscalerUtilTest.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/AutoscalerUtilTest.java b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/AutoscalerUtilTest.java index 3706fd4..2f65281 100644 --- a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/AutoscalerUtilTest.java +++ b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/AutoscalerUtilTest.java @@ -19,9 +19,16 @@ package org.apache.stratos.autoscaler; +import org.apache.stratos.autoscaler.applications.pojo.*; +import org.apache.stratos.autoscaler.context.AutoscalerContext; import org.apache.stratos.autoscaler.util.AutoscalerUtil; +import org.apache.stratos.autoscaler.util.ServiceReferenceHolder; +import org.apache.stratos.common.clustering.impl.HazelcastDistributedObjectProvider; import org.junit.Test; +import java.util.ArrayList; +import java.util.List; + import static org.junit.Assert.assertEquals; /** @@ -68,4 +75,62 @@ public class AutoscalerUtilTest { tenantRange = AutoscalerUtil.findTenantRange(tenantId, null); assertEquals(tenantRange, "*"); } + + @Test + public void testRemovalOfAutoscalingPolicy() { + List<CartridgeContext> cartridgeContexts = new ArrayList<CartridgeContext>(); + for(int i = 0; i < 12; i++) { + CartridgeContext cartridgeContext = new CartridgeContext(); + SubscribableInfoContext subscribableContext = new SubscribableInfoContext(); + subscribableContext.setAlias("cart-" + i); + subscribableContext.setDeploymentPolicy("dep-" + i); + subscribableContext.setAutoscalingPolicy("auto-" + i); + cartridgeContext.setSubscribableInfoContext(subscribableContext); + cartridgeContexts.add(cartridgeContext); + } + List<GroupContext> groupContextList = new ArrayList<GroupContext>(); + for(int i = 0; i < 5; i++) { + GroupContext groupContext = new GroupContext(); + groupContext.setAlias("group-" + i); + CartridgeContext[] cartridgeContexts1 = new CartridgeContext[2]; + cartridgeContexts1[0] = cartridgeContexts.get(i); + cartridgeContexts1[1] = cartridgeContexts.get(i+5); + + groupContext.setCartridgeContexts(cartridgeContexts1); + groupContextList.add(groupContext); + } + + //Application-1 + ApplicationContext applicationContext = new ApplicationContext(); + applicationContext.setApplicationId("application-1"); + ComponentContext componentContext = new ComponentContext(); + CartridgeContext[] cartridgeContexts1 = new CartridgeContext[2]; + cartridgeContexts1[0] = cartridgeContexts.get(10); + cartridgeContexts1[1] = cartridgeContexts.get(11); + componentContext.setCartridgeContexts(cartridgeContexts1); + GroupContext[] groupContexts = new GroupContext[groupContextList.size()]; + componentContext.setGroupContexts(groupContextList.toArray(groupContexts)); + applicationContext.setComponents(componentContext); + + ServiceReferenceHolder holder = ServiceReferenceHolder.getInstance(); + holder.setDistributedObjectProvider(new HazelcastDistributedObjectProvider()); + + AutoscalerContext.getInstance().addApplicationContext(applicationContext); + + + boolean canRemove; + + canRemove = AutoscalerUtil.removableAutoScalerPolicy("test"); + assertEquals(canRemove, true); + + for(int i = 0; i < 12; i ++) { + canRemove = AutoscalerUtil.removableAutoScalerPolicy("auto-" + i); + assertEquals(canRemove, false); + + } + } + + public void testRemovalOfDeploymentPolicy() { + + } }
