public UpdateResult DoRollback(Guid UpdateInstructionID, Guid RollbackUpdateBackupID) { UpdateInstruction UpdateInstruction = _UpdateRepository.GetUpdateInstructionByID(UpdateInstructionID); UpdateBackupEntry UpdateBackupEntry = _UpdateRepository.GetUpdateBackupEntryFromUpdateID(UpdateInstruction, RollbackUpdateBackupID); string AnalyticsMessageResult = ""; var updateResultReturn = new UpdateResult() { ID = UpdateInstruction.ID, IsSuccess = false, //Message = "No update found. Nothing to update!", UpdateInstructionID = UpdateInstruction.ID }; try { Version CurrentVersionBeforeRollback = this.GetCurrentAssemblyVersion(UpdateInstruction); JobStatus JobStatus = _JobService.GetQueuePosition(new JobStatus() { ID = UpdateInstruction.ID }); updateResultReturn = ExecuteRollback(UpdateInstruction, UpdateBackupEntry); AnalyticsMessageResult = !updateResultReturn.IsSuccess ? $"Job '{JobStatus.QueuePosition}' Failed to rollback '{UpdateInstruction.Name}' from '{CurrentVersionBeforeRollback}' to '{UpdateBackupEntry.BackupVersion}'. Alepsed time is: {this.ConvertMillisecondsToTimeString(updateResultReturn.TimeSpentMilliseconds)}.\r\nSee details:\r\n\r\n{ JsonConvert.SerializeObject(updateResultReturn.Messages, Formatting.Indented)}" : $"Job '{JobStatus.QueuePosition}' rollback success for product '{UpdateInstruction.Name}' from '{CurrentVersionBeforeRollback}' to '{UpdateBackupEntry.BackupVersion}'. Alepsed time is: {this.ConvertMillisecondsToTimeString(updateResultReturn.TimeSpentMilliseconds)}."; } catch (Exception ex) { throw ex; } finally { _JobService.CreateUpdateJobStatus(new JobStatus() { ID = UpdateInstruction.ID, CurrentStatus = JobStatusTyes.Completed }); } this.SendAnalyticsData("UpdateService.DoRollback.Results", AnalyticsMessageResult); return(updateResultReturn); }