internal SqlAzureDatabase(
            SqlAzureServer server,
            string databaseName,
            SqlAzureDatabaseMaxSize maxSize)
        {
            if (server == null)
            {
                throw new ArgumentNullException("server");
            }

            if (string.IsNullOrEmpty(databaseName))
            {
                throw new ArgumentNullException("databaseName");
            }

            Name    = databaseName;
            Server  = server;
            MaxSize = maxSize;
        }
        internal SqlAzureDatabase(
            SqlAzureServer server,
            string databaseName, 
            SqlAzureDatabaseMaxSize maxSize)
        {
            if (server == null)
            {
                throw new ArgumentNullException("server");
            }

            if (string.IsNullOrEmpty(databaseName))
            {
                throw new ArgumentNullException("databaseName");
            }

            Name = databaseName;
            Server = server;
            MaxSize = maxSize;
        }
        /// <summary>
        ///     Create sql server
        /// </summary>
        /// <param name="user"></param>
        /// <param name="password"></param>
        /// <param name="location"></param>
        /// <param name="reuseExistingIfPossible"></param>
        /// <returns></returns>
        public SqlAzureServer CreateSqlServer(string user = AzureServiceConstants.SqlServerAdminLogin,
            string password = AzureServiceConstants.SqlServerAdminPassword,
            string location = null,
            bool reuseExistingIfPossible = true)
        {
            if(string.IsNullOrEmpty(location))
            {
                location = Dependencies.Subscription.DefaultLocation;
            }

            SqlAzureServer server = null;
            var ip = GetInterNetworkIp();
            var pip = GetPublicIP();

            if (reuseExistingIfPossible)
            {
                server = FindServerToReuse(user, password);
            }

            if (server == null)
            {
                TestEasyLog.Instance.Info(string.Format("Creating azure sql server with login '{0}'", user));

                var newServerName = SqlManagementClient.Servers.CreateAsync(new ServerCreateParameters
                {
                    AdministratorPassword = password,
                    AdministratorUserName = user,
                    Location = location,
                }, new CancellationToken()).Result.ServerName;

                server = new SqlAzureServer(newServerName, user, password);
            }
            Dependencies.TestResourcesCollector.Remember(AzureResourceType.SqlServer, server.Name, server);

            server.CreateFirewallRule("azureapps", "0.0.0.0", "0.0.0.0");
            server.CreateFirewallRule("workaround", "0.0.0.0", "255.255.255.255");
            server.CreateFirewallRule(Environment.MachineName + "_ip", ip, ip);
            server.CreateFirewallRule(Environment.MachineName + "_pip", pip, pip);


            return server;
        }
 internal SqlAzureDatabase(SqlAzureServer server, string databaseName)
     : this(server, databaseName, SqlAzureDatabaseMaxSize.Gb1)
 {
 }
        private SqlAzureServer FindServerToReuse(string user, string password)
        {
            SqlAzureServer server = null;

            try
            {
                var servers = GetSqlServersDetails();
                foreach (var s in servers)
                {
                    if (string.Compare(
                        s.AdministratorUserName, user,
                        StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        var tempServer = new SqlAzureServer(s.Name, user, password);
                        
                        if (!tempServer.CanHaveMoreDatabases) continue;

                        server = tempServer;
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                TestEasyLog.Instance.Warning(string.Format("Could not reuse SqlServers, there was an exception: '{0}'", e.Message));
            }

            return server;
        }
        /// <summary>
        ///     Create a database on sql server
        /// </summary>
        /// <param name="databaseName"></param>
        /// <param name="server"></param>
        /// <param name="maxSize"></param>
        /// <returns></returns>
        public SqlAzureDatabase CreateSqlDatabase(
            string databaseName,
            SqlAzureServer server,
            SqlAzureDatabaseMaxSize maxSize = SqlAzureDatabaseMaxSize.Gb1)
        {

            var existingDatabasesOnServer = SqlManagementClient.Databases.ListAsync(server.Name, new CancellationToken()).Result.Databases;
            
            if(existingDatabasesOnServer.Any(d => d.Name == databaseName))
            {
                SqlManagementClient.Databases.DeleteAsync(server.Name, databaseName, new CancellationToken()).Wait();
            }

            return server.CreateDatabase(databaseName, maxSize);
        }
 internal SqlAzureDatabase(SqlAzureServer server, string databaseName)
     : this(server, databaseName, SqlAzureDatabaseMaxSize.Gb1)
 {
 }