/// <summary>
        /// Creates a new export request
        /// </summary>
        /// <param name="exportRequest">Export request parameters</param>
        /// <returns>Operation response including the OperationStatusLink to get the operation status</returns>
        public AzureSqlDatabaseImportExportBaseModel Export(AzureSqlDatabaseImportExportBaseModel exportRequest)
        {
            ExportDatabaseDefinition parameters = new ExportDatabaseDefinition()
            {
                AdministratorLogin         = exportRequest.AdministratorLogin,
                AdministratorLoginPassword = AzureSqlServerAdapter.Decrypt(exportRequest.AdministratorLoginPassword),
                StorageKey     = exportRequest.StorageKey,
                StorageKeyType = exportRequest.StorageKeyType.ToString(),
                StorageUri     = exportRequest.StorageUri.ToString()
            };

            if (exportRequest.AuthenticationType != AuthenticationType.None)
            {
                parameters.AuthenticationType = exportRequest.AuthenticationType.ToString().ToLowerInvariant();
            }

            Uri azureAsyncOperation = null;
            ImportExportOperationResult response;

            response = Communicator.BeginExport(
                exportRequest.ResourceGroupName,
                exportRequest.ServerName,
                exportRequest.DatabaseName,
                parameters,
                out azureAsyncOperation);

            return(CreateImportExportResponse(response, exportRequest, azureAsyncOperation));
        }
        /// <summary>
        /// Creates a new export request
        /// </summary>
        /// <param name="exportRequest">Export request parameters</param>
        /// <returns>Operation response including the OperationStatusLink to get the operation status</returns>
        public AzureSqlDatabaseImportExportBaseModel Export(AzureSqlDatabaseImportExportBaseModel exportRequest)
        {
            ExportDatabaseDefinition parameters = new ExportDatabaseDefinition()
            {
                AdministratorLogin         = exportRequest.AdministratorLogin,
                AdministratorLoginPassword = AzureSqlServerAdapter.Decrypt(exportRequest.AdministratorLoginPassword),
                StorageKey       = exportRequest.StorageKey,
                StorageKeyType   = exportRequest.StorageKeyType.ToString(),
                StorageUri       = exportRequest.StorageUri.ToString(),
                NetworkIsolation = null
            };

            if (!string.IsNullOrEmpty(exportRequest.NetworkIsolationSettings.SqlServerResourceId) ||
                !string.IsNullOrEmpty(exportRequest.NetworkIsolationSettings.StorageAccountResourceId))
            {
                parameters.NetworkIsolation = new Management.Sql.Models.NetworkIsolationSettings()
                {
                    SqlServerResourceId      = exportRequest.NetworkIsolationSettings.SqlServerResourceId,
                    StorageAccountResourceId = exportRequest.NetworkIsolationSettings.StorageAccountResourceId
                };
            }

            if (exportRequest.AuthenticationType != AuthenticationType.None)
            {
                parameters.AuthenticationType = exportRequest.AuthenticationType.ToString().ToLowerInvariant();
            }

            Uri azureAsyncOperation = null;
            ImportExportOperationResult response;

            response = Communicator.BeginExport(
                exportRequest.ResourceGroupName,
                exportRequest.ServerName,
                exportRequest.DatabaseName,
                parameters,
                out azureAsyncOperation);

            return(CreateImportExportResponse(response, exportRequest, azureAsyncOperation));
        }
        public void TestImportExport(bool preexistingDatabase, string testName, bool useNetworkIsolation)
        {
            using (SqlManagementTestContext context = new SqlManagementTestContext(this, testName))
            {
                ResourceGroup       resourceGroup = context.CreateResourceGroup();
                Server              server        = context.CreateServer(resourceGroup);
                SqlManagementClient sqlClient     = context.GetClient <SqlManagementClient>();

                string storageAccountName = SqlManagementTestUtilities.GenerateName(prefix: "sqlcrudtest");

                // Begin creating storage account and container
                Task <StorageContainerInfo> storageContainerTask = CreateStorageContainer(context, resourceGroup, storageAccountName);

                string login    = SqlManagementTestUtilities.DefaultLogin;
                string password = SqlManagementTestUtilities.DefaultPassword;
                string dbName   = SqlManagementTestUtilities.GenerateName();
                string dbName2  = SqlManagementTestUtilities.GenerateName();

                Dictionary <string, string> tags = new Dictionary <string, string>()
                {
                    { "tagKey1", "TagValue1" }
                };

                // set server firewall rule
                sqlClient.FirewallRules.CreateOrUpdate(resourceGroup.Name, server.Name, SqlManagementTestUtilities.GenerateName(), new FirewallRule()
                {
                    StartIpAddress = "0.0.0.0",
                    EndIpAddress   = "255.255.255.255"
                });

                // Create 1 or 2 databases
                sqlClient.Databases.CreateOrUpdate(resourceGroup.Name, server.Name, dbName, new Database()
                {
                    Location = server.Location
                });

                if (preexistingDatabase)
                {
                    sqlClient.Databases.CreateOrUpdate(resourceGroup.Name, server.Name, dbName2, new Database()
                    {
                        Location = server.Location
                    });

                    // Verify existence of new database
                    Assert.NotNull(sqlClient.Databases.Get(resourceGroup.Name, server.Name, dbName2));
                }

                // Get Storage container credentials
                StorageContainerInfo storageContainerInfo = storageContainerTask.Result;
                string exportBacpacLink = string.Format(
                    CultureInfo.InvariantCulture,
                    "{0}/{1}.bacpac",
                    storageContainerInfo.StorageContainerUri, dbName);

                string sqlServerResourceId      = $"/subscriptions/{sqlClient.SubscriptionId}/resourceGroups/{resourceGroup.Name}/providers/Microsoft.Sql/servers/{server.Name}";
                string storageAccountResourceId = $"/subscriptions/{sqlClient.SubscriptionId}/resourcegroups/{resourceGroup.Name}/providers/Microsoft.Storage/storageAccounts/{storageAccountName}";

                var exportDatabaseDefinition = new ExportDatabaseDefinition()
                {
                    AdministratorLogin         = login,
                    AdministratorLoginPassword = password,
                    AuthenticationType         = "SQL",
                    StorageKey     = storageContainerInfo.StorageAccountKey,
                    StorageKeyType = StorageKeyType.StorageAccessKey.ToString(),
                    StorageUri     = exportBacpacLink
                };

                if (useNetworkIsolation)
                {
                    exportDatabaseDefinition.NetworkIsolation = new NetworkIsolationSettings()
                    {
                        SqlServerResourceId      = sqlServerResourceId,
                        StorageAccountResourceId = storageAccountResourceId
                    };
                }

                // Export database to bacpac
                sqlClient.Databases.Export(resourceGroup.Name, server.Name, dbName, exportDatabaseDefinition);

                // Import bacpac to new/existing database
                if (preexistingDatabase)
                {
                    var importDatabaseDefinition = new ImportExistingDatabaseDefinition()
                    {
                        AdministratorLogin         = login,
                        AdministratorLoginPassword = password,
                        AuthenticationType         = "SQL",
                        StorageKey     = storageContainerInfo.StorageAccountKey,
                        StorageKeyType = StorageKeyType.StorageAccessKey.ToString(),
                        StorageUri     = exportBacpacLink
                    };

                    if (useNetworkIsolation)
                    {
                        importDatabaseDefinition.NetworkIsolation = new NetworkIsolationSettings()
                        {
                            SqlServerResourceId      = sqlServerResourceId,
                            StorageAccountResourceId = storageAccountResourceId
                        };
                    }

                    // Import bacpac to existing database
                    sqlClient.Databases.ImportWithHttpMessagesAsync(resourceGroup.Name, server.Name, dbName2, importDatabaseDefinition).Wait();
                }
                else
                {
                    var importDatabaseDefinition = new ImportNewDatabaseDefinition()
                    {
                        AdministratorLogin         = login,
                        AdministratorLoginPassword = password,
                        AuthenticationType         = "SQL",
                        StorageKey           = storageContainerInfo.StorageAccountKey,
                        StorageKeyType       = StorageKeyType.StorageAccessKey.ToString(),
                        StorageUri           = exportBacpacLink,
                        DatabaseName         = dbName2,
                        Edition              = SqlTestConstants.DefaultDatabaseEdition,
                        ServiceObjectiveName = ServiceObjectiveName.Basic,
                        MaxSizeBytes         = (2 * 1024L * 1024L * 1024L).ToString(),
                    };

                    if (useNetworkIsolation)
                    {
                        importDatabaseDefinition.NetworkIsolation = new NetworkIsolationSettings()
                        {
                            SqlServerResourceId      = sqlServerResourceId,
                            StorageAccountResourceId = storageAccountResourceId
                        };
                    }

                    sqlClient.Servers.ImportDatabase(resourceGroup.Name, server.Name, importDatabaseDefinition);
                }
            }
        }
        /// <summary>
        /// Creates new export request
        /// </summary>
        public ImportExportOperationResult BeginExport(string resourceGroupName, string serverName, string databaseName, ExportDatabaseDefinition parameters, out Uri operationStatusLink)
        {
            LastLocationHeader = null;
            LocationHeaderResetEvent.Reset();
            ImportExportOperationResult result = GetCurrentSqlClient().Databases.BeginExport(resourceGroupName, serverName, databaseName, parameters);

            LocationHeaderResetEvent.WaitOne(3000);
            operationStatusLink = LastLocationHeader;
            return(result);
        }