/// <summary>
        /// Manage Subscription Batch Usage.
        /// </summary>
        /// <param name="subscriptionBatchUsageRequest">The subscription batch usage request.</param>
        /// <returns>
        /// Subscription Usage.
        /// </returns>
        public async Task <MeteringBatchUsageResult> EmitBatchUsageEventAsync(IEnumerable <MeteringUsageRequest> subscriptionBatchUsageRequest)
        {
            this.Logger?.Info($"Inside ManageSubscriptionUsageAsync() of FulfillmentApiClient, with number of request items :: {subscriptionBatchUsageRequest.Count()} and trying to Manage Subscription Batch Usage :: {subscriptionBatchUsageRequest.FirstOrDefault()?.ResourceId}");

            BatchUsageEvent batchUsageEvent = new BatchUsageEvent();

            foreach (MeteringUsageRequest usage in subscriptionBatchUsageRequest)
            {
                batchUsageEvent.Request.Add(new UsageEvent()
                {
                    ResourceId         = usage.ResourceId,
                    PlanId             = usage.PlanId,
                    Dimension          = usage.Dimension,
                    Quantity           = usage.Quantity,
                    EffectiveStartTime = usage.EffectiveStartTime,
                });
            }

            try
            {
                var updateResult = (await this.meteringClient.Metering.PostBatchUsageEventAsync(batchUsageEvent)).Value;
            }
            catch (Exception ex)
            {
                this.ProcessErrorResponse(MarketplaceActionEnum.SUBSCRIPTION_BATCHUSAGEEVENT, ex);
                return(null);
            }

            return(new MeteringBatchUsageResult());
        }
예제 #2
0
 public virtual Response <BatchUsageEventOkResponse> PostBatchUsageEvent(BatchUsageEvent body, Guid?requestId = null, Guid?correlationId = null, CancellationToken cancellationToken = default)
 {
     using var scope = _clientDiagnostics.CreateScope("MeteringOperations.PostBatchUsageEvent");
     scope.Start();
     try
     {
         return(RestClient.PostBatchUsageEvent(body, requestId, correlationId, cancellationToken));
     }
     catch (Exception e)
     {
         scope.Failed(e);
         throw;
     }
 }
예제 #3
0
        public async Task PostBatchUsage()
        {
            var sut = this.InstrumentClient(this.GetMarketplaceMeteringClient());

            var usageEvent1 = new Metering.Models.UsageEvent
            {
                ResourceId = Guid.Parse("da8dc4ae-4cdf-ed6b-e12e-9d0219306842"),
                Quantity   = 20.5,
                Dimension  = "dim1",
                // The time passed to Parse method should be the same as the recording
                EffectiveStartTime = this.Mode == RecordedTestMode.Playback ? DateTime.Parse("2021-03-15T18:06:00.4578027Z").ToUniversalTime() : DateTime.UtcNow.AddMinutes(-300),
                PlanId             = "silver",
            };

            var usageEvent2 = new Metering.Models.UsageEvent
            {
                ResourceUri = "/subscriptions/bf7adf12-c3a8-426c-9976-29f145eba70f/resourceGroups/ercmngd/providers/Microsoft.Solutions/applications/ercmdngd2231",
                Quantity    = 20.5,
                Dimension   = "dim1",
                // The time passed to Parse method should be the same as the recording
                EffectiveStartTime = this.Mode == RecordedTestMode.Playback ? DateTime.Parse("2021-03-15T18:06:00.4580942Z").ToUniversalTime() : DateTime.UtcNow.AddMinutes(-300),
                PlanId             = "userassigned",
            };

            var usageBatch = new BatchUsageEvent {
                Request = { usageEvent1, usageEvent2 }
            };

            var result = await sut.Metering.PostBatchUsageEventAsync(usageBatch);

            Assert.IsTrue(result.Value.Result.All(r => r.Status == UsageEventStatusEnum.Accepted));
            Assert.IsTrue(result.Value.Result.All(r => r.Quantity == 20.5));
            Assert.AreEqual(result.Value.Count, 2);
            Assert.IsTrue(result.Value.Result.All(r => r.Error == default));

            // Now get duplicates
            result = await sut.Metering.PostBatchUsageEventAsync(usageBatch);

            Assert.IsTrue(result.Value.Result.All(r => r.Status == UsageEventStatusEnum.Duplicate));
            Assert.IsTrue(result.Value.Result.All(r => r.Error != default));
            Assert.IsTrue(result.Value.Result.All(r => r.UsageEventId == default));
        }