/// <summary>
        /// Creates the response model given server response
        /// </summary>
        /// <param name="response">Server Response</param>
        /// <returns>Response Model</returns>
        private AzureSqlDatabaseImportExportBaseModel CreateImportExportResponse(ImportExportResponse response, AzureSqlDatabaseImportExportBaseModel originalModel)
        {
            AzureSqlDatabaseImportExportBaseModel model = originalModel == null ? new AzureSqlDatabaseImportExportBaseModel() : originalModel.Copy();

            model.OperationStatusLink = response.OperationStatusLink;
            model.Status       = response.Status.ToString();
            model.ErrorMessage = response.Error == null ? "" : response.Error.Message;
            return(model);
        }
        /// <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)
        {
            ExportRequestParameters parameters = new ExportRequestParameters()
            {
                AdministratorLogin         = exportRequest.AdministratorLogin,
                AdministratorLoginPassword = AzureSqlServerAdapter.Decrypt(exportRequest.AdministratorLoginPassword),
                StorageKey     = exportRequest.StorageKey,
                StorageKeyType = exportRequest.StorageKeyType.ToString(),
                StorageUri     = exportRequest.StorageUri
            };

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

            ImportExportResponse response = Communicator.Export(exportRequest.ResourceGroupName, exportRequest.ServerName,
                                                                exportRequest.DatabaseName, parameters, Util.GenerateTracingId());

            return(CreateImportExportResponse(response, exportRequest));
        }
        /// <summary>
        /// Creates a new import request
        /// </summary>
        /// <param name="importRequest">Import request parameters</param>
        /// <returns>Operation response including the OperationStatusLink to get the operation status</returns>
        public AzureSqlDatabaseImportExportBaseModel Import(AzureSqlDatabaseImportModel importRequest)
        {
            ImportRequestParameters parameters = new ImportRequestParameters()
            {
                AdministratorLogin         = importRequest.AdministratorLogin,
                AdministratorLoginPassword = AzureSqlServerAdapter.Decrypt(importRequest.AdministratorLoginPassword),
                StorageKey           = importRequest.StorageKey,
                StorageKeyType       = importRequest.StorageKeyType.ToString(),
                StorageUri           = importRequest.StorageUri,
                DatabaseMaxSize      = importRequest.DatabaseMaxSizeBytes,
                Edition              = importRequest.Edition != Database.Model.DatabaseEdition.None ? importRequest.Edition.ToString() : string.Empty,
                ServiceObjectiveName = importRequest.ServiceObjectiveName,
                DatabaseName         = importRequest.DatabaseName
            };

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

            ImportExportResponse response = Communicator.Import(importRequest.ResourceGroupName, importRequest.ServerName, parameters, Util.GenerateTracingId());

            return(CreateImportExportResponse(response, importRequest));
        }
Example #4
0
        private void ValidateImportExport(bool createServer    = true, bool createDatabase    = true, bool createFirewallRule = true,
                                          string operationName = "Export", bool missingFields = false, HttpStatusCode expectedStatueCode = HttpStatusCode.Accepted)
        {
            var handler = new BasicDelegatingHandler();

            // Management Clients
            var sqlClient = Sql2ScenarioHelper.GetSqlClient(handler);
            var resClient = Sql2ScenarioHelper.GetResourceClient(handler);

            // Variables for server create
            string serverName     = TestUtilities.GenerateName("csm-sql-ie");
            string resGroupName   = TestUtilities.GenerateName("csm-rg-servercrud");
            string serverLocation = "North Europe";
            string adminLogin     = "******";
            string adminPass      = "******";
            string version        = "12.0";

            // Variables for database create
            string databaseName         = TestUtilities.GenerateName("csm-sql-db_ie");
            string databaseEdition      = "Standard";
            long   databaseMaxSize      = 5L * 1024L * 1024L * 1024L;                       // 5 GB
            Guid   dbSloS1              = new Guid("1b1ebd4d-d903-4baa-97f9-4ea675f5e928"); // S1
            string serviceObjectiveName = "S1";

            // Create firewall test.
            string firewallRuleName = TestUtilities.GenerateName("sql-fwrule");
            string startIp1         = "0.0.0.0";
            string endIp1           = "255.255.255.255";

            string storageKey       = "StorageKey";
            string storageKeyType   = "StorageAccessKey";
            string exportBacpacLink = string.Format(CultureInfo.InvariantCulture, "http://test.blob.core.windows.net/databases/{0}.bacpac", databaseName);
            string importBacpacLink = "http://test.blob.core.windows.net/databases/test.bacpac";

            string testMode = Environment.GetEnvironmentVariable("AZURE_TEST_MODE");

            if (testMode == "Record")
            {
                string importBacpacBaseUrl = Environment.GetEnvironmentVariable("TEST_EXPORT_BACPAC");
                storageKey       = Environment.GetEnvironmentVariable("TEST_STORAGE_KEY");
                exportBacpacLink = string.Format(CultureInfo.InvariantCulture, "{0}/{1}.bacpac", importBacpacBaseUrl, databaseName);
                importBacpacLink = Environment.GetEnvironmentVariable("TEST_IMPORT_BACPAC");

                Assert.False(string.IsNullOrWhiteSpace(storageKey), "Environment variable TEST_EXPORT_BACPAC has not been set");
                Assert.False(string.IsNullOrWhiteSpace(importBacpacBaseUrl), "Environment variable TEST_EXPORT_BACPAC has not been set");
                Assert.False(string.IsNullOrWhiteSpace(importBacpacLink), "Environment variable TEST_IMPORT_BACPAC has not been set");
            }

            // Create the resource group.
            resClient.ResourceGroups.CreateOrUpdate(resGroupName, new ResourceGroup()
            {
                Location = serverLocation,
            });

            try
            {
                //////////////////////////////////////////////////////////////////////
                // Create server
                if (createServer)
                {
                    var createResponse = sqlClient.Servers.CreateOrUpdate(resGroupName, serverName, new ServerCreateOrUpdateParameters()
                    {
                        Location   = serverLocation,
                        Properties = new ServerCreateOrUpdateProperties()
                        {
                            AdministratorLogin         = adminLogin,
                            AdministratorLoginPassword = adminPass,
                            Version = version,
                        }
                    });
                    TestUtilities.ValidateOperationResponse(createResponse, HttpStatusCode.Created);
                }
                //////////////////////////////////////////////////////////////////////
                // Create database
                if (createServer && createDatabase)
                {
                    var createDbResponse = sqlClient.Databases.CreateOrUpdate(resGroupName, serverName, databaseName, new DatabaseCreateOrUpdateParameters()
                    {
                        Location   = serverLocation,
                        Properties = new DatabaseCreateOrUpdateProperties()
                        {
                            Edition      = databaseEdition,
                            MaxSizeBytes = databaseMaxSize,
                            RequestedServiceObjectiveId = dbSloS1
                        },
                    });

                    TestUtilities.ValidateOperationResponse(createDbResponse, HttpStatusCode.Created);
                }
                //////////////////////////////////////////////////////////////////////
                // Create firewall rule
                if (createServer && createFirewallRule)
                {
                    var firewallCreate = sqlClient.FirewallRules.CreateOrUpdate(resGroupName, serverName, firewallRuleName, new FirewallRuleCreateOrUpdateParameters()
                    {
                        Properties = new FirewallRuleCreateOrUpdateProperties()
                        {
                            StartIpAddress = startIp1,
                            EndIpAddress   = endIp1,
                        }
                    });
                    TestUtilities.ValidateOperationResponse(firewallCreate, HttpStatusCode.Created);
                }
                //////////////////////////////////////////////////////////////////////
                //Import Export
                try
                {
                    ImportExportResponse importExportResponse = null;
                    if (operationName == ExportOperationName)
                    {
                        ExportRequestParameters parameters = new ExportRequestParameters()
                        {
                            AdministratorLogin         = adminLogin,
                            AdministratorLoginPassword = adminPass
                        };
                        if (!missingFields)
                        {
                            parameters.StorageKey     = storageKey;
                            parameters.StorageKeyType = storageKeyType;
                            parameters.StorageUri     = new Uri(exportBacpacLink);
                        }

                        importExportResponse = sqlClient.ImportExport.Export(resGroupName, serverName, databaseName, parameters);
                    }
                    else if (operationName == ImportOperationName)
                    {
                        ImportRequestParameters parameters = new ImportRequestParameters()
                        {
                            AdministratorLogin         = adminLogin,
                            AdministratorLoginPassword = adminPass,
                            StorageKey     = storageKey,
                            StorageKeyType = storageKeyType,
                            StorageUri     = new Uri(importBacpacLink),
                            DatabaseName   = databaseName
                        };

                        if (!missingFields)
                        {
                            parameters.DatabaseMaxSize      = databaseMaxSize;
                            parameters.Edition              = databaseEdition;
                            parameters.ServiceObjectiveName = serviceObjectiveName;
                        }

                        importExportResponse = sqlClient.ImportExport.Import(resGroupName, serverName, parameters);
                    }
                    else if (operationName == ImportExistingDbOperationName)
                    {
                        ImportExtensionRequestParameteres parameters = new ImportExtensionRequestParameteres()
                        {
                            Properties = new ImportExtensionProperties
                            {
                                AdministratorLogin         = adminLogin,
                                AdministratorLoginPassword = adminPass,
                                StorageKey     = storageKey,
                                StorageKeyType = storageKeyType,
                                StorageUri     = new Uri(importBacpacLink)
                            }
                        };

                        importExportResponse = sqlClient.ImportExport.ImportToExistingDatabase(resGroupName, serverName, databaseName, parameters);
                    }

                    if (expectedStatueCode == HttpStatusCode.Accepted)
                    {
                        Assert.Equal(importExportResponse.Status, OperationStatus.InProgress);
                        ImportExportOperationStatusResponse statusResponse = sqlClient.ImportExport.GetImportExportOperationStatus(importExportResponse.OperationStatusLink);
                        while (statusResponse.Status == Microsoft.Azure.OperationStatus.InProgress)
                        {
                            statusResponse = sqlClient.ImportExport.GetImportExportOperationStatus(importExportResponse.OperationStatusLink);
                            if (statusResponse.Status == Microsoft.Azure.OperationStatus.InProgress)
                            {
                                ValidateImportExportOperationStatusResponseProperties(statusResponse);
                            }
                        }

                        Assert.Equal(statusResponse.Status, OperationStatus.Succeeded);
                        ValidateImportExportOperationStatusResponseProperties(statusResponse.Properties);
                    }

                    TestUtilities.ValidateOperationResponse(importExportResponse, expectedStatueCode);
                }
                catch (CloudException exception)
                {
                    Assert.Equal(exception.Response.StatusCode, expectedStatueCode);
                }
                if (operationName == ImportOperationName && !createDatabase && !missingFields)
                {
                    DatabaseGetResponse databaseGetResponse = sqlClient.Databases.Get(resGroupName, serverName, databaseName);
                    TestUtilities.ValidateOperationResponse(databaseGetResponse);
                }
            }
            finally
            {
                // Clean up the resource group.
                resClient.ResourceGroups.Delete(resGroupName);
            }
        }
Example #5
0
        static void Main(string[] args)
        {
            //Authenticate With Client ID and Secret (OR Implement MSI)
            ClientCredential      Credentials = new ClientCredential("YOUR CLIENT ID HERE", "YOUR CLIENT SECRET HERE");
            AuthenticationContext AuthContext = new AuthenticationContext(String.Format("https://login.windows.net/{0}", "YOUR TENANT ID HERE"));

            AuthenticationResult AuthResult = AuthContext.AcquireTokenAsync("https://management.core.windows.net/", Credentials).Result;

            TokenCredentials AuthTokenCredentials = new TokenCredentials(AuthResult.AccessToken);

            _client = new SqlManagementClient(AuthTokenCredentials);
            _client.SubscriptionId = "YOU SUBSCRIPTION ID HERE";

EnterResourceGroup:
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine();
            Console.WriteLine("Enter Resource Group Name:");
            Console.ForegroundColor = ConsoleColor.White;

            String ResourceGroupName = Console.ReadLine();

            if (String.IsNullOrWhiteSpace(ResourceGroupName))
            {
                goto EnterResourceGroup;
            }

            IEnumerable <Server> Servers = _client.Servers.ListByResourceGroup(ResourceGroupName);

            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine();
            Console.WriteLine("Available Servers:");
            Console.WriteLine("---------------------");

            Console.ForegroundColor = ConsoleColor.White;

            foreach (Server CurrentServer in Servers)
            {
                Console.WriteLine(CurrentServer.Name);
            }

EnterServerName:
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine();
            Console.WriteLine("Enter a Server Name:");
            Console.ForegroundColor = ConsoleColor.White;

            String ServerName = Console.ReadLine();

            if (String.IsNullOrWhiteSpace(ServerName) || Servers.FirstOrDefault(x => x.Name.ToLowerInvariant() == ServerName.ToLowerInvariant()) == null)
            {
                goto EnterServerName;
            }

EnterLoginDetails:
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine();
            Console.WriteLine("Enter Server Login Details (Username and Password Comma Separated (,)):");
            Console.ForegroundColor = ConsoleColor.White;

            String LoginDetails = Console.ReadLine();

            if (String.IsNullOrWhiteSpace(LoginDetails) || !LoginDetails.Contains(","))
            {
                goto EnterLoginDetails;
            }

            String[] LoginDetailsArray = LoginDetails.Split(',');

            if (LoginDetailsArray.Count() < 2)
            {
                goto EnterLoginDetails;
            }

            IEnumerable <ElasticPool> Pools =
                ListElasticPools(ResourceGroupName, ServerName);

            if (Pools == null || Pools.Count() == 0)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine();
                Console.WriteLine("Please create an Elastic Pool first!");
                Console.ReadKey();
                return;
            }

EnterElasticPoolName:
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine();
            Console.WriteLine("Enter Elastic Pool Name:");
            Console.ForegroundColor = ConsoleColor.White;

            String      ElasticPoolName    = Console.ReadLine();
            ElasticPool currentElasticPool = null;

            if (String.IsNullOrWhiteSpace(ElasticPoolName) || Pools.FirstOrDefault(x => x.Name.ToLowerInvariant() == ElasticPoolName.ToLowerInvariant()) == null)
            {
                goto EnterElasticPoolName;
            }
            else
            {
                currentElasticPool = Pools.FirstOrDefault(x => x.Name.ToLowerInvariant() == ElasticPoolName.ToLowerInvariant());
            }

            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine();
            Console.WriteLine("Creating Template Database, This May Take Sometime...");

            //********************************************************************************//
            //Here is where you will actually Import the database,                            //
            //Provide the information to Blob Storage Account that holds your Database BACPAC //
            //Important Information: The Database and Elastic Pool must have compatible SKU's //
            //For Example: ElasticPool -> Standard, Database -> Standard S2                   //
            //********************************************************************************//

            ImportRequest ImportRequestInfo =
                new ImportRequest(StorageKeyType.StorageAccessKey,
                                  "YOUR STORAGE ACCOUNT ACCESS KEY HERE", "YOUR BLOBL STORAGE URI HERE",
                                  LoginDetailsArray[0], LoginDetailsArray[1],
                                  currentElasticPool.Name + "-templatedb", "Standard", "S2", "100", AuthenticationType.SQL);

            ImportExportResponse Response =
                _client.Databases.Import(ResourceGroupName, ServerName, ImportRequestInfo);

            Console.WriteLine("Adding Template Database To Elastic Pool, This May Take Sometime...");

            //***********************************************************************************//
            //Here we fetch the newly created Database out ready for updating the SKU and Pool ID//
            //***********************************************************************************//
            Database NewlyCreatedDatabase = _client.Databases.Get(ResourceGroupName, ServerName, Response.DatabaseName);

            //Modified The ElasticPoolId (Provide The Selected ElasticPool Id So We Can Link.
            NewlyCreatedDatabase.ElasticPoolId = currentElasticPool.Id;
            //Modified The SKU So That The Database Is Compatible With The ElasticPool
            NewlyCreatedDatabase.Sku = new Sku("ElasticPool", "Standard");

            //Update The Database With The New SKU Settings And Elastic Pool Id.
            _client.Databases.CreateOrUpdate(ResourceGroupName, ServerName, Response.DatabaseName, NewlyCreatedDatabase);

            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine();
            Console.WriteLine("Created Database And Linked To Selected Elastic Pool Successfully !");
        }