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); }
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())); } }