Example usage for com.amazonaws.services.ec2.model Subnet getAvailableIpAddressCount

List of usage examples for com.amazonaws.services.ec2.model Subnet getAvailableIpAddressCount

Introduction

In this page you can find the example usage for com.amazonaws.services.ec2.model Subnet getAvailableIpAddressCount.

Prototype


public Integer getAvailableIpAddressCount() 

Source Link

Document

The number of unused private IPv4 addresses in the subnet.

Usage

From source file:com.pinterest.clusterservice.aws.AwsManagerImpl.java

License:Apache License

@Override
public int getAvailableCapacityInSubnet(String subnetId) throws Exception {
    DescribeSubnetsRequest subnetsRequest = new DescribeSubnetsRequest();
    subnetsRequest.setSubnetIds(Arrays.asList(subnetId));
    DescribeSubnetsResult subnetsResult = ec2Client.describeSubnets(subnetsRequest);
    List<Subnet> subnets = subnetsResult.getSubnets();
    if (subnets.isEmpty()) {
        return 0;
    }//w w  w. j a  v a 2  s .  co  m

    Subnet subnet = subnets.get(0);
    return subnet.getAvailableIpAddressCount();
}

From source file:org.finra.dm.dao.helper.EmrPricingHelper.java

License:Apache License

/**
 * Updates the given list of subnets to remove subnets with number of available IPs less than the given value.
 *
 * @param subnets List of subnets/*from   ww  w  . ja va2 s .  c  o m*/
 * @param availableIps The number of available IPs to filter by
 */
private void removeSubnetsWithAvailableIpsLessThan(List<Subnet> subnets, int availableIps) {
    Iterator<Subnet> iterator = subnets.iterator();
    while (iterator.hasNext()) {
        Subnet subnet = iterator.next();
        if (subnet.getAvailableIpAddressCount() < availableIps) {
            iterator.remove();
        }
    }
}

From source file:org.finra.herd.dao.helper.EmrPricingHelper.java

License:Apache License

/**
 * Finds the best price for each master and core instances based on the subnets and master and core instance search parameters given in the definition.
 * <p/>// ww w .  ja  v  a 2  s  .  c om
 * The results of the findings are used to update the given definition.
 * <p/>
 * If the instance's instanceSpotPrice is set, the instance definition will keep that value. If the instance's instanceMaxSearchPrice is set, the best price
 * will be found. If the found price is spot, the instanceSpotPrice will be set to the value of instanceMaxSearchPrice. If the found price is on-demand, the
 * instanceSpotPrice will be removed. The definition's subnetId will be set to the particular subnet which the best price is found. The value will always be
 * replaced by a single subnet ID.
 * <p/>
 * The definition's instanceMaxSearchPrice and instanceOnDemandThreshold will be removed by this operation.
 *
 * @param emrClusterAlternateKeyDto EMR cluster alternate key
 * @param emrClusterDefinition The EMR cluster definition with search criteria, and the definition that will be updated
 * @param awsParamsDto the AWS related parameters for access/secret keys and proxy details
 */
public void updateEmrClusterDefinitionWithBestPrice(EmrClusterAlternateKeyDto emrClusterAlternateKeyDto,
        EmrClusterDefinition emrClusterDefinition, AwsParamsDto awsParamsDto) {
    EmrVpcPricingState emrVpcPricingState = new EmrVpcPricingState();

    // Get total count of instances this definition will attempt to create
    int totalInstanceCount = getTotalInstanceCount(emrClusterDefinition);

    // Get the subnet information
    List<Subnet> subnets = getSubnets(emrClusterDefinition, awsParamsDto);
    for (Subnet subnet : subnets) {
        emrVpcPricingState.getSubnetAvailableIpAddressCounts().put(subnet.getSubnetId(),
                subnet.getAvailableIpAddressCount());
    }
    // Filter out subnets with not enough available IPs
    removeSubnetsWithAvailableIpsLessThan(subnets, totalInstanceCount);

    if (subnets.isEmpty()) {
        LOGGER.info(String.format(
                "Insufficient IP availability. namespace=\"%s\" emrClusterDefinitionName=\"%s\" emrClusterName=\"%s\" "
                        + "totalRequestedInstanceCount=%s emrVpcPricingState=%s",
                emrClusterAlternateKeyDto.getNamespace(),
                emrClusterAlternateKeyDto.getEmrClusterDefinitionName(),
                emrClusterAlternateKeyDto.getEmrClusterName(), totalInstanceCount,
                jsonHelper.objectToJson(emrVpcPricingState)));
        throw new ObjectNotFoundException(String.format(
                "There are no subnets in the current VPC which have sufficient IP addresses available to run your "
                        + "clusters. Try expanding the list of subnets or try again later. requestedInstanceCount=%s%n%s",
                totalInstanceCount, emrVpcPricingStateFormatter.format(emrVpcPricingState)));
    }

    // Best prices are accumulated in this list
    List<EmrClusterPriceDto> emrClusterPrices = new ArrayList<>();

    InstanceDefinition masterInstanceDefinition = getMasterInstanceDefinition(emrClusterDefinition);
    InstanceDefinition coreInstanceDefinition = getCoreInstanceDefinition(emrClusterDefinition);
    InstanceDefinition taskInstanceDefinition = getTaskInstanceDefinition(emrClusterDefinition);

    Set<String> requestedInstanceTypes = new HashSet<>();

    String masterInstanceType = masterInstanceDefinition.getInstanceType();
    requestedInstanceTypes.add(masterInstanceType);

    if (coreInstanceDefinition != null) {
        String coreInstanceType = coreInstanceDefinition.getInstanceType();
        requestedInstanceTypes.add(coreInstanceType);
    }

    if (taskInstanceDefinition != null) {
        String taskInstanceType = taskInstanceDefinition.getInstanceType();
        requestedInstanceTypes.add(taskInstanceType);
    }

    // Get AZs for the subnets
    for (AvailabilityZone availabilityZone : getAvailabilityZones(subnets, awsParamsDto)) {
        // Create a mapping of instance types to prices for more efficient, in-memory lookup
        // This method also validates that the given instance types are real instance types supported by AWS.
        Map<String, BigDecimal> instanceTypeOnDemandPrices = getInstanceTypeOnDemandPrices(availabilityZone,
                requestedInstanceTypes);

        // Create a mapping of instance types to prices for more efficient, in-memory lookup
        // When AWS does not return any spot price history for an instance type in an availability zone, the algorithm will not use that availability zone
        // when selecting the lowest price.
        Map<String, BigDecimal> instanceTypeSpotPrices = getInstanceTypeSpotPrices(availabilityZone,
                requestedInstanceTypes, awsParamsDto);

        emrVpcPricingState.getSpotPricesPerAvailabilityZone().put(availabilityZone.getZoneName(),
                instanceTypeSpotPrices);
        emrVpcPricingState.getOnDemandPricesPerAvailabilityZone().put(availabilityZone.getZoneName(),
                instanceTypeOnDemandPrices);

        // Get and compare master price
        BigDecimal masterSpotPrice = instanceTypeSpotPrices.get(masterInstanceType);
        BigDecimal masterOnDemandPrice = instanceTypeOnDemandPrices.get(masterInstanceType);
        Ec2PriceDto masterPrice = getBestInstancePrice(masterSpotPrice, masterOnDemandPrice,
                masterInstanceDefinition);

        // Get and compare core price
        Ec2PriceDto corePrice = null;
        if (coreInstanceDefinition != null) {
            String coreInstanceType = coreInstanceDefinition.getInstanceType();
            BigDecimal coreSpotPrice = instanceTypeSpotPrices.get(coreInstanceType);
            BigDecimal coreOnDemandPrice = instanceTypeOnDemandPrices.get(coreInstanceType);
            corePrice = getBestInstancePrice(coreSpotPrice, coreOnDemandPrice, coreInstanceDefinition);
        }

        // Get and compare task price
        Ec2PriceDto taskPrice = null;
        if (taskInstanceDefinition != null) {
            String taskInstanceType = taskInstanceDefinition.getInstanceType();
            BigDecimal taskSpotPrice = instanceTypeSpotPrices.get(taskInstanceType);
            BigDecimal taskOnDemandPrice = instanceTypeOnDemandPrices.get(taskInstanceType);
            taskPrice = getBestInstancePrice(taskSpotPrice, taskOnDemandPrice, taskInstanceDefinition);
        }

        // If prices were found
        if (masterPrice != null && (coreInstanceDefinition == null || corePrice != null)
                && (taskInstanceDefinition == null || taskPrice != null)) {
            // Add the pricing result to the result list
            emrClusterPrices.add(createEmrClusterPrice(availabilityZone, masterPrice, corePrice, taskPrice));
        }

        // If prices were not found for either master or core, this AZ cannot satisfy the search criteria. Ignore this AZ.
    }

    if (emrClusterPrices.isEmpty()) {
        LOGGER.info(String.format(
                "No subnets which satisfied the best price search criteria. namespace=\"%s\" emrClusterDefinitionName=\"%s\" "
                        + "emrClusterName=\"%s\" emrVpcPricingState=%s",
                emrClusterAlternateKeyDto.getNamespace(),
                emrClusterAlternateKeyDto.getEmrClusterDefinitionName(),
                emrClusterAlternateKeyDto.getEmrClusterName(), jsonHelper.objectToJson(emrVpcPricingState)));
        throw new ObjectNotFoundException(String.format(
                "There were no subnets which satisfied your best price search criteria. If you explicitly opted to use spot EC2 instances, please confirm "
                        + "that your instance types support spot pricing. Otherwise, try setting the max price or the on-demand threshold to a higher value.%n%s",
                emrVpcPricingStateFormatter.format(emrVpcPricingState)));
    }

    // Find the best prices from the result list
    EmrClusterPriceDto bestEmrClusterPrice = getEmrClusterPriceWithLowestCoreInstancePrice(emrClusterPrices);

    // Find the best subnet among the best AZ's
    Subnet bestEmrClusterSubnet = getBestSubnetForAvailabilityZone(bestEmrClusterPrice.getAvailabilityZone(),
            subnets);

    // Update the definition with the new calculated values
    updateInstanceDefinitionsWithBestPrice(emrClusterDefinition, bestEmrClusterSubnet, bestEmrClusterPrice);
}