use of org.joda.time.DateMidnight in project ice by Netflix.
the class BasicLineItemProcessor method process.
public Result process(long startMilli, boolean processDelayed, ProcessorConfig config, String[] items, Map<Product, ReadWriteData> usageDataByProduct, Map<Product, ReadWriteData> costDataByProduct, Map<String, Double> ondemandRate) {
if (StringUtils.isEmpty(items[accountIdIndex]) || StringUtils.isEmpty(items[productIndex]) || StringUtils.isEmpty(items[usageTypeIndex]) || StringUtils.isEmpty(items[operationIndex]) || StringUtils.isEmpty(items[usageQuantityIndex]) || StringUtils.isEmpty(items[costIndex]))
return Result.ignore;
Account account = config.accountService.getAccountById(items[accountIdIndex]);
if (account == null)
return Result.ignore;
double usageValue = Double.parseDouble(items[usageQuantityIndex]);
double costValue = Double.parseDouble(items[costIndex]);
long millisStart;
long millisEnd;
try {
millisStart = amazonBillingDateFormat.parseMillis(items[startTimeIndex]);
millisEnd = amazonBillingDateFormat.parseMillis(items[endTimeIndex]);
} catch (IllegalArgumentException e) {
millisStart = amazonBillingDateFormat2.parseMillis(items[startTimeIndex]);
millisEnd = amazonBillingDateFormat2.parseMillis(items[endTimeIndex]);
}
Product product = config.productService.getProductByAwsName(items[productIndex]);
boolean reservationUsage = "Y".equals(items[reservedIndex]);
ReformedMetaData reformedMetaData = reform(millisStart, config, product, reservationUsage, items[operationIndex], items[usageTypeIndex], items[descriptionIndex], costValue);
product = reformedMetaData.product;
Operation operation = reformedMetaData.operation;
UsageType usageType = reformedMetaData.usageType;
Zone zone = Zone.getZone(items[zoneIndex], reformedMetaData.region);
int startIndex = (int) ((millisStart - startMilli) / AwsUtils.hourMillis);
int endIndex = (int) ((millisEnd + 1000 - startMilli) / AwsUtils.hourMillis);
Result result = Result.hourly;
if (product == Product.ec2_instance) {
result = processEc2Instance(processDelayed, reservationUsage, operation, zone);
} else if (product == Product.redshift) {
result = processRedshift(processDelayed, reservationUsage, operation, costValue);
} else if (product == Product.data_transfer) {
result = processDataTranfer(processDelayed, usageType);
} else if (product == Product.cloudhsm) {
result = processCloudhsm(processDelayed, usageType);
} else if (product == Product.ebs) {
result = processEbs(usageType);
} else if (product == Product.rds) {
result = processRds(usageType);
}
if (result == Result.ignore || result == Result.delay)
return result;
if (usageType.name.startsWith("TimedStorage-ByteHrs"))
result = Result.daily;
boolean monthlyCost = StringUtils.isEmpty(items[descriptionIndex]) ? false : items[descriptionIndex].toLowerCase().contains("-month");
ReadWriteData usageData = usageDataByProduct.get(null);
ReadWriteData costData = costDataByProduct.get(null);
ReadWriteData usageDataOfProduct = usageDataByProduct.get(product);
ReadWriteData costDataOfProduct = costDataByProduct.get(product);
if (result == Result.daily) {
DateMidnight dm = new DateMidnight(millisStart, DateTimeZone.UTC);
millisStart = dm.getMillis();
startIndex = (int) ((millisStart - startMilli) / AwsUtils.hourMillis);
endIndex = startIndex + 24;
} else if (result == Result.monthly) {
startIndex = 0;
endIndex = usageData.getNum();
int numHoursInMonth = new DateTime(startMilli, DateTimeZone.UTC).dayOfMonth().getMaximumValue() * 24;
usageValue = usageValue * endIndex / numHoursInMonth;
costValue = costValue * endIndex / numHoursInMonth;
}
if (monthlyCost) {
int numHoursInMonth = new DateTime(startMilli, DateTimeZone.UTC).dayOfMonth().getMaximumValue() * 24;
usageValue = usageValue * numHoursInMonth;
}
int[] indexes;
if (endIndex - startIndex > 1) {
usageValue = usageValue / (endIndex - startIndex);
costValue = costValue / (endIndex - startIndex);
indexes = new int[endIndex - startIndex];
for (int i = 0; i < indexes.length; i++) indexes[i] = startIndex + i;
} else {
indexes = new int[] { startIndex };
}
TagGroup tagGroup = TagGroup.getTagGroup(account, reformedMetaData.region, zone, product, operation, usageType, null);
TagGroup resourceTagGroup = null;
if (costValue > 0 && !reservationUsage && product == Product.ec2_instance && tagGroup.operation == Operation.ondemandInstances) {
String key = operation + "|" + tagGroup.region + "|" + usageType;
ondemandRate.put(key, costValue / usageValue);
}
double resourceCostValue = costValue;
if (items.length > resourceIndex && !StringUtils.isEmpty(items[resourceIndex]) && config.resourceService != null) {
if (config.useCostForResourceGroup.equals("modeled") && product == Product.ec2_instance)
operation = Operation.getReservedInstances(config.reservationService.getDefaultReservationUtilization(0L));
if (product == Product.ec2_instance && operation instanceof Operation.ReservationOperation) {
UsageType usageTypeForPrice = usageType;
if (usageType.name.endsWith(InstanceOs.others.name())) {
usageTypeForPrice = UsageType.getUsageType(usageType.name.replace(InstanceOs.others.name(), InstanceOs.windows.name()), usageType.unit);
}
try {
resourceCostValue = usageValue * config.reservationService.getLatestHourlyTotalPrice(millisStart, tagGroup.region, usageTypeForPrice, config.reservationService.getDefaultReservationUtilization(0L));
} catch (Exception e) {
logger.error("failed to get RI price for " + tagGroup.region + " " + usageTypeForPrice);
resourceCostValue = -1;
}
}
String resourceGroupStr = config.resourceService.getResource(account, reformedMetaData.region, product, items[resourceIndex], items, millisStart);
if (!StringUtils.isEmpty(resourceGroupStr)) {
ResourceGroup resourceGroup = ResourceGroup.getResourceGroup(resourceGroupStr);
resourceTagGroup = TagGroup.getTagGroup(account, reformedMetaData.region, zone, product, operation, usageType, resourceGroup);
if (usageDataOfProduct == null) {
usageDataOfProduct = new ReadWriteData();
costDataOfProduct = new ReadWriteData();
usageDataByProduct.put(product, usageDataOfProduct);
costDataByProduct.put(product, costDataOfProduct);
}
}
}
if (config.randomizer != null && product == Product.monitor)
return result;
for (int i : indexes) {
if (config.randomizer != null) {
if (tagGroup.product != Product.rds && tagGroup.product != Product.s3 && usageData.getData(i).get(tagGroup) != null)
break;
long time = millisStart + i * AwsUtils.hourMillis;
usageValue = config.randomizer.randomizeUsage(time, resourceTagGroup == null ? tagGroup : resourceTagGroup, usageValue);
costValue = usageValue * config.randomizer.randomizeCost(tagGroup);
}
if (product != Product.monitor) {
Map<TagGroup, Double> usages = usageData.getData(i);
Map<TagGroup, Double> costs = costData.getData(i);
addValue(usages, tagGroup, usageValue, config.randomizer == null || tagGroup.product == Product.rds || tagGroup.product == Product.s3);
addValue(costs, tagGroup, costValue, config.randomizer == null || tagGroup.product == Product.rds || tagGroup.product == Product.s3);
} else {
resourceCostValue = usageValue * config.costPerMonitorMetricPerHour;
}
if (resourceTagGroup != null) {
Map<TagGroup, Double> usagesOfResource = usageDataOfProduct.getData(i);
Map<TagGroup, Double> costsOfResource = costDataOfProduct.getData(i);
if (config.randomizer == null || tagGroup.product == Product.rds || tagGroup.product == Product.s3) {
addValue(usagesOfResource, resourceTagGroup, usageValue, product != Product.monitor);
if (!config.useCostForResourceGroup.equals("modeled") || resourceCostValue < 0) {
addValue(costsOfResource, resourceTagGroup, costValue, product != Product.monitor);
} else {
addValue(costsOfResource, resourceTagGroup, resourceCostValue, product != Product.monitor);
}
} else {
Map<String, Double> distribution = config.randomizer.getDistribution(tagGroup);
for (Map.Entry<String, Double> entry : distribution.entrySet()) {
String app = entry.getKey();
double dist = entry.getValue();
resourceTagGroup = TagGroup.getTagGroup(account, reformedMetaData.region, zone, product, operation, usageType, ResourceGroup.getResourceGroup(app));
double usage = usageValue * dist;
if (product == Product.ec2_instance)
usage = (int) usageValue * dist;
addValue(usagesOfResource, resourceTagGroup, usage, false);
addValue(costsOfResource, resourceTagGroup, usage * config.randomizer.randomizeCost(tagGroup), false);
}
}
}
}
return result;
}
use of org.joda.time.DateMidnight in project ice by Netflix.
the class BasicReservationService method pollAPI.
private void pollAPI() throws Exception {
long currentTime = new DateMidnight().getMillis();
DescribeReservedInstancesOfferingsRequest req = new DescribeReservedInstancesOfferingsRequest().withFilters(new com.amazonaws.services.ec2.model.Filter().withName("marketplace").withValues("false"));
String token = null;
boolean hasNewPrice = false;
AmazonEC2Client ec2Client = new AmazonEC2Client(AwsUtils.awsCredentialsProvider, AwsUtils.clientConfig);
for (Region region : Region.getAllRegions()) {
ec2Client.setEndpoint("ec2." + region.name + ".amazonaws.com");
do {
if (!StringUtils.isEmpty(token))
req.setNextToken(token);
DescribeReservedInstancesOfferingsResult offers = ec2Client.describeReservedInstancesOfferings(req);
token = offers.getNextToken();
for (ReservedInstancesOffering offer : offers.getReservedInstancesOfferings()) {
if (offer.getProductDescription().indexOf("Amazon VPC") >= 0)
continue;
ReservationUtilization utilization = ReservationUtilization.get(offer.getOfferingType());
Ec2InstanceReservationPrice.ReservationPeriod term = offer.getDuration() / 24 / 3600 > 366 ? Ec2InstanceReservationPrice.ReservationPeriod.threeyear : Ec2InstanceReservationPrice.ReservationPeriod.oneyear;
if (term != this.term)
continue;
double hourly = offer.getUsagePrice();
if (hourly <= 0) {
for (RecurringCharge recurringCharge : offer.getRecurringCharges()) {
if (recurringCharge.getFrequency().equals("Hourly")) {
hourly = recurringCharge.getAmount();
break;
}
}
}
UsageType usageType = getUsageType(offer.getInstanceType(), offer.getProductDescription());
// Unknown Zone
if (Zone.getZone(offer.getAvailabilityZone()) == null) {
logger.error("No Zone for " + offer.getAvailabilityZone());
} else {
hasNewPrice = setPrice(utilization, currentTime, Zone.getZone(offer.getAvailabilityZone()).region, usageType, offer.getFixedPrice(), hourly) || hasNewPrice;
logger.info("Setting RI price for " + Zone.getZone(offer.getAvailabilityZone()).region + " " + utilization + " " + usageType + " " + offer.getFixedPrice() + " " + hourly);
}
}
} while (!StringUtils.isEmpty(token));
}
ec2Client.shutdown();
if (hasNewPrice) {
for (ReservationUtilization utilization : files.keySet()) {
File file = files.get(utilization);
DataOutputStream out = new DataOutputStream(new FileOutputStream(file));
try {
Serializer.serialize(out, this.ec2InstanceReservationPrices.get(utilization));
AwsUtils.upload(config.workS3BucketName, config.workS3BucketPrefix, file);
} finally {
out.close();
}
}
}
}
use of org.joda.time.DateMidnight in project qi4j-sdk by Qi4j.
the class BookNewCargo method buildRouteSpecification.
public RouteSpecification buildRouteSpecification(ValueBuilderFactory vbf, Location origin, Location destination, Date deadline) {
if (origin == destination) {
throw new RouteException("Origin location can't be same as destination location.");
}
if (deadline == null) {
throw new RouteException("Arrival deadline cannot be null.");
}
Date endOfToday = new DateMidnight().plusDays(1).toDate();
if (deadline.before(endOfToday)) {
throw new RouteException("Arrival deadline is in the past or Today." + "\nDeadline " + deadline + "\nToday (midnight) " + endOfToday);
}
ValueBuilder<RouteSpecification> routeSpec = vbf.newValueBuilder(RouteSpecification.class);
routeSpec.prototype().origin().set(origin);
routeSpec.prototype().destination().set(destination);
routeSpec.prototype().arrivalDeadline().set(deadline);
return routeSpec.newInstance();
}
use of org.joda.time.DateMidnight in project joda-time by JodaOrg.
the class TestGregorianChronology method testMaximumValue.
public void testMaximumValue() {
YearMonthDay ymd1 = new YearMonthDay(1999, DateTimeConstants.FEBRUARY, 1);
DateMidnight dm1 = new DateMidnight(1999, DateTimeConstants.FEBRUARY, 1);
Chronology chrono = GregorianChronology.getInstance();
assertEquals(28, chrono.dayOfMonth().getMaximumValue(ymd1));
assertEquals(28, chrono.dayOfMonth().getMaximumValue(dm1.getMillis()));
}
use of org.joda.time.DateMidnight in project OpenClinica by OpenClinica.
the class OpenClinicaBeanVariableNode method testCalculateVariable.
private String testCalculateVariable() {
if (number.equals("_CURRENT_DATE")) {
String ssTimeZone = getExpressionBeanService().getSSTimeZone();
if (ssTimeZone.equals("") || ssTimeZone == null)
ssTimeZone = TimeZone.getDefault().getID();
DateTimeZone ssZone = DateTimeZone.forID(ssTimeZone);
DateMidnight dm = new DateMidnight(ssZone);
DateTimeFormatter fmt = ISODateTimeFormat.date();
return fmt.print(dm);
}
return null;
}
Aggregations