aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs
diff options
context:
space:
mode:
authorAvi Levkovich <avi@twine-s.com>2019-12-17 14:37:38 +0200
committerAvi Levkovich <avi@twine-s.com>2019-12-17 14:37:38 +0200
commit8a7e65715ef393a08cc39d1b5d4a3da22799c852 (patch)
treef71065b4c0000aafad1356ff2ab6b17f8287476b /Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs
parentc653fa2077b6118c2ace3b7bcc8bc91c9a9ed4f5 (diff)
parent3ed7e9cc55e10888d84aa53abcb5e765a317ddb1 (diff)
downloadTango-8a7e65715ef393a08cc39d1b5d4a3da22799c852.tar.gz
Tango-8a7e65715ef393a08cc39d1b5d4a3da22799c852.zip
merge conflicts
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.cs160
1 files changed, 132 insertions, 28 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 29c5bc6a2..29daedb4c 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();
@@ -135,8 +240,6 @@ namespace Tango.PPC.Common.MachineSetup
request.DeviceID = await _windows_manager.GetDeviceId();
request.DeviceName = await _windows_manager.GetDeviceName();
- MachineSetupResponse setup_response = null;
-
try
{
LogManager.Log($"Sending setup request...\n{request.ToJsonString()}");
@@ -180,7 +283,7 @@ namespace Tango.PPC.Common.MachineSetup
{
LogManager.Log("Installing remote assistance...");
UpdateProgress("Installing remote assistance", "Installing...");
- await _remoteAssistance.InstallRemoteAssistance(serialNumber,settings.DeploymentSlot.ToString());
+ await _remoteAssistance.InstallRemoteAssistance(serialNumber, settings.DeploymentSlot.ToString());
}
if (setup_response.SetupUWF)
@@ -204,27 +307,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...");
@@ -324,21 +429,21 @@ namespace Tango.PPC.Common.MachineSetup
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 +452,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;