/// <summary>
        /// Transition to next state and update the subscription in database.
        /// </summary>
        /// <param name="subscription">The subscription</param>
        /// <param name="targetState">The target state</param>
        /// <param name="callerName">The caller name</param>
        /// <returns></returns>
        private async Task <Subscription> TransitToNextState(Subscription subscription,
                                                             ProvisioningState targetState,
                                                             [CallerMemberName] string callerName = "")
        {
            MethodInfo method = typeof(ProvisioningService).GetMethod(callerName);

            OutputStatesAttribute attribute = (OutputStatesAttribute)Attribute.GetCustomAttribute(method, typeof(OutputStatesAttribute));

            if (!attribute.InputStates.Contains(targetState.ToString()))
            {
                throw new LunaProvisioningException(
                          $"Cannot transit to {targetState.ToString()} state from method {callerName}.",
                          false);
            }

            //reset retry count
            subscription.RetryCount         = 0;
            subscription.ProvisioningStatus = targetState.ToString();
            subscription.LastUpdatedTime    = DateTime.UtcNow;
            _context.Subscriptions.Update(subscription);
            await _context._SaveChangesAsync();

            return(subscription);
        }
        /// <summary>
        /// Serializes this instance of <see cref="ConfigurationStoreProperties" /> into a <see cref="Microsoft.Azure.AzConfig.Runtime.Json.JsonNode" />.
        /// </summary>
        /// <param name="container">The <see cref="Microsoft.Azure.AzConfig.Runtime.Json.JsonObject"/> container to serialize this object into. If the caller
        /// passes in <c>null</c>, a new instance will be created and returned to the caller.</param>
        /// <param name="serializationMode">Allows the caller to choose the depth of the serialization. See <see cref="Microsoft.Azure.AzConfig.Runtime.SerializationMode"/>.</param>
        /// <returns>
        /// a serialized instance of <see cref="ConfigurationStoreProperties" /> as a <see cref="Microsoft.Azure.AzConfig.Runtime.Json.JsonNode" />.
        /// </returns>
        public Microsoft.Azure.AzConfig.Runtime.Json.JsonNode ToJson(Microsoft.Azure.AzConfig.Runtime.Json.JsonObject container, Microsoft.Azure.AzConfig.Runtime.SerializationMode serializationMode)
        {
            container = container ?? new Microsoft.Azure.AzConfig.Runtime.Json.JsonObject();

            bool returnNow = false;

            BeforeToJson(ref container, ref returnNow);
            if (returnNow)
            {
                return(container);
            }
            if (serializationMode.HasFlag(Microsoft.Azure.AzConfig.Runtime.SerializationMode.IncludeReadOnly))
            {
                AddIf(null != CreationDate ? (Microsoft.Azure.AzConfig.Runtime.Json.JsonNode) new Microsoft.Azure.AzConfig.Runtime.Json.JsonString(CreationDate?.ToString(@"yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK", System.Globalization.CultureInfo.InvariantCulture)) : null, "creationDate", container.Add);
            }
            if (serializationMode.HasFlag(Microsoft.Azure.AzConfig.Runtime.SerializationMode.IncludeReadOnly))
            {
                AddIf(null != (((object)Endpoint)?.ToString()) ? (Microsoft.Azure.AzConfig.Runtime.Json.JsonNode) new Microsoft.Azure.AzConfig.Runtime.Json.JsonString(Endpoint.ToString()) : null, "endpoint", container.Add);
            }
            if (serializationMode.HasFlag(Microsoft.Azure.AzConfig.Runtime.SerializationMode.IncludeReadOnly))
            {
                AddIf(null != (((object)ProvisioningState)?.ToString()) ? (Microsoft.Azure.AzConfig.Runtime.Json.JsonNode) new Microsoft.Azure.AzConfig.Runtime.Json.JsonString(ProvisioningState.ToString()) : null, "provisioningState", container.Add);
            }
            AfterToJson(ref container);
            return(container);
        }