/// <summary>
        /// Creates firewall rule for given server name and IP address range. Throws exception if operation fails
        /// </summary>
        public async Task <FirewallRuleResponse> CreateFirewallRuleAsync(string serverName, IPAddress startIpAddress, IPAddress endIpAddress)
        {
            try
            {
                FirewallRuleResponse firewallRuleResponse = new FirewallRuleResponse()
                {
                    Created = false
                };
                CommonUtil.CheckStringForNullOrEmpty(serverName, "serverName");
                CommonUtil.CheckForNull(startIpAddress, "startIpAddress");
                CommonUtil.CheckForNull(endIpAddress, "endIpAddress");

                IAzureAuthenticationManager authenticationManager = AuthenticationManager;

                if (authenticationManager != null && !await authenticationManager.GetUserNeedsReauthenticationAsync())
                {
                    FirewallRuleResource firewallRuleResource = await FindAzureResourceAsync(serverName);

                    firewallRuleResponse = await CreateFirewallRule(firewallRuleResource, startIpAddress, endIpAddress);
                }
                if (firewallRuleResponse == null || !firewallRuleResponse.Created)
                {
                    throw new FirewallRuleException(SR.FirewallRuleCreationFailed);
                }
                return(firewallRuleResponse);
            }
            catch (ServiceExceptionBase)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new FirewallRuleException(string.Format(CultureInfo.CurrentCulture, SR.FirewallRuleCreationFailedWithError, ex.Message), ex);
            }
        }
        /// <summary>
        /// Creates firewall rule for given subscription and IP address range
        /// </summary>
        private async Task <FirewallRuleResponse> CreateFirewallRule(FirewallRuleResource firewallRuleResource, IPAddress startIpAddress, IPAddress endIpAddress)
        {
            CommonUtil.CheckForNull(firewallRuleResource, "firewallRuleResource");

            try
            {
                if (firewallRuleResource.IsValid)
                {
                    FirewallRuleRequest request = new FirewallRuleRequest()
                    {
                        StartIpAddress = startIpAddress,
                        EndIpAddress   = endIpAddress
                    };
                    using (IAzureResourceManagementSession session = await ResourceManager.CreateSessionAsync(firewallRuleResource.SubscriptionContext))
                    {
                        return(await ResourceManager.CreateFirewallRuleAsync(
                                   session,
                                   firewallRuleResource.AzureResource,
                                   request));
                    }
                }
            }
            catch (ServiceExceptionBase)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new FirewallRuleException(string.Format(CultureInfo.CurrentCulture, SR.FirewallRuleCreationFailedWithError, ex.Message), ex);
            }

            return(new FirewallRuleResponse()
            {
                Created = false
            });
        }