Search in sources :

Example 11 with ClusterSummary

use of com.amazonaws.services.elasticmapreduce.model.ClusterSummary in project herd by FINRAOS.

the class EmrDaoImpl method getActiveEmrClusterByName.

@Override
public ClusterSummary getActiveEmrClusterByName(String clusterName, AwsParamsDto awsParams) {
    if (StringUtils.isNotBlank(clusterName)) {
        /**
         * Call AWSOperations for ListClusters API. Need to list all the active clusters that are in
         * BOOTSTRAPPING/RUNNING/STARTING/WAITING states
         */
        ListClustersRequest listClustersRequest = new ListClustersRequest().withClusterStates(getActiveEmrClusterStates());
        /**
         * ListClusterRequest returns only 50 clusters at a time. However, this returns a marker
         * that can be used for subsequent calls to listClusters to get all the clusters
         */
        String markerForListClusters = listClustersRequest.getMarker();
        // Loop through all the available clusters and look for the given cluster id
        do {
            /**
             * Call AWSOperations for ListClusters API.
             * Need to include the Marker returned by the previous iteration
             */
            ListClustersResult clusterResult = emrOperations.listEmrClusters(getEmrClient(awsParams), listClustersRequest.withMarker(markerForListClusters));
            // Loop through all the active clusters returned by AWS
            for (ClusterSummary clusterInstance : clusterResult.getClusters()) {
                // If the cluster name matches, then return the status
                if (StringUtils.isNotBlank(clusterInstance.getName()) && clusterInstance.getName().equalsIgnoreCase(clusterName)) {
                    return clusterInstance;
                }
            }
            markerForListClusters = clusterResult.getMarker();
        } while (markerForListClusters != null);
    }
    return null;
}
Also used : ClusterSummary(com.amazonaws.services.elasticmapreduce.model.ClusterSummary) ListClustersRequest(com.amazonaws.services.elasticmapreduce.model.ListClustersRequest) ListClustersResult(com.amazonaws.services.elasticmapreduce.model.ListClustersResult)

Example 12 with ClusterSummary

use of com.amazonaws.services.elasticmapreduce.model.ClusterSummary in project herd by FINRAOS.

the class EmrHelper method getActiveEmrClusterId.

/**
 * Gets the ID of an active EMR cluster which matches the given criteria. If both cluster ID and cluster name is specified, the name of the actual cluster
 * with the given ID must match the specified name. For cases where the cluster is not found (does not exists or not active), the method fails. All
 * parameters are case-insensitive and whitespace trimmed. Blank parameters are equal to null.
 *
 * @param emrClusterId EMR cluster ID
 * @param emrClusterName EMR cluster name
 * @param accountId the account Id that EMR cluster is running under
 *
 * @return The cluster ID
 */
public String getActiveEmrClusterId(String emrClusterId, String emrClusterName, String accountId) {
    boolean emrClusterIdSpecified = StringUtils.isNotBlank(emrClusterId);
    boolean emrClusterNameSpecified = StringUtils.isNotBlank(emrClusterName);
    Assert.isTrue(emrClusterIdSpecified || emrClusterNameSpecified, "One of EMR cluster ID or EMR cluster name must be specified.");
    AwsParamsDto awsParamsDto = getAwsParamsDtoByAcccountId(accountId);
    // Get cluster by ID first
    if (emrClusterIdSpecified) {
        String emrClusterIdTrimmed = emrClusterId.trim();
        // Assert cluster exists
        Cluster cluster = emrDao.getEmrClusterById(emrClusterIdTrimmed, awsParamsDto);
        Assert.notNull(cluster, String.format("The cluster with ID \"%s\" does not exist.", emrClusterIdTrimmed));
        // Assert the cluster's state is active
        String emrClusterState = cluster.getStatus().getState();
        Assert.isTrue(isActiveEmrState(emrClusterState), String.format("The cluster with ID \"%s\" is not active. The cluster state must be in one of %s. Current state is \"%s\"", emrClusterIdTrimmed, Arrays.toString(getActiveEmrClusterStates()), emrClusterState));
        // Assert cluster name equals if cluster name was specified
        if (emrClusterNameSpecified) {
            String emrClusterNameTrimmed = emrClusterName.trim();
            Assert.isTrue(cluster.getName().equalsIgnoreCase(emrClusterNameTrimmed), String.format("The cluster with ID \"%s\" does not match the expected name \"%s\". The actual name is \"%s\".", cluster.getId(), emrClusterNameTrimmed, cluster.getName()));
        }
        return cluster.getId();
    } else {
        String emrClusterNameTrimmed = emrClusterName.trim();
        ClusterSummary clusterSummary = emrDao.getActiveEmrClusterByName(emrClusterNameTrimmed, awsParamsDto);
        Assert.notNull(clusterSummary, String.format("The cluster with name \"%s\" does not exist.", emrClusterNameTrimmed));
        return clusterSummary.getId();
    }
}
Also used : AwsParamsDto(org.finra.herd.model.dto.AwsParamsDto) ClusterSummary(com.amazonaws.services.elasticmapreduce.model.ClusterSummary) Cluster(com.amazonaws.services.elasticmapreduce.model.Cluster)

Example 13 with ClusterSummary

use of com.amazonaws.services.elasticmapreduce.model.ClusterSummary in project herd by FINRAOS.

the class EmrHelperTest method testGetActiveEmrClusterByName.

@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());
}
Also used : EmrClusterDefinition(org.finra.herd.model.api.xml.EmrClusterDefinition) ClusterSummary(com.amazonaws.services.elasticmapreduce.model.ClusterSummary) Test(org.junit.Test) AbstractServiceTest(org.finra.herd.service.AbstractServiceTest)

Example 14 with ClusterSummary

use of com.amazonaws.services.elasticmapreduce.model.ClusterSummary in project herd by FINRAOS.

the class EmrServiceImpl method getClusterImpl.

/**
 * Gets details of an existing EMR Cluster.
 *
 * @param emrClusterAlternateKeyDto the EMR cluster alternate key
 * @param emrClusterId the cluster id of the cluster to get details
 * @param emrStepId the step id of the step to get details
 * @param verbose parameter for whether to return detailed information
 * @param accountId the optional AWS account that EMR cluster is running in
 * @param retrieveInstanceFleets parameter for whether to retrieve instance fleets
 *
 * @return the EMR Cluster object with details.
 * @throws Exception if an error occurred while getting the cluster
 */
protected EmrCluster getClusterImpl(EmrClusterAlternateKeyDto emrClusterAlternateKeyDto, String emrClusterId, String emrStepId, boolean verbose, String accountId, Boolean retrieveInstanceFleets) throws Exception {
    AwsParamsDto awsParamsDto = emrHelper.getAwsParamsDtoByAcccountId(accountId);
    // Perform the request validation.
    validateEmrClusterKey(emrClusterAlternateKeyDto);
    // Get the namespace and ensure it exists.
    NamespaceEntity namespaceEntity = namespaceDaoHelper.getNamespaceEntity(emrClusterAlternateKeyDto.getNamespace());
    // Get the EMR cluster definition and ensure it exists.
    EmrClusterDefinitionEntity emrClusterDefinitionEntity = emrClusterDefinitionDaoHelper.getEmrClusterDefinitionEntity(emrClusterAlternateKeyDto.getNamespace(), emrClusterAlternateKeyDto.getEmrClusterDefinitionName());
    EmrCluster emrCluster = createEmrClusterFromRequest(null, namespaceEntity.getCode(), emrClusterDefinitionEntity.getName(), emrClusterAlternateKeyDto.getEmrClusterName(), accountId, null, null, null, null);
    String clusterName = emrHelper.buildEmrClusterName(namespaceEntity.getCode(), emrClusterDefinitionEntity.getName(), emrClusterAlternateKeyDto.getEmrClusterName());
    try {
        // Get Cluster status if clusterId is specified
        if (StringUtils.isNotBlank(emrClusterId)) {
            Cluster cluster = emrDao.getEmrClusterById(emrClusterId.trim(), awsParamsDto);
            // Validate that, Cluster exists
            Assert.notNull(cluster, "An EMR cluster must exists with the cluster ID \"" + emrClusterId + "\".");
            // Validate that, Cluster name match as specified
            Assert.isTrue(clusterName.equalsIgnoreCase(cluster.getName()), "Cluster name of specified cluster id \"" + emrClusterId + "\" must match the name specified.");
            emrCluster.setId(cluster.getId());
            setEmrClusterStatus(emrCluster, cluster.getStatus());
        } else {
            ClusterSummary clusterSummary = emrDao.getActiveEmrClusterByName(clusterName, awsParamsDto);
            // Validate that, Cluster exists with the name
            Assert.notNull(clusterSummary, "An EMR cluster must exists with the name \"" + clusterName + "\".");
            emrCluster.setId(clusterSummary.getId());
            setEmrClusterStatus(emrCluster, clusterSummary.getStatus());
        }
        // Get active step details
        if (emrHelper.isActiveEmrState(emrCluster.getStatus())) {
            StepSummary stepSummary = emrDao.getClusterActiveStep(emrCluster.getId(), awsParamsDto);
            if (stepSummary != null) {
                EmrStep activeStep;
                // If verbose get active step details
                if (verbose) {
                    activeStep = buildEmrStepFromAwsStep(stepSummary, true);
                } else {
                    activeStep = buildEmrStepFromAwsStepSummary(stepSummary);
                }
                emrCluster.setActiveStep(activeStep);
            }
        }
        // Get requested step details
        if (StringUtils.isNotBlank(emrStepId)) {
            Step step = emrDao.getClusterStep(emrCluster.getId(), emrStepId.trim(), awsParamsDto);
            emrCluster.setStep(buildEmrStepFromAwsStep(step, verbose));
        }
        // Get instance fleet if true
        if (BooleanUtils.isTrue(retrieveInstanceFleets)) {
            ListInstanceFleetsResult listInstanceFleetsResult = emrDao.getListInstanceFleetsResult(emrCluster.getId(), awsParamsDto);
            emrCluster.setInstanceFleets(emrHelper.buildEmrClusterInstanceFleetFromAwsResult(listInstanceFleetsResult));
        }
    } catch (AmazonServiceException ex) {
        handleAmazonException(ex, "An Amazon exception occurred while getting EMR cluster details with name \"" + clusterName + "\".");
    }
    return emrCluster;
}
Also used : AwsParamsDto(org.finra.herd.model.dto.AwsParamsDto) NamespaceEntity(org.finra.herd.model.jpa.NamespaceEntity) StepSummary(com.amazonaws.services.elasticmapreduce.model.StepSummary) ListInstanceFleetsResult(com.amazonaws.services.elasticmapreduce.model.ListInstanceFleetsResult) ClusterSummary(com.amazonaws.services.elasticmapreduce.model.ClusterSummary) EmrCluster(org.finra.herd.model.api.xml.EmrCluster) AmazonServiceException(com.amazonaws.AmazonServiceException) EmrCluster(org.finra.herd.model.api.xml.EmrCluster) Cluster(com.amazonaws.services.elasticmapreduce.model.Cluster) EmrStep(org.finra.herd.model.api.xml.EmrStep) Step(com.amazonaws.services.elasticmapreduce.model.Step) EmrStep(org.finra.herd.model.api.xml.EmrStep) EmrClusterDefinitionEntity(org.finra.herd.model.jpa.EmrClusterDefinitionEntity)

Example 15 with ClusterSummary

use of com.amazonaws.services.elasticmapreduce.model.ClusterSummary in project herd by FINRAOS.

the class EmrServiceImpl method createClusterImpl.

/**
 * <p> Creates a new EMR cluster based on the given request if the cluster with the given name does not already exist. If the cluster already exist, returns
 * the information about the existing cluster. </p> <p> The request must contain: </p> <ul> <li>A namespace and definition name which refer to an existing
 * EMR cluster definition.</li> <li>A valid cluster name to create.</li> </ul> <p> The request may optionally contain: </p> <ul> <li>A "dry run" flag, which
 * when set to {@code true}, no calls to AWS will occur, but validations and override will. Defaults to {@code false}.</li> <li>An override parameter, which
 * when set, overrides the given parameters in the cluster definition before creating the cluster. Defaults to no override. </li> </ul> <p> A successful
 * response will contain: </p> <ul> <li>The ID of the cluster that was created, or if the cluster already exists, the ID of the cluster that exists. This
 * field will be {@code null} when dry run flag is {@code true}.</li> <li>The status of the cluster that was created or already exists. The status will
 * normally be "Starting" on successful creations. This field will be {@code null} when dry run flag is {@code true}</li> <li>The namespace, definition
 * name, and cluster name of the cluster.</li> <li>The dry run flag, if given in the request.</li> <li>An indicator whether the cluster was created or not.
 * If the cluster already exists, the cluster will not be created and this flag will be set to {@code false}.</li> <li>The definition which was used to
 * create the cluster. If any overrides were given, this definition's values will be the values after the override. This field will be {@code null} if the
 * cluster was not created.</li> </ul> <p> Notes: </p> <ul> <li>At any point of the execution, if there are validation errors, the method will immediately
 * throw an exception.</li> <li>Even if the validations pass, AWS may still reject the request, which will cause this method to throw an exception.</li>
 * <li>Dry runs do not make any calls to AWS, therefore AWS may still reject the creation request even when a dry run succeeds.</li> </ul>
 *
 * @param request - {@link EmrClusterCreateRequest} The EMR cluster create request
 *
 * @return {@link EmrCluster} the created EMR cluster object
 * @throws Exception when the original EMR cluster definition XML is malformed
 */
protected EmrCluster createClusterImpl(EmrClusterCreateRequest request) throws Exception {
    // Extract EMR cluster alternate key from the create request.
    EmrClusterAlternateKeyDto emrClusterAlternateKeyDto = getEmrClusterAlternateKey(request);
    // Perform the request validation.
    validateEmrClusterKey(emrClusterAlternateKeyDto);
    // Get the namespace and ensure it exists.
    NamespaceEntity namespaceEntity = namespaceDaoHelper.getNamespaceEntity(emrClusterAlternateKeyDto.getNamespace());
    // Get the EMR cluster definition and ensure it exists.
    EmrClusterDefinitionEntity emrClusterDefinitionEntity = emrClusterDefinitionDaoHelper.getEmrClusterDefinitionEntity(emrClusterAlternateKeyDto.getNamespace(), emrClusterAlternateKeyDto.getEmrClusterDefinitionName());
    // Replace all S3 managed location variables in xml
    String toReplace = getS3ManagedReplaceString();
    String replacedConfigXml = emrClusterDefinitionEntity.getConfiguration().replaceAll(toReplace, emrHelper.getS3StagingLocation());
    // Unmarshal definition xml into JAXB object.
    EmrClusterDefinition emrClusterDefinition = xmlHelper.unmarshallXmlToObject(EmrClusterDefinition.class, replacedConfigXml);
    // Perform override if override is set.
    overrideEmrClusterDefinition(emrClusterDefinition, request.getEmrClusterDefinitionOverride());
    // Perform the EMR cluster definition configuration validation.
    emrClusterDefinitionHelper.validateEmrClusterDefinitionConfiguration(emrClusterDefinition);
    // Check permissions.
    namespaceIamRoleAuthorizationHelper.checkPermissions(emrClusterDefinitionEntity.getNamespace(), emrClusterDefinition.getServiceIamRole(), emrClusterDefinition.getEc2NodeIamProfileName());
    AwsParamsDto awsParamsDto = emrHelper.getAwsParamsDtoByAcccountId(emrClusterDefinition.getAccountId());
    // If instance group definitions are specified, find best price and update definition.
    if (!emrHelper.isInstanceDefinitionsEmpty(emrClusterDefinition.getInstanceDefinitions())) {
        emrPricingHelper.updateEmrClusterDefinitionWithBestPrice(emrClusterAlternateKeyDto, emrClusterDefinition, awsParamsDto);
    }
    // The cluster ID record.
    String clusterId = null;
    String emrClusterStatus = null;
    String accountId = emrClusterDefinition.getAccountId();
    // Was cluster created?
    Boolean emrClusterCreated = null;
    // If the dryRun flag is null or false. This is the default option if no flag is given.
    if (!Boolean.TRUE.equals(request.isDryRun())) {
        /*
             * Create the cluster only if the cluster does not already exist.
             * If the cluster is created, record the newly created cluster ID.
             * If the cluster already exists, record the existing cluster ID.
             * If there is any error while attempting to check for existing cluster or create a new one, handle the exception to throw appropriate exception.
             */
        String clusterName = emrHelper.buildEmrClusterName(namespaceEntity.getCode(), emrClusterDefinitionEntity.getName(), emrClusterAlternateKeyDto.getEmrClusterName());
        try {
            // Try to get an active EMR cluster by its name.
            ClusterSummary clusterSummary = emrDao.getActiveEmrClusterByName(clusterName, awsParamsDto);
            // If cluster does not already exist.
            if (clusterSummary == null) {
                clusterId = emrDao.createEmrCluster(clusterName, emrClusterDefinition, awsParamsDto);
                emrClusterCreated = true;
                EmrClusterCreationLogEntity emrClusterCreationLogEntity = new EmrClusterCreationLogEntity();
                emrClusterCreationLogEntity.setNamespace(emrClusterDefinitionEntity.getNamespace());
                emrClusterCreationLogEntity.setEmrClusterDefinitionName(emrClusterDefinitionEntity.getName());
                emrClusterCreationLogEntity.setEmrClusterName(emrClusterAlternateKeyDto.getEmrClusterName());
                emrClusterCreationLogEntity.setEmrClusterId(clusterId);
                emrClusterCreationLogEntity.setEmrClusterDefinition(xmlHelper.objectToXml(emrClusterDefinition));
                herdDao.saveAndRefresh(emrClusterCreationLogEntity);
            } else // If the cluster already exist.
            {
                clusterId = clusterSummary.getId();
                emrClusterCreated = false;
                // Do not include definition in response
                emrClusterDefinition = null;
            }
            emrClusterStatus = emrDao.getEmrClusterStatusById(clusterId, awsParamsDto);
        } catch (AmazonServiceException ex) {
            handleAmazonException(ex, "An Amazon exception occurred while creating EMR cluster with name \"" + clusterName + "\".");
        }
    } else // If the dryRun flag is true and not null
    {
        emrClusterCreated = false;
    }
    return createEmrClusterFromRequest(clusterId, namespaceEntity.getCode(), emrClusterDefinitionEntity.getName(), emrClusterAlternateKeyDto.getEmrClusterName(), accountId, emrClusterStatus, emrClusterCreated, request.isDryRun(), emrClusterDefinition);
}
Also used : NamespaceEntity(org.finra.herd.model.jpa.NamespaceEntity) AwsParamsDto(org.finra.herd.model.dto.AwsParamsDto) EmrClusterDefinition(org.finra.herd.model.api.xml.EmrClusterDefinition) ClusterSummary(com.amazonaws.services.elasticmapreduce.model.ClusterSummary) AmazonServiceException(com.amazonaws.AmazonServiceException) EmrClusterCreationLogEntity(org.finra.herd.model.jpa.EmrClusterCreationLogEntity) EmrClusterAlternateKeyDto(org.finra.herd.model.dto.EmrClusterAlternateKeyDto) EmrClusterDefinitionEntity(org.finra.herd.model.jpa.EmrClusterDefinitionEntity)

Aggregations

ClusterSummary (com.amazonaws.services.elasticmapreduce.model.ClusterSummary)15 AwsParamsDto (org.finra.herd.model.dto.AwsParamsDto)11 Test (org.junit.Test)10 ListClustersResult (com.amazonaws.services.elasticmapreduce.model.ListClustersResult)9 ListClustersRequest (com.amazonaws.services.elasticmapreduce.model.ListClustersRequest)3 ArrayList (java.util.ArrayList)3 AbstractDaoTest (org.finra.herd.dao.AbstractDaoTest)3 AmazonServiceException (com.amazonaws.AmazonServiceException)2 Cluster (com.amazonaws.services.elasticmapreduce.model.Cluster)2 ListInstancesResult (com.amazonaws.services.elasticmapreduce.model.ListInstancesResult)2 EmrClusterDefinition (org.finra.herd.model.api.xml.EmrClusterDefinition)2 EmrClusterDefinitionEntity (org.finra.herd.model.jpa.EmrClusterDefinitionEntity)2 NamespaceEntity (org.finra.herd.model.jpa.NamespaceEntity)2 InvocationOnMock (org.mockito.invocation.InvocationOnMock)2 AmazonElasticMapReduceClient (com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduceClient)1 AddJobFlowStepsRequest (com.amazonaws.services.elasticmapreduce.model.AddJobFlowStepsRequest)1 ClusterStateChangeReason (com.amazonaws.services.elasticmapreduce.model.ClusterStateChangeReason)1 ClusterStatus (com.amazonaws.services.elasticmapreduce.model.ClusterStatus)1 ClusterTimeline (com.amazonaws.services.elasticmapreduce.model.ClusterTimeline)1 Instance (com.amazonaws.services.elasticmapreduce.model.Instance)1