public async Task <FulfillmentRequestResult> UpdateSubscriptionOperationAsync(
            Guid subscriptionId,
            Guid operationId,
            OperationUpdate update,
            Guid requestId,
            Guid correlationId,
            CancellationToken cancellationToken)
        {
            var requestUrl = FluentUriBuilder
                             .Start(this.baseUri)
                             .AddPath("subscriptions")
                             .AddPath(subscriptionId.ToString())
                             .AddPath("operations")
                             .AddPath(operationId.ToString())
                             .AddQuery(DefaultApiVersionParameterName, this.apiVersion)
                             .Uri;

            requestId     = requestId == default ? Guid.NewGuid() : requestId;
            correlationId = correlationId == default ? Guid.NewGuid() : correlationId;

            var response = await this.SendRequestAndReturnResult(
                new HttpMethod("PATCH"),
                requestUrl,
                requestId,
                correlationId,
                null,
                JsonConvert.SerializeObject(update),
                cancellationToken);

            return(await FulfillmentRequestResult.ParseAsync <ResolvedSubscription>(response));
        }
Exemple #2
0
        public void TestExecute()
        {
            var managerMock = new Mock <InstallationManager>
            {
                CallBase = true,
            };

            manager = managerMock.Object;

            var operationInstall   = new OperationInstall(package.Object);
            var operationUninstall = new OperationUninstall(package.Object);
            var operationUpdate    = new OperationUpdate(package.Object, package.Object);

            package.Setup((o) => o.GetPackageType()).Returns("foo");
            repository.SetupSequence((o) => o.HasPackage(package.Object))
            .Returns(false).Returns(true).Returns(true).Returns(false);
            manager.AddInstaller(new InstallerNoop());

            manager.Execute(repository.Object, operationInstall);
            manager.Execute(repository.Object, operationUninstall);
            manager.Execute(repository.Object, operationUpdate);

            managerMock.Protected().Verify("Install", Times.Once(), repository.Object, operationInstall);
            managerMock.Protected().Verify("Uninstall", Times.Once(), repository.Object, operationUninstall);
            managerMock.Protected().Verify("Update", Times.Once(), repository.Object, operationUpdate);
        }
Exemple #3
0
        public void TestUpdateWithNotEqualPackageType()
        {
            var initial = new Mock <IPackage>();

            initial.Setup((o) => o.GetPackageType()).Returns("foo");
            var target = new Mock <IPackage>();

            target.Setup((o) => o.GetPackageType()).Returns("bar");

            var installerFoo = new Mock <IInstaller>();

            installerFoo.Setup((o) => o.IsSupports("foo")).Returns(true);
            var installerBar = new Mock <IInstaller>();

            installerBar.Setup((o) => o.IsSupports("bar")).Returns(true);

            manager.AddInstaller(installerFoo.Object);
            manager.AddInstaller(installerBar.Object);

            var operationUpdate = new OperationUpdate(initial.Object, target.Object);

            manager.Execute(repository.Object, operationUpdate);

            installerFoo.Verify((o) => o.Uninstall(repository.Object, initial.Object));
            installerBar.Verify((o) => o.Install(repository.Object, target.Object));
        }
Exemple #4
0
 protected virtual void OnOperationUpdate(OperationType type,
                                          ProgressStyle style) =>
 OperationUpdate?.Invoke(this, new OperationUpdateEventArgs
 {
     Type      = type,
     Counter   = 0,
     MaxCount  = 0,
     Style     = style,
     StartTime = operationStartTime,
 });
Exemple #5
0
 protected virtual void OnOperationUpdate(OperationType type,
                                          int counter,
                                          int maxCount) =>
 OperationUpdate?.Invoke(this, new OperationUpdateEventArgs
 {
     Type      = type,
     Counter   = counter,
     MaxCount  = maxCount,
     Style     = ProgressStyle.Continuous,
     StartTime = operationStartTime,
 });
        public OpResult Update(String tableName, Dictionary <String, Object> objectMap)
        {
            if (objectMap == null)
            {
                throw new ArgumentException(ExceptionMessage.NULL_MAP);
            }

            TransactionHelper.MakeReferenceToValueFromOpResult(objectMap);
            String          operationResultId = opResultIdGenerator.GenerateOpResultId(OperationType.UPDATE, tableName);
            OperationUpdate operationUpdate   = new OperationUpdate(OperationType.UPDATE, tableName, operationResultId, objectMap);

            operations.AddLast(operationUpdate);

            return(TransactionHelper.MakeOpResult(tableName, operationResultId, OperationType.UPDATE));
        }
Exemple #7
0
        public async Task NotifyAsync(OperationUpdate notification)
        {
            using var requestMessage = new HttpRequestMessage(
                      HttpMethod.Post,
                      _configuration["SaaSOffer:Connectionwebhook"]);

            var json       = JsonConvert.SerializeObject(notification);
            var httpClient = _httpClientFactory.CreateClient();

            requestMessage.Content = new StringContent(json, Encoding.Default, "application/json");

            using var response = await httpClient.SendAsync(requestMessage).ConfigureAwait(false);

            response.EnsureSuccessStatusCode();
        }
Exemple #8
0
        public void TestUpdate()
        {
            var initial         = new Mock <IPackage>();
            var target          = new Mock <IPackage>();
            var operationUpdate = new OperationUpdate(initial.Object, target.Object);

            initial.Setup((o) => o.GetPackageType()).Returns("foo");
            target.Setup((o) => o.GetPackageType()).Returns("foo");
            installer.Setup((o) => o.IsSupports("foo")).Returns(true);
            manager.AddInstaller(installer.Object);

            manager.Execute(repository.Object, operationUpdate);

            installer.Verify((o) => o.Download(target.Object, initial.Object));
            installer.Verify((o) => o.Update(repository.Object, initial.Object, target.Object));
        }
        public IActionResult DeleteSubscription([FromRoute] Guid subscriptionId)
        {
            // create cancel subscription operation
            var operation = new OperationUpdate()
            {
                Id             = Guid.NewGuid(),
                Action         = SaaSActionEnum.Unsubscribe,
                SubscriptionId = subscriptionId,
                Status         = SaasStatusEnum.InProgress
            };

            // save data in cache.
            _cache.Set(operation.Id, operation, _cacheEntryOptions);

            _webhookTriggerService.NotifyAsync(operation);

            return(StatusCode(202));
        }
        public IActionResult PatchSubscription([FromRoute] Guid subscriptionId, [FromBody] ChangeQuantityPayload changeQuantityPayload)
        {
            // create cancel subscription operation
            var operation = new OperationUpdate()
            {
                Id             = Guid.NewGuid(),
                Action         = SaaSActionEnum.ChangeQuantity,
                SubscriptionId = subscriptionId,
                Quantity       = changeQuantityPayload.Quantity,
                Status         = SaasStatusEnum.InProgress
            };

            // save data in cache.
            _cache.Set(operation.Id, operation, _cacheEntryOptions);

            _webhookTriggerService.NotifyAsync(operation);

            return(StatusCode(202));
        }
Exemple #11
0
        public async Task <IActionResult> UpdateSubscription(UpdateSubscriptionViewModel model)
        {
            var subscription = _dbContext.Subscriptions.Where(
                subscription => subscription.Id == model.Subscription.Id).Single();

            OperationUpdate operation = null;

            // check if the plan is changed
            if (model.Subscription.PlanId != subscription.PlanId)
            {
                // create change plan operation
                operation = new OperationUpdate()
                {
                    Id             = Guid.NewGuid(),
                    Action         = SaaSActionEnum.ChangePlan,
                    SubscriptionId = subscription.Id,
                    Quantity       = model.Subscription.Quantity,
                    Status         = SaasStatusEnum.InProgress,
                    PlanId         = model.Subscription.PlanId
                };
            }
            else
            {
                // create change quantity operation
                operation = new OperationUpdate()
                {
                    Id             = Guid.NewGuid(),
                    Action         = SaaSActionEnum.ChangeQuantity,
                    SubscriptionId = subscription.Id,
                    Quantity       = model.Subscription.Quantity,
                    Status         = SaasStatusEnum.InProgress,
                    PlanId         = model.Subscription.PlanId
                };
            }
            model.OperationUpdateId = operation.Id;

            // save data in cache
            _cache.Set(operation.Id, operation, _cacheEntryOptions);
            // webhook trigger: send notifaction to ISV service
            await _webhookTriggerService.NotifyAsync(operation);

            return(View(model));
        }
Exemple #12
0
        public async Task <FulfillmentRequestResult> UpdateSubscriptionOperationAsync(
            Guid subscriptionId,
            Guid operationId,
            OperationUpdate update,
            Guid requestId,
            Guid correlationId,
            CancellationToken cancellationToken = default)
        {
            try
            {
                var requestUrl = FluentUriBuilder
                                 .Start(_baseUri)
                                 .AddPath("subscriptions")
                                 .AddPath(subscriptionId.ToString())
                                 .AddPath("operations")
                                 .AddPath(operationId.ToString())
                                 .AddQuery(DefaultApiVersionParameterName, _apiVersion)
                                 .Uri;

                requestId     = requestId == default ? Guid.NewGuid() : requestId;
                correlationId = correlationId == default ? Guid.NewGuid() : correlationId;
                var bearerToken = await _keyVaultHelper.GetBearerToken(
                    _options.AzureActiveDirectory,
                    _options.ClientService.AuthenticationResourceId);

                var response = await SendRequestAndReturnResult(
                    new HttpMethod("PATCH"),
                    requestUrl,
                    requestId,
                    correlationId,
                    bearerToken,
                    null,
                    JsonConvert.SerializeObject(update),
                    cancellationToken);

                return(await FulfillmentRequestResult.ParseAsync <ResolvedSubscriptionResult>(response));
            }
            catch (LunaServerException e)
            {
                throw new LunaFulfillmentException($"Cannot update operation {operationId} for subscription {subscriptionId}.", e);
            }
        }
Exemple #13
0
        public async Task <IActionResult> CancelSubscription(UpdateSubscriptionViewModel model)
        {
            var subscription = _dbContext.Subscriptions.Where(i => i.Id == model.Subscription.Id).Single();

            // create cancel subscription operation
            var operation = new OperationUpdate()
            {
                Id             = Guid.NewGuid(),
                Action         = SaaSActionEnum.Unsubscribe,
                SubscriptionId = subscription.Id,
                Quantity       = model.Subscription.Quantity,
                Status         = SaasStatusEnum.InProgress,
                PlanId         = model.Subscription.PlanId
            };

            model.OperationUpdateId = operation.Id;

            // save data in cache
            _cache.Set(operation.Id, operation, _cacheEntryOptions);
            // webhook trigger: send notifaction to ISV service
            await _webhookTriggerService.NotifyAsync(operation);

            return(View("UpdateSubscription", model));
        }
 public static OperationHistoryNoSqlEntity Create(OperationUpdate entity) =>
Exemple #15
0
 public OperationHistoryEntity(OperationUpdate entity) : base(entity)
 {
 }
        public async Task <Subscription> UpdateOperationCompletedAsync(Guid subscriptionId, string activatedBy = "system")
        {
            Subscription subscription = await _context.Subscriptions.FindAsync(subscriptionId);

            ValidateSubscriptionAndInputState(subscription);

            try
            {
                Offer offer = await FindOfferById(subscription.OfferId);

                if (subscription.ProvisioningStatus.Equals(ProvisioningState.NotificationPending.ToString(), StringComparison.InvariantCultureIgnoreCase) &&
                    offer.ManualCompleteOperation)
                {
                    _logger.LogInformation($"ManualCompleteOperation of offer {offer.OfferName} is set to true. Will not complete the operation automatically.");

                    return(await TransitToNextState(subscription, ProvisioningState.ManualCompleteOperationPending));
                }

                // Don't need to update marketplace operation for delete data
                if (!subscription.ProvisioningType.Equals(nameof(ProvisioningType.DeleteData)))
                {
                    Plan plan = await FindPlanById(subscription.PlanId);

                    OperationUpdate update = new OperationUpdate
                    {
                        PlanId   = plan.PlanName,
                        Quantity = subscription.Quantity,
                        Status   = OperationUpdateStatusEnum.Success
                    };

                    _logger.LogInformation(
                        LoggingUtils.ComposeHttpClientLogMessage(
                            _fulfillmentClient.GetType().Name,
                            nameof(_fulfillmentClient.UpdateSubscriptionOperationAsync),
                            subscriptionId));

                    var result = await _fulfillmentClient.UpdateSubscriptionOperationAsync(
                        subscriptionId,
                        subscription.OperationId ?? Guid.Empty,
                        update,
                        Guid.NewGuid(),
                        Guid.NewGuid(),
                        default);
                }

                switch (subscription.ProvisioningType)
                {
                case nameof(ProvisioningType.Update):
                case nameof(ProvisioningType.Reinstate):
                    subscription.Status = nameof(FulfillmentState.Subscribed);
                    break;

                case nameof(ProvisioningType.DeleteData):
                    subscription.Status = nameof(FulfillmentState.Purged);
                    break;

                case nameof(ProvisioningType.Suspend):
                    subscription.LastSuspendedTime = DateTime.UtcNow;
                    subscription.Status            = nameof(FulfillmentState.Suspended);
                    break;

                case nameof(ProvisioningType.Unsubscribe):
                    subscription.UnsubscribedTime = DateTime.UtcNow;
                    subscription.Status           = nameof(FulfillmentState.Unsubscribed);
                    break;

                default:
                    throw new ArgumentException($"Provisioning type {subscription.ProvisioningType} is not supported.");
                }
                subscription.ActivatedBy = activatedBy;
                return(await TransitToNextState(subscription, ProvisioningState.Succeeded));
            }
            catch (Exception e)
            {
                return(await HandleExceptions(subscription, e));
            }
        }
 public AvgPriceUpdate(OperationUpdate entity) : base(entity)
 {
     EventType = entity.OperationType.ToString();
 }