public async Task <List <AzureSubscription> > GetSubscriptions()
        {
            if (_AzureSubscriptions != null)
            {
                return(_AzureSubscriptions);
            }

            String subscriptionsUrl = _AzureContext.AzureServiceUrls.GetASMServiceManagementUrl() + "subscriptions";

            _AzureContext.StatusProvider.UpdateStatus("BUSY: Getting Subscriptions...");

            AzureRestRequest azureRestRequest = new AzureRestRequest(subscriptionsUrl, _AzureContext.TokenProvider.AccessToken);

            azureRestRequest.Headers.Add("x-ms-version", "2015-04-01");
            AzureRestResponse azureRestResponse = await _AzureContext.AzureRetriever.GetAzureRestResponse(azureRestRequest);

            XmlDocument subscriptionsXml = AzureSubscription.RemoveXmlns(azureRestResponse.Response);

            _AzureSubscriptions = new List <AzureSubscription>();
            foreach (XmlNode subscriptionXml in subscriptionsXml.SelectNodes("//Subscription"))
            {
                AzureSubscription azureSubscription = new AzureSubscription(_AzureContext, subscriptionXml, this._AzureContext.AzureEnvironment);
                _AzureSubscriptions.Add(azureSubscription);
            }

            return(_AzureSubscriptions);
        }
        public async Task <List <AzureSubscription> > GetAzureARMSubscriptions()
        {
            _AzureContext.LogProvider.WriteLog("GetAzureARMSubscriptions", "Start");

            if (_ArmSubscriptions != null)
            {
                return(_ArmSubscriptions);
            }

            String subscriptionsUrl = _AzureContext.AzureServiceUrls.GetARMServiceManagementUrl() + "subscriptions?api-version=2015-01-01";
            String accessToken      = _AzureContext.TokenProvider.AccessToken;

            _AzureContext.StatusProvider.UpdateStatus("BUSY: Getting Subscriptions...");

            AzureRestRequest  azureRestRequest  = new AzureRestRequest(subscriptionsUrl, accessToken, "GET", true);
            AzureRestResponse azureRestResponse = await _AzureContext.AzureRetriever.GetAzureRestResponse(azureRestRequest);

            JObject subscriptionsJson = JObject.Parse(azureRestResponse.Response);

            var subscriptions = from subscription in subscriptionsJson["value"]
                                select subscription;

            _ArmSubscriptions = new List <AzureSubscription>();

            foreach (JObject azureSubscriptionJson in subscriptions)
            {
                AzureSubscription azureSubscription = new AzureSubscription(_AzureContext, azureSubscriptionJson, null, _AzureContext.AzureEnvironment);
                _ArmSubscriptions.Add(azureSubscription);
            }

            return(_ArmSubscriptions);
        }
        public async Task <List <AzureSubscription> > GetAzureARMSubscriptions(AzureTenant azureTenant)
        {
            _AzureContext.LogProvider.WriteLog("GetAzureARMSubscriptions", "Start - azureTenant: " + azureTenant.ToString());

            String subscriptionsUrl = _AzureContext.AzureServiceUrls.GetARMServiceManagementUrl() + "subscriptions?api-version=2015-01-01";
            String accessToken      = _AzureContext.TokenProvider.AccessToken;

            AuthenticationResult subscriptionAuthenticationResult = await _AzureContext.TokenProvider.GetAzureToken(azureTenant.TenantId.ToString());

            if (subscriptionAuthenticationResult != null)
            {
                accessToken = subscriptionAuthenticationResult.AccessToken;
            }

            _AzureContext.StatusProvider.UpdateStatus("BUSY: Getting Subscriptions...");

            AzureRestRequest  azureRestRequest  = new AzureRestRequest(subscriptionsUrl, accessToken, "GET", false);
            AzureRestResponse azureRestResponse = await _AzureContext.AzureRetriever.GetAzureRestResponse(azureRestRequest);

            JObject subscriptionsJson = JObject.Parse(azureRestResponse.Response);

            var subscriptions = from subscription in subscriptionsJson["value"]
                                select subscription;

            List <AzureSubscription> tenantSubscriptions = new List <AzureSubscription>();

            foreach (JObject azureSubscriptionJson in subscriptions)
            {
                AzureSubscription azureSubscription = new AzureSubscription(_AzureContext, azureSubscriptionJson, azureTenant, _AzureContext.AzureEnvironment);
                tenantSubscriptions.Add(azureSubscription);
            }

            return(tenantSubscriptions);
        }
Exemple #4
0
        /// <summary>
        /// Get Azure Subscriptions within the provided Azure Tenant
        /// </summary>
        /// <param name="azureTenant">Azure Tenant for which Azure Subscriptions should be retrieved</param>
        /// <param name="allowRestCacheUse">False in production use so that Azure Token Content is Tenant specific.  True in Unit Tests to allow offline (no actual URL querying).</param>
        /// <returns></returns>
        public async Task <List <AzureSubscription> > GetAzureARMSubscriptions(AzureContext azureContext, bool allowRestCacheUse = false)
        {
            azureContext.LogProvider.WriteLog("GetAzureARMSubscriptions", "Start - azureTenant: " + this.ToString());

            azureContext.StatusProvider.UpdateStatus("BUSY: Getting Auth Token to Query Subscriptions");

            String subscriptionsUrl = azureContext.AzureEnvironment.ResourceManagerEndpoint + "subscriptions?api-version=2015-01-01";
            AuthenticationResult authenticationResult = await azureContext.TokenProvider.GetToken(azureContext.AzureEnvironment.ResourceManagerEndpoint, this.TenantId);

            azureContext.StatusProvider.UpdateStatus("BUSY: Querying Subscriptions");

            AzureRestRequest  azureRestRequest  = new AzureRestRequest(subscriptionsUrl, authenticationResult, "GET", allowRestCacheUse);
            AzureRestResponse azureRestResponse = await azureContext.AzureRetriever.GetAzureRestResponse(azureRestRequest);

            JObject subscriptionsJson = JObject.Parse(azureRestResponse.Response);

            var subscriptions = from subscription in subscriptionsJson["value"]
                                select subscription;

            azureContext.StatusProvider.UpdateStatus("BUSY: Instantiating Subscriptions");

            List <AzureSubscription> azureSubscriptions = new List <AzureSubscription>();

            foreach (JObject azureSubscriptionJson in subscriptions)
            {
                AzureSubscription azureSubscription = new AzureSubscription(azureSubscriptionJson, this, azureContext.AzureEnvironment, azureContext.GetARMServiceManagementUrl(), azureContext.GetARMTokenResourceUrl());
                azureSubscriptions.Add(azureSubscription);

                azureContext.StatusProvider.UpdateStatus("BUSY: Loaded Subscription " + azureSubscription.ToString());
            }

            azureContext.StatusProvider.UpdateStatus("BUSY: Getting Subscriptions Completed");

            return(azureSubscriptions);
        }
Exemple #5
0
        public async Task <List <AzureDomain> > GetAzureARMDomains(AzureContext azureContext, bool allowRestCacheUse = false)
        {
            try
            {
                azureContext.LogProvider.WriteLog("GetAzureARMDomains", "Start");

                if (this == null)
                {
                    throw new ArgumentNullException("AzureContext is null.  Unable to call Azure API without Azure Context.");
                }
                if (azureContext.TokenProvider == null)
                {
                    throw new ArgumentNullException("TokenProvider Context is null.  Unable to call Azure API without TokenProvider.");
                }

                String domainUrl = azureContext.AzureEnvironment.GraphEndpoint + "myorganization/domains?api-version=1.6";

                AuthenticationResult tenantAuthenticationResult = await azureContext.TokenProvider.GetToken(azureContext.AzureEnvironment.GraphEndpoint, this.TenantId, PromptBehavior.Never);

                azureContext.StatusProvider.UpdateStatus("BUSY: Getting Tenant Domain details from Graph...");

                AzureRestRequest  azureRestRequest  = new AzureRestRequest(domainUrl, tenantAuthenticationResult, "GET", allowRestCacheUse);
                AzureRestResponse azureRestResponse = await azureContext.AzureRetriever.GetAzureRestResponse(azureRestRequest);

                JObject domainsJson = JObject.Parse(azureRestResponse.Response);

                var domains = from domain in domainsJson["value"]
                              select domain;

                _Domains = new List <AzureDomain>();

                foreach (JObject domainJson in domains)
                {
                    try
                    {
                        AzureDomain azureDomain = new AzureDomain(this, domainJson);
                        _Domains.Add(azureDomain);
                    }
                    catch (Exception exc)
                    {
                        azureContext.LogProvider.WriteLog("GetAzureARMDomains", "Error getting Azure AD Domain:" + exc.Message);
                    }
                }
            }
            catch (Exception exc)
            {
                azureContext.LogProvider.WriteLog("GetAzureARMDomains", "Error getting Azure Subscriptions:" + exc.Message);
            }

            return(_Domains);
        }
        public async Task <List <AzureDomain> > GetAzureARMDomains(AzureTenant azureTenant)
        {
            _AzureContext.LogProvider.WriteLog("GetAzureARMDomains", "Start");

            if (_AzureContext == null)
            {
                throw new ArgumentNullException("AzureContext is null.  Unable to call Azure API without Azure Context.");
            }
            if (_AzureContext.TokenProvider == null)
            {
                throw new ArgumentNullException("TokenProvider Context is null.  Unable to call Azure API without TokenProvider.");
            }
            if (_AzureContext.TokenProvider.AccessToken == null)
            {
                throw new ArgumentNullException("AccessToken Context is null.  Unable to call Azure API without AccessToken.");
            }

            String accessToken = _AzureContext.TokenProvider.AccessToken;

            String domainUrl = _AzureContext.AzureServiceUrls.GetGraphApiUrl() + "myorganization/domains?api-version=1.6";

            AuthenticationResult tenantAuthenticationResult = await _AzureContext.TokenProvider.GetGraphToken(azureTenant.TenantId.ToString());

            if (tenantAuthenticationResult != null)
            {
                accessToken = tenantAuthenticationResult.AccessToken;
            }

            _AzureContext.StatusProvider.UpdateStatus("BUSY: Getting Tenant Domain details from Graph...");

            AzureRestRequest  azureRestRequest  = new AzureRestRequest(domainUrl, accessToken, "GET", false);
            AzureRestResponse azureRestResponse = await _AzureContext.AzureRetriever.GetAzureRestResponse(azureRestRequest);

            JObject domainsJson = JObject.Parse(azureRestResponse.Response);

            var domains = from domain in domainsJson["value"]
                          select domain;

            List <AzureDomain> armTenantDomains = new List <AzureDomain>();

            foreach (JObject domainJson in domains)
            {
                AzureDomain azureDomain = new AzureDomain(domainJson, _AzureContext);
                armTenantDomains.Add(azureDomain);
            }

            return(armTenantDomains);
        }
Exemple #7
0
        public async Task <List <AzureTenant> > GetAzureARMTenants(bool allowRestCacheUse = false)
        {
            this.LogProvider.WriteLog("GetAzureARMTenants", "Start");

            if (_ArmTenants != null)
            {
                return(_ArmTenants);
            }

            if (this.TokenProvider == null)
            {
                throw new ArgumentNullException("TokenProvider Context is null.  Unable to call Azure API without TokenProvider.");
            }

            AuthenticationResult tenantAuthenticationResult = await this.TokenProvider.GetToken(this.AzureEnvironment.ResourceManagerEndpoint, Guid.Empty);

            String tenantUrl = this.AzureEnvironment.ResourceManagerEndpoint + "tenants?api-version=2015-01-01";

            this.StatusProvider.UpdateStatus("BUSY: Getting Tenants...");

            AzureRestRequest  azureRestRequest  = new AzureRestRequest(tenantUrl, tenantAuthenticationResult, "GET", allowRestCacheUse);
            AzureRestResponse azureRestResponse = await this.AzureRetriever.GetAzureRestResponse(azureRestRequest);

            JObject tenantsJson = JObject.Parse(azureRestResponse.Response);

            var tenants = from tenant in tenantsJson["value"]
                          select tenant;

            _ArmTenants = new List <AzureTenant>();

            foreach (JObject tenantJson in tenants)
            {
                try
                {
                    AzureTenant azureTenant = new AzureTenant(this, tenantJson);
                    await azureTenant.InitializeChildren(this, allowRestCacheUse);

                    _ArmTenants.Add(azureTenant);
                }
                catch (Exception exc)
                {
                    this.LogProvider.WriteLog("GetAzureARMTenants", "Error getting Azure Tenant: '" + exc.Message);
                }
            }

            return(_ArmTenants);
        }
        public async Task <List <AzureTenant> > GetAzureARMTenants()
        {
            _AzureContext.LogProvider.WriteLog("GetAzureARMTenants", "Start");

            if (_ArmTenants != null)
            {
                return(_ArmTenants);
            }

            if (_AzureContext == null)
            {
                throw new ArgumentNullException("AzureContext is null.  Unable to call Azure API without Azure Context.");
            }
            if (_AzureContext.TokenProvider == null)
            {
                throw new ArgumentNullException("TokenProvider Context is null.  Unable to call Azure API without TokenProvider.");
            }
            if (_AzureContext.TokenProvider.AccessToken == null)
            {
                throw new ArgumentNullException("AccessToken Context is null.  Unable to call Azure API without AccessToken.");
            }

            String tenantUrl = _AzureContext.AzureServiceUrls.GetARMServiceManagementUrl() + "tenants?api-version=2015-01-01";

            _AzureContext.StatusProvider.UpdateStatus("BUSY: Getting Tenants...");

            AzureRestRequest  azureRestRequest  = new AzureRestRequest(tenantUrl, _AzureContext.TokenProvider.AccessToken, "GET", true);
            AzureRestResponse azureRestResponse = await _AzureContext.AzureRetriever.GetAzureRestResponse(azureRestRequest);

            JObject tenantsJson = JObject.Parse(azureRestResponse.Response);

            var tenants = from tenant in tenantsJson["value"]
                          select tenant;

            _ArmTenants = new List <AzureTenant>();

            foreach (JObject tenantJson in tenants)
            {
                AzureTenant azureTenant = new AzureTenant(tenantJson, _AzureContext);
                await azureTenant.InitializeChildren();

                _ArmTenants.Add(azureTenant);
            }

            return(_ArmTenants);
        }
Exemple #9
0
        public async Task <AzureRestResponse> GetAzureRestResponse(AzureRestRequest azureRestRequest)
        {
            _LogProvider.WriteLog("GetAzureRestResponse", azureRestRequest.RequestGuid.ToString() + " Url: " + azureRestRequest.Url);

            if (azureRestRequest.UseCached && _RestApiCache.ContainsKey(azureRestRequest.Url))
            {
                _LogProvider.WriteLog("GetAzureRestResponse", azureRestRequest.RequestGuid.ToString() + " Using Cached Response");
                _LogProvider.WriteLog("GetAzureRestResponse", azureRestRequest.RequestGuid.ToString() + " End REST Request");
                AzureRestResponse cachedRestResponse = (AzureRestResponse)_RestApiCache[azureRestRequest.Url];
                return(cachedRestResponse);
            }

            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(azureRestRequest.Url);

            request.Method = azureRestRequest.Method;

            if (azureRestRequest.AccessToken != String.Empty)
            {
                string authorizationHeader = "Bearer " + azureRestRequest.AccessToken;
                request.Headers.Add(HttpRequestHeader.Authorization, authorizationHeader);
                writeRetreiverResultToLog(azureRestRequest.RequestGuid, "GetAzureRestResponse", azureRestRequest.Url, authorizationHeader);
            }

            if (request.Method == "POST")
            {
                request.ContentLength = 0;
            }

            foreach (String headerKey in azureRestRequest.Headers.Keys)
            {
                request.Headers.Add(headerKey, azureRestRequest.Headers[headerKey]);
            }

            string webRequesetResult = String.Empty;

            try
            {
                _LogProvider.WriteLog("GetAzureRestResponse", azureRestRequest.RequestGuid.ToString() + " " + azureRestRequest.Method + " " + azureRestRequest.Url);

                // Retry Guidlines for 500 series with Backoff Timer - https://msdn.microsoft.com/en-us/library/azure/jj878112.aspx  https://msdn.microsoft.com/en-us/library/azure/gg185909.aspx
                HttpWebResponse response             = null;
                const Int32     maxRetrySecond       = 32;
                Int32           retrySeconds         = 1;
                bool            boolRetryGetResponse = true;
                while (boolRetryGetResponse)
                {
                    try
                    {
                        response = (HttpWebResponse)await request.GetResponseAsync();

                        boolRetryGetResponse = false;
                    }
                    catch (WebException webException)
                    {
                        _LogProvider.WriteLog("GetAzureRestResponse", azureRestRequest.RequestGuid.ToString() + " EXCEPTION " + webException.Message);

                        HttpWebResponse exceptionResponse = (HttpWebResponse)webException.Response;

                        if (exceptionResponse != null)
                        {
                            _LogProvider.WriteLog("GetAzureRestResponse", azureRestRequest.RequestGuid.ToString() + " EXCEPTION HttpWebResponse Status Code: " + exceptionResponse.StatusCode);

                            if (
                                (int)exceptionResponse.StatusCode == 429 || // 429 Too Many Requests
                                ((int)exceptionResponse.StatusCode >= 500 && (int)exceptionResponse.StatusCode <= 599)
                                )
                            {
                                DateTime sleepUntil   = DateTime.Now.AddSeconds(retrySeconds);
                                string   sleepMessage = "Sleeping for " + retrySeconds.ToString() + " second(s) (until " + sleepUntil.ToString() + ") before web request retry.";

                                _LogProvider.WriteLog("GetAzureRestResponse", azureRestRequest.RequestGuid.ToString() + " " + sleepMessage);
                                _StatusProvider.UpdateStatus(sleepMessage);
                                while (DateTime.Now < sleepUntil)
                                {
                                    Application.DoEvents();
                                }
                                retrySeconds = retrySeconds * 2;

                                if (retrySeconds > maxRetrySecond)
                                {
                                    _LogProvider.WriteLog("GetAzureRestResponse", azureRestRequest.RequestGuid.ToString() + " Too many retry.");
                                    _StatusProvider.UpdateStatus("Too many retry.");
                                    throw webException;
                                    // too many retry -> throw exception
                                }

                                _LogProvider.WriteLog("GetAzureRestResponse", azureRestRequest.RequestGuid.ToString() + " Initiating retry of Web Request.");
                                _StatusProvider.UpdateStatus("Initiating retry of Web Request.");
                            }
                            else if (exceptionResponse.StatusCode == HttpStatusCode.Conflict)
                            {
                                boolRetryGetResponse = false;
                            }
                            else
                            {
                                throw webException;
                            }
                        }
                        else
                        {
                            throw webException;
                        }
                    }
                    catch (Exception exc)
                    {
                        // todo?
                    }
                }

                if (response != null)
                {
                    _LogProvider.WriteLog("GetAzureRestResponse", azureRestRequest.RequestGuid.ToString() + "  Status Code " + response.StatusCode);

                    webRequesetResult = new StreamReader(response.GetResponseStream()).ReadToEnd();
                    writeRetreiverResultToLog(azureRestRequest.RequestGuid, "GetAzureRestResponse", azureRestRequest.Url, webRequesetResult);
                }
            }
            catch (Exception exception)
            {
                _LogProvider.WriteLog("GetAzureRestResponse", azureRestRequest.RequestGuid.ToString() + azureRestRequest.Url + "  EXCEPTION " + exception.Message);
                throw exception;
            }

            _LogProvider.WriteLog("GetAzureRestResponse", azureRestRequest.RequestGuid.ToString() + " End REST Request");

            AzureRestResponse azureRestResponse = new AzureRestResponse(azureRestRequest, webRequesetResult);

            if (!_RestApiCache.ContainsKey(azureRestRequest.Url))
            {
                _RestApiCache.Add(azureRestRequest.Url, azureRestResponse);
            }

            OnRestResult?.Invoke(azureRestResponse);

            return(azureRestResponse);
        }