public static void CheckStorageAccountAccessibility()

in toolkit/Toolkit/SqlManagedInstanceToolkit.cs [182:262]


    public static void CheckStorageAccountAccessibility(SqlString storageAccount, SqlString sasToken, SqlBoolean executeWriteOperation)
    {
        List<string> result = new List<string>();

        Uri uri = null;
        try
        {
            uri = new Uri(storageAccount.Value);
        }
        catch (UriFormatException)
        {
            result.Add("URI is in the wrong format");
        }

        if (uri != null && uri.Port != 443)
        {
            result.Add("Only https is allowed");
        }

        if (uri != null)
        {
            string hostname = uri.Host;
            string ipAddress;
            result.AddRange(CheckFqdn(hostname, out ipAddress));
            result.AddRange(CheckIp(ipAddress, 443));

            if (executeWriteOperation.Value)
            {
                // Try writing to the file
                //
                string requestUri = string.Format("{0}/checktestblob_{1}_{2}?{3}", storageAccount.Value, DateTime.UtcNow.ToString("yyyyMMd_HHmmss"), Guid.NewGuid().ToString("N"), sasToken);
                HttpWebRequest request = HttpWebRequest.CreateHttp(requestUri);
                request.Method = "PUT";
                request.ContentType = "text/plain; charset=UTF-8";
                request.ContentLength = 0;
                request.Headers["x-ms-blob-type"] = "BlockBlob";
                request.Headers["x-ms-version"] = "2020-04-08";
                request.Headers["x-ms-date"] = DateTime.UtcNow.ToString();

                try
                {
                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        var encoding = string.IsNullOrEmpty(response.CharacterSet) ? Encoding.ASCII : Encoding.GetEncoding(response.CharacterSet);
                        using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
                        {
                            string responseBody = reader != null ? reader.ReadToEnd() : null;

                            result.Add(string.Format("Put request to account {0} returned {1}. Description: {2}; Response: {3};", storageAccount.Value, response.StatusCode, response.StatusDescription, responseBody));
                        }
                    }
                }
                catch (WebException wex)
                {
                    string returnedResponse = string.Empty;
                    HttpWebResponse response = (HttpWebResponse)wex.Response;

                    if (response != null)
                    {
                        var encoding = string.IsNullOrEmpty(response.CharacterSet) ? Encoding.ASCII : Encoding.GetEncoding(response.CharacterSet);

                        using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
                        {
                            returnedResponse = reader != null ? reader.ReadToEnd() : string.Empty;
                        }

                        response.Dispose();
                    }

                    result.Add(string.Format("Put request to account {0} throw an exception {1}. Http response: {2}.", storageAccount.Value, wex.Message, returnedResponse));
                }
            }
        }

        // Expose results.
        //
        foreach (var row in result)
        {
            SqlContext.Pipe.Send(row);
        }
    }