Ejemplo n.º 1
0
        public async Task <IEnumerable <ResourceUsage> > GetUsagesAsync(
            IEnumerable <SubscriptionModel> subscriptions,
            DateTime startTime,
            DateTime endTime)
        {
            var resourceUsages = new List <ResourceUsage>();

            using (var client = new RateCardClient(this.context.ARMAccessToken, this.context.ARMBaseUri))
            {
                // TODO: revisit here to check whether contains non resource id specific usages, e.g. legacy resources.
                foreach (var subscription in subscriptions)
                {
                    IEnumerable <UsageAggregate> usages;

                    try
                    {
                        usages = await client.GetUsagesAsync(subscription.SubscriptionId, startTime, endTime);
                    }
                    catch (CloudException ex)
                    {
                        if (this.context.ARMBaseUri == new AzureEnvironmentHelper("AzureChinaCloud").ResourceManagerEndpoint &&
                            ex.Message.StartsWith("The resource type could not be found in the namespace 'Microsoft.Commerce'", StringComparison.OrdinalIgnoreCase))
                        {
                            // Skip usage retrieving since the RP is not available yet in Azure China Cloud
                            usages = new UsageAggregate[] { };
                        }
                        else
                        {
                            throw;
                        }
                    }

                    var resourceIds = new HashSet <string>(
                        subscription.ResourceGroups
                        .SelectMany(r => r.Value)
                        .Select(m => m.Id)
                        .Distinct(),
                        StringComparer.OrdinalIgnoreCase);

                    resourceUsages.AddRange(usages
                                            .Where(u => resourceIds.Contains(u.ResourceUri))
                                            .GroupBy(u => new
                    {
                        resourceUri = u.ResourceUri,
                        meterId     = u.Properties.MeterId
                    })
                                            .Select(g => new ResourceUsage
                    {
                        ResourceUri = g.Key.resourceUri,
                        MeterId     = g.Key.meterId,
                        Quantity    = g.Sum(m => m.Properties.Quantity)
                    }));
                }
            }

            return(resourceUsages);
        }
Ejemplo n.º 2
0
        public async Task <IEnumerable <ListPriceMeter> > GetMetersAsync(
            IEnumerable <string> subscriptionIds,
            ISet <string> meterIds)
        {
            // TODO: resolve from IoC container
            using (var client = new RateCardClient(this.context.ARMAccessToken, this.context.ARMBaseUri))
            {
                var tasks    = subscriptionIds.Select(async subscriptionId => await client.GetPayloadAsync(subscriptionId));
                var payloads = await Task.WhenAll(tasks);

                return(payloads
                       .SelectMany(p => p.Meters.Select(m => new ListPriceMeter(m)))
                       .Where(m => meterIds.Contains(m.MeterId))
                       .GroupBy(m => m.MeterId)
                       .Select(g => g.First()));
            }
        }