/// <summary> /// Post REST message to start running task /// </summary> /// <param name="runId"></param> /// <param name="scenarioId"></param> /// <param name="real"></param> public GetAutoBookStatusModel StartAutoBookRun(Guid runId, Guid scenarioId) { var startAutoBookTaskModel = new StartAutoBookTaskModel() { runId = runId, scenarioId = scenarioId, binariesVersion = _autoBookSettings.BinariesVersion }; string url = $"{_autoBook.Api}/task"; byte[] contentBody = SerializeContentBody(startAutoBookTaskModel); var webRequest = CreateHttpWebRequest(url, "POST", GetAuthHeaders(authType, _accessToken), ContentTypeJSON, contentBody); var webResponse = (HttpWebResponse)webRequest.GetResponse(); ThrowExceptionIfNotSuccess(webResponse, new List <HttpStatusCode>() { HttpStatusCode.OK }); // Get response GetAutoBookStatusModel status = null; using (var reader = new StreamReader(webResponse.GetResponseStream())) { string data = reader.ReadToEnd().ToLower(); status = DeserializeContentBody <GetAutoBookStatusModel>(data); } return(status); }
/// <summary> /// Returns status /// </summary> /// <returns></returns> public AutoBookStatuses GetStatus() { string url = $"{_autoBook.Api}/status"; var webRequest = CreateHttpWebRequest(url, "GET", GetAuthHeaders(authType, _accessToken), string.Empty, null); var webResponse = (HttpWebResponse)webRequest.GetResponse(); ThrowExceptionIfNotSuccess(webResponse, new List <HttpStatusCode>() { HttpStatusCode.OK }); // Get response GetAutoBookStatusModel status = null; using (var reader = new StreamReader(webResponse.GetResponseStream())) { string data = reader.ReadToEnd().ToLower(); status = DeserializeContentBody <GetAutoBookStatusModel>(data); } return(status.Status); }
/// <summary> /// Starts run. Uploads input data and then instructs AutoBook instance to start /// </summary> /// <param name="autoBookInterface"></param> /// <param name="autoBook"></param> public void UploadInputFilesStartAutoBookRun(IAutoBook autoBookInterface, AutoBook autoBook) { using var scope = _repositoryFactory.BeginRepositoryScope(); var runRepository = scope.CreateRepository <IRunRepository>(); var autoBookRepository = scope.CreateRepository <IAutoBookRepository>(); bool startedRun = false; try { // Update scenario status to Starting, Scenario.StartedDateTime has already been set RunManager.UpdateScenarioStatuses(_repositoryFactory, _auditEventRepository, RunId, new List <Guid>() { ScenarioId }, new List <ScenarioStatuses>() { ScenarioStatuses.Starting }); // Get run var run = runRepository.Find(RunId); // Record which run/scenario is being processed //IAutoBookRepository autoBookRepository = (IAutoBookRepository)repositories[typeof(IAutoBookRepository)]; //AutoBook localAutoBook = autoBookRepository.Find(autoBook.Id); lock (autoBook) { autoBook.Status = AutoBookStatuses.In_Progress; autoBook.LastRunStarted = DateTime.UtcNow; autoBook.Locked = true; autoBook.Task = new AutoBookTask() { RunId = RunId, ScenarioId = ScenarioId }; } autoBookRepository.Update(autoBook); autoBookRepository.SaveChanges(); // Force save // Upload input data _autoBookInputHandler.Handle(run, ScenarioId); // Instruct AutoBook to start processing bool loggedNotifyFinished = false; try { _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForGameplanPipelineStart(0, 0, PipelineEventIDs.STARTED_NOTIFYING_AUTOBOOK_API, RunId, ScenarioId, autoBook.Id, null)); GetAutoBookStatusModel autoBookStatusModel = autoBookInterface.StartAutoBookRun(RunId, ScenarioId); _pipelineAuditEventRepository.Add(PipelineEventHelper.CreatePipelineAuditEvent(AuditEventTypes.GamePlanRun, PipelineEventIDs.STARTED_NOTIFYING_AUTOBOOK_API, RunId, ScenarioId, null)); if (autoBookStatusModel.Status == AutoBookStatuses.In_Progress) // Task_Error or Fatal_Error { _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForGameplanPipelineEnd(0, 0, PipelineEventIDs.FINISHED_NOTIFYING_AUTOBOOK_API, RunId, ScenarioId, autoBook.Id, null, null, null)); _pipelineAuditEventRepository.Add(PipelineEventHelper.CreatePipelineAuditEvent(AuditEventTypes.GamePlanRun, PipelineEventIDs.FINISHED_NOTIFYING_AUTOBOOK_API, RunId, ScenarioId, null)); loggedNotifyFinished = true; } else { _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForGameplanPipelineEnd(0, 0, PipelineEventIDs.FINISHED_NOTIFYING_AUTOBOOK_API, RunId, ScenarioId, autoBook.Id, null, String.Format( "AutoBook API unexpectedly returned status {0} when instructing it to start run", autoBookStatusModel.ToString()), null)); _pipelineAuditEventRepository.Add(PipelineEventHelper.CreatePipelineAuditEvent(AuditEventTypes.GamePlanRun, PipelineEventIDs.FINISHED_NOTIFYING_AUTOBOOK_API, RunId, ScenarioId, $"AutoBook API unexpectedly returned status {autoBookStatusModel.ToString()} " + "when instructing it to start run")); loggedNotifyFinished = true; throw new Exception(String.Format( "AutoBook returned status {0} when starting run (AutoBookID={1})", autoBookStatusModel.Status, autoBook.Id)); } } catch (System.Exception exception) { if (!loggedNotifyFinished) { _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForGameplanPipelineEnd(0, 0, PipelineEventIDs.FINISHED_NOTIFYING_AUTOBOOK_API, RunId, ScenarioId, autoBook.Id, null, exception.Message, exception)); _pipelineAuditEventRepository.Add(PipelineEventHelper.CreatePipelineAuditEvent(AuditEventTypes.GamePlanRun, PipelineEventIDs.FINISHED_NOTIFYING_AUTOBOOK_API, RunId, ScenarioId, exception.Message)); } throw; } finally { _pipelineAuditEventRepository.SaveChanges(); } // Flag as InProgress RunManager.UpdateScenarioStatuses(_repositoryFactory, _auditEventRepository, RunId, new List <Guid>() { ScenarioId }, new List <ScenarioStatuses>() { ScenarioStatuses.InProgress }); startedRun = true; } catch { throw; } finally { // Clean up failure if (!startedRun) { // Reset to free, unlocks AutoBook instance so that it can be re-used autoBookInterface.ResetFree(); autoBookRepository.SaveChanges(); _pipelineAuditEventRepository.SaveChanges(); } } }