private static async Task RunOptions()

in sdk/storage/Azure.Storage.DataMovement.Blobs/stress/src/src/Program.cs [39:323]


    private static async Task RunOptions(Options opts)
    {
        // See if there are environment variables available to use in the .env file
        var environment = new Dictionary<string, string>();
        var environmentFile = Environment.GetEnvironmentVariable("ENV_FILE");
        environment = EnvironmentReader.LoadFromFile(environmentFile);

        environment.TryGetValue(DataMovementBlobStressConstants.EnvironmentVariables.ApplicationInsightsKey, out var appInsightsKey);
        environment.TryGetValue(DataMovementBlobStressConstants.EnvironmentVariables.StorageSourceBlobEndpoint, out var blobSourceEndpoint);
        environment.TryGetValue(DataMovementBlobStressConstants.EnvironmentVariables.StorageDestinationBlobEndpoint, out var blobDestinationEndpoint);

        // Check values

        // If a job index is provided, a single role is started, otherwise, all specified roles within the
        // test scenario runs are run in parallel.

        TokenCredential tokenCredential = new DefaultAzureCredential();

        using var cancellationSource = new CancellationTokenSource();
        var runDuration = TimeSpan.FromHours(1);
        cancellationSource.CancelAfter(runDuration);

        var metrics = new Metrics(appInsightsKey);

        using var azureEventListener = new AzureEventSourceListener((args, level) => metrics.Client.TrackTrace($"EventWritten: {args.ToString()} Level: {level}."), EventLevel.Warning);

        try
        {
            TestScenarioName testScenarioName = StringToTestScenario(opts.Test);
            metrics.Client.Context.GlobalProperties["TestName"] = opts.Test;
            string guid = Guid.NewGuid().ToString();

            metrics.Client.TrackEvent($"Starting a test {testScenarioName} run.");

            TestScenarioBase testScenario = null;
            TransferManagerOptions transferManagerOptions = new TransferManagerOptions()
            {
                MaximumConcurrency = opts.Parallel,
            };
            TransferOptions transferOptions = new()
            {
                MaximumTransferChunkSize = opts.BlockSize,
                InitialTransferSize = opts.InitialTransferSize,
            };
            switch (testScenarioName)
            {
                case TestScenarioName.UploadSingleBlockBlob:
                    testScenario = new UploadBlockBlobSingleScenario(
                        new Uri(blobSourceEndpoint),
                        opts.Size,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.UploadDirectoryBlockBlob:
                    testScenario = new UploadBlockBlobDirectoryScenario(
                        destinationBlobUri: new Uri(blobSourceEndpoint),
                        blobSize: opts.Size,
                        blobCount: opts.Count,
                        transferManagerOptions: transferManagerOptions,
                        transferOptions: transferOptions,
                        tokenCredential: tokenCredential,
                        metrics: metrics,
                        testRunId: guid);
                    break;
                case TestScenarioName.DownloadSingleBlockBlob:
                    testScenario = new DownloadBlockBlobSingleScenario(
                        new Uri(blobSourceEndpoint),
                        opts.Size,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.DownloadDirectoryBlockBlob:
                    testScenario = new DownloadBlockBlobDirectoryScenario(
                        new Uri(blobSourceEndpoint),
                        opts.Size,
                        opts.Count,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.CopySingleBlockBlob:
                    testScenario = new CopyBlockBlobSingleScenario(
                        new Uri(blobSourceEndpoint),
                        new Uri(blobDestinationEndpoint),
                        opts.Size,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.CopyDirectoryBlockBlob:
                    testScenario = new CopyBlockBlobDirectoryScenario(
                        new Uri(blobSourceEndpoint),
                        new Uri(blobDestinationEndpoint),
                        opts.Size,
                        opts.Count,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.UploadSingleAppendBlob:
                    testScenario = new UploadAppendBlobSingleScenario(
                        new Uri(blobSourceEndpoint),
                        opts.Size,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.UploadDirectoryAppendBlob:
                    testScenario = new UploadAppendBlobDirectoryScenario(
                        new Uri(blobSourceEndpoint),
                        opts.Size,
                        opts.Count,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.DownloadSingleAppendBlob:
                    testScenario = new DownloadAppendBlobSingleScenario(
                        new Uri(blobSourceEndpoint),
                        opts.Size,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.DownloadDirectoryAppendBlob:
                    testScenario = new DownloadAppendBlobDirectoryScenario(
                        new Uri(blobSourceEndpoint),
                        opts.Size,
                        opts.Count,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.CopySingleAppendBlob:
                    testScenario = new CopyAppendBlobSingleScenario(
                        new Uri(blobSourceEndpoint),
                        new Uri(blobDestinationEndpoint),
                        opts.Size,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.CopyDirectoryAppendBlob:
                    testScenario = new CopyAppendBlobDirectoryScenario(
                        new Uri(blobSourceEndpoint),
                        new Uri(blobDestinationEndpoint),
                        opts.Size,
                        opts.Count,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.UploadSinglePageBlob:
                    testScenario = new UploadPageBlobSingleScenario(
                        new Uri(blobSourceEndpoint),
                        opts.Size,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.UploadDirectoryPageBlob:
                    testScenario = new UploadPageBlobDirectoryScenario(
                        new Uri(blobSourceEndpoint),
                        opts.Size,
                        opts.Count,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.DownloadSinglePageBlob:
                    testScenario = new DownloadPageBlobSingleScenario(
                        new Uri(blobSourceEndpoint),
                        opts.Size,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.DownloadDirectoryPageBlob:
                    testScenario = new DownloadPageBlobDirectoryScenario(
                        new Uri(blobSourceEndpoint),
                        opts.Size,
                        opts.Count,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.CopySinglePageBlob:
                    testScenario = new CopyPageBlobSingleScenario(
                        new Uri(blobSourceEndpoint),
                        new Uri(blobDestinationEndpoint),
                        opts.Size,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                case TestScenarioName.CopyDirectoryPageBlob:
                    testScenario = new CopyPageBlobDirectoryScenario(
                        new Uri(blobSourceEndpoint),
                        new Uri(blobDestinationEndpoint),
                        opts.Size,
                        opts.Count,
                        transferManagerOptions,
                        transferOptions,
                        tokenCredential,
                        tokenCredential,
                        metrics,
                        guid);
                    break;
                default:
                    throw new Exception("No Scenario or Invalid scenario passed");
            }

            var testRun = testScenario.RunTestAsync(cancellationSource.Token);

            while (!testRun.IsCompleted)
            {
                metrics.UpdateEnvironmentStatistics();
                await Task.Delay(TimeSpan.FromMinutes(5), cancellationSource.Token).ConfigureAwait(false);
            }

            metrics.Client.TrackEvent("Test run is ending.");
        }
        catch (TaskCanceledException)
        {
            // Run is complete
        }
        catch (Exception ex) when
            (ex is OutOfMemoryException
            || ex is StackOverflowException
            || ex is ThreadAbortException)
        {
            throw;
        }
        catch (Exception ex)
        {
            metrics.Client.TrackException(ex);
        }
        finally
        {
            // We need to wait one minute after flushing the Application Insights client. The Application
            // Insights flush is non-deterministic, so we don't want to let the application close until
            // all telemetry has been sent.
            metrics.Client.Flush();
            await Task.Delay(60000).ConfigureAwait(false);
        }
    }