package com.sequenceiq.it.cloudbreak.scaling; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; import com.sequenceiq.ambari.client.AmbariClient; import com.sequenceiq.cloudbreak.api.endpoint.StackEndpoint; import com.sequenceiq.cloudbreak.api.model.InstanceGroupResponse; import com.sequenceiq.cloudbreak.api.model.StackResponse; import com.sequenceiq.cloudbreak.api.model.Status; import com.sequenceiq.cloudbreak.client.CloudbreakClient; import com.sequenceiq.it.IntegrationTestContext; import com.sequenceiq.it.cloudbreak.CloudbreakITContextConstants; import com.sequenceiq.it.cloudbreak.CloudbreakUtil; public class ScalingUtil { private static final Logger LOGGER = LoggerFactory.getLogger(com.sequenceiq.it.cloudbreak.scaling.ScalingUtil.class); private ScalingUtil() { } private static int getNodeCount(StackResponse stackResponse) { List<InstanceGroupResponse> instanceGroups = stackResponse.getInstanceGroups(); int nodeCount = 0; for (InstanceGroupResponse instanceGroup : instanceGroups) { if (!instanceGroup.getGroup().equals("cbgateway")) { nodeCount += instanceGroup.getNodeCount(); } } return nodeCount; } public static void checkStackScaled(StackEndpoint stackEndpoint, String stackId, int expectedNodeCount) { StackResponse stackResponse = stackEndpoint.get(Long.valueOf(stackId)); Assert.assertEquals(stackResponse.getStatus(), Status.AVAILABLE, "The stack hasn't been started!"); Assert.assertEquals(expectedNodeCount, getNodeCount(stackResponse), "After scaling, the number of the nodes in stack differs from the expected number!"); } public static void checkClusterScaled(StackEndpoint stackEndpoint, String port, String stackId, String ambariUser, String ambariPassword, int expectedNodeCount, IntegrationTestContext itContext) { StackResponse stackResponse = stackEndpoint.get(Long.valueOf(stackId)); Assert.assertEquals(stackResponse.getCluster().getStatus(), "AVAILABLE", "The cluster hasn't been started!"); Assert.assertEquals(stackResponse.getStatus(), Status.AVAILABLE, "The stack hasn't been started!"); String ambariIp = CloudbreakUtil.getAmbariIp(stackEndpoint, stackId, itContext); AmbariClient ambariClient = new AmbariClient(ambariIp, port, ambariUser, ambariPassword); Assert.assertEquals(ambariClient.healthCheck(), "RUNNING", "The Ambari server is not running!"); Assert.assertEquals(expectedNodeCount, ambariClient.getClusterHosts().size(), "After scaling, the number of the nodes registered in ambari differs from the expected number!"); } public static int getNodeCountStack(StackEndpoint stackEndpoint, String stackId) { StackResponse stackResponse = stackEndpoint.get(Long.valueOf(stackId)); return getNodeCount(stackResponse); } public static int getNodeCountAmbari(StackEndpoint stackEndpoint, String port, String stackId, String ambariUser, String ambariPassword, IntegrationTestContext itContext) { String ambariIp = CloudbreakUtil.getAmbariIp(stackEndpoint, stackId, itContext); AmbariClient ambariClient = new AmbariClient(ambariIp, port, ambariUser, ambariPassword); return ambariClient.getClusterHosts().size(); } public static Map getNodeCountByHostgroup(StackResponse stackResponse) { Map<String, Integer> instanceCount = new HashMap<>(); List<InstanceGroupResponse> instanceGroups = stackResponse.getInstanceGroups(); for (InstanceGroupResponse instanceGroup : instanceGroups) { if (!instanceGroup.getGroup().equals("cbgateway")) { instanceCount.put(instanceGroup.getGroup(), instanceGroup.getNodeCount()); } } return instanceCount; } public static void putInstanceCountToContext(IntegrationTestContext itContext, String stackId) { List<Map<String, Integer>> tmpInstanceCount = new ArrayList<>(); StackEndpoint stackEndpoint = itContext.getContextParam(CloudbreakITContextConstants.CLOUDBREAK_CLIENT, CloudbreakClient.class).stackEndpoint(); StackResponse stackResponse = stackEndpoint.get(Long.valueOf(stackId)); if (itContext.getContextParam(CloudbreakITContextConstants.INSTANCE_COUNT, List.class) != null) { tmpInstanceCount = itContext.getContextParam(CloudbreakITContextConstants.INSTANCE_COUNT, List.class); tmpInstanceCount.add(ScalingUtil.getNodeCountByHostgroup(stackResponse)); } else { tmpInstanceCount.add(ScalingUtil.getNodeCountByHostgroup(stackResponse)); } itContext.putContextParam(CloudbreakITContextConstants.INSTANCE_COUNT, tmpInstanceCount); } }