/*
* 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.rest;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import com.google.common.base.Objects;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
import org.mockito.ArgumentMatcher;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.util.Assert;
import org.finra.herd.model.ObjectNotFoundException;
import org.finra.herd.model.api.xml.EmrCluster;
import org.finra.herd.model.api.xml.EmrClusterCreateRequest;
import org.finra.herd.model.api.xml.EmrHadoopJarStep;
import org.finra.herd.model.api.xml.EmrHadoopJarStepAddRequest;
import org.finra.herd.model.api.xml.EmrHiveStep;
import org.finra.herd.model.api.xml.EmrHiveStepAddRequest;
import org.finra.herd.model.api.xml.EmrMasterSecurityGroupAddRequest;
import org.finra.herd.model.api.xml.EmrPigStep;
import org.finra.herd.model.api.xml.EmrPigStepAddRequest;
import org.finra.herd.model.api.xml.EmrShellStep;
import org.finra.herd.model.api.xml.EmrShellStepAddRequest;
import org.finra.herd.model.dto.EmrClusterAlternateKeyDto;
import org.finra.herd.model.jpa.NamespaceEntity;
import org.finra.herd.service.EmrService;
/**
* This class tests various functionality within the EMR REST controller.
*/
public class EmrRestControllerTest extends AbstractRestTest
{
private String defaultAccountId = null;
/**
* This test is to get unit test coverage for the rest method. Real unit tests are covered in Service layer EmrServiceTest
*/
@Test
public void testAddEmrSteps() 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()));
// Create a cluster definition create request
EmrClusterCreateRequest clusterCreateRequest = getNewEmrClusterCreateRequest();
EmrCluster emrCluster = emrRestController.createEmrCluster(clusterCreateRequest);
Assert.notNull(emrCluster);
Assert.notNull(emrCluster.getId());
// Create a EmrShellStepAddRequest entry to pass it to RestController
EmrShellStepAddRequest shellRequest = getNewEmrShellStepAddRequest();
EmrShellStep emrShellStep = emrRestController.addShellStepToEmrCluster(shellRequest);
Assert.notNull(emrShellStep);
Assert.notNull(emrShellStep.getId());
EmrCluster emrClusterStatus = emrRestController
.getEmrCluster(emrCluster.getNamespace(), emrCluster.getEmrClusterDefinitionName(), emrCluster.getEmrClusterName(), emrCluster.getId(),
emrShellStep.getId(), false, null, false);
assertEquals(emrShellStep.getId(), emrClusterStatus.getStep().getId());
// Create a EmrHiveStepAddRequest entry to pass it to RestController
EmrHiveStepAddRequest hiveRequest = new EmrHiveStepAddRequest();
hiveRequest.setNamespace(NAMESPACE);
hiveRequest.setEmrClusterDefinitionName(EMR_CLUSTER_DEFINITION_NAME);
hiveRequest.setEmrClusterName(EMR_CLUSTER_NAME);
hiveRequest.setStepName("A_HIVE_STEP");
hiveRequest.setScriptLocation("SCRIPT_LOCATION");
EmrHiveStep emrHiveStep = emrRestController.addHiveStepToEmrCluster(hiveRequest);
Assert.notNull(emrHiveStep);
Assert.notNull(emrHiveStep.getId());
emrClusterStatus = emrRestController
.getEmrCluster(emrCluster.getNamespace(), emrCluster.getEmrClusterDefinitionName(), emrCluster.getEmrClusterName(), emrCluster.getId(),
emrHiveStep.getId(), false, null, false);
assertEquals(emrHiveStep.getId(), emrClusterStatus.getStep().getId());
// Create a EmrPigStepAddRequest entry to pass it to RestController
EmrPigStepAddRequest pigRequest = new EmrPigStepAddRequest();
pigRequest.setNamespace(NAMESPACE);
pigRequest.setEmrClusterDefinitionName(EMR_CLUSTER_DEFINITION_NAME);
pigRequest.setEmrClusterName(EMR_CLUSTER_NAME);
pigRequest.setStepName("A_HIVE_STEP");
pigRequest.setScriptLocation("SCRIPT_LOCATION");
EmrPigStep emrPigStep = emrRestController.addPigStepToEmrCluster(pigRequest);
Assert.notNull(emrPigStep);
Assert.notNull(emrPigStep.getId());
emrClusterStatus = emrRestController
.getEmrCluster(emrCluster.getNamespace(), emrCluster.getEmrClusterDefinitionName(), emrCluster.getEmrClusterName(), emrCluster.getId(),
emrPigStep.getId(), false, null, false);
assertEquals(emrPigStep.getId(), emrClusterStatus.getStep().getId());
// Create a EmrHadoopJarStepAddRequest entry to pass it to RestController
EmrHadoopJarStepAddRequest hadoopJarRequest = new EmrHadoopJarStepAddRequest();
hadoopJarRequest.setNamespace(NAMESPACE);
hadoopJarRequest.setEmrClusterDefinitionName(EMR_CLUSTER_DEFINITION_NAME);
hadoopJarRequest.setEmrClusterName(EMR_CLUSTER_NAME);
hadoopJarRequest.setStepName("A_HIVE_STEP");
hadoopJarRequest.setJarLocation("JAR_LOCATION");
EmrHadoopJarStep emrHadoopJarStep = emrRestController.addHadoopJarStepToEmrCluster(hadoopJarRequest);
Assert.notNull(emrHadoopJarStep);
Assert.notNull(emrHadoopJarStep.getId());
emrClusterStatus = emrRestController
.getEmrCluster(emrCluster.getNamespace(), emrCluster.getEmrClusterDefinitionName(), emrCluster.getEmrClusterName(), emrCluster.getId(),
emrHadoopJarStep.getId(), false, defaultAccountId, false);
assertEquals(emrHadoopJarStep.getId(), emrClusterStatus.getStep().getId());
}
/**
* This test is to get unit test coverage for the rest method. Since it is calling the requires_new createCluster method, we expect an exception. Real unit
* tests are covered in Service layer EmrServiceTest
*/
@Test(expected = ObjectNotFoundException.class)
public void testAddSecurityGroupToMaster() throws Exception
{
// Create a EmrAddStepRequest entry to pass it to RestController
EmrMasterSecurityGroupAddRequest request = getNewEmrAddSecurityGroupMasterRequest();
emrRestController.addGroupsToEmrClusterMaster(request);
}
/**
* This test is to get unit test coverage for the rest method. Real unit tests are covered in Service layer EmrServiceTest
*/
@Test
public void testCreateEmrCluster() 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()));
// Create a cluster definition create request
EmrClusterCreateRequest request = getNewEmrClusterCreateRequest();
EmrCluster emrCluster = emrRestController.createEmrCluster(request);
Assert.notNull(emrCluster);
}
/**
* This test is to get unit test coverage for the rest method. Real unit tests are covered in Service layer EmrServiceTest
*/
@Test(expected = ObjectNotFoundException.class)
public void testGetEmrCluster() throws Exception
{
emrRestController.getEmrCluster(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME, "cluster_no_exist", null, null, false, defaultAccountId, false);
}
@Test
public void testTerminateEmrCluster() throws Exception
{
EmrRestController emrRestController = new EmrRestController();
EmrService emrService = mock(EmrService.class);
ReflectionTestUtils.setField(emrRestController, "emrService", emrService);
String namespace = "namespace";
String emrClusterDefinitionName = "emrClusterDefinitionName";
String emrClusterName = "emrClusterName";
boolean overrideTerminationProtection = false;
String emrClusterId = "emrClusterId";
EmrCluster emrCluster = new EmrCluster();
when(emrService.terminateCluster(any(), anyBoolean(), any(), any())).thenReturn(emrCluster);
assertEquals(emrCluster, emrRestController
.terminateEmrCluster(namespace, emrClusterDefinitionName, emrClusterName, overrideTerminationProtection, emrClusterId, defaultAccountId));
verify(emrService).terminateCluster(argThat(new EqualsEmrClusterAlternateKeyDto(namespace, emrClusterDefinitionName, emrClusterName)),
eq(overrideTerminationProtection), eq(emrClusterId), eq(defaultAccountId));
verifyNoMoreInteractions(emrService);
}
/**
* This method fills-up the parameters required for the EMR add security group request. This is called from all the other test methods.
*/
private EmrMasterSecurityGroupAddRequest getNewEmrAddSecurityGroupMasterRequest() throws Exception
{
// Create the EmrMasterSecurityGroupAddRequest object
EmrMasterSecurityGroupAddRequest request = new EmrMasterSecurityGroupAddRequest();
// Fill in the parameters.
request.setNamespace(NAMESPACE);
request.setEmrClusterDefinitionName(EMR_CLUSTER_DEFINITION_NAME);
request.setEmrClusterName(EMR_CLUSTER_NAME);
List<String> groupIds = new ArrayList<>();
groupIds.add("A_TEST_SECURITY_GROUP");
request.setSecurityGroupIds(groupIds);
return request;
}
/**
* 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 a new ENR cluster create request.
EmrClusterCreateRequest request = new EmrClusterCreateRequest();
// Fill in the parameters.
request.setNamespace(NAMESPACE);
request.setEmrClusterDefinitionName(EMR_CLUSTER_DEFINITION_NAME);
request.setEmrClusterName(EMR_CLUSTER_NAME);
return request;
}
/**
* This method creates a EMR Shell step add request. This is called from all the other test methods.
*/
private EmrShellStepAddRequest getNewEmrShellStepAddRequest() throws Exception
{
// Create the EmrStepsAddRequest object
EmrShellStepAddRequest request = new EmrShellStepAddRequest();
// Fill in the parameters.
request.setNamespace(NAMESPACE);
request.setEmrClusterDefinitionName(EMR_CLUSTER_DEFINITION_NAME);
request.setEmrClusterName(EMR_CLUSTER_NAME);
request.setStepName("A_SHELL_STEP");
request.setScriptLocation("SCRIPT_LOCATION");
return request;
}
private static class EqualsEmrClusterAlternateKeyDto extends ArgumentMatcher<EmrClusterAlternateKeyDto>
{
private String emrClusterDefinitionName;
private String emrClusterName;
private String namespace;
private EqualsEmrClusterAlternateKeyDto(String namespace, String emrClusterDefinitionName, String emrClusterName)
{
this.namespace = namespace;
this.emrClusterDefinitionName = emrClusterDefinitionName;
this.emrClusterName = emrClusterName;
}
@Override
public boolean matches(Object argument)
{
EmrClusterAlternateKeyDto emrClusterAlternateKeyDto = (EmrClusterAlternateKeyDto) argument;
return Objects.equal(namespace, emrClusterAlternateKeyDto.getNamespace()) &&
Objects.equal(emrClusterDefinitionName, emrClusterAlternateKeyDto.getEmrClusterDefinitionName()) &&
Objects.equal(emrClusterName, emrClusterAlternateKeyDto.getEmrClusterName());
}
}
}