private void VerifyPostFiles(ProcessedTriggerInfo processedTriggerInfo, CromwellOnAzureEnvironment environment) { var files = RetrievePostFiles(processedTriggerInfo, environment); Assert.AreEqual(processedTriggerInfo.WorkflowInputs.Count + 1, files.Count, "unexpected number of files"); Assert.AreEqual("workflowSource", files[0].ParameterName, $"unexpected ParameterName for the 0th file"); Assert.AreEqual(processedTriggerInfo.WorkflowSource.Filename, files[0].Filename, $"unexpected Filename for the 0th file"); AssertBytesEqual(processedTriggerInfo.WorkflowSource.Data, files[0].Data, "files[0].Data"); for (var i = 0; i < processedTriggerInfo.WorkflowInputs.Count; i++) { var ip1 = i + 1; if (i == 0) { Assert.AreEqual("workflowInputs", files[ip1].ParameterName, $"unexpected ParameterName for file #{ip1}"); } else { Assert.AreEqual("workflowInputs_" + ip1, files[ip1].ParameterName, $"unexpected ParameterName for file #{ip1}"); } Assert.AreEqual(processedTriggerInfo.WorkflowInputs[i].Filename, files[ip1].Filename, $"unexpected Filename for file #{ip1}"); AssertBytesEqual(processedTriggerInfo.WorkflowInputs[i].Data, files[ip1].Data, $"files[{ip1}].Data"); } }
private async Task <(string, byte[])> GetBlobFileNameAndDataUsingMocksAsync(string url, string accountAuthority) { var serviceCollection = new ServiceCollection() .AddLogging(loggingBuilder => loggingBuilder.AddConsole()); var serviceProvider = serviceCollection.BuildServiceProvider(); var azStorageMock = new Mock <IAzureStorage>(); azStorageMock.Setup(az => az .DownloadBlockBlobAsync(It.IsAny <string>())) .Returns(Task.FromResult(blobData)); azStorageMock.Setup(az => az .DownloadFileUsingHttpClientAsync(It.IsAny <string>())) .Returns(Task.FromResult(httpClientData)); azStorageMock.SetupGet(az => az.AccountAuthority).Returns(accountAuthority); var environment = new CromwellOnAzureEnvironment( serviceProvider.GetRequiredService <ILoggerFactory>(), azStorageMock.Object, new CromwellApiClient.CromwellApiClient("http://cromwell:8000")); return(await environment.GetBlobFileNameAndData(url)); }
private static async Task <(string newTriggerName, Workflow newTriggerContent)> ProcessAbortRequestAsync(Guid workflowId, ICromwellApiClient cromwellApiClient) { string newTriggerName = null; Workflow newTriggerContent = null; var loggerFactory = new Mock <ILoggerFactory>(); var azureStorage = new Mock <IAzureStorage>(); var repository = new Mock <IRepository <TesTask> >(); loggerFactory .Setup(f => f.CreateLogger(It.IsAny <string>())) .Returns(new Mock <ILogger>().Object); azureStorage .Setup(az => az.GetWorkflowsByStateAsync(WorkflowState.Abort)) .Returns(Task.FromResult(new[] { new TriggerFile { Uri = $"http://tempuri.org/workflows/abort/{workflowId}.json", ContainerName = "workflows", Name = $"abort/{workflowId}.json", LastModified = DateTimeOffset.UtcNow } }.AsEnumerable())); azureStorage .Setup(az => az.DownloadBlobTextAsync(It.IsAny <string>(), $"abort/{workflowId}.json")) .Returns(Task.FromResult(string.Empty)); azureStorage .Setup(az => az.UploadFileTextAsync(It.IsAny <string>(), "workflows", It.IsAny <string>())) .Callback((string content, string container, string blobName) => { newTriggerName = blobName; newTriggerContent = content is not null ? JsonConvert.DeserializeObject <Workflow>(content) : null; }); var cromwellOnAzureEnvironment = new CromwellOnAzureEnvironment(loggerFactory.Object, azureStorage.Object, cromwellApiClient, repository.Object, Enumerable.Repeat(azureStorage.Object, 1)); await cromwellOnAzureEnvironment.ProcessAndAbortWorkflowsAsync(); return(newTriggerName, newTriggerContent); }
private CromwellOnAzureEnvironment SetCromwellOnAzureEnvironment(string accountAuthority) { var serviceCollection = new ServiceCollection() .AddLogging(loggingBuilder => loggingBuilder.AddConsole()); var serviceProvider = serviceCollection.BuildServiceProvider(); var azStorageMock = new Mock <IAzureStorage>(); azStorageMock.Setup(az => az .DownloadBlockBlobAsync(It.IsAny <string>())) .Returns(Task.FromResult(blobData)); azStorageMock.Setup(az => az .DownloadFileUsingHttpClientAsync(It.IsAny <string>())) .Returns(Task.FromResult(httpClientData)); azStorageMock.SetupGet(az => az.AccountAuthority).Returns(accountAuthority); var accountName = accountAuthority; var subdomainEndIndex = accountAuthority.IndexOf("."); if (subdomainEndIndex > 0) { accountName = accountAuthority.Substring(0, subdomainEndIndex); } azStorageMock.SetupGet(az => az.AccountName).Returns(accountName); var environment = new CromwellOnAzureEnvironment( serviceProvider.GetRequiredService <ILoggerFactory>(), azStorageMock.Object, new CromwellApiClient.CromwellApiClient("http://cromwell:8000")); return(environment); }
private static List <CromwellApiClient.CromwellApiClient.FileToPost> RetrievePostFiles(ProcessedTriggerInfo processedTriggerInfo, CromwellOnAzureEnvironment environment) { var cromwellApiClient = (CromwellApiClient.CromwellApiClient)environment.cromwellApiClient; return(cromwellApiClient.AccumulatePostFiles( processedTriggerInfo.WorkflowSource.Filename, processedTriggerInfo.WorkflowSource.Data, processedTriggerInfo.WorkflowInputs.Select(a => a.Filename).ToList(), processedTriggerInfo.WorkflowInputs.Select(a => a.Data).ToList(), processedTriggerInfo.WorkflowOptions.Filename, processedTriggerInfo.WorkflowOptions.Data, processedTriggerInfo.WorkflowDependencies.Filename, processedTriggerInfo.WorkflowDependencies.Data)); }
public async Task NewWorkflowsThatFailToParseAsJsonAreAnotatedAndMovedToFailedSubdirectory() { const string badJason = @"{'WorkflowUrl': 'https://tempuri.org/inputs/bam-to-unmapped-bams.wdl' 'WorkflowInputsUrl': 'https://tempuri.org/inputs/bam-to-unmapped-bams.inputs.json'}"; const string errPrefix = "\nError(s): "; var cromwellApiClient = new Mock <ICromwellApiClient>(); var triesToPost = false; cromwellApiClient .Setup(ac => ac.PostWorkflowAsync(It.IsAny <string>(), It.IsAny <byte[]>(), It.IsAny <List <string> >(), It.IsAny <List <byte[]> >(), It.IsAny <string>(), It.IsAny <byte[]>(), It.IsAny <string>(), It.IsAny <byte[]>())) .Callback(() => triesToPost = true) .Throws(new Exception("Should never get here.")); string newTriggerName = null; string newTriggerContent = null; var loggerFactory = new Mock <ILoggerFactory>(); var azureStorage = new Mock <IAzureStorage>(); var repository = new Mock <IRepository <TesTask> >(); loggerFactory .Setup(f => f.CreateLogger(It.IsAny <string>())) .Returns(new Mock <ILogger>().Object); azureStorage .Setup(az => az.GetWorkflowsByStateAsync(WorkflowState.New)) .Returns(Task.FromResult(new[] { new TriggerFile { Uri = $"http://tempuri.org/workflows/new/Sample.json", ContainerName = "workflows", Name = $"new/Sample.json", LastModified = DateTimeOffset.UtcNow } }.AsEnumerable())); azureStorage .Setup(az => az.DownloadBlobTextAsync(It.IsAny <string>(), $"new/Sample.json")) .Returns(Task.FromResult(badJason)); azureStorage .Setup(az => az.UploadFileTextAsync(It.IsAny <string>(), "workflows", It.IsAny <string>())) .Callback((string content, string container, string blobName) => { newTriggerName = blobName; newTriggerContent = content; }); var deleted = false; azureStorage .Setup(az => az.DeleteBlobIfExistsAsync(It.IsAny <string>(), $"new/Sample.json")) .Callback(() => deleted = true); var cromwellOnAzureEnvironment = new CromwellOnAzureEnvironment(loggerFactory.Object, azureStorage.Object, cromwellApiClient.Object, repository.Object, Enumerable.Repeat(azureStorage.Object, 1)); await cromwellOnAzureEnvironment.ProcessAndAbortWorkflowsAsync(); Assert.IsTrue(newTriggerName.StartsWith("failed/")); Assert.IsTrue(deleted); Assert.IsFalse(triesToPost); Assert.IsTrue((badJason + errPrefix).Length < newTriggerContent.Length); Assert.IsTrue(newTriggerContent.StartsWith(badJason + errPrefix)); }