Ejemplo n.º 1
0
        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}");
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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)
                };
            }));
        }