http://git-wip-us.apache.org/repos/asf/stratos/blob/395be450/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/GroupStartupOrderTest.java ---------------------------------------------------------------------- diff --git a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/GroupStartupOrderTest.java b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/GroupStartupOrderTest.java new file mode 100644 index 0000000..b7bff04 --- /dev/null +++ b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/GroupStartupOrderTest.java @@ -0,0 +1,377 @@ +/* + * 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.integration.tests.application; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.common.beans.application.ApplicationBean; +import org.apache.stratos.integration.common.RestConstants; +import org.apache.stratos.integration.common.TopologyHandler; +import org.apache.stratos.integration.tests.StratosIntegrationTest; +import org.apache.stratos.messaging.domain.application.ApplicationStatus; +import org.testng.annotations.Test; + +import java.util.Map; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; +import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertTrue; + +/** + * Handling the startup order of the group + */ +public class GroupStartupOrderTest extends StratosIntegrationTest { + private static final Log log = LogFactory.getLog(SampleApplicationsTest.class); + private static final String RESOURCES_PATH = "/group-startup-order-test"; + private static final int GROUP_ACTIVE_TIMEOUT = 300000; + private static final int NODES_START_PARALLEL_TIMEOUT = 30000; + + + @Test(timeOut = APPLICATION_TEST_TIMEOUT) + public void testTerminationBehavior() { + try { + log.info("----------------------Started application startup order test case------------------------"); + + String autoscalingPolicyId = "autoscaling-policy-group-startup-order-test"; + TopologyHandler topologyHandler = TopologyHandler.getInstance(); + + boolean addedScalingPolicy = restClient.addEntity(RESOURCES_PATH + RestConstants.AUTOSCALING_POLICIES_PATH + + "/" + autoscalingPolicyId + ".json", + RestConstants.AUTOSCALING_POLICIES, RestConstants.AUTOSCALING_POLICIES_NAME); + assertTrue(addedScalingPolicy); + + boolean addedC1 = restClient.addEntity( + RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + "esb-group-startup-order-test.json", + RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME); + assertTrue(addedC1); + + boolean addedC2 = restClient.addEntity( + RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + "php-group-startup-order-test.json", + RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME); + assertTrue(addedC2); + + boolean addedC3 = restClient.addEntity( + RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + "stratos-lb-group-startup-order-test.json", + RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME); + assertTrue(addedC3); + + boolean addedC5 = restClient.addEntity( + RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + "tomcat1-group-startup-order-test.json", + RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME); + assertTrue(addedC5); + + boolean addedC6 = restClient.addEntity( + RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + "tomcat2-group-startup-order-test.json", + RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME); + assertTrue(addedC6); + + boolean addedC7 = restClient.addEntity( + RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + "tomcat3-group-startup-order-test.json", + RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME); + assertTrue(addedC7); + + boolean addedC8 = restClient.addEntity( + RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + "tomcat-group-startup-order-test.json", + RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME); + assertTrue(addedC8); + + boolean addedG2 = restClient.addEntity(RESOURCES_PATH + RestConstants.CARTRIDGE_GROUPS_PATH + + "/" + "group6-group-startup-order-test.json", RestConstants.CARTRIDGE_GROUPS, + RestConstants.CARTRIDGE_GROUPS_NAME); + assertTrue(addedG2); + + boolean addedG3 = restClient.addEntity(RESOURCES_PATH + RestConstants.CARTRIDGE_GROUPS_PATH + + "/" + "group8-group-startup-order-test.json", RestConstants.CARTRIDGE_GROUPS, + RestConstants.CARTRIDGE_GROUPS_NAME); + assertTrue(addedG3); + + boolean addedN1 = restClient.addEntity(RESOURCES_PATH + RestConstants.NETWORK_PARTITIONS_PATH + "/" + + "network-partition-group-startup-order-test-1.json", + RestConstants.NETWORK_PARTITIONS, RestConstants.NETWORK_PARTITIONS_NAME); + assertTrue(addedN1); + + boolean addedDep = restClient.addEntity(RESOURCES_PATH + RestConstants.DEPLOYMENT_POLICIES_PATH + "/" + + "deployment-policy-group-startup-order-test.json", + RestConstants.DEPLOYMENT_POLICIES, RestConstants.DEPLOYMENT_POLICIES_NAME); + assertTrue(addedDep); + + boolean added = restClient.addEntity(RESOURCES_PATH + RestConstants.APPLICATIONS_PATH + "/" + + "group-startup-order-test.json", RestConstants.APPLICATIONS, + RestConstants.APPLICATIONS_NAME); + assertTrue(added); + + ApplicationBean bean = (ApplicationBean) restClient.getEntity(RestConstants.APPLICATIONS, + "group-startup-order-test", ApplicationBean.class, RestConstants.APPLICATIONS_NAME); + assertEquals(bean.getApplicationId(), "group-startup-order-test"); + + boolean addAppPolicy = restClient.addEntity(RESOURCES_PATH + RestConstants.APPLICATION_POLICIES_PATH + "/" + + "application-policy-group-startup-order-test.json", RestConstants.APPLICATION_POLICIES, + RestConstants.APPLICATION_POLICIES_NAME); + assertTrue(addAppPolicy); + + //deploy the application + String resourcePath = RestConstants.APPLICATIONS + "/" + "group-startup-order-test" + + RestConstants.APPLICATIONS_DEPLOY + "/" + "application-policy-group-startup-order-test"; + boolean deployed = restClient.deployEntity(resourcePath, + RestConstants.APPLICATIONS_NAME); + assertTrue(deployed); + + String group6 = topologyHandler.generateId(bean.getApplicationId(), + "my-group6-group-startup-order-test", bean.getApplicationId() + "-1"); + + String group8 = topologyHandler.generateId(bean.getApplicationId(), + "my-group8-group-startup-order-test", bean.getApplicationId() + "-1"); + + String lb = topologyHandler. + getClusterIdFromAlias(bean.getApplicationId(), + "my-stratos-lb-group-startup-order-test"); + + String tomcat = topologyHandler. + getClusterIdFromAlias(bean.getApplicationId(), + "my-tomcat-group-startup-order-test"); + + assertCreationOfNodes(lb, tomcat); + + assertCreationOfNodes(tomcat, group6); + + assertCreationOfNodesInParallel(group6, group8); + + assertCreationOfNodes(tomcat, group8); + + String group7 = topologyHandler.generateId(bean.getApplicationId(), + "my-group7-group-startup-order-test", bean.getApplicationId() + "-1"); + + String groupTom2 = topologyHandler.generateId(bean.getApplicationId(), + "my-group6-group-tom2-group-startup-order-test", bean.getApplicationId() + "-1"); + + assertCreationOfNodesInParallel(group7, groupTom2); + + String group7Tomcat = topologyHandler. + getClusterIdFromAlias(bean.getApplicationId(), + "my-group7-tomcat-group-startup-order-test"); + + String group7Tomcat1 = topologyHandler. + getClusterIdFromAlias(bean.getApplicationId(), + "my-group7-tomcat1-group-startup-order-test"); + + assertCreationOfNodes(group7Tomcat, group7Tomcat1); + + String groupTom2Tomcat2 = topologyHandler. + getClusterIdFromAlias(bean.getApplicationId(), + "my-group-tom2-tomcat2-group-startup-order-test"); + + String groupTom2Tomcat3 = topologyHandler. + getClusterIdFromAlias(bean.getApplicationId(), + "my-group-tom2-tomcat3-group-startup-order-test"); + + assertCreationOfNodes(groupTom2Tomcat2, groupTom2Tomcat3); + + String group8Tomcat2 = topologyHandler. + getClusterIdFromAlias(bean.getApplicationId(), + "my-tomcat2-group8-group-startup-order-test"); + + String group8Tomcat = topologyHandler. + getClusterIdFromAlias(bean.getApplicationId(), + "my-tomcat-group8-group-startup-order-test"); + + assertCreationOfNodesInParallel(group8Tomcat2, group8Tomcat); + + //Application active handling + topologyHandler.assertApplicationStatus(bean.getApplicationId(), + ApplicationStatus.Active); + + //Group active handling + topologyHandler.assertGroupActivation(bean.getApplicationId()); + + //Cluster active handling + topologyHandler.assertClusterActivation(bean.getApplicationId()); + + boolean removedGroup = restClient.removeEntity(RestConstants.CARTRIDGE_GROUPS, + "group6-group-startup-order-test", + RestConstants.CARTRIDGE_GROUPS_NAME); + assertFalse(removedGroup); + + removedGroup = restClient.removeEntity(RestConstants.CARTRIDGE_GROUPS, + "group8-group-startup-order-test", + RestConstants.CARTRIDGE_GROUPS_NAME); + assertFalse(removedGroup); + + boolean removedAuto = restClient.removeEntity(RestConstants.AUTOSCALING_POLICIES, + autoscalingPolicyId, RestConstants.AUTOSCALING_POLICIES_NAME); + assertFalse(removedAuto); + + boolean removedNet = restClient.removeEntity(RestConstants.NETWORK_PARTITIONS, + "network-partition-group-startup-order-test-1", + RestConstants.NETWORK_PARTITIONS_NAME); + //Trying to remove the used network partition + assertFalse(removedNet); + + boolean removedDep = restClient.removeEntity(RestConstants.DEPLOYMENT_POLICIES, + "deployment-policy-group-startup-order-test", RestConstants.DEPLOYMENT_POLICIES_NAME); + assertFalse(removedDep); + + //Un-deploying the application + String resourcePathUndeploy = RestConstants.APPLICATIONS + "/" + "group-startup-order-test" + + RestConstants.APPLICATIONS_UNDEPLOY; + + boolean unDeployed = restClient.undeployEntity(resourcePathUndeploy, + RestConstants.APPLICATIONS_NAME); + assertTrue(unDeployed); + + boolean undeploy = topologyHandler.assertApplicationUndeploy("group-startup-order-test"); + if (!undeploy) { + //Need to forcefully undeploy the application + log.info("Force undeployment is going to start for the [application] " + "group-startup-order-test"); + + restClient.undeployEntity(RestConstants.APPLICATIONS + "/" + "group-startup-order-test" + + RestConstants.APPLICATIONS_UNDEPLOY + "?force=true", RestConstants.APPLICATIONS); + + boolean forceUndeployed = topologyHandler.assertApplicationUndeploy("group-startup-order-test"); + assertTrue(String.format("Forceful undeployment failed for the application %s", + "group-startup-order-test"), forceUndeployed); + + } + + boolean removed = restClient.removeEntity(RestConstants.APPLICATIONS, "group-startup-order-test", + RestConstants.APPLICATIONS_NAME); + assertTrue(removed); + + ApplicationBean beanRemoved = (ApplicationBean) restClient.getEntity(RestConstants.APPLICATIONS, + "group-startup-order-test", ApplicationBean.class, RestConstants.APPLICATIONS_NAME); + assertNull(beanRemoved); + + removedGroup = restClient.removeEntity(RestConstants.CARTRIDGE_GROUPS, + "group6-group-startup-order-test", + RestConstants.CARTRIDGE_GROUPS_NAME); + assertTrue(removedGroup); + + removedGroup = restClient.removeEntity(RestConstants.CARTRIDGE_GROUPS, + "group8-group-startup-order-test", + RestConstants.CARTRIDGE_GROUPS_NAME); + assertTrue(removedGroup); + + boolean removedC1 = restClient.removeEntity(RestConstants.CARTRIDGES, "stratos-lb-group-startup-order-test", + RestConstants.CARTRIDGES_NAME); + assertTrue(removedC1); + + boolean removedC2 = restClient.removeEntity(RestConstants.CARTRIDGES, "tomcat-group-startup-order-test", + RestConstants.CARTRIDGES_NAME); + assertTrue(removedC2); + + boolean removedC3 = restClient.removeEntity(RestConstants.CARTRIDGES, "tomcat1-group-startup-order-test", + RestConstants.CARTRIDGES_NAME); + assertTrue(removedC3); + + boolean removedC4 = restClient.removeEntity(RestConstants.CARTRIDGES, "tomcat2-group-startup-order-test", + RestConstants.CARTRIDGES_NAME); + assertTrue(removedC4); + + boolean removedC5 = restClient.removeEntity(RestConstants.CARTRIDGES, "tomcat3-group-startup-order-test", + RestConstants.CARTRIDGES_NAME); + assertTrue(removedC5); + + removedAuto = restClient.removeEntity(RestConstants.AUTOSCALING_POLICIES, + autoscalingPolicyId, RestConstants.AUTOSCALING_POLICIES_NAME); + assertTrue(removedAuto); + + removedDep = restClient.removeEntity(RestConstants.DEPLOYMENT_POLICIES, + "deployment-policy-group-startup-order-test", RestConstants.DEPLOYMENT_POLICIES_NAME); + assertTrue(removedDep); + + removedNet = restClient.removeEntity(RestConstants.NETWORK_PARTITIONS, + "network-partition-group-startup-order-test-1", RestConstants.NETWORK_PARTITIONS_NAME); + assertFalse(removedNet); + + boolean removeAppPolicy = restClient.removeEntity(RestConstants.APPLICATION_POLICIES, + "application-policy-group-startup-order-test", RestConstants.APPLICATION_POLICIES_NAME); + assertTrue(removeAppPolicy); + + removedNet = restClient.removeEntity(RestConstants.NETWORK_PARTITIONS, + "network-partition-group-startup-order-test-1", RestConstants.NETWORK_PARTITIONS_NAME); + assertTrue(removedNet); + + log.info( + "-------------------------------Ended application termination behavior test case-------------------------------"); + + } + catch (Exception e) { + log.error("An error occurred while handling application termination behavior", e); + assertTrue("An error occurred while handling application termination behavior", false); + } + } + + private void assertCreationOfNodes(String firstNodeId, String secondNodeId) { + //group1 started first, then cluster started later + long startTime = System.currentTimeMillis(); + Map<String, Long> activeMembers = TopologyHandler.getInstance().getActivateddMembers(); + Map<String, Long> createdMembers = TopologyHandler.getInstance().getCreatedMembers(); + //Active member should be available at the time cluster is started to create. + while (!activeMembers.containsKey(firstNodeId)) { + try { + Thread.sleep(1000); + } + catch (InterruptedException ignored) { + } + activeMembers = TopologyHandler.getInstance().getActivateddMembers(); + if ((System.currentTimeMillis() - startTime) > GROUP_ACTIVE_TIMEOUT) { + break; + } + } + assertTrue(activeMembers.containsKey(firstNodeId)); + + while (!createdMembers.containsKey(secondNodeId)) { + try { + Thread.sleep(1000); + } + catch (InterruptedException ignore) { + } + createdMembers = TopologyHandler.getInstance().getCreatedMembers(); + if ((System.currentTimeMillis() - startTime) > GROUP_ACTIVE_TIMEOUT) { + break; + } + } + + assertTrue(createdMembers.containsKey(secondNodeId)); + + assertTrue(createdMembers.get(secondNodeId) > activeMembers.get(firstNodeId)); + } + + private void assertCreationOfNodesInParallel(String firstNodeId, String secondNodeId) { + //group1 started first, then cluster started later + long startTime = System.currentTimeMillis(); + Map<String, Long> createdMembers = TopologyHandler.getInstance().getCreatedMembers(); + //Active member should be available at the time cluster is started to create. + + while (!(createdMembers.containsKey(firstNodeId) && createdMembers.containsKey(firstNodeId))) { + try { + Thread.sleep(1000); + } + catch (InterruptedException ignored) { + } + createdMembers = TopologyHandler.getInstance().getCreatedMembers(); + if ((System.currentTimeMillis() - startTime) > NODES_START_PARALLEL_TIMEOUT) { + break; + } + } + assertTrue(createdMembers.containsKey(firstNodeId)); + assertTrue(createdMembers.containsKey(firstNodeId)); + + } +}
http://git-wip-us.apache.org/repos/asf/stratos/blob/395be450/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/GroupTerminationBehaviorTest.java ---------------------------------------------------------------------- diff --git a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/GroupTerminationBehaviorTest.java b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/GroupTerminationBehaviorTest.java new file mode 100644 index 0000000..2134385 --- /dev/null +++ b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/GroupTerminationBehaviorTest.java @@ -0,0 +1,427 @@ +/* + * 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.integration.tests.application; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.common.beans.application.ApplicationBean; +import org.apache.stratos.common.beans.cartridge.CartridgeGroupBean; +import org.apache.stratos.common.beans.policy.deployment.ApplicationPolicyBean; +import org.apache.stratos.integration.common.RestConstants; +import org.apache.stratos.integration.common.TopologyHandler; +import org.apache.stratos.integration.tests.StratosIntegrationTest; +import org.apache.stratos.messaging.domain.application.ApplicationStatus; +import org.apache.stratos.messaging.domain.topology.Member; +import org.testng.annotations.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; +import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertTrue; + +/** + * Handling the termination behavior of the group + */ +public class GroupTerminationBehaviorTest extends StratosIntegrationTest { + private static final Log log = LogFactory.getLog(GroupTerminationBehaviorTest.class); + private static final String RESOURCES_PATH = "/group-termination-behavior-test"; + private static final int GROUP_INACTIVE_TIMEOUT = 180000; + + @Test(timeOut = APPLICATION_TEST_TIMEOUT) + public void testTerminationBehavior() { + try { + log.info("----------------------Started application termination behavior test case----------------------"); + + String autoscalingPolicyId = "autoscaling-policy-group-termination-behavior-test"; + TopologyHandler topologyHandler = TopologyHandler.getInstance(); + + boolean addedScalingPolicy = restClient.addEntity(RESOURCES_PATH + RestConstants.AUTOSCALING_POLICIES_PATH + + "/" + autoscalingPolicyId + ".json", + RestConstants.AUTOSCALING_POLICIES, RestConstants.AUTOSCALING_POLICIES_NAME); + assertTrue(addedScalingPolicy); + + boolean addedC1 = restClient.addEntity( + RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + "c1-group-termination-behavior-test.json", + RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME); + assertTrue(addedC1); + + boolean addedC2 = restClient.addEntity( + RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + "c2-group-termination-behavior-test.json", + RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME); + assertTrue(addedC2); + + boolean addedC3 = restClient.addEntity( + RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + "c3-group-termination-behavior-test.json", + RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME); + assertTrue(addedC3); + + boolean addedC4 = restClient.addEntity( + RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + "c4-group-termination-behavior-test.json", + RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME); + assertTrue(addedC4); + + boolean addedG1 = restClient.addEntity(RESOURCES_PATH + RestConstants.CARTRIDGE_GROUPS_PATH + + "/" + "cartridge-groups-group-termination-behavior-test.json", + RestConstants.CARTRIDGE_GROUPS, + RestConstants.CARTRIDGE_GROUPS_NAME); + assertTrue(addedG1); + + CartridgeGroupBean beanG1 = (CartridgeGroupBean) restClient. + getEntity(RestConstants.CARTRIDGE_GROUPS, "g-sc-G4-group-termination-behavior-test", + CartridgeGroupBean.class, RestConstants.CARTRIDGE_GROUPS_NAME); + assertEquals(beanG1.getName(), "g-sc-G4-group-termination-behavior-test"); + + boolean addedN1 = restClient.addEntity(RESOURCES_PATH + RestConstants.NETWORK_PARTITIONS_PATH + "/" + + "network-partition-group-termination-behavior-test-1.json", + RestConstants.NETWORK_PARTITIONS, RestConstants.NETWORK_PARTITIONS_NAME); + assertTrue(addedN1); + + boolean addedDep = restClient.addEntity(RESOURCES_PATH + RestConstants.DEPLOYMENT_POLICIES_PATH + "/" + + "deployment-policy-group-termination-behavior-test.json", + RestConstants.DEPLOYMENT_POLICIES, RestConstants.DEPLOYMENT_POLICIES_NAME); + assertTrue(addedDep); + + boolean added = restClient.addEntity(RESOURCES_PATH + RestConstants.APPLICATIONS_PATH + "/" + + "group-termination-behavior-test.json", RestConstants.APPLICATIONS, + RestConstants.APPLICATIONS_NAME); + assertTrue(added); + + ApplicationBean bean = (ApplicationBean) restClient.getEntity(RestConstants.APPLICATIONS, + "group-termination-behavior-test", ApplicationBean.class, RestConstants.APPLICATIONS_NAME); + assertEquals(bean.getApplicationId(), "group-termination-behavior-test"); + + boolean addAppPolicy = restClient.addEntity(RESOURCES_PATH + RestConstants.APPLICATION_POLICIES_PATH + "/" + + "application-policy-group-termination-behavior-test.json", + RestConstants.APPLICATION_POLICIES, + RestConstants.APPLICATION_POLICIES_NAME); + assertTrue(addAppPolicy); + + ApplicationPolicyBean policyBean = (ApplicationPolicyBean) restClient.getEntity( + RestConstants.APPLICATION_POLICIES, + "application-policy-group-termination-behavior-test", ApplicationPolicyBean.class, + RestConstants.APPLICATION_POLICIES_NAME); + + //deploy the application + String resourcePath = RestConstants.APPLICATIONS + "/" + "group-termination-behavior-test" + + RestConstants.APPLICATIONS_DEPLOY + "/" + "application-policy-group-termination-behavior-test"; + boolean deployed = restClient.deployEntity(resourcePath, + RestConstants.APPLICATIONS_NAME); + assertTrue(deployed); + + String groupId = topologyHandler.generateId(bean.getApplicationId(), + "g-G1-1x0-group-termination-behavior-test", bean.getApplicationId() + "-1"); + + String clusterIdC3 = topologyHandler. + getClusterIdFromAlias(bean.getApplicationId(), + "c3-1x0-group-termination-behavior-test"); + + String clusterIdC4 = topologyHandler. + getClusterIdFromAlias(bean.getApplicationId(), + "c4-1x0-group-termination-behavior-test"); + + String clusterIdC2 = topologyHandler. + getClusterIdFromAlias(bean.getApplicationId(), + "c2-1x0-group-termination-behavior-test"); + + assertCreationOfNodes(groupId, clusterIdC2); + + assertCreationOfNodes(clusterIdC3, clusterIdC4); + + //Application active handling + topologyHandler.assertApplicationStatus(bean.getApplicationId(), + ApplicationStatus.Active); + + //Group active handling + topologyHandler.assertGroupActivation(bean.getApplicationId()); + + //Cluster active handling + topologyHandler.assertClusterActivation(bean.getApplicationId()); + + Map<String, Member> memberMap = TopologyHandler.getInstance().getMembersForCluster + ("c3-group-termination-behavior-test", bean.getApplicationId()); + + //Terminate members in the cluster + for (Map.Entry<String, Member> entry : memberMap.entrySet()) { + String memberId = entry.getValue().getMemberId(); + TopologyHandler.getInstance().terminateMemberInMockIaas(memberId, mockIaasApiClient); + TopologyHandler.getInstance().assertMemberTermination(memberId); + } + + List<String> clusterIds = new ArrayList<String>(); + clusterIds.add(clusterIdC3); + clusterIds.add(clusterIdC4); + clusterIds.add(clusterIdC2); + + assertGroupInactive(groupId, clusterIdC3); + + assertTerminatingOfNodes(groupId, clusterIds); + + assertTerminationOfNodes(groupId, clusterIds); + + assertCreationOfNodes(groupId, clusterIdC2); + + assertCreationOfNodes(clusterIdC3, clusterIdC4); + + //Application active handling + topologyHandler.assertApplicationStatus(bean.getApplicationId(), + ApplicationStatus.Active); + + //Group active handling + topologyHandler.assertGroupActivation(bean.getApplicationId()); + + //Cluster active handling + topologyHandler.assertClusterActivation(bean.getApplicationId()); + + boolean removedGroup = restClient.removeEntity(RestConstants.CARTRIDGE_GROUPS, + "g-sc-G4-group-termination-behavior-test", + RestConstants.CARTRIDGE_GROUPS_NAME); + assertFalse(removedGroup); + + boolean removedAuto = restClient.removeEntity(RestConstants.AUTOSCALING_POLICIES, + autoscalingPolicyId, RestConstants.AUTOSCALING_POLICIES_NAME); + assertFalse(removedAuto); + + boolean removedNet = restClient.removeEntity(RestConstants.NETWORK_PARTITIONS, + "network-partition-group-termination-behavior-test-1", + RestConstants.NETWORK_PARTITIONS_NAME); + //Trying to remove the used network partition + assertFalse(removedNet); + + boolean removedDep = restClient.removeEntity(RestConstants.DEPLOYMENT_POLICIES, + "deployment-policy-group-termination-behavior-test", RestConstants.DEPLOYMENT_POLICIES_NAME); + assertFalse(removedDep); + + //Un-deploying the application + String resourcePathUndeploy = RestConstants.APPLICATIONS + "/" + "group-termination-behavior-test" + + RestConstants.APPLICATIONS_UNDEPLOY; + + boolean unDeployed = restClient.undeployEntity(resourcePathUndeploy, + RestConstants.APPLICATIONS_NAME); + assertTrue(unDeployed); + + boolean undeploy = topologyHandler.assertApplicationUndeploy("group-termination-behavior-test"); + if (!undeploy) { + //Need to forcefully undeploy the application + log.info("Force undeployment is going to start for the [application] " + + "group-termination-behavior-test"); + + restClient.undeployEntity(RestConstants.APPLICATIONS + "/" + "group-termination-behavior-test" + + RestConstants.APPLICATIONS_UNDEPLOY + "?force=true", RestConstants.APPLICATIONS); + + boolean forceUndeployed = topologyHandler.assertApplicationUndeploy("group-termination-behavior-test"); + assertTrue(String.format("Forceful undeployment failed for the application %s", + "group-termination-behavior-test"), forceUndeployed); + + } + + boolean removed = restClient.removeEntity(RestConstants.APPLICATIONS, "group-termination-behavior-test", + RestConstants.APPLICATIONS_NAME); + assertTrue(removed); + + ApplicationBean beanRemoved = (ApplicationBean) restClient.getEntity(RestConstants.APPLICATIONS, + "group-termination-behavior-test", ApplicationBean.class, RestConstants.APPLICATIONS_NAME); + assertNull(beanRemoved); + + removedGroup = restClient.removeEntity(RestConstants.CARTRIDGE_GROUPS, + "g-sc-G4-group-termination-behavior-test", + RestConstants.CARTRIDGE_GROUPS_NAME); + assertTrue(removedGroup); + + boolean removedC1 = restClient.removeEntity(RestConstants.CARTRIDGES, "c1-group-termination-behavior-test", + RestConstants.CARTRIDGES_NAME); + assertTrue(removedC1); + + boolean removedC2 = restClient.removeEntity(RestConstants.CARTRIDGES, "c2-group-termination-behavior-test", + RestConstants.CARTRIDGES_NAME); + assertTrue(removedC2); + + boolean removedC3 = restClient.removeEntity(RestConstants.CARTRIDGES, "c3-group-termination-behavior-test", + RestConstants.CARTRIDGES_NAME); + assertTrue(removedC3); + + boolean removedC4 = restClient.removeEntity(RestConstants.CARTRIDGES, "c4-group-termination-behavior-test", + RestConstants.CARTRIDGES_NAME); + assertTrue(removedC4); + + removedAuto = restClient.removeEntity(RestConstants.AUTOSCALING_POLICIES, + autoscalingPolicyId, RestConstants.AUTOSCALING_POLICIES_NAME); + assertTrue(removedAuto); + + removedDep = restClient.removeEntity(RestConstants.DEPLOYMENT_POLICIES, + "deployment-policy-group-termination-behavior-test", RestConstants.DEPLOYMENT_POLICIES_NAME); + assertTrue(removedDep); + + removedNet = restClient.removeEntity(RestConstants.NETWORK_PARTITIONS, + "network-partition-group-termination-behavior-test-1", RestConstants.NETWORK_PARTITIONS_NAME); + assertFalse(removedNet); + + boolean removeAppPolicy = restClient.removeEntity(RestConstants.APPLICATION_POLICIES, + "application-policy-group-termination-behavior-test", RestConstants.APPLICATION_POLICIES_NAME); + assertTrue(removeAppPolicy); + + removedNet = restClient.removeEntity(RestConstants.NETWORK_PARTITIONS, + "network-partition-group-termination-behavior-test-1", RestConstants.NETWORK_PARTITIONS_NAME); + assertTrue(removedNet); + + log.info("-----------------------Ended application termination behavior test case-----------------------"); + + } + catch (Exception e) { + log.error("An error occurred while handling application termination behavior", e); + assertTrue("An error occurred while handling application termination behavior", false); + } + } + + private void assertGroupInactive(String groupId, String clusterId) { + long startTime = System.currentTimeMillis(); + Map<String, Long> inActiveMap = TopologyHandler.getInstance().getInActiveMembers(); + + while (!inActiveMap.containsKey(clusterId)) { + try { + Thread.sleep(1000); + } + catch (InterruptedException ignore) { + } + inActiveMap = TopologyHandler.getInstance().getInActiveMembers(); + if ((System.currentTimeMillis() - startTime) > GROUP_INACTIVE_TIMEOUT) { + break; + } + } + assertTrue(inActiveMap.containsKey(clusterId)); + + while (!inActiveMap.containsKey(groupId)) { + try { + Thread.sleep(1000); + } + catch (InterruptedException ignore) { + } + inActiveMap = TopologyHandler.getInstance().getInActiveMembers(); + if ((System.currentTimeMillis() - startTime) > GROUP_INACTIVE_TIMEOUT) { + break; + } + } + assertTrue(inActiveMap.containsKey(groupId)); + + } + + private void assertTerminatingOfNodes(String groupId, List<String> clusterIds) { + Map<String, Long> terminatingMembers = TopologyHandler.getInstance().getTerminatingMembers(); + for (String clusterId : clusterIds) { + long startTime = System.currentTimeMillis(); + while (!terminatingMembers.containsKey(clusterId)) { + try { + Thread.sleep(1000); + } + catch (InterruptedException ignore) { + } + terminatingMembers = TopologyHandler.getInstance().getTerminatingMembers(); + if ((System.currentTimeMillis() - startTime) > GROUP_INACTIVE_TIMEOUT) { + break; + } + } + assertTrue(terminatingMembers.containsKey(groupId)); + } + long startTime = System.currentTimeMillis(); + while (!terminatingMembers.containsKey(groupId)) { + try { + Thread.sleep(1000); + } + catch (InterruptedException ignore) { + } + terminatingMembers = TopologyHandler.getInstance().getTerminatingMembers(); + if ((System.currentTimeMillis() - startTime) > GROUP_INACTIVE_TIMEOUT) { + break; + } + } + assertTrue(terminatingMembers.containsKey(groupId)); + + } + + private void assertTerminationOfNodes(String groupId, List<String> clusterIds) { + long startTime = System.currentTimeMillis(); + Map<String, Long> terminatedMembers = TopologyHandler.getInstance().getTerminatedMembers(); + + for (String clusterId : clusterIds) { + while (!terminatedMembers.containsKey(clusterId)) { + try { + Thread.sleep(1000); + } + catch (InterruptedException ignore) { + } + terminatedMembers = TopologyHandler.getInstance().getTerminatedMembers(); + if ((System.currentTimeMillis() - startTime) > GROUP_INACTIVE_TIMEOUT) { + break; + } + } + assertTrue(terminatedMembers.containsKey(clusterId)); + } + + while (!terminatedMembers.containsKey(groupId)) { + try { + Thread.sleep(1000); + } + catch (InterruptedException ignore) { + } + terminatedMembers = TopologyHandler.getInstance().getTerminatedMembers(); + if ((System.currentTimeMillis() - startTime) > GROUP_INACTIVE_TIMEOUT) { + break; + } + } + + assertTrue(terminatedMembers.containsKey(groupId)); + } + + private void assertCreationOfNodes(String firstNodeId, String secondNodeId) { + //group1 started first, then cluster started later + long startTime = System.currentTimeMillis(); + Map<String, Long> activeMembers = TopologyHandler.getInstance().getActivateddMembers(); + Map<String, Long> createdMembers = TopologyHandler.getInstance().getCreatedMembers(); + //Active member should be available at the time cluster is started to create. + while (!activeMembers.containsKey(firstNodeId)) { + try { + Thread.sleep(1000); + } + catch (InterruptedException ignored) { + } + activeMembers = TopologyHandler.getInstance().getActivateddMembers(); + if ((System.currentTimeMillis() - startTime) > GROUP_INACTIVE_TIMEOUT) { + break; + } + } + assertTrue(activeMembers.containsKey(firstNodeId)); + + while (!createdMembers.containsKey(secondNodeId)) { + try { + Thread.sleep(1000); + } + catch (InterruptedException ignored) { + } + createdMembers = TopologyHandler.getInstance().getCreatedMembers(); + if ((System.currentTimeMillis() - startTime) > GROUP_INACTIVE_TIMEOUT) { + break; + } + } + assertTrue(createdMembers.containsKey(secondNodeId)); + assertTrue(createdMembers.get(secondNodeId) > activeMembers.get(firstNodeId)); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/stratos/blob/395be450/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/PartitionOneAfterAnotherClusterTest.java ---------------------------------------------------------------------- diff --git a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/PartitionOneAfterAnotherClusterTest.java b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/PartitionOneAfterAnotherClusterTest.java new file mode 100644 index 0000000..ddd157f --- /dev/null +++ b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/PartitionOneAfterAnotherClusterTest.java @@ -0,0 +1,291 @@ +/* + * 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.integration.tests.application; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.common.beans.application.ApplicationBean; +import org.apache.stratos.common.beans.policy.deployment.ApplicationPolicyBean; +import org.apache.stratos.integration.common.RestConstants; +import org.apache.stratos.integration.common.TopologyHandler; +import org.apache.stratos.integration.tests.StratosIntegrationTest; +import org.apache.stratos.messaging.domain.application.Application; +import org.apache.stratos.messaging.domain.application.ApplicationStatus; +import org.apache.stratos.messaging.domain.application.ClusterDataHolder; +import org.apache.stratos.messaging.domain.instance.ClusterInstance; +import org.apache.stratos.messaging.domain.topology.Cluster; +import org.apache.stratos.messaging.domain.topology.Member; +import org.apache.stratos.messaging.domain.topology.Service; +import org.apache.stratos.messaging.message.receiver.application.ApplicationManager; +import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; +import org.testng.annotations.Test; + +import java.util.*; + +import static org.testng.Assert.assertEquals; +import static org.testng.AssertJUnit.assertNotNull; +import static org.testng.AssertJUnit.assertTrue; + +/** + * This will handle the scale-up and scale-down of a particular cluster bursting test cases + */ +public class PartitionOneAfterAnotherClusterTest extends StratosIntegrationTest { + private static final Log log = LogFactory.getLog(SampleApplicationsTest.class); + private static final String RESOURCES_PATH = "/partition-round-robin-cluster-test"; + + + @Test(timeOut = APPLICATION_TEST_TIMEOUT) + public void testDeployApplication() { + try { + log.info("-----------------------Started Partition One after another test case-----------------------"); + TopologyHandler topologyHandler = TopologyHandler.getInstance(); + String autoscalingPolicyId = "autoscaling-policy-3"; + + boolean addedScalingPolicy = restClient.addEntity(RESOURCES_PATH + RestConstants.AUTOSCALING_POLICIES_PATH + + "/" + autoscalingPolicyId + ".json", + RestConstants.AUTOSCALING_POLICIES, RestConstants.AUTOSCALING_POLICIES_NAME); + assertEquals(addedScalingPolicy, true); + + boolean addedC1 = restClient.addEntity(RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + "c7.json", + RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME); + assertEquals(addedC1, true); + + boolean addedN1 = restClient.addEntity(RESOURCES_PATH + RestConstants.NETWORK_PARTITIONS_PATH + "/" + + "network-partition-11.json", + RestConstants.NETWORK_PARTITIONS, RestConstants.NETWORK_PARTITIONS_NAME); + assertEquals(addedN1, true); + + boolean addedDep = restClient.addEntity(RESOURCES_PATH + RestConstants.DEPLOYMENT_POLICIES_PATH + "/" + + "deployment-policy-5.json", + RestConstants.DEPLOYMENT_POLICIES, RestConstants.DEPLOYMENT_POLICIES_NAME); + assertEquals(addedDep, true); + + boolean added = restClient.addEntity(RESOURCES_PATH + RestConstants.APPLICATIONS_PATH + "/" + + "single-cluster-scaling-test.json", RestConstants.APPLICATIONS, + RestConstants.APPLICATIONS_NAME); + assertEquals(added, true); + + ApplicationBean bean = (ApplicationBean) restClient.getEntity(RestConstants.APPLICATIONS, + "single-cluster-scaling-test", ApplicationBean.class, RestConstants.APPLICATIONS_NAME); + assertEquals(bean.getApplicationId(), "single-cluster-scaling-test"); + + boolean addAppPolicy = restClient.addEntity(RESOURCES_PATH + RestConstants.APPLICATION_POLICIES_PATH + "/" + + "application-policy-4.json", RestConstants.APPLICATION_POLICIES, + RestConstants.APPLICATION_POLICIES_NAME); + assertEquals(addAppPolicy, true); + + ApplicationPolicyBean policyBean = (ApplicationPolicyBean) restClient.getEntity( + RestConstants.APPLICATION_POLICIES, + "application-policy-4", ApplicationPolicyBean.class, + RestConstants.APPLICATION_POLICIES_NAME); + + //deploy the application + String resourcePath = RestConstants.APPLICATIONS + "/" + "single-cluster-scaling-test" + + RestConstants.APPLICATIONS_DEPLOY + "/" + "application-policy-4"; + boolean deployed = restClient.deployEntity(resourcePath, + RestConstants.APPLICATIONS_NAME); + assertEquals(deployed, true); + + //Application active handling + topologyHandler.assertApplicationStatus(bean.getApplicationId(), + ApplicationStatus.Active); + + //Cluster active handling + topologyHandler.assertClusterActivation(bean.getApplicationId()); + + //Verifying whether members got created using round robin algorithm + assertClusterWithRoundRobinAlgorithm(bean.getApplicationId()); + + //Removing one member from cluster and check for auto healing + + + boolean removedAuto = restClient.removeEntity(RestConstants.AUTOSCALING_POLICIES, + autoscalingPolicyId, RestConstants.AUTOSCALING_POLICIES_NAME); + assertEquals(removedAuto, false); + + boolean removedNet = restClient.removeEntity(RestConstants.NETWORK_PARTITIONS, + "network-partition-11", + RestConstants.NETWORK_PARTITIONS_NAME); + //Trying to remove the used network partition + assertEquals(removedNet, false); + + boolean removedDep = restClient.removeEntity(RestConstants.DEPLOYMENT_POLICIES, + "deployment-policy-5", RestConstants.DEPLOYMENT_POLICIES_NAME); + assertEquals(removedDep, false); + + //Un-deploying the application + String resourcePathUndeploy = RestConstants.APPLICATIONS + "/" + "single-cluster-scaling-test" + + RestConstants.APPLICATIONS_UNDEPLOY; + + boolean unDeployed = restClient.undeployEntity(resourcePathUndeploy, + RestConstants.APPLICATIONS_NAME); + assertEquals(unDeployed, true); + + boolean undeploy = topologyHandler.assertApplicationUndeploy("single-cluster-scaling-test"); + if (!undeploy) { + //Need to forcefully undeploy the application + log.info("Force undeployment is going to start for the [application] " + "single-cluster-scaling-test"); + + restClient.undeployEntity(RestConstants.APPLICATIONS + "/" + "single-cluster-scaling-test" + + RestConstants.APPLICATIONS_UNDEPLOY + "?force=true", RestConstants.APPLICATIONS); + + boolean forceUndeployed = topologyHandler.assertApplicationUndeploy("single-cluster-scaling-test"); + assertEquals(forceUndeployed, true, String.format("Forceful undeployment failed for the application %s", + "single-cluster-scaling-test")); + + } + + boolean removed = restClient.removeEntity(RestConstants.APPLICATIONS, "single-cluster-scaling-test", + RestConstants.APPLICATIONS_NAME); + assertEquals(removed, true); + + ApplicationBean beanRemoved = (ApplicationBean) restClient.getEntity(RestConstants.APPLICATIONS, + "single-cluster-scaling-test", ApplicationBean.class, RestConstants.APPLICATIONS_NAME); + assertEquals(beanRemoved, null); + + boolean removedC1 = restClient.removeEntity(RestConstants.CARTRIDGES, "c7", + RestConstants.CARTRIDGES_NAME); + assertEquals(removedC1, true); + + + removedAuto = restClient.removeEntity(RestConstants.AUTOSCALING_POLICIES, + autoscalingPolicyId, RestConstants.AUTOSCALING_POLICIES_NAME); + assertEquals(removedAuto, true); + + removedDep = restClient.removeEntity(RestConstants.DEPLOYMENT_POLICIES, + "deployment-policy-5", RestConstants.DEPLOYMENT_POLICIES_NAME); + assertEquals(removedDep, true); + + removedNet = restClient.removeEntity(RestConstants.NETWORK_PARTITIONS, + "network-partition-11", RestConstants.NETWORK_PARTITIONS_NAME); + assertEquals(removedNet, false); + + + boolean removeAppPolicy = restClient.removeEntity(RestConstants.APPLICATION_POLICIES, + "application-policy-4", RestConstants.APPLICATION_POLICIES_NAME); + assertEquals(removeAppPolicy, true); + + removedNet = restClient.removeEntity(RestConstants.NETWORK_PARTITIONS, + "network-partition-11", RestConstants.NETWORK_PARTITIONS_NAME); + assertEquals(removedNet, true); + + log.info("--------------------------Ended Partition one after another test case-------------------------"); + + } + catch (Exception e) { + log.error("An error occurred while handling application bursting", e); + assertTrue("An error occurred while handling application bursting", false); + } + } + + /** + * Assert application activation + * + * @param applicationName + */ + private void assertClusterWithRoundRobinAlgorithm(String applicationName) { + Application application = ApplicationManager.getApplications().getApplication(applicationName); + assertNotNull(String.format("Application is not found: [application-id] %s", + applicationName), application); + + Set<ClusterDataHolder> clusterDataHolderSet = application.getClusterDataRecursively(); + for (ClusterDataHolder clusterDataHolder : clusterDataHolderSet) { + String serviceName = clusterDataHolder.getServiceType(); + String clusterId = clusterDataHolder.getClusterId(); + Service service = TopologyManager.getTopology().getService(serviceName); + assertNotNull(String.format("Service is not found: [application-id] %s [service] %s", + applicationName, serviceName), service); + + Cluster cluster = service.getCluster(clusterId); + assertNotNull(String.format("Cluster is not found: [application-id] %s [service] %s [cluster-id] %s", + applicationName, serviceName, clusterId), cluster); + + for (ClusterInstance instance : cluster.getInstanceIdToInstanceContextMap().values()) { + List<String> partitionsUsedInMembers = new ArrayList<String>(); + Map<String, List<Long>> partitionIdToMembersMap = new HashMap<String, List<Long>>(); + for (Member member : cluster.getMembers()) { + String partitionId = member.getPartitionId(); + if (!partitionIdToMembersMap.containsKey(partitionId)) { + List<Long> members = new ArrayList<Long>(); + members.add(member.getInitTime()); + partitionIdToMembersMap.put(partitionId, members); + } else { + partitionIdToMembersMap.get(partitionId).add(member.getInitTime()); + } + if (!partitionsUsedInMembers.contains(partitionId)) { + partitionsUsedInMembers.add(partitionId); + } + } + String p1 = "network-partition-11-partition-1"; + String p2 = "network-partition-11-partition-2"; + List<Long> p1InitTime = partitionIdToMembersMap.get(p1); + Collections.sort(p1InitTime); + + List<Long> p2InitTime = partitionIdToMembersMap.get(p2); + Collections.sort(p2InitTime); + + List<Long> allInitTime = new ArrayList<Long>(); + allInitTime.addAll(p1InitTime); + allInitTime.addAll(p2InitTime); + Collections.sort(allInitTime); + + int p1Index = -1; + int p2Index = -1; + String previousPartition = null; + for (int i = 0; i < allInitTime.size(); i++) { + if (previousPartition == null) { + if (p1InitTime.get(0) == allInitTime.get(i)) { + previousPartition = p1; + p1Index++; + } else if (p2InitTime.get(0) == allInitTime.get(i)) { + previousPartition = p2; + p2Index++; + } + } else if (previousPartition.equals(p1)) { + p2Index++; + previousPartition = p2; + assertEquals(allInitTime.get(i), p2InitTime.get(p2Index), + "Partition-2 doesn't not contain correct values in current iteration"); + if (p1Index >= 0) { + assertEquals(allInitTime.get(i - 1), p1InitTime.get(p1Index), + "Partition-1 doesn't not contain correct values in the previous iteration"); + if (p1Index + 1 <= (p1InitTime.size() - 1) && i + 1 <= (allInitTime.size() - 1)) { + assertEquals(allInitTime.get(i + 1), p1InitTime.get(p1Index + 1), + "Partition-1 doesn't not contain correct values in the next iteration"); + } + } + } else { + p1Index++; + previousPartition = p1; + assertEquals(allInitTime.get(i), p1InitTime.get(p1Index), "Partition-1 doesn't not contain " + + "correct values in current iteration"); + if (p2Index >= 0) { + assertEquals(allInitTime.get(i - 1), p2InitTime.get(p2Index), + "Partition-2 doesn't not contain correct values in the previous iteration"); + if ((p2Index + 1) <= (p2InitTime.size() - 1) && (i + 1) <= (allInitTime.size() - 1)) { + assertEquals(allInitTime.get(i + 1), p2InitTime.get(p2Index + 1), + "Partition-2 doesn't not contain correct values in the next iteration"); + } + } + } + } + } + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/stratos/blob/395be450/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/PartitionRoundRobinClusterTest.java ---------------------------------------------------------------------- diff --git a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/PartitionRoundRobinClusterTest.java b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/PartitionRoundRobinClusterTest.java new file mode 100644 index 0000000..35fd827 --- /dev/null +++ b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/PartitionRoundRobinClusterTest.java @@ -0,0 +1,298 @@ +/* + * 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.integration.tests.application; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.common.beans.application.ApplicationBean; +import org.apache.stratos.integration.common.RestConstants; +import org.apache.stratos.integration.common.TopologyHandler; +import org.apache.stratos.integration.tests.StratosIntegrationTest; +import org.apache.stratos.messaging.domain.application.Application; +import org.apache.stratos.messaging.domain.application.ApplicationStatus; +import org.apache.stratos.messaging.domain.application.ClusterDataHolder; +import org.apache.stratos.messaging.domain.instance.ClusterInstance; +import org.apache.stratos.messaging.domain.topology.Cluster; +import org.apache.stratos.messaging.domain.topology.Member; +import org.apache.stratos.messaging.domain.topology.Service; +import org.apache.stratos.messaging.message.receiver.application.ApplicationManager; +import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; +import org.testng.annotations.Test; + +import java.util.*; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.assertNotNull; + +/** + * This will handle the scale-up and scale-down of a particular cluster bursting test cases + */ +public class PartitionRoundRobinClusterTest extends StratosIntegrationTest { + private static final Log log = LogFactory.getLog(SampleApplicationsTest.class); + private static final String RESOURCES_PATH = "/partition-round-robin-cluster-test"; + + @Test(timeOut = APPLICATION_TEST_TIMEOUT) + public void testDeployApplication() { + try { + log.info("------------------------Started application Bursting test case-----------------------"); + TopologyHandler topologyHandler = TopologyHandler.getInstance(); + String autoscalingPolicyId = "autoscaling-policy-partition-round-robin-test"; + + boolean addedScalingPolicy = restClient.addEntity(RESOURCES_PATH + RestConstants.AUTOSCALING_POLICIES_PATH + + "/" + autoscalingPolicyId + ".json", + RestConstants.AUTOSCALING_POLICIES, RestConstants.AUTOSCALING_POLICIES_NAME); + assertEquals(addedScalingPolicy, true); + + boolean addedC1 = restClient.addEntity( + RESOURCES_PATH + RestConstants.CARTRIDGES_PATH + "/" + "c7-partition-round-robin-test.json", + RestConstants.CARTRIDGES, RestConstants.CARTRIDGES_NAME); + assertEquals(addedC1, true); + + boolean addedN1 = restClient.addEntity(RESOURCES_PATH + RestConstants.NETWORK_PARTITIONS_PATH + "/" + + "network-partition-partition-round-robin-test.json", + RestConstants.NETWORK_PARTITIONS, RestConstants.NETWORK_PARTITIONS_NAME); + assertEquals(addedN1, true); + + boolean addedDep = restClient.addEntity(RESOURCES_PATH + RestConstants.DEPLOYMENT_POLICIES_PATH + "/" + + "deployment-policy-partition-round-robin-test.json", + RestConstants.DEPLOYMENT_POLICIES, RestConstants.DEPLOYMENT_POLICIES_NAME); + assertEquals(addedDep, true); + + boolean added = restClient.addEntity(RESOURCES_PATH + RestConstants.APPLICATIONS_PATH + "/" + + "partition-round-robin-test.json", RestConstants.APPLICATIONS, + RestConstants.APPLICATIONS_NAME); + assertEquals(added, true); + + ApplicationBean bean = (ApplicationBean) restClient.getEntity(RestConstants.APPLICATIONS, + "partition-round-robin-test", ApplicationBean.class, RestConstants.APPLICATIONS_NAME); + assertEquals(bean.getApplicationId(), "partition-round-robin-test"); + + boolean addAppPolicy = restClient.addEntity(RESOURCES_PATH + RestConstants.APPLICATION_POLICIES_PATH + "/" + + "application-policy-partition-round-robin-test.json", RestConstants.APPLICATION_POLICIES, + RestConstants.APPLICATION_POLICIES_NAME); + assertEquals(addAppPolicy, true); + + //deploy the application + String resourcePath = RestConstants.APPLICATIONS + "/" + "partition-round-robin-test" + + RestConstants.APPLICATIONS_DEPLOY + "/" + "application-policy-partition-round-robin-test"; + boolean deployed = restClient.deployEntity(resourcePath, + RestConstants.APPLICATIONS_NAME); + assertEquals(deployed, true); + + + //Application active handling + topologyHandler.assertApplicationStatus(bean.getApplicationId(), + ApplicationStatus.Active); + + //Cluster active handling + topologyHandler.assertClusterActivation(bean.getApplicationId()); + + //Verifying whether members got created using round robin algorithm + assertClusterWithRoundRobinAlgorithm(bean.getApplicationId()); + + //Application in-active handling + log.info("Waiting for the faulty member detection from " + + "CEP as the statistics are stopped..."); + topologyHandler.assertApplicationStatus(bean.getApplicationId(), + ApplicationStatus.Inactive); + + //Application active handling after application becomes active again + topologyHandler.assertApplicationStatus(bean.getApplicationId(), + ApplicationStatus.Active); + + //Cluster active handling + topologyHandler.assertClusterActivation(bean.getApplicationId()); + + boolean removedAuto = restClient.removeEntity(RestConstants.AUTOSCALING_POLICIES, + autoscalingPolicyId, RestConstants.AUTOSCALING_POLICIES_NAME); + assertEquals(removedAuto, false); + + boolean removedNet = restClient.removeEntity(RestConstants.NETWORK_PARTITIONS, + "network-partition-partition-round-robin-test", + RestConstants.NETWORK_PARTITIONS_NAME); + //Trying to remove the used network partition + assertEquals(removedNet, false); + + boolean removedDep = restClient.removeEntity(RestConstants.DEPLOYMENT_POLICIES, + "deployment-policy-partition-round-robin-test", RestConstants.DEPLOYMENT_POLICIES_NAME); + assertEquals(removedDep, false); + + //Un-deploying the application + String resourcePathUndeploy = RestConstants.APPLICATIONS + "/" + "partition-round-robin-test" + + RestConstants.APPLICATIONS_UNDEPLOY; + + boolean unDeployed = restClient.undeployEntity(resourcePathUndeploy, + RestConstants.APPLICATIONS_NAME); + assertEquals(unDeployed, true); + + boolean undeploy = topologyHandler.assertApplicationUndeploy("partition-round-robin-test"); + if (!undeploy) { + //Need to forcefully undeploy the application + log.info("Force undeployment is going to start for the [application] " + "partition-round-robin-test"); + + restClient.undeployEntity(RestConstants.APPLICATIONS + "/" + "partition-round-robin-test" + + RestConstants.APPLICATIONS_UNDEPLOY + "?force=true", RestConstants.APPLICATIONS); + + boolean forceUndeployed = topologyHandler.assertApplicationUndeploy("partition-round-robin-test"); + assertEquals(forceUndeployed, true, String.format("Forceful undeployment failed for the application %s", + "partition-round-robin-test")); + + } + + boolean removed = restClient.removeEntity(RestConstants.APPLICATIONS, "partition-round-robin-test", + RestConstants.APPLICATIONS_NAME); + assertEquals(removed, true); + + ApplicationBean beanRemoved = (ApplicationBean) restClient.getEntity(RestConstants.APPLICATIONS, + "partition-round-robin-test", ApplicationBean.class, RestConstants.APPLICATIONS_NAME); + assertEquals(beanRemoved, null); + + boolean removedC1 = restClient.removeEntity(RestConstants.CARTRIDGES, "c7-partition-round-robin-test", + RestConstants.CARTRIDGES_NAME); + assertEquals(removedC1, true); + + + removedAuto = restClient.removeEntity(RestConstants.AUTOSCALING_POLICIES, + autoscalingPolicyId, RestConstants.AUTOSCALING_POLICIES_NAME); + assertEquals(removedAuto, true); + + removedDep = restClient.removeEntity(RestConstants.DEPLOYMENT_POLICIES, + "deployment-policy-partition-round-robin-test", RestConstants.DEPLOYMENT_POLICIES_NAME); + assertEquals(removedDep, true); + + removedNet = restClient.removeEntity(RestConstants.NETWORK_PARTITIONS, + "network-partition-partition-round-robin-test", RestConstants.NETWORK_PARTITIONS_NAME); + assertEquals(removedNet, false); + + + boolean removeAppPolicy = restClient.removeEntity(RestConstants.APPLICATION_POLICIES, + "application-policy-partition-round-robin-test", RestConstants.APPLICATION_POLICIES_NAME); + assertEquals(removeAppPolicy, true); + + removedNet = restClient.removeEntity(RestConstants.NETWORK_PARTITIONS, + "network-partition-partition-round-robin-test", RestConstants.NETWORK_PARTITIONS_NAME); + assertEquals(removedNet, true); + + log.info( + "-------------------------------Ended application bursting test case-------------------------------"); + + } + catch (Exception e) { + log.error("An error occurred while handling application bursting", e); + assertTrue(false, "An error occurred while handling application bursting"); + } + } + + /** + * Assert application activation + * + * @param applicationName + */ + private void assertClusterWithRoundRobinAlgorithm(String applicationName) { + Application application = ApplicationManager.getApplications().getApplication(applicationName); + assertNotNull(String.format("Application is not found: [application-id] %s", + applicationName), application); + + Set<ClusterDataHolder> clusterDataHolderSet = application.getClusterDataRecursively(); + for (ClusterDataHolder clusterDataHolder : clusterDataHolderSet) { + String serviceName = clusterDataHolder.getServiceType(); + String clusterId = clusterDataHolder.getClusterId(); + Service service = TopologyManager.getTopology().getService(serviceName); + assertNotNull(String.format("Service is not found: [application-id] %s [service] %s", + applicationName, serviceName), service); + + Cluster cluster = service.getCluster(clusterId); + assertNotNull(String.format("Cluster is not found: [application-id] %s [service] %s [cluster-id] %s", + applicationName, serviceName, clusterId), cluster); + + for (ClusterInstance instance : cluster.getInstanceIdToInstanceContextMap().values()) { + List<String> partitionsUsedInMembers = new ArrayList<String>(); + Map<String, List<Long>> partitionIdToMembersMap = new HashMap<String, List<Long>>(); + for (Member member : cluster.getMembers()) { + String partitionId = member.getPartitionId(); + if (!partitionIdToMembersMap.containsKey(partitionId)) { + List<Long> members = new ArrayList<Long>(); + members.add(member.getInitTime()); + partitionIdToMembersMap.put(partitionId, members); + } else { + partitionIdToMembersMap.get(partitionId).add(member.getInitTime()); + } + if (!partitionsUsedInMembers.contains(partitionId)) { + partitionsUsedInMembers.add(partitionId); + } + } + String p1 = "network-partition-11-partition-1"; + String p2 = "network-partition-11-partition-2"; + List<Long> p1InitTime = partitionIdToMembersMap.get(p1); + Collections.sort(p1InitTime); + + List<Long> p2InitTime = partitionIdToMembersMap.get(p2); + Collections.sort(p2InitTime); + + List<Long> allInitTime = new ArrayList<Long>(); + allInitTime.addAll(p1InitTime); + allInitTime.addAll(p2InitTime); + Collections.sort(allInitTime); + + int p1Index = -1; + int p2Index = -1; + String previousPartition = null; + for (int i = 0; i < allInitTime.size(); i++) { + if (previousPartition == null) { + if (p1InitTime.get(0) == allInitTime.get(i)) { + previousPartition = p1; + p1Index++; + } else if (p2InitTime.get(0) == allInitTime.get(i)) { + previousPartition = p2; + p2Index++; + + } + } else if (previousPartition.equals(p1)) { + p2Index++; + previousPartition = p2; + assertEquals(allInitTime.get(i), p2InitTime.get(p2Index), + "Partition-2 doesn't not contain correct values in current iteration"); + if (p1Index >= 0) { + assertEquals(allInitTime.get(i - 1), p1InitTime.get(p1Index), + "Partition-1 doesn't not contain correct values in the previous iteration"); + if (p1Index + 1 <= (p1InitTime.size() - 1) && i + 1 <= (allInitTime.size() - 1)) { + assertEquals(allInitTime.get(i + 1), p1InitTime.get(p1Index + 1), + "Partition-1 doesn't not contain correct values in the next iteration"); + } + } + } else { + p1Index++; + previousPartition = p1; + assertEquals(allInitTime.get(i), p1InitTime.get(p1Index), + "Partition-1 doesn't not contain correct values in current iteration"); + if (p2Index >= 0) { + assertEquals(allInitTime.get(i - 1), p2InitTime.get(p2Index), + "Partition-2 doesn't not contain correct values in the previous iteration"); + if ((p2Index + 1) <= (p2InitTime.size() - 1) && (i + 1) <= (allInitTime.size() - 1)) { + assertEquals(allInitTime.get(i + 1), p2InitTime.get(p2Index + 1), + "Partition-2 doesn't not contain correct values in the next iteration"); + } + } + } + } + } + } + } +} \ No newline at end of file
