/*
* Copyright 2015 herd contributors
*
* Licensed 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.finra.herd.service.helper;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.ArrayList;
import java.util.List;
import com.amazonaws.services.elasticmapreduce.model.Cluster;
import com.amazonaws.services.elasticmapreduce.model.ClusterSummary;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
import org.finra.herd.dao.impl.MockEmrOperationsImpl;
import org.finra.herd.model.api.xml.EmrCluster;
import org.finra.herd.model.api.xml.EmrClusterCreateRequest;
import org.finra.herd.model.api.xml.EmrClusterDefinition;
import org.finra.herd.model.api.xml.EmrHadoopJarStep;
import org.finra.herd.model.api.xml.EmrHiveStep;
import org.finra.herd.model.api.xml.EmrPigStep;
import org.finra.herd.model.api.xml.EmrShellStep;
import org.finra.herd.model.api.xml.NodeTag;
import org.finra.herd.model.dto.AwsParamsDto;
import org.finra.herd.model.jpa.NamespaceEntity;
import org.finra.herd.service.AbstractServiceTest;
/**
* This class tests functionality within the EmrHelper.
*/
public class EmrHelperTest extends AbstractServiceTest
{
/**
* This method tests the blank EC2 tags
*/
@Test
public void testCreateEmrClusterBlankTags() throws Exception
{
// Create the namespace entity.
namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE);
String configXml = IOUtils.toString(resourceLoader.getResource(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH).getInputStream());
EmrClusterDefinition emrClusterDefinition = xmlHelper.unmarshallXmlToObject(EmrClusterDefinition.class, configXml);
// Add new node tags. First tag does not contain any tag value; but contains node tag name
NodeTag nodeTag1 = new NodeTag();
nodeTag1.setTagName("NO_TAG_VALUE");
// Second tag does not contain node tag name; but contains node tag value
NodeTag nodeTag2 = new NodeTag();
nodeTag2.setTagValue("NO_TAG_NAME");
// Create the list and add the tags
ArrayList<NodeTag> nodeTagList = new ArrayList<>();
nodeTagList.add(nodeTag1);
nodeTagList.add(nodeTag2);
// Set the tags
emrClusterDefinition.setNodeTags(nodeTagList);
emrDao.createEmrCluster(EMR_CLUSTER_DEFINITION_NAME, emrClusterDefinition, emrHelper.getAwsParamsDto());
}
/**
* This method tests the negative test cases scenario by testing all the step types
*/
@Test
public void testEmrAddStepsAllTypesNegativeTestCase() throws Exception
{
// Create the namespace entity.
NamespaceEntity namespaceEntity = namespaceDaoTestHelper.createNamespaceEntity(NAMESPACE);
emrClusterDefinitionDaoTestHelper.createEmrClusterDefinitionEntity(namespaceEntity, EMR_CLUSTER_DEFINITION_NAME,
IOUtils.toString(resourceLoader.getResource(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH).getInputStream()));
EmrClusterCreateRequest request = getNewEmrClusterCreateRequest();
EmrCluster emrCluster = emrService.createCluster(request);
EmrStepHelper stepHelper;
// Shell script arguments
List<String> shellScriptArgs = new ArrayList<>();
shellScriptArgs.add("Hello");
shellScriptArgs.add("herd");
shellScriptArgs.add("How Are You");
List<Object> steps = new ArrayList<>();
// Shell step parameters
EmrShellStep shellStep = new EmrShellStep(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, request.getEmrClusterName(), null, null, null, null, null, null);
shellStep.setScriptLocation("s3://test-bucket-managed/app-a/test/test_script.sh");
shellStep.setStepName("Test Shell Script");
shellStep.setScriptArguments(shellScriptArgs);
shellStep.setContinueOnError(true);
steps.add(shellStep);
// Hive step parameters
EmrHiveStep hiveStep = new EmrHiveStep(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, request.getEmrClusterName(), null, null, null, null, null, null);
hiveStep.setStepName("Test Hive");
hiveStep.setScriptLocation("s3://test-bucket-managed/app-a/test/test_hive.hql");
hiveStep.setContinueOnError(true);
steps.add(hiveStep);
// Pig step parameter
EmrPigStep pigStep = new EmrPigStep(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, request.getEmrClusterName(), null, null, null, null, null, null);
pigStep.setStepName("Test Pig");
pigStep.setContinueOnError(true);
pigStep.setScriptLocation("s3://test-bucket-managed/app-a/test/test_pig.pig");
steps.add(pigStep);
// Oozie step that includes a shell script to install oozie
shellStep = new EmrShellStep(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, request.getEmrClusterName(), null, null, null, null, null, null);
shellStep.setScriptLocation("s3://test-bucket-managed/app-a/bootstrap/install_oozie.sh");
shellStep.setStepName("Install Oozie");
List<String> shellScriptArgsOozie = new ArrayList<>();
shellScriptArgsOozie.add("s3://test-bucket-managed/app-a/bootstrap/oozie-4.0.1-distro.tar");
shellStep.setScriptArguments(shellScriptArgsOozie);
steps.add(shellStep);
// Hadoop jar step configuration
EmrHadoopJarStep hadoopJarStep =
new EmrHadoopJarStep(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, request.getEmrClusterName(), null, null, null, null, null, null, null);
hadoopJarStep.setContinueOnError(true);
hadoopJarStep.setStepName("Hadoop Jar");
hadoopJarStep.setJarLocation("s3://test-bucket-managed/app-a/test/hadoop-mapreduce-examples-2.4.0.jar");
hadoopJarStep.setMainClass("wordcount");
steps.add(hadoopJarStep);
for (Object emrStep : steps)
{
stepHelper = emrStepHelperFactory.getStepHelper(emrStep.getClass().getName());
emrDao.addEmrStep(emrCluster.getId(), stepHelper.getEmrStepConfig(emrStep), emrHelper.getAwsParamsDto());
}
}
/**
* This method tests the blank proxy details
*/
@Test
public void testEmrAwsDtoBlankProxy() throws Exception
{
// Set the proxy as blank too to get the EMR client without proxy
AwsParamsDto awsParamsDto = emrHelper.getAwsParamsDto();
awsParamsDto.setHttpProxyHost("");
emrDao.getEmrClient(awsParamsDto);
}
@Test
public void testGetActiveEmrClusterByName() throws Exception
{
// Get the EMR cluster definition object
String configXml = IOUtils.toString(resourceLoader.getResource(EMR_CLUSTER_DEFINITION_XML_FILE_WITH_CLASSPATH).getInputStream());
EmrClusterDefinition emrClusterDefinition = xmlHelper.unmarshallXmlToObject(EmrClusterDefinition.class, configXml);
// check cluster summary before creation
ClusterSummary clusterSummary = emrDao.getActiveEmrClusterByName(MockEmrOperationsImpl.MOCK_CLUSTER_NAME, emrHelper.getAwsParamsDto());
assertNull(clusterSummary);
// Create the cluster
String clusterId = emrDao.createEmrCluster(MockEmrOperationsImpl.MOCK_CLUSTER_NAME, emrClusterDefinition, emrHelper.getAwsParamsDto());
// check cluster summary after creation
clusterSummary = emrDao.getActiveEmrClusterByName(MockEmrOperationsImpl.MOCK_CLUSTER_NAME, emrHelper.getAwsParamsDto());
assertNotNull(clusterSummary);
assertEquals(clusterId, clusterSummary.getId());
}
@Test
public void testGetEmrClusterByIdNull() throws Exception
{
Cluster cluster = emrDao.getEmrClusterById(null, null);
assertNull(cluster);
}
/**
* This method tests the blank cluster id for finding cluster status
*/
@Test
public void testGetEmrClusterStatusByIdWithBlank() throws Exception
{
// Send blank for cluster id, and this method returns null for describeClusterResult
emrDao.getEmrClusterStatusById(EMR_CLUSTER_DEFINITION_NAME, emrHelper.getAwsParamsDto());
}
/**
* This method fills-up the parameters required for the EMR cluster create request. This is called from all the other test methods.
*/
private EmrClusterCreateRequest getNewEmrClusterCreateRequest() throws Exception
{
// Create the definition.
EmrClusterCreateRequest request = new EmrClusterCreateRequest();
// Fill in the parameters.
request.setNamespace(NAMESPACE);
request.setEmrClusterDefinitionName(EMR_CLUSTER_DEFINITION_NAME);
request.setEmrClusterName("UT_EMR_CLUSTER" + String.format("-%.3f", Math.random()));
return request;
}
}