[Feature] SKU recommendations in SQL migration extension (#1399)

* Initial check in for SQL migration SKU recommendation feature (#1362)

Co-authored-by: Raymond Truong <ratruong@microsoft.com>

* Integration test for Get SKU Recommendation. (#1377)

* Integration test for Get SKU Recommendation.

* Addressing comments -
1) Moving sample files to data folder.
2) Changed Assert for Positive Justification. Ideally for MI we are expecting ~6 justifications but this might change so sticking with 'recommendation should have atleast one positive justification'.

* Implement start/stop perf data collection (#1369)

* Add SqlInstanceRequirements to SKU recommendation output (#1378)

* test for data collection start and stop (#1395)

* improve error handling, add RefreshPerfDataCollection  (#1393)

* WIP - refresh data collection

* Capture messages before logging

* Update Microsoft.SqlServer.Migration.Assessment NuGet version (#1402)

* Update NuGet version to 1.0.20220208.23, update assessment metadata

* Update SKU recommendation metadata

* Include preview SKUs

* Clear message/error queue after refreshing

* Clean up

* Add 'IsCollecting' to RefreshPerfDataCollection (#1405)

Co-authored-by: Neetu Singh <23.neetu@gmail.com>
This commit is contained in:
Raymond Truong
2022-02-10 19:02:27 -08:00
committed by GitHub
parent 4a33da5a18
commit 1693843ab0
35 changed files with 5200 additions and 2973 deletions

View File

@@ -0,0 +1,5 @@
ServerName,DatabaseName,LogicalName,PhysicalFullName,FileType,SizeMB,IsMemoryOptimizedDataOptionEnabled,TimeDataCollected
TEST,test,test,C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test.mdf,Rows,3,False,2021-10-28 19:08:03
TEST,test,test_log,C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test_log.ldf,Log,1,False,2021-10-28 19:08:03
TEST,test1,AdventureWorks2008R2_Data,C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test1.mdf,Rows,195.9375,False,2021-10-28 19:08:03
TEST,test1,AdventureWorks2008R2_Log,C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test1_1.LDF,Log,3.75,False,2021-10-28 19:08:03
1 ServerName DatabaseName LogicalName PhysicalFullName FileType SizeMB IsMemoryOptimizedDataOptionEnabled TimeDataCollected
2 TEST test test C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test.mdf Rows 3 False 2021-10-28 19:08:03
3 TEST test test_log C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test_log.ldf Log 1 False 2021-10-28 19:08:03
4 TEST test1 AdventureWorks2008R2_Data C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test1.mdf Rows 195.9375 False 2021-10-28 19:08:03
5 TEST test1 AdventureWorks2008R2_Log C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test1_1.LDF Log 3.75 False 2021-10-28 19:08:03

View File

@@ -0,0 +1,2 @@
ServerName,Edition,HyperthreadRatio,IsClustered,IsHadrEnabled,LogicalCpuCount,MaxServerMemoryInUse,NumberCoresUsed,NumberOfUserDatabases,PhysicalCpuCount,ProductVersion,SqlStartTime,SumOfUserDatabasesSize,TempDbSize,NumOfLogins,TimeDataCollected
TEST,Enterprise Edition (64-bit),2,False,False,2,2147483647,2,2,1,10.50.6592.0,2021-10-26 19:26:06,203,8,13,2021-10-28 19:08:03
1 ServerName Edition HyperthreadRatio IsClustered IsHadrEnabled LogicalCpuCount MaxServerMemoryInUse NumberCoresUsed NumberOfUserDatabases PhysicalCpuCount ProductVersion SqlStartTime SumOfUserDatabasesSize TempDbSize NumOfLogins TimeDataCollected
2 TEST Enterprise Edition (64-bit) 2 False False 2 2147483647 2 2 1 10.50.6592.0 2021-10-26 19:26:06 203 8 13 2021-10-28 19:08:03

View File

@@ -3,19 +3,24 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.SqlTools.Hosting.Protocol;
using Microsoft.SqlTools.ServiceLayer.IntegrationTests.Utility;
using Microsoft.SqlTools.ServiceLayer.Migration;
using Microsoft.SqlTools.ServiceLayer.Migration.Contracts;
using Microsoft.SqlTools.ServiceLayer.SqlAssessment.Contracts;
using Microsoft.SqlTools.ServiceLayer.Test.Common;
using Microsoft.SqlTools.ServiceLayer.Test.Common.RequestContextMocking;
using Moq;
using NUnit.Framework;
namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.Migration
{
public class MigrationgentServiceTests
public class MigrationServiceTests
{
[Test]
public async Task TestHandleMigrationAssessmentRequest()
@@ -34,7 +39,81 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.Migration
MigrationService service = new MigrationService();
await service.HandleMigrationAssessmentsRequest(requestParams, requestContext.Object);
requestContext.VerifyAll();
}
}
}
[Test]
public async Task TestHandleMigrationGetSkuRecommendationsRequest()
{
GetSkuRecommendationsResult result = null;
var requestParams = new GetSkuRecommendationsParams()
{
DataFolder = Path.Combine("..", "..", "..", "Migration", "Data"),
TargetPlatforms = new List<string> { "AzureSqlManagedInstance" },
TargetSqlInstance = "Test",
TargetPercentile = 95,
StartTime = new DateTime(2020, 01, 01).ToString("yyyy-MM-dd HH:mm:ss"),
EndTime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"),
PerfQueryIntervalInSec = 30,
ScalingFactor = 1,
DatabaseAllowList = new List<string> { "test", "test1" }
};
var requestContext = RequestContextMocks.Create<GetSkuRecommendationsResult>(r => result = r).AddErrorHandling(null);
MigrationService service = new MigrationService();
await service.HandleGetSkuRecommendationsRequest(requestParams, requestContext.Object);
Assert.IsNotNull(result, "Get SKU Recommendation result is null");
Assert.IsNotNull(result.SqlMiRecommendationResults, "Get MI SKU Recommendation result is null");
// TODO: Include Negative Justification in future when we start recommending more than one SKU.
Assert.Greater(result.SqlMiRecommendationResults.First().PositiveJustifications.Count, 0, "No positive justification for MI SKU Recommendation result");
Assert.IsNotNull(result.InstanceRequirements);
Assert.AreEqual(result.InstanceRequirements.InstanceId, "TEST");
Assert.AreEqual(result.InstanceRequirements.DatabaseLevelRequirements.Count, 2);
Assert.AreEqual(result.InstanceRequirements.DatabaseLevelRequirements.Sum(db => db.FileLevelRequirements.Count), 4);
}
[Test]
public async Task TestHandleStartStopPerfDataCollectionRequest()
{
StartPerfDataCollectionResult result = null;
using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile())
{
var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath);
string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "SkuRecommendationTest");
Directory.CreateDirectory(folderPath);
var requestParams = new StartPerfDataCollectionParams()
{
OwnerUri = connectionResult.ConnectionInfo.OwnerUri,
DataFolder = folderPath,
PerfQueryIntervalInSec = 30,
NumberOfIterations = 20,
StaticQueryIntervalInSec = 3600,
};
var requestContext = RequestContextMocks.Create<StartPerfDataCollectionResult>(r => result = r).AddErrorHandling(null);
MigrationService service = new MigrationService();
await service.HandleStartPerfDataCollectionRequest(requestParams, requestContext.Object);
Assert.IsNotNull(result, "Start Perf Data Collection result is null");
Assert.IsNotNull(result.DateTimeStarted, "Time perf data collection started is null");
// Stop data collection
StopPerfDataCollectionResult stopResult = null;
var stopRequestParams = new StopPerfDataCollectionParams()
{
};
var stopRequestContext = RequestContextMocks.Create<StopPerfDataCollectionResult>(r => stopResult = r).AddErrorHandling(null);
await service.HandleStopPerfDataCollectionRequest(stopRequestParams, stopRequestContext.Object);
Assert.IsNotNull(stopResult, "Stop Perf Data Collection result is null");
Assert.IsNotNull(stopResult.DateTimeStopped, "Time perf data collection stoped is null");
}
}
}
}
}