src/Excel/ImportDiscoveryReport.cs (95 lines of code) (raw):
using ClosedXML.Excel;
using System;
using System.IO;
using System.Collections.Generic;
using Azure.Migrate.Export.Common;
using Azure.Migrate.Export.Models;
namespace Azure.Migrate.Export.Excel
{
public class ImportDiscoveryReport
{
private UserInput UserInputObj;
private List<DiscoveryData> DiscoveredData;
public ImportDiscoveryReport(UserInput userInputObj, List<DiscoveryData> discoveredData)
{
UserInputObj = userInputObj;
DiscoveredData = discoveredData;
}
public void ImportDiscoveryData()
{
ValidateDiscoveryReportPresence();
using (var fileStream = new FileStream(DiscoveryReportConstants.DiscoveryReportPath, FileMode.Open, FileAccess.Read)) // only read the data
{
using (var discoveryWb = new XLWorkbook(fileStream))
{
ValidateDiscoveryReport(discoveryWb);
if (DiscoveredData == null)
DiscoveredData = new List<DiscoveryData>();
LoadExcelData(discoveryWb);
}
}
}
private void ValidateDiscoveryReportPresence()
{
if (!Directory.Exists(DiscoveryReportConstants.DiscoveryReportDirectory))
throw new Exception($"Discovery report directory {DiscoveryReportConstants.DiscoveryReportDirectory} not found.");
if (!File.Exists(DiscoveryReportConstants.DiscoveryReportPath))
throw new Exception($"Discovery report file {DiscoveryReportConstants.DiscoveryReportPath} not found");
UserInputObj.LoggerObj.LogInformation("Validated the presence of Discovery Report");
}
private void ValidateDiscoveryReport(XLWorkbook discoveryWb)
{
var discoveryDataSheet = discoveryWb.Worksheet(2);
var headerRow = discoveryDataSheet.Row(1);
UserInputObj.LoggerObj.LogInformation("Validating columns of discovery report");
var columns = DiscoveryReportConstants.DiscoveryReportColumns;
for (int i = 0; i < columns.Count; i++)
{
var column = columns[i];
if (string.IsNullOrEmpty(column))
throw new Exception("Encountered empty column name from app settings");
var cell = headerRow.Cell(i + 1);
string sheetColumn = cell.GetValue<string>();
if (string.IsNullOrEmpty(sheetColumn))
throw new Exception($"Expected column {column}, but received empty column name");
if (!column.Equals(sheetColumn))
throw new Exception($"Expected column {column}, but encountered column {sheetColumn}");
}
UserInputObj.LoggerObj.LogInformation("Validated columns in discovery report excel");
}
private void LoadExcelData(XLWorkbook discoveryWb)
{
UserInputObj.LoggerObj.LogInformation("Loading data from discovery report");
var discoveryDataSheet = discoveryWb.Worksheet(2);
int i = 2;
var row = discoveryDataSheet.Row(i);
while (!row.IsEmpty())
{
i += 1;
DiscoveryData obj = new DiscoveryData();
obj.MachineName = row.Cell(1).GetValue<string>();
obj.EnvironmentType = row.Cell(2).GetValue<string>();
obj.SoftwareInventory = row.Cell(3).GetValue<int>();
obj.SqlDiscoveryServerCount = row.Cell(4).GetValue<int>();
obj.IsSqlServicePresent = row.Cell(5).GetValue<bool>();
obj.WebAppCount = row.Cell(6).GetValue<int>();
obj.OperatingSystem = row.Cell(7).GetValue<string>();
obj.Cores = row.Cell(8).GetValue<int>();
obj.MemoryInMB = row.Cell(9).GetValue<double>();
obj.TotalDisks = row.Cell(10).GetValue<int>();
obj.IpAddress = row.Cell(11).GetValue<string>();
obj.MacAddress = row.Cell(12).GetValue<string>();
obj.TotalNetworkAdapters = row.Cell(13).GetValue<int>();
obj.BootType = row.Cell(14).GetValue<string>();
obj.PowerStatus = row.Cell(15).GetValue<string>();
obj.SupportStatus = row.Cell(16).GetValue<string>();
obj.FirstDiscoveryTime = row.Cell(17).GetValue<string>();
obj.LastUpdatedTime = row.Cell(18).GetValue<string>();
obj.MachineId = row.Cell(19).GetValue<string>();
DiscoveredData.Add(obj);
row = discoveryDataSheet.Row(i);
}
UserInputObj.LoggerObj.LogInformation($"Updated discovery data model with {DiscoveredData.Count} machines");
}
}
}