public static string GetCrossEnvironmentId(this ListPriceMeter meter) { var category = meter.MeterCategory.Replace(" ", string.Empty); var subCategory = meter.MeterSubCategory.Replace(" ", string.Empty); var name = meter.MeterName.Replace(" ", string.Empty); var unit = meter.MeterUnit.Replace(" ", string.Empty); return($"{category}/{subCategory}/{name}/{unit}"); }
private static decimal?CalculateCost( double?quantity, ListPriceMeter meter) { if (quantity == null || meter == null) { return(null); } decimal cost = 0; double remainQuantity = quantity.Value; for (int i = meter.MeterRates.Count - 1; i >= 0; i--) { double highestTier = meter.MeterRates.Keys[i]; if (remainQuantity > highestTier) { cost += (decimal)(remainQuantity - highestTier) * meter.MeterRates.Values[i]; remainQuantity = highestTier; } } return(cost); }
private IEnumerable <CostEstimationDetail> GetCostEstimationResult( ResourceModel resource, IEnumerable <ResourceUsage> usages, IReadOnlyDictionary <string, ListPriceMeter> sourceMeters, IReadOnlyDictionary <string, ListPriceMeter> targetMeters) { if (!usages.Any()) { usages = new ResourceUsage[] { null }; } return(usages.Select(usage => { ListPriceMeter sourceMeter = null; ListPriceMeter targetMeter = null; if (usage != null) { if (sourceMeters.TryGetValue(usage.MeterId, out sourceMeter)) { if (!targetMeters.TryGetValue(sourceMeter.CrossEnvironmentId, out targetMeter)) { this.context.TelemetryManager.WriteLog( TelemetryLogLevel.Warning, TelemetryLogSection, FormattableString.Invariant($"Unknown target price meter: {sourceMeter.CrossEnvironmentId}")); } } else { this.context.TelemetryManager.WriteLog( TelemetryLogLevel.Warning, TelemetryLogSection, FormattableString.Invariant($"Unknown source price meter: {usage.MeterId}")); } } else { this.context.TelemetryManager.WriteLog( TelemetryLogLevel.Warning, TelemetryLogSection, FormattableString.Invariant($"Cannot find usage for resource {resource.Id}")); } var resourceId = new ResourceId(resource.Id); return new CostEstimationDetail { ResourceId = resource.Id, ResourceType = resource.Details?.Value <string>("type") ?? $"{resourceId.ResourceType}", ResourceName = resourceId.ResourceName, ResourceGroupName = resourceId.ResourceGroup, ResourceModel = resource, Location = resource.Details?.Value <string>("location") ?? "N/A", UsagesQuantity = usage?.Quantity, MeterName = sourceMeter?.MeterName, MeterCategory = sourceMeter?.MeterCategory, MeterSubCategory = sourceMeter?.MeterSubCategory, SourceMeterId = sourceMeter?.MeterId, TargetMeterId = targetMeter?.MeterId, OriginalCost = CalculateCost(usage?.Quantity, sourceMeter), EstimatedCost = CalculateCost(usage?.Quantity, targetMeter) }; })); }