예제 #1
0
 /// <summary>
 /// Creates the new session for given clients
 /// </summary>
 /// <param name="sqlManagementClient">Sql Management Client</param>
 /// <param name="resourceManagementClient">Resource Management Client</param>
 /// <param name="subscriptionContext">Subscription Context</param>
 public AzureResourceManagementSession(SqlManagementClient sqlManagementClient,
                                       ResourceManagementClient resourceManagementClient,
                                       IAzureUserAccountSubscriptionContext subscriptionContext)
 {
     SqlManagementClient      = sqlManagementClient;
     ResourceManagementClient = resourceManagementClient;
     SubscriptionContext      = subscriptionContext;
 }
예제 #2
0
        /// <summary>
        /// Creates credential instance for given subscription
        /// </summary>
        private ServiceClientCredentials CreateCredentials(IAzureUserAccountSubscriptionContext subscriptionContext)
        {
            AzureUserAccountSubscriptionContext azureUserSubContext =
                subscriptionContext as AzureUserAccountSubscriptionContext;

            if (azureUserSubContext != null)
            {
                return(azureUserSubContext.Credentials);
            }
            throw new NotSupportedException("This uses an unknown subscription type");
        }
        /// <summary>
        /// Throws a firewallRule exception based on give status code
        /// </summary>
        private void HandleError(ServiceExceptionBase exception, string serverName,
                                 IAzureUserAccountSubscriptionContext subscription)
        {
            var accountName = subscription != null && subscription.UserAccount != null &&
                              subscription.UserAccount.DisplayInfo != null
                ? subscription.UserAccount.DisplayInfo.UserName
                : string.Empty;

            switch (exception.HttpStatusCode)
            {
            case HttpStatusCode.NotFound:
                throw new FirewallRuleException(string.Format(CultureInfo.CurrentCulture, SR.AzureServerNotFound, serverName, accountName), exception);

            case HttpStatusCode.Forbidden:
                throw new FirewallRuleException(string.Format(CultureInfo.CurrentCulture, SR.FirewallRuleAccessForbidden, accountName), exception);

            default:
                throw new FirewallRuleException(SR.FirewallRuleCreationFailed, exception.HttpStatusCode, exception);
            }
        }
예제 #4
0
        /// <summary>
        /// Returns a  list of Azure sql databases for given subscription
        /// </summary>
        private async Task <ServiceResponse <DatabaseInstanceInfo> > GetDatabaseForSubscriptionFromServiceAsync(
            IAzureUserAccountSubscriptionContext input, string serverName,
            CancellationToken cancellationToken, CancellationToken internalCancellationToken)
        {
            ServiceResponse <DatabaseInstanceInfo> result = null;

            try
            {
                if (!cancellationToken.IsCancellationRequested && !internalCancellationToken.IsCancellationRequested)
                {
                    using (IAzureResourceManagementSession session = await AzureResourceManager.CreateSessionAsync(input))
                    {
                        //find the server matches with the given servername which should be only one
                        bool shouldFilter = !string.IsNullOrEmpty(serverName);
                        IEnumerable <IAzureSqlServerResource> sqlAzureServers = await AzureResourceManager.GetSqlServerAzureResourcesAsync(session);

                        IEnumerable <IAzureSqlServerResource> filteredServers = !shouldFilter ? sqlAzureServers : sqlAzureServers.Where(x =>
                                                                                                                                        x.FullyQualifiedDomainName != null &&
                                                                                                                                        x.FullyQualifiedDomainName.Equals(serverName,
                                                                                                                                                                          StringComparison.OrdinalIgnoreCase));

                        IList <IAzureSqlServerResource> filteredServersList = filteredServers.ToList();
                        result = await GetDatabasesForSubscriptionServersAsync(session, filteredServersList.ToList(), cancellationToken);

                        //Set response Found to true to notify the other tasks to cancel
                        if (shouldFilter && filteredServersList.Any())
                        {
                            result.Found = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                result = new ServiceResponse <DatabaseInstanceInfo>(ex);
            }

            return(result ?? new ServiceResponse <DatabaseInstanceInfo>());
        }
예제 #5
0
 public Task <IAzureResourceManagementSession> CreateSessionAsync(IAzureUserAccountSubscriptionContext subscriptionContext)
 {
     CommonUtil.CheckForNull(subscriptionContext, "subscriptionContext");
     try
     {
         ServiceClientCredentials credentials         = CreateCredentials(subscriptionContext);
         SqlManagementClient      sqlManagementClient = new SqlManagementClient(credentials)
         {
             SubscriptionId = subscriptionContext.Subscription.SubscriptionId
         };
         ResourceManagementClient resourceManagementClient = new ResourceManagementClient(credentials)
         {
             SubscriptionId = subscriptionContext.Subscription.SubscriptionId
         };
         return(Task.FromResult <IAzureResourceManagementSession>(new AzureResourceManagementSession(sqlManagementClient, resourceManagementClient, subscriptionContext)));
     }
     catch (Exception ex)
     {
         Logger.Write(LogLevel.Error, string.Format(CultureInfo.CurrentCulture, "Failed to get databases {0}", ex));
         throw;
     }
 }
예제 #6
0
        public Task <IAzureResourceManagementSession> CreateSessionAsync(IAzureUserAccountSubscriptionContext subscriptionContext)
        {
            CommonUtil.CheckForNull(subscriptionContext, "subscriptionContext");
            try
            {
                string armEndpoint = subscriptionContext.UserAccount.UnderlyingAccount.Properties.ProviderSettings?.Settings?.ArmResource?.Endpoint;
                Uri    armUri      = null;
                if (armEndpoint != null)
                {
                    try
                    {
                        armUri = new Uri(armEndpoint);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine($"Exception while parsing URI: {e.Message}");
                    }
                }
                ServiceClientCredentials credentials         = CreateCredentials(subscriptionContext);
                SqlManagementClient      sqlManagementClient = new SqlManagementClient(armUri ?? _resourceManagementUri, credentials)
                {
                    SubscriptionId = subscriptionContext.Subscription.SubscriptionId
                };

                ResourceManagementClient resourceManagementClient = new ResourceManagementClient(armUri ?? _resourceManagementUri, credentials)
                {
                    SubscriptionId = subscriptionContext.Subscription.SubscriptionId
                };
                return(Task.FromResult <IAzureResourceManagementSession>(new AzureResourceManagementSession(sqlManagementClient, resourceManagementClient, subscriptionContext)));
            }
            catch (Exception ex)
            {
                Logger.Write(TraceEventType.Error, string.Format(CultureInfo.CurrentCulture, "Failed to get databases {0}", ex));
                throw;
            }
        }
 /// <summary>
 ///
 /// </summary>
 public bool Equals(IAzureUserAccountSubscriptionContext other)
 {
     return(other != null &&
            CommonUtil.SameSubscriptionIdentifier(Subscription, other.Subscription) &&
            CommonUtil.SameUserAccount(UserAccount, other.UserAccount));
 }
예제 #8
0
        /// <summary>
        /// Returns a  list of Azure sql databases for given subscription
        /// </summary>
        private async Task <ServiceResponse <DatabaseInstanceInfo> > GetDatabaseForSubscriptionAsync(object notRequired,
                                                                                                     IAzureUserAccountSubscriptionContext input, string serverName,
                                                                                                     CancellationToken cancellationToken, CancellationToken internalCancellationToken)
        {
            ServiceResponse <DatabaseInstanceInfo> result = null;
            bool shouldFilter = !string.IsNullOrEmpty(serverName);

            try
            {
                string key = input.Subscription.SubscriptionId;

                //when the data was coming from cache and no async mthod was called the parallel tasks running crashed so I had to call this line async to fix it
                result = await GetFromCacheAsync(key);

                if (result == null)
                {
                    //this will only get the databases for the given server name
                    result = await GetDatabaseForSubscriptionFromServiceAsync(input, serverName, cancellationToken, internalCancellationToken);
                }
                else if (shouldFilter)
                {
                    //we should filter the result because the cached data includes databases for all servers
                    result = new ServiceResponse <DatabaseInstanceInfo>(result.Data.Where(x => x.ServerInstanceInfo.FullyQualifiedDomainName == serverName),
                                                                        result.Errors);
                }

                //only update the cache if server name is not passes so the result is not filtered. The cache data supposed to be the data for all server
                if (!shouldFilter && !cancellationToken.IsCancellationRequested)
                {
                    result = _cache.UpdateCache(key, result);
                }
            }
            catch (Exception ex)
            {
                result = new ServiceResponse <DatabaseInstanceInfo>(ex);
            }

            return(result);
        }
        /// <summary>
        /// Returns a  list of Azure sql databases for given subscription
        /// </summary>
        private async Task <ServiceResponse <FirewallRuleResource> > TryFindAzureResourceForSubscriptionAsync(object notRequired,
                                                                                                              IAzureUserAccountSubscriptionContext input, string serverName,
                                                                                                              CancellationToken cancellationToken, CancellationToken internalCancellationToken)
        {
            ServiceResponse <FirewallRuleResource> result = null;

            if (!cancellationToken.IsCancellationRequested)
            {
                using (IAzureResourceManagementSession session = await ResourceManager.CreateSessionAsync(input))
                {
                    IAzureSqlServerResource azureSqlServer = await FindAzureResourceForSubscriptionAsync(serverName, session);

                    if (azureSqlServer != null)
                    {
                        result = new ServiceResponse <FirewallRuleResource>(new FirewallRuleResource()
                        {
                            SubscriptionContext = input,
                            AzureResource       = azureSqlServer
                        }.SingleItemAsEnumerable());
                        result.Found = true;
                    }
                }
            }

            return(result ?? new ServiceResponse <FirewallRuleResource>());
        }