From d30b9c870d63441500530ce547313c1384f8ade9 Mon Sep 17 00:00:00 2001 From: Kate Shin Date: Tue, 3 Oct 2017 16:11:30 -0700 Subject: [PATCH] Update restore service to return default backup folder (#475) * Fix restore to return default backup folder * fix break * fix tests * fix file validator for invalid filepath --- .../BackupOperation/BackupOperation.cs | 7 +------ .../DisasterRecovery/CommonUtilities.cs | 4 ++-- .../DisasterRecoveryFileValidator.cs | 19 +++++++++++++------ .../RestoreOperation/RestoreDatabaseHelper.cs | 2 ++ .../RestoreDatabaseTaskDataObject.cs | 9 +++++++++ .../DisasterRecovery/RestoreOptionsHelper.cs | 3 +++ .../RestoreDatabaseTaskDataObjectStub.cs | 2 ++ .../RestoreOptionsHelperTests.cs | 2 ++ 8 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/BackupOperation/BackupOperation.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/BackupOperation/BackupOperation.cs index d5936338..0adf2c34 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/BackupOperation/BackupOperation.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/BackupOperation/BackupOperation.cs @@ -142,7 +142,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery { BackupConfigInfo configInfo = new BackupConfigInfo(); configInfo.RecoveryModel = GetRecoveryModel(databaseName); - configInfo.DefaultBackupFolder = GetDefaultBackupFolder(); + configInfo.DefaultBackupFolder = CommonUtilities.GetDefaultBackupFolder(this.serverConnection); configInfo.LatestBackups = GetLatestBackupLocations(databaseName); configInfo.BackupEncryptors = GetBackupEncryptors(); return configInfo; @@ -338,11 +338,6 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery return recoveryModel.ToString(); } - public string GetDefaultBackupFolder() - { - return this.backupRestoreUtil.GetDefaultBackupFolder(); - } - /// /// Return the latest backup locations /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/CommonUtilities.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/CommonUtilities.cs index 564fb6b8..123a88da 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/CommonUtilities.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/CommonUtilities.cs @@ -320,7 +320,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery return recoveryModelString; } - public string GetDefaultBackupFolder() + public static string GetDefaultBackupFolder(ServerConnection connection) { string backupFolder = ""; @@ -330,7 +330,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery Request req = new Request(); en = new Enumerator(); req.Urn = "Server/Setting"; - ds = en.Process(this.sqlConnection, req); + ds = en.Process(connection, req); if (ds.Tables[0].Rows.Count > 0) { diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/DisasterRecoveryFileValidator.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/DisasterRecoveryFileValidator.cs index c3385ed3..25b5eb42 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/DisasterRecoveryFileValidator.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/DisasterRecoveryFileValidator.cs @@ -85,18 +85,25 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery #region private methods + /// + /// Check if the folder path exists + /// + /// sql connection + /// full file path + /// internal static string IsFolderPathExisting(SqlConnection connection, string filePath) { - // If the file path doesn't exist, check if the folder exists string folderPath = PathWrapper.GetDirectoryName(filePath); string errorMessage = string.Empty; - if (string.Compare(GetMachineName(connection.DataSource), Environment.MachineName, StringComparison.OrdinalIgnoreCase) == 0) + if (string.IsNullOrEmpty(folderPath)) { - if (!string.IsNullOrEmpty(folderPath) && !Directory.Exists(folderPath)) - { - errorMessage = SR.InvalidBackupPathError; - } + errorMessage = SR.InvalidBackupPathError; + } + else if (string.Compare(GetMachineName(connection.DataSource), Environment.MachineName, StringComparison.OrdinalIgnoreCase) == 0 + && !Directory.Exists(folderPath)) + { + errorMessage = SR.InvalidBackupPathError; } else { diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseHelper.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseHelper.cs index 6771603f..7f448140 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseHelper.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseHelper.cs @@ -41,6 +41,8 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation response.ConfigInfo.Add(RestoreOptionsHelper.LogFileFolder, restoreTaskObject.DefaultLogFileFolder); // The db names with backup set response.ConfigInfo.Add(RestoreOptionsHelper.SourceDatabaseNamesWithBackupSets, restoreTaskObject.GetDatabaseNamesWithBackupSets()); + // Default backup folder path in the target server + response.ConfigInfo.Add(RestoreOptionsHelper.DefaultBackupFolder, restoreTaskObject.DefaultBackupFolder); } return response; diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseTaskDataObject.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseTaskDataObject.cs index 5772cee5..6e08ab15 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseTaskDataObject.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOperation/RestoreDatabaseTaskDataObject.cs @@ -25,6 +25,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation string LogFilesFolder { get; set; } string DefaultLogFileFolder { get; } List DbFiles { get; } + string DefaultBackupFolder { get; } RestoreOptions RestoreOptions { get; } @@ -851,6 +852,14 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation } } + public string DefaultBackupFolder + { + get + { + return CommonUtilities.GetDefaultBackupFolder(this.server.ConnectionContext); + } + } + internal RestorePlan CreateRestorePlan(DatabaseRestorePlanner planner, RestoreOptions restoreOptions) { this.CreateOrUpdateRestorePlanException = null; diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOptionsHelper.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOptionsHelper.cs index 1f3e6a9f..8a7ef197 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOptionsHelper.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/RestoreOptionsHelper.cs @@ -53,6 +53,9 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery //Option name logFileFolder internal const string LogFileFolder = "logFileFolder"; + //Option name defaultBackupFolder + internal const string DefaultBackupFolder = "defaultBackupFolder"; + //The key name to use to set the session id in the request internal const string SessionId = "sessionId"; diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreDatabaseTaskDataObjectStub.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreDatabaseTaskDataObjectStub.cs index de906eb3..e2afd026 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreDatabaseTaskDataObjectStub.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreDatabaseTaskDataObjectStub.cs @@ -21,6 +21,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery public string DefaultLogFileFolder { get; set; } + public string DefaultBackupFolder { get; set; } + public List DbFiles { get; set; } public RestoreOptions RestoreOptions { get; set; } diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreOptionsHelperTests.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreOptionsHelperTests.cs index 85d4c50c..3d026e26 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreOptionsHelperTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/RestoreOptionsHelperTests.cs @@ -292,6 +292,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery optionValues.Options.Add("DbFiles", new List() { new DbFile("", '1', "") }); optionValues.Options.Add("DefaultDataFileFolder", "Default data file folder"); optionValues.Options.Add("DefaultLogFileFolder", "Default log file folder"); + optionValues.Options.Add("DefaultBackupFolder", "Default backup folder"); optionValues.Options.Add("IsTailLogBackupPossible", true); optionValues.Options.Add("IsTailLogBackupWithNoRecoveryPossible", true); optionValues.Options.Add("GetDefaultStandbyFile", "default standby file"); @@ -324,6 +325,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery restoreDataObject.DbFiles = optionValues.GetOptionValue>("DbFiles"); restoreDataObject.DefaultDataFileFolder = optionValues.GetOptionValue("DefaultDataFileFolder"); restoreDataObject.DefaultLogFileFolder = optionValues.GetOptionValue("DefaultLogFileFolder"); + restoreDataObject.DefaultBackupFolder = optionValues.GetOptionValue("DefaultBackupFolder"); restoreDataObject.IsTailLogBackupPossible = optionValues.GetOptionValue("IsTailLogBackupPossible"); restoreDataObject.IsTailLogBackupWithNoRecoveryPossible = optionValues.GetOptionValue("IsTailLogBackupWithNoRecoveryPossible"); restoreDataObject.DefaultStandbyFile = optionValues.GetOptionValue("GetDefaultStandbyFile");