mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-16 10:58:30 -05:00
integrate backup operation with new scriptable task (#440)
* integrate backup operation with new scriptable task
This commit is contained in:
@@ -13,8 +13,6 @@ using Microsoft.SqlServer.Management.Sdk.Sfc;
|
|||||||
using Microsoft.SqlServer.Management.Smo;
|
using Microsoft.SqlServer.Management.Smo;
|
||||||
using Microsoft.SqlTools.ServiceLayer.Admin;
|
using Microsoft.SqlTools.ServiceLayer.Admin;
|
||||||
using Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts;
|
using Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts;
|
||||||
using System.Globalization;
|
|
||||||
using System.Text;
|
|
||||||
using Microsoft.SqlTools.ServiceLayer.TaskServices;
|
using Microsoft.SqlTools.ServiceLayer.TaskServices;
|
||||||
|
|
||||||
namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
|
namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
|
||||||
@@ -22,13 +20,12 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class implements backup operations
|
/// This class implements backup operations
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class BackupOperation : IBackupOperation
|
public class BackupOperation : SmoScriptableTaskOperation, IBackupOperation
|
||||||
{
|
{
|
||||||
private CDataContainer dataContainer;
|
private CDataContainer dataContainer;
|
||||||
private ServerConnection serverConnection;
|
private ServerConnection serverConnection;
|
||||||
private CommonUtilities backupRestoreUtil = null;
|
private CommonUtilities backupRestoreUtil = null;
|
||||||
private Backup backup = null;
|
private Backup backup = null;
|
||||||
private string scriptContent = "";
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constants
|
/// Constants
|
||||||
@@ -151,22 +148,10 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
|
|||||||
return configInfo;
|
return configInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ScriptContent
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return this.scriptContent;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
this.scriptContent = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The error occurred during backup operation
|
/// The error occurred during backup operation
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string ErrorMessage
|
public override string ErrorMessage
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
@@ -174,17 +159,19 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public SqlTask SqlTask { get; set; }
|
public override Server Server
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.dataContainer.Server;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Execute backup
|
/// Execute backup
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void Execute(TaskExecutionMode mode)
|
public override void Execute()
|
||||||
{
|
{
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
SqlExecutionModes oldExecutionMode = this.dataContainer.Server.ConnectionContext.SqlExecutionModes;
|
|
||||||
this.dataContainer.Server.ConnectionContext.SqlExecutionModes = (mode == TaskExecutionMode.Script) ? SqlExecutionModes.CaptureSql: SqlExecutionModes.ExecuteAndCaptureSql;
|
|
||||||
this.dataContainer.Server.ConnectionContext.CapturedSql.Clear();
|
|
||||||
this.backup = new Backup();
|
this.backup = new Backup();
|
||||||
this.backup.Database = this.backupInfo.DatabaseName;
|
this.backup.Database = this.backupInfo.DatabaseName;
|
||||||
this.backup.Action = this.backupActionType;
|
this.backup.Action = this.backupActionType;
|
||||||
@@ -322,24 +309,18 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (String s in this.dataContainer.Server.ConnectionContext.CapturedSql.Text)
|
|
||||||
{
|
|
||||||
sb.Append(s);
|
|
||||||
sb.Append(Environment.NewLine);
|
|
||||||
}
|
|
||||||
this.ScriptContent = sb.ToString();
|
|
||||||
}
|
}
|
||||||
finally
|
catch(Exception)
|
||||||
{
|
{
|
||||||
this.dataContainer.Server.ConnectionContext.CapturedSql.Clear();
|
throw;
|
||||||
this.dataContainer.Server.ConnectionContext.SqlExecutionModes = oldExecutionMode;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Cancel backup
|
/// Cancel backup
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void Cancel()
|
public override void Cancel()
|
||||||
{
|
{
|
||||||
if (this.backup != null)
|
if (this.backup != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,13 +4,15 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
using Microsoft.SqlTools.Hosting.Protocol.Contracts;
|
using Microsoft.SqlTools.Hosting.Protocol.Contracts;
|
||||||
|
using Microsoft.SqlTools.ServiceLayer.TaskServices;
|
||||||
|
using Microsoft.SqlTools.ServiceLayer.Utility;
|
||||||
|
|
||||||
namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts
|
namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Backup parameters passed for execution and scripting
|
/// Backup parameters passed for execution and scripting
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class BackupParams
|
public class BackupParams : IScriptableRequestParams
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Connection uri
|
/// Connection uri
|
||||||
@@ -23,9 +25,9 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts
|
|||||||
public BackupInfo BackupInfo { get; set; }
|
public BackupInfo BackupInfo { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// True for generating script, false for execution
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsScripting { get; set; }
|
public TaskExecutionMode TaskExecutionMode { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -147,20 +147,6 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public TaskExecutionMode TaskExecutionMode { get; set; }
|
public TaskExecutionMode TaskExecutionMode { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Same as Target Database name. Used by task manager to create task info
|
|
||||||
/// </summary>
|
|
||||||
public string DatabaseName
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return TargetDatabaseName;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
TargetDatabaseName = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -225,6 +225,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
|
|||||||
{
|
{
|
||||||
// create task metadata
|
// create task metadata
|
||||||
TaskMetadata metadata = TaskMetadata.Create(restoreParams, SR.RestoreTaskName, restoreDataObject, ConnectionServiceInstance);
|
TaskMetadata metadata = TaskMetadata.Create(restoreParams, SR.RestoreTaskName, restoreDataObject, ConnectionServiceInstance);
|
||||||
|
metadata.DatabaseName = restoreParams.TargetDatabaseName;
|
||||||
|
|
||||||
// create restore task and perform
|
// create restore task and perform
|
||||||
SqlTask sqlTask = SqlTaskManagerInstance.CreateAndRun<SqlTask>(metadata);
|
SqlTask sqlTask = SqlTaskManagerInstance.CreateAndRun<SqlTask>(metadata);
|
||||||
@@ -277,23 +278,9 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
|
|||||||
SqlTask sqlTask = null;
|
SqlTask sqlTask = null;
|
||||||
|
|
||||||
// create task metadata
|
// create task metadata
|
||||||
TaskMetadata metadata = new TaskMetadata();
|
TaskMetadata metadata = TaskMetadata.Create(backupParams, SR.BackupTaskName, backupOperation, ConnectionServiceInstance);
|
||||||
metadata.ServerName = connInfo.ConnectionDetails.ServerName;
|
|
||||||
metadata.DatabaseName = connInfo.ConnectionDetails.DatabaseName;
|
sqlTask = SqlTaskManagerInstance.CreateAndRun<SqlTask>(metadata);
|
||||||
metadata.TaskOperation = backupOperation;
|
|
||||||
|
|
||||||
if (backupParams.IsScripting)
|
|
||||||
{
|
|
||||||
metadata.Name = string.Format("{0} {1}", SR.BackupTaskName, SR.ScriptTaskName);
|
|
||||||
metadata.TaskExecutionMode = TaskExecutionMode.Script;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
metadata.Name = SR.BackupTaskName;
|
|
||||||
metadata.TaskExecutionMode = TaskExecutionMode.ExecuteAndScript;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlTask = SqlTaskManagerInstance.CreateAndRun(metadata, this.PerformBackupTaskAsync, this.CancelBackupTaskAsync);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -400,88 +387,5 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery
|
|||||||
{
|
{
|
||||||
backupOperation.Execute(TaskExecutionMode.Script);
|
backupOperation.Execute(TaskExecutionMode.Script);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Async task to execute backup
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sqlTask"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
internal async Task<TaskResult> PerformBackupTaskAsync(SqlTask sqlTask)
|
|
||||||
{
|
|
||||||
IBackupOperation backupOperation = sqlTask.TaskMetadata.TaskOperation as IBackupOperation;
|
|
||||||
TaskResult result = new TaskResult();
|
|
||||||
|
|
||||||
// Create a task to perform backup
|
|
||||||
await Task.Factory.StartNew(() =>
|
|
||||||
{
|
|
||||||
if (backupOperation != null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
sqlTask.AddMessage(SR.TaskInProgress, SqlTaskStatus.InProgress, true);
|
|
||||||
|
|
||||||
// Execute backup
|
|
||||||
backupOperation.Execute(sqlTask.TaskMetadata.TaskExecutionMode);
|
|
||||||
|
|
||||||
// Set result
|
|
||||||
result.TaskStatus = SqlTaskStatus.Succeeded;
|
|
||||||
|
|
||||||
// Send generated script to client
|
|
||||||
if (!String.IsNullOrEmpty(backupOperation.ScriptContent))
|
|
||||||
{
|
|
||||||
sqlTask.AddScript(result.TaskStatus, backupOperation.ScriptContent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
result.TaskStatus = SqlTaskStatus.Failed;
|
|
||||||
result.ErrorMessage = string.Format(CultureInfo.InvariantCulture, "error:{0} inner:{1} stacktrace:{2}",
|
|
||||||
ex.Message,
|
|
||||||
ex.InnerException != null ? ex.InnerException.Message : "",
|
|
||||||
ex.StackTrace);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result.TaskStatus = SqlTaskStatus.Failed;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Async task to cancel backup
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sqlTask"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
internal async Task<TaskResult> CancelBackupTaskAsync(SqlTask sqlTask)
|
|
||||||
{
|
|
||||||
IBackupOperation backupOperation = sqlTask.TaskMetadata.TaskOperation as IBackupOperation;
|
|
||||||
TaskResult result = new TaskResult();
|
|
||||||
|
|
||||||
await Task.Factory.StartNew(() =>
|
|
||||||
{
|
|
||||||
if (backupOperation != null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
backupOperation.Cancel();
|
|
||||||
result.TaskStatus = SqlTaskStatus.Canceled;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
result.TaskStatus = SqlTaskStatus.Failed;
|
|
||||||
result.ErrorMessage = ex.Message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result.TaskStatus = SqlTaskStatus.Failed;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,6 +57,8 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
|||||||
string DefaultTargetDbName { get; }
|
string DefaultTargetDbName { get; }
|
||||||
string TargetDatabaseName { get; set; }
|
string TargetDatabaseName { get; set; }
|
||||||
|
|
||||||
|
bool CanDropExistingConnections { get; }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -247,7 +249,6 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
|||||||
lastBackup = isTheLastOneSelected ?
|
lastBackup = isTheLastOneSelected ?
|
||||||
string.Format(CultureInfo.CurrentCulture, SR.TheLastBackupTaken, (backupTimeStr)) : backupTimeStr;
|
string.Format(CultureInfo.CurrentCulture, SR.TheLastBackupTaken, (backupTimeStr)) : backupTimeStr;
|
||||||
}
|
}
|
||||||
//TODO: find the selected one
|
|
||||||
else if (GetFirstSelectedBackupSetIndex() == 0 && !this.RestorePlanner.RestoreToLastBackup)
|
else if (GetFirstSelectedBackupSetIndex() == 0 && !this.RestorePlanner.RestoreToLastBackup)
|
||||||
{
|
{
|
||||||
lastBackup = this.CurrentRestorePointInTime.Value.ToLongDateString() +
|
lastBackup = this.CurrentRestorePointInTime.Value.ToLongDateString() +
|
||||||
@@ -1242,6 +1243,21 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns true if can close eixisting connections for give database
|
||||||
|
/// </summary>
|
||||||
|
public bool CanDropExistingConnections
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (RestorePlan != null && RestorePlanner != null)
|
||||||
|
{
|
||||||
|
return RestorePlan.CanDropExistingConnections(RestorePlanner.DatabaseName);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Cancels the restore operations
|
/// Cancels the restore operations
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -482,8 +482,7 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation
|
|||||||
{
|
{
|
||||||
return new OptionValidationResult()
|
return new OptionValidationResult()
|
||||||
{
|
{
|
||||||
//TODO: make the method public in SMO bool canDropExistingConnections = restoreDataObject.RestorePlan.CanDropExistingConnections(this.Data.RestorePlanner.DatabaseName);
|
IsReadOnly = !restoreDataObject.CanDropExistingConnections
|
||||||
IsReadOnly = false
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
|
SetValueFunction = (IRestoreDatabaseTaskDataObject restoreDataObject, object value) =>
|
||||||
|
|||||||
@@ -67,11 +67,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TaskServices
|
|||||||
taskMetadata.ServerName = connInfo.ConnectionDetails.ServerName;
|
taskMetadata.ServerName = connInfo.ConnectionDetails.ServerName;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(requestParam.DatabaseName))
|
if (connInfo != null)
|
||||||
{
|
|
||||||
taskMetadata.DatabaseName = requestParam.DatabaseName;
|
|
||||||
}
|
|
||||||
else if (connInfo != null)
|
|
||||||
{
|
{
|
||||||
taskMetadata.DatabaseName = connInfo.ConnectionDetails.DatabaseName;
|
taskMetadata.DatabaseName = connInfo.ConnectionDetails.DatabaseName;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,10 +12,5 @@ namespace Microsoft.SqlTools.ServiceLayer.Utility
|
|||||||
/// The Uri to find the connection to do the restore operations
|
/// The Uri to find the connection to do the restore operations
|
||||||
/// </summary>
|
/// </summary>
|
||||||
string OwnerUri { get; set; }
|
string OwnerUri { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Database name
|
|
||||||
/// </summary>
|
|
||||||
string DatabaseName { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -676,7 +676,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.DisasterRecovery
|
|||||||
{
|
{
|
||||||
OwnerUri = liveConnection.ConnectionInfo.OwnerUri,
|
OwnerUri = liveConnection.ConnectionInfo.OwnerUri,
|
||||||
BackupInfo = backupInfo,
|
BackupInfo = backupInfo,
|
||||||
IsScripting = false
|
TaskExecutionMode = TaskExecutionMode.Execute
|
||||||
};
|
};
|
||||||
|
|
||||||
// Backup the database
|
// Backup the database
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery
|
|||||||
DisasterRecoveryService service = new DisasterRecoveryService();
|
DisasterRecoveryService service = new DisasterRecoveryService();
|
||||||
var mockBackupOperation = new Mock<IBackupOperation>();
|
var mockBackupOperation = new Mock<IBackupOperation>();
|
||||||
TaskMetadata taskMetaData = this.CreateTaskMetaData(mockBackupOperation.Object);
|
TaskMetadata taskMetaData = this.CreateTaskMetaData(mockBackupOperation.Object);
|
||||||
SqlTask sqlTask = manager.CreateTask(taskMetaData, service.PerformBackupTaskAsync, service.CancelBackupTaskAsync);
|
SqlTask sqlTask = manager.CreateTask<SqlTask>(taskMetaData);
|
||||||
Assert.NotNull(sqlTask);
|
Assert.NotNull(sqlTask);
|
||||||
Task taskToVerify = sqlTask.RunAsync().ContinueWith(Task =>
|
Task taskToVerify = sqlTask.RunAsync().ContinueWith(Task =>
|
||||||
{
|
{
|
||||||
@@ -50,7 +50,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery
|
|||||||
TaskMetadata taskMetaData = this.CreateTaskMetaData(mockBackupOperation.Object);
|
TaskMetadata taskMetaData = this.CreateTaskMetaData(mockBackupOperation.Object);
|
||||||
taskMetaData.TaskExecutionMode = TaskExecutionMode.Script;
|
taskMetaData.TaskExecutionMode = TaskExecutionMode.Script;
|
||||||
|
|
||||||
SqlTask sqlTask = manager.CreateTask(taskMetaData, service.PerformBackupTaskAsync);
|
SqlTask sqlTask = manager.CreateTask<SqlTask>(taskMetaData);
|
||||||
Assert.NotNull(sqlTask);
|
Assert.NotNull(sqlTask);
|
||||||
Task taskToVerify = sqlTask.RunAsync().ContinueWith(Task =>
|
Task taskToVerify = sqlTask.RunAsync().ContinueWith(Task =>
|
||||||
{
|
{
|
||||||
@@ -74,8 +74,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery
|
|||||||
var mockBackupOperation = new Mock<IBackupOperation>();
|
var mockBackupOperation = new Mock<IBackupOperation>();
|
||||||
TaskMetadata taskMetaData = this.CreateTaskMetaData(mockBackupOperation.Object);
|
TaskMetadata taskMetaData = this.CreateTaskMetaData(mockBackupOperation.Object);
|
||||||
|
|
||||||
SqlTask sqlTask = manager.CreateTask(taskMetaData, service.PerformBackupTaskAsync, service.CancelBackupTaskAsync);
|
SqlTask sqlTask = manager.CreateTask<SqlTask>(taskMetaData);
|
||||||
SqlTask sqlTask2 = manager.CreateTask(taskMetaData, service.PerformBackupTaskAsync, service.CancelBackupTaskAsync);
|
SqlTask sqlTask2 = manager.CreateTask<SqlTask>(taskMetaData);
|
||||||
Assert.NotNull(sqlTask);
|
Assert.NotNull(sqlTask);
|
||||||
Assert.NotNull(sqlTask2);
|
Assert.NotNull(sqlTask2);
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery
|
|||||||
IBackupOperation backupOperation = new BackupOperationStub();
|
IBackupOperation backupOperation = new BackupOperationStub();
|
||||||
DisasterRecoveryService service = new DisasterRecoveryService();
|
DisasterRecoveryService service = new DisasterRecoveryService();
|
||||||
TaskMetadata taskMetaData = this.CreateTaskMetaData(backupOperation);
|
TaskMetadata taskMetaData = this.CreateTaskMetaData(backupOperation);
|
||||||
SqlTask sqlTask = manager.CreateTask(taskMetaData, service.PerformBackupTaskAsync, service.CancelBackupTaskAsync);
|
SqlTask sqlTask = manager.CreateTask<SqlTask>(taskMetaData);
|
||||||
Assert.NotNull(sqlTask);
|
Assert.NotNull(sqlTask);
|
||||||
Task taskToVerify = sqlTask.RunAsync().ContinueWith(Task =>
|
Task taskToVerify = sqlTask.RunAsync().ContinueWith(Task =>
|
||||||
{
|
{
|
||||||
@@ -135,8 +135,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery
|
|||||||
TaskMetadata taskMetaData = this.CreateTaskMetaData(backupOperation);
|
TaskMetadata taskMetaData = this.CreateTaskMetaData(backupOperation);
|
||||||
TaskMetadata taskMetaData2 = this.CreateTaskMetaData(backupOperation2);
|
TaskMetadata taskMetaData2 = this.CreateTaskMetaData(backupOperation2);
|
||||||
|
|
||||||
SqlTask sqlTask = manager.CreateTask(taskMetaData, service.PerformBackupTaskAsync, service.CancelBackupTaskAsync);
|
SqlTask sqlTask = manager.CreateTask<SqlTask>(taskMetaData);
|
||||||
SqlTask sqlTask2 = manager.CreateTask(taskMetaData2, service.PerformBackupTaskAsync, service.CancelBackupTaskAsync);
|
SqlTask sqlTask2 = manager.CreateTask<SqlTask>(taskMetaData2);
|
||||||
Assert.NotNull(sqlTask);
|
Assert.NotNull(sqlTask);
|
||||||
Assert.NotNull(sqlTask2);
|
Assert.NotNull(sqlTask2);
|
||||||
|
|
||||||
@@ -174,11 +174,11 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery
|
|||||||
DisasterRecoveryService service = new DisasterRecoveryService();
|
DisasterRecoveryService service = new DisasterRecoveryService();
|
||||||
IBackupOperation backupOperation = new BackupOperationStub();
|
IBackupOperation backupOperation = new BackupOperationStub();
|
||||||
TaskMetadata taskMetaData = this.CreateTaskMetaData(backupOperation);
|
TaskMetadata taskMetaData = this.CreateTaskMetaData(backupOperation);
|
||||||
SqlTask sqlTask = manager.CreateTask(taskMetaData, service.PerformBackupTaskAsync, service.CancelBackupTaskAsync);
|
SqlTask sqlTask = manager.CreateTask<SqlTask>(taskMetaData);
|
||||||
|
|
||||||
var mockBackupOperation = new Mock<IBackupOperation>();
|
var mockBackupOperation = new Mock<IBackupOperation>();
|
||||||
TaskMetadata taskMetaData2 = this.CreateTaskMetaData(mockBackupOperation.Object);
|
TaskMetadata taskMetaData2 = this.CreateTaskMetaData(mockBackupOperation.Object);
|
||||||
SqlTask sqlTask2 = manager.CreateTask(taskMetaData, service.PerformBackupTaskAsync, service.CancelBackupTaskAsync);
|
SqlTask sqlTask2 = manager.CreateTask<SqlTask>(taskMetaData);
|
||||||
|
|
||||||
Assert.NotNull(sqlTask);
|
Assert.NotNull(sqlTask);
|
||||||
Assert.NotNull(sqlTask2);
|
Assert.NotNull(sqlTask2);
|
||||||
|
|||||||
@@ -52,5 +52,6 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery
|
|||||||
public string DefaultTargetDbName { get; set; }
|
public string DefaultTargetDbName { get; set; }
|
||||||
|
|
||||||
public string TargetDatabaseName { get; set; }
|
public string TargetDatabaseName { get; set; }
|
||||||
|
public bool CanDropExistingConnections { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,6 +135,30 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery
|
|||||||
Assert.False(result[RestoreOptionsHelper.StandbyFile].IsReadOnly);
|
Assert.False(result[RestoreOptionsHelper.StandbyFile].IsReadOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CloseExistingConnectionsShouldNotBeReadOnlyGivenCanDropExistingConnectionsSetToTrue()
|
||||||
|
{
|
||||||
|
GeneralRequestDetails optionValues = CreateOptionsTestData();
|
||||||
|
optionValues.Options["CanDropExistingConnections"] = true;
|
||||||
|
IRestoreDatabaseTaskDataObject restoreDatabaseTaskDataObject = CreateRestoreDatabaseTaskDataObject(optionValues);
|
||||||
|
|
||||||
|
Dictionary<string, RestorePlanDetailInfo> result = RestoreOptionsHelper.CreateRestorePlanOptions(restoreDatabaseTaskDataObject);
|
||||||
|
Assert.NotNull(result);
|
||||||
|
Assert.False(result[RestoreOptionsHelper.CloseExistingConnections].IsReadOnly);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CloseExistingConnectionsShouldBeReadOnlyGivenCanDropExistingConnectionsSetToFalse()
|
||||||
|
{
|
||||||
|
GeneralRequestDetails optionValues = CreateOptionsTestData();
|
||||||
|
optionValues.Options["CanDropExistingConnections"] = false;
|
||||||
|
IRestoreDatabaseTaskDataObject restoreDatabaseTaskDataObject = CreateRestoreDatabaseTaskDataObject(optionValues);
|
||||||
|
|
||||||
|
Dictionary<string, RestorePlanDetailInfo> result = RestoreOptionsHelper.CreateRestorePlanOptions(restoreDatabaseTaskDataObject);
|
||||||
|
Assert.NotNull(result);
|
||||||
|
Assert.True(result[RestoreOptionsHelper.CloseExistingConnections].IsReadOnly);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void KeepReplicationShouldNotBeReadOnlyGivenRecoveryStateWithNoRecovery()
|
public void KeepReplicationShouldNotBeReadOnlyGivenRecoveryStateWithNoRecovery()
|
||||||
{
|
{
|
||||||
@@ -288,6 +312,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery
|
|||||||
optionValues.Options.Add("DefaultSourceDbName", "DefaultSourceDbName");
|
optionValues.Options.Add("DefaultSourceDbName", "DefaultSourceDbName");
|
||||||
optionValues.Options.Add("DefaultTargetDbName", "DefaultTargetDbName");
|
optionValues.Options.Add("DefaultTargetDbName", "DefaultTargetDbName");
|
||||||
optionValues.Options.Add("SourceDbNames", new List<string>());
|
optionValues.Options.Add("SourceDbNames", new List<string>());
|
||||||
|
optionValues.Options.Add("CanDropExistingConnections", true);
|
||||||
return optionValues;
|
return optionValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -314,6 +339,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery
|
|||||||
restoreDataObject.SourceDbNames = optionValues.GetOptionValue<List<string>>("SourceDbNames");
|
restoreDataObject.SourceDbNames = optionValues.GetOptionValue<List<string>>("SourceDbNames");
|
||||||
restoreDataObject.DefaultTargetDbName = optionValues.GetOptionValue<string>("DefaultTargetDbName");
|
restoreDataObject.DefaultTargetDbName = optionValues.GetOptionValue<string>("DefaultTargetDbName");
|
||||||
restoreDataObject.BackupTailLog = optionValues.GetOptionValue<bool>(RestoreOptionsHelper.BackupTailLog);
|
restoreDataObject.BackupTailLog = optionValues.GetOptionValue<bool>(RestoreOptionsHelper.BackupTailLog);
|
||||||
|
restoreDataObject.CanDropExistingConnections = optionValues.GetOptionValue<bool>("CanDropExistingConnections");
|
||||||
restoreDataObject.RestoreParams = optionValues as RestoreParams;
|
restoreDataObject.RestoreParams = optionValues as RestoreParams;
|
||||||
restoreDataObject.RestorePlan = null;
|
restoreDataObject.RestorePlan = null;
|
||||||
RestoreOptions restoreOptions = new RestoreOptions();
|
RestoreOptions restoreOptions = new RestoreOptions();
|
||||||
|
|||||||
Reference in New Issue
Block a user