aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy@twine-s.com>2020-12-30 15:11:34 +0000
committerRoy Ben Shabat <Roy@twine-s.com>2020-12-30 15:11:34 +0000
commitd33c19b3ac6803de4b5c8d475832efef131c1a45 (patch)
treeea725abc39def99a755b041c13cba1fe0d594ddc /Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs
parent1bdcaa9f51303bbff682507f31fb3b4414692ca4 (diff)
downloadTango-d33c19b3ac6803de4b5c8d475832efef131c1a45.tar.gz
Tango-d33c19b3ac6803de4b5c8d475832efef131c1a45.zip
Revert "Hope it is fine"
Diffstat (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs')
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs200
1 files changed, 157 insertions, 43 deletions
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs
index 004c37096..15902f629 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs
@@ -11,12 +11,15 @@ using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
+using Tango.BL;
+using Tango.BL.Entities;
using Tango.Core;
using Tango.Core.DB;
using Tango.Core.ExtensionMethods;
using Tango.Core.Helpers;
using Tango.Core.IO;
using Tango.Integration.Operation;
+using Tango.Logging;
using Tango.PMR.Synchronization;
using Tango.PPC.Common.Application;
using Tango.PPC.Common.Connection;
@@ -28,6 +31,7 @@ using Tango.Settings;
using Tango.SharedUI.Helpers;
using Tango.SQLExaminer;
using Tango.Transport.Web;
+using System.Data.Entity;
namespace Tango.PPC.Common.MachineSetup
{
@@ -42,6 +46,9 @@ namespace Tango.PPC.Common.MachineSetup
private IUnifiedWriteFilterManager _uwf;
private IOperationSystemManager _windows_manager;
private PPCWebClient _client;
+ private List<LogItemBase> _logs;
+ private bool _isUpdating;
+ private DateTime _setupStartDate;
#region Events
@@ -80,6 +87,21 @@ namespace Tango.PPC.Common.MachineSetup
_remoteAssistance = remoteAssistance;
_uwf = unifiedWriterFilterManager;
_windows_manager = operationSystemManager;
+
+ _logs = new List<LogItemBase>();
+ LogManager.NewLog += LogManager_NewLog;
+ }
+
+ #endregion
+
+ #region Event Handlers
+
+ private void LogManager_NewLog(object sender, LogItemBase e)
+ {
+ if (_isUpdating)
+ {
+ _logs.Add(e);
+ }
}
#endregion
@@ -99,6 +121,82 @@ namespace Tango.PPC.Common.MachineSetup
});
}
+ private async void OnFailed(Exception ex, TaskCompletionSource<MachineSetupResult> completionSource, MachineSetupResponse response)
+ {
+ LogManager.Log(ex, "An error occurred in machine setup.");
+
+ completionSource.SetException(ex);
+
+ if (response != null)
+ {
+ try
+ {
+ var result = await _client.NotifyUpdateCompleted(new MachineUpdateCompletedRequest()
+ {
+ Token = response.NotifyCompletedToken,
+ Status = BL.Enumerations.TangoUpdateStatuses.SetupFailed,
+ FailedReason = ex.FlattenMessage(),
+ FailedLog = GetLogsStringAndClear(),
+ });
+ }
+ catch (Exception xx)
+ {
+ LogManager.Log(xx, "Error notifying setup completed.");
+ }
+ }
+
+ _isUpdating = false;
+ }
+
+ private async void OnCompleted(MachineSetupResult result, TaskCompletionSource<MachineSetupResult> completionSource, MachineSetupResponse response)
+ {
+ completionSource.SetResult(result);
+
+ if (response != null)
+ {
+ try
+ {
+ var r = await _client.NotifyUpdateCompleted(new MachineUpdateCompletedRequest()
+ {
+ Token = response.NotifyCompletedToken,
+ Status = BL.Enumerations.TangoUpdateStatuses.SetupCompleted,
+ });
+ }
+ catch (Exception xx)
+ {
+ LogManager.Log(xx, "Error notifying setup completed.");
+ }
+
+ try
+ {
+ using (ObservablesContext db = ObservablesContext.CreateDefault())
+ {
+ TangoUpdate update = new TangoUpdate();
+ update.ApplicationVersion = response.Version;
+ update.FirmwareVersion = response.FirmwareVersion;
+ update.MachineGuid = (await db.Machines.FirstAsync()).Guid;
+ update.UpdateStatus = BL.Enumerations.TangoUpdateStatuses.SetupCompleted;
+ update.StartDate = _setupStartDate;
+ update.EndDate = DateTime.UtcNow;
+ await db.SaveChangesAsync();
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Error saving tango setup information to database.");
+ }
+ }
+
+ _isUpdating = false;
+ }
+
+ private String GetLogsStringAndClear()
+ {
+ String logsString = String.Join(Environment.NewLine, _logs.ToList().Select(x => x.ToString()));
+ _logs.Clear();
+ return logsString;
+ }
+
#endregion
#region Public Methods
@@ -111,10 +209,17 @@ namespace Tango.PPC.Common.MachineSetup
/// <returns></returns>
public async Task<MachineSetupResult> Setup(string serialNumber)
{
+ _logs.Clear();
+
TaskCompletionSource<MachineSetupResult> result = new TaskCompletionSource<MachineSetupResult>();
+ MachineSetupResponse setup_response = null;
+ _setupStartDate = DateTime.UtcNow;
+
try
{
+ _isUpdating = true;
+
LogManager.Log($"Starting machine setup for serial number {serialNumber}...");
var machineServiceAddress = SettingsManager.Default.GetOrCreate<PPCSettings>().GetMachineServiceAddress();
@@ -130,16 +235,24 @@ namespace Tango.PPC.Common.MachineSetup
Login(serialNumber).Wait();
+ String deviceName = $"Tango-{serialNumber}-{settings.DeploymentSlot.ToString()}";
+ LogManager.Log($"Settings device name: '{deviceName}'...");
+ try
+ {
+ await _windows_manager.SetDeviceName(deviceName);
+ }
+ catch
+ {
+ throw new IOException("Error setting device name.");
+ }
+
MachineSetupRequest request = new MachineSetupRequest();
- request.SerialNumber = serialNumber;
request.DeviceID = await _windows_manager.GetDeviceId();
- request.DeviceName = await _windows_manager.GetDeviceName();
-
-
- MachineSetupResponse setup_response = null;
+ request.DeviceName = deviceName;
try
{
+ LogManager.Log($"Sending setup request...\n{request.ToJsonString()}");
setup_response = await _client.MachineSetup(request);
}
catch (Exception ex)
@@ -175,20 +288,20 @@ namespace Tango.PPC.Common.MachineSetup
UpdateProgress("Activating operation system license", "Activating...");
await _windows_manager.Activate(setup_response.OSKey);
}
+ }
- if (setup_response.SetupRemoteAssistance)
- {
- LogManager.Log("Installing remote assistance...");
- UpdateProgress("Installing remote assistance", "Installing...");
- await _remoteAssistance.InstallRemoteAssistance(serialNumber);
- }
+ if (setup_response.SetupRemoteAssistance)
+ {
+ LogManager.Log("Installing remote assistance...");
+ UpdateProgress("Installing remote assistance", "Installing...");
+ await _remoteAssistance.InstallRemoteAssistance(serialNumber, setup_response.Organization, settings.DeploymentSlot.ToString());
+ }
- if (setup_response.SetupUWF)
- {
- LogManager.Log("Activating unified write filter...");
- UpdateProgress("Activating disk protection", "Activating...");
- await _uwf.Setup();
- }
+ if (setup_response.SetupUWF)
+ {
+ LogManager.Log("Activating unified write filter...");
+ UpdateProgress("Activating disk protection", "Activating...");
+ await _uwf.Setup();
}
//Create temporary folders for packages.
@@ -204,27 +317,29 @@ namespace Tango.PPC.Common.MachineSetup
LogManager.Log("Downloading software package...");
- long fileSize = 0;
- UpdateProgress("Downloading software package", "Downloading...", false);
-
- await Task.Factory.StartNew(() =>
+ using (AutoFileDownloader downloader = new AutoFileDownloader(setup_response.BlobAddress, setup_response.CdnAddress, tempFile))
{
- using (FileStreamWrapper fs = new FileStreamWrapper(tempFile.Path, FileMode.Create, (current) =>
+ await downloader.ResolveMode();
+
+ if (downloader.Mode == AutoFileDownloader.DownloadMode.Standard)
{
- UpdateProgress("Downloading software package", "Downloading...", false, current, fileSize);
- }))
+ LogManager.Log($"Connecting to storage CDN with address {downloader.Address}");
+ }
+ else
{
-
- LogManager.Log($"Connecting to storage blob with address {setup_response.BlobAddress}");
- CloudBlockBlob blob = new CloudBlockBlob(new Uri(setup_response.BlobAddress));
- LogManager.Log("Fetching blob attributes...");
- blob.FetchAttributes();
- fileSize = blob.Properties.Length;
- LogManager.Log("Download size: " + fileSize + " bytes.");
- LogManager.Log("Starting blob download...");
- blob.DownloadToStream(fs);
+ LogManager.Log($"Connecting to storage blob with address {downloader.Address}");
}
- });
+
+ downloader.Progress += (x, e) =>
+ {
+ UpdateProgress("Downloading software package", "Downloading...", false, e.Current, e.Total);
+ };
+
+ var size = await downloader.GetFileSize();
+ LogManager.Log("Download size: " + size + " bytes.");
+ LogManager.Log("Starting file download...");
+ await downloader.Download();
+ }
UpdateProgress("Downloading software package", "Extracting package...");
@@ -320,25 +435,25 @@ namespace Tango.PPC.Common.MachineSetup
UpdateProgress("Updating Firmware", "Loading firmware package...");
var tfpPath = Path.Combine(_newPackageTempFolder, "firmware_package.tfp");
var stream = new FileStream(tfpPath, FileMode.Open);
- var handler = await op.UpgradeFirmware(stream);
+ var handler = await op.UpgradeFirmware(stream, setup_response.IsDemo);
handler.Failed += (_, ex) =>
{
stream.Dispose();
- result.SetException(ex);
+ OnFailed(ex, result, setup_response);
};
handler.Completed += (_, __) =>
{
UpdateProgress("Updating Firmware", "Firmware update completed successfully.");
stream.Dispose();
- result.SetResult(new MachineSetupResult()
+ OnCompleted(new MachineSetupResult()
{
UpdatePackagePath = _newPackageTempFolder,
- });
+ }, result, setup_response);
};
handler.Canceled += (_, __) =>
{
stream.Dispose();
- result.SetException(new Exception("The operation has been canceled."));
+ OnFailed(new Exception("The operation has been canceled."), result, setup_response);
};
handler.Progress += (_, e) =>
{
@@ -347,16 +462,15 @@ namespace Tango.PPC.Common.MachineSetup
}
else
{
- result.SetResult(new MachineSetupResult()
+ OnCompleted(new MachineSetupResult()
{
UpdatePackagePath = _newPackageTempFolder,
- });
+ }, result, setup_response);
}
}
catch (Exception ex)
{
- LogManager.Log(ex, "An error occurred in machine setup.");
- result.SetException(ex);
+ OnFailed(ex, result, setup_response);
}
return await result.Task;