List of usage examples for com.amazonaws.services.ec2.model Subnet getAvailableIpAddressCount
public Integer getAvailableIpAddressCount()
The number of unused private IPv4 addresses in the subnet.
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); }