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));
        }
예제 #6
0
        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));
        }