List of usage examples for com.amazonaws.services.ec2.model ReservedInstances getAvailabilityZone
public String getAvailabilityZone()
The Availability Zone in which the Reserved Instance can be used.
From source file:com.netflix.ice.basic.BasicReservationService.java
License:Apache License
public void updateEc2Reservations(Map<String, ReservedInstances> reservationsFromApi) { Map<ReservationUtilization, Map<TagGroup, List<Reservation>>> reservationMap = Maps.newTreeMap(); for (ReservationUtilization utilization : ReservationUtilization.values()) { reservationMap.put(utilization, Maps.<TagGroup, List<Reservation>>newHashMap()); }/* w w w. jav a2 s.c o m*/ for (String key : reservationsFromApi.keySet()) { ReservedInstances reservedInstances = reservationsFromApi.get(key); if (reservedInstances.getInstanceCount() <= 0) continue; String accountId = key.substring(0, key.indexOf(",")); Account account = config.accountService.getAccountById(accountId); Zone zone = Zone.getZone(reservedInstances.getAvailabilityZone()); if (zone == null) logger.error( "Not able to find zone for reserved instances " + reservedInstances.getAvailabilityZone()); ReservationUtilization utilization = ReservationUtilization.get(reservedInstances.getOfferingType()); long endTime = Math.min(reservedInstances.getEnd().getTime(), reservedInstances.getStart().getTime() + reservedInstances.getDuration() * 1000); if (endTime <= config.startDate.getMillis()) continue; Reservation reservation = new Reservation(reservedInstances.getInstanceCount(), reservedInstances.getStart().getTime(), endTime, utilization, reservedInstances.getFixedPrice(), reservedInstances.getUsagePrice()); String osStr = reservedInstances.getProductDescription(); InstanceOs os = InstanceOs.withDescription(osStr); UsageType usageType = UsageType.getUsageType(reservedInstances.getInstanceType() + os.usageType, "hours"); TagGroup reservationKey = new TagGroup(account, zone.region, zone, Product.ec2_instance, Operation.getReservedInstances(utilization), usageType, null); List<Reservation> reservations = reservationMap.get(utilization).get(reservationKey); if (reservations == null) { reservationMap.get(utilization).put(reservationKey, Lists.<Reservation>newArrayList(reservation)); } else { reservations.add(reservation); } } this.reservations = reservationMap; }
From source file:com.netflix.ice.processor.ReservationCapacityPoller.java
License:Apache License
@Override protected void poll() throws Exception { ProcessorConfig config = ProcessorConfig.getInstance(); // read from s3 if not exists File file = new File(config.localDir, "reservation_capacity.txt"); if (!file.exists()) { logger.info("downloading " + file + "..."); AwsUtils.downloadFileIfNotExist(config.workS3BucketName, config.workS3BucketPrefix, file); logger.info("downloaded " + file); }//from w ww.j ava 2 s .c o m // read from file Map<String, ReservedInstances> reservations = Maps.newTreeMap(); if (file.exists()) { BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); String line; while ((line = reader.readLine()) != null) { String[] tokens = line.split(","); String accountId = tokens[0]; String region = tokens[1]; String reservationId = tokens[2]; String zone = tokens[3]; Long start = Long.parseLong(tokens[4]); long duration = Long.parseLong(tokens[5]); String instanceType = tokens[6]; String productDescription = tokens[7]; int instanceCount = Integer.parseInt(tokens[8]); String offeringType = tokens[9]; String state = tokens[10]; Long end = tokens.length > 11 ? Long.parseLong(tokens[11]) : null; float fixedPrice = tokens.length > 12 ? Float.parseFloat(tokens[12]) : 0; float usagePrice = tokens.length > 13 ? Float.parseFloat(tokens[13]) : 0; ReservedInstances reservation = new ReservedInstances().withAvailabilityZone(zone) .withStart(new Date(start)).withDuration(duration).withInstanceType(instanceType) .withProductDescription(productDescription).withInstanceCount(instanceCount) .withOfferingType(offeringType).withState(state).withFixedPrice(fixedPrice) .withUsagePrice(usagePrice); if (end != null) reservation.setEnd(new Date(end)); else reservation.setEnd(new Date(start + duration * 1000)); reservations.put(accountId + "," + region + "," + reservationId, reservation); } } catch (Exception e) { logger.error("error in reading " + file, e); } finally { if (reader != null) try { reader.close(); } catch (Exception e) { } } } logger.info("read " + reservations.size() + " reservations."); for (Account account : config.accountService.getReservationAccounts().keySet()) { try { AmazonEC2Client ec2Client; String assumeRole = config.accountService.getReservationAccessRoles().get(account); if (assumeRole != null) { String externalId = config.accountService.getReservationAccessExternalIds().get(account); final Credentials credentials = AwsUtils.getAssumedCredentials(account.id, assumeRole, externalId); ec2Client = new AmazonEC2Client(new AWSSessionCredentials() { public String getAWSAccessKeyId() { return credentials.getAccessKeyId(); } public String getAWSSecretKey() { return credentials.getSecretAccessKey(); } public String getSessionToken() { return credentials.getSessionToken(); } }); } else ec2Client = new AmazonEC2Client(AwsUtils.awsCredentialsProvider.getCredentials(), AwsUtils.clientConfig); for (Region region : Region.getAllRegions()) { ec2Client.setEndpoint("ec2." + region.name + ".amazonaws.com"); try { DescribeReservedInstancesResult result = ec2Client.describeReservedInstances(); for (ReservedInstances reservation : result.getReservedInstances()) { String key = account.id + "," + region.name + "," + reservation.getReservedInstancesId(); reservations.put(key, reservation); if (reservation.getEnd() == null) reservation.setEnd(new Date( reservation.getStart().getTime() + reservation.getDuration() * 1000L)); if (reservation.getFixedPrice() == null) reservation.setFixedPrice(0f); if (reservation.getUsagePrice() == null) reservation.setUsagePrice(0f); } } catch (Exception e) { logger.error("error in describeReservedInstances for " + region.name + " " + account.name, e); } } ec2Client.shutdown(); } catch (Exception e) { logger.error("Error in describeReservedInstances for " + account.name, e); } } config.reservationService.updateEc2Reservations(reservations); updatedConfig = true; // archive to disk BufferedWriter writer = null; try { writer = new BufferedWriter(new FileWriter(file)); for (String key : reservations.keySet()) { ReservedInstances reservation = reservations.get(key); String[] line = new String[] { key, reservation.getAvailabilityZone(), reservation.getStart().getTime() + "", reservation.getDuration().toString(), reservation.getInstanceType(), reservation.getProductDescription(), reservation.getInstanceCount().toString(), reservation.getOfferingType(), reservation.getState(), reservation.getEnd().getTime() + "", reservation.getFixedPrice() + "", reservation.getUsagePrice() + "", }; writer.write(StringUtils.join(line, ",")); writer.newLine(); } } catch (Exception e) { logger.error("", e); } finally { if (writer != null) try { writer.close(); } catch (Exception e) { } } logger.info("archived " + reservations.size() + " reservations."); // archive to s3 logger.info("uploading " + file + "..."); AwsUtils.upload(config.workS3BucketName, config.workS3BucketPrefix, config.localDir, file.getName()); logger.info("uploaded " + file); }