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