public DataStoreTestsFixture() { _blobContainerConfiguration = new BlobContainerConfiguration { ContainerName = Guid.NewGuid().ToString() }; _metadataContainerConfiguration = new BlobContainerConfiguration { ContainerName = Guid.NewGuid().ToString() }; _blobDataStoreConfiguration = new BlobDataStoreConfiguration { ConnectionString = Environment.GetEnvironmentVariable("BlobStore:ConnectionString") ?? BlobLocalEmulator.ConnectionString, }; RecyclableMemoryStreamManager = new RecyclableMemoryStreamManager(); }
public BlobFileStore( BlobServiceClient client, IOptionsMonitor <BlobContainerConfiguration> namedBlobContainerConfigurationAccessor, BlobDataStoreConfiguration blobDataStoreConfiguration) { EnsureArg.IsNotNull(client, nameof(client)); EnsureArg.IsNotNull(namedBlobContainerConfigurationAccessor, nameof(namedBlobContainerConfigurationAccessor)); EnsureArg.IsNotNull(blobDataStoreConfiguration, nameof(blobDataStoreConfiguration)); BlobContainerConfiguration containerConfiguration = namedBlobContainerConfigurationAccessor.Get(Constants.ContainerConfigurationName); _container = client.GetBlobContainerClient(containerConfiguration.ContainerName); _blobDataStoreConfiguration = blobDataStoreConfiguration; }
/// <summary> /// Initializes a new instance of the <see cref="DicomBlobHealthCheck"/> class. /// </summary> /// <param name="client">The blob client factory.</param> /// <param name="configuration">The blob data store configuration.</param> /// <param name="namedBlobContainerConfigurationAccessor">The IOptions accessor to get a named blob container version.</param> /// <param name="testProvider">The test provider.</param> /// <param name="logger">The logger.</param> public DicomBlobHealthCheck( BlobServiceClient client, BlobDataStoreConfiguration configuration, IOptionsSnapshot <BlobContainerConfiguration> namedBlobContainerConfigurationAccessor, IBlobClientTestProvider testProvider, ILogger <DicomBlobHealthCheck> logger) : base( client, configuration, namedBlobContainerConfigurationAccessor, Constants.ContainerConfigurationName, testProvider, logger) { }
public BlobClientProvider( BlobDataStoreConfiguration blobDataStoreConfiguration, IBlobClientInitializer blobClientInitializer, ILogger <BlobClientProvider> logger, IEnumerable <IBlobContainerInitializer> collectionInitializers) { EnsureArg.IsNotNull(blobDataStoreConfiguration, nameof(blobDataStoreConfiguration)); EnsureArg.IsNotNull(blobClientInitializer, nameof(blobClientInitializer)); EnsureArg.IsNotNull(logger, nameof(logger)); EnsureArg.IsNotNull(collectionInitializers, nameof(collectionInitializers)); _blobServiceClient = blobClientInitializer.CreateBlobClient(blobDataStoreConfiguration); _initializationOperation = new RetryableInitializationOperation( () => blobClientInitializer.InitializeDataStoreAsync(_blobServiceClient, blobDataStoreConfiguration, collectionInitializers)); }
public static IServiceCollection AddBlobDataStore(this IServiceCollection services, Action <BlobDataStoreConfiguration> configureAction = null) { EnsureArg.IsNotNull(services, nameof(services)); if (services.Any(x => x.ImplementationType == typeof(BlobClientProvider))) { return(services); } services.Add(provider => { var config = new BlobDataStoreConfiguration(); provider.GetService <IConfiguration>().GetSection(BlobStoreConfigurationSectionName).Bind(config); configureAction?.Invoke(config); if (string.IsNullOrEmpty(config.ConnectionString) && config.AuthenticationType == BlobDataStoreAuthenticationType.ConnectionString) { config.ConnectionString = BlobLocalEmulator.ConnectionString; } return(config); }) .Singleton() .AsSelf(); services.Add <BlobClientProvider>() .Singleton() .AsSelf() .AsService <IHostedService>() // so that it starts initializing ASAP .AsService <IRequireInitializationOnFirstRequest>(); // so that web requests block on its initialization. services.Add(sp => sp.GetService <BlobClientProvider>().CreateBlobClient()) .Singleton() .AsSelf(); services.Add <BlobClientReadWriteTestProvider>() .Singleton() .AsService <IBlobClientTestProvider>(); services.Add <BlobClientInitializer>() .Singleton() .AsService <IBlobClientInitializer>(); services.TryAddSingleton <RecyclableMemoryStreamManager>(); return(services); }
public async Task PerformTestAsync(BlobServiceClient client, BlobDataStoreConfiguration configuration, BlobContainerConfiguration blobContainerConfiguration, CancellationToken cancellationToken = default) { EnsureArg.IsNotNull(client, nameof(client)); EnsureArg.IsNotNull(configuration, nameof(configuration)); EnsureArg.IsNotNull(blobContainerConfiguration, nameof(blobContainerConfiguration)); BlobContainerClient blobContainer = client.GetBlobContainerClient(blobContainerConfiguration.ContainerName); BlockBlobClient blob = blobContainer.GetBlockBlobClient(TestBlobName); using var content = new MemoryStream(Encoding.UTF8.GetBytes(TestBlobContent)); await blob.UploadAsync( content, new BlobHttpHeaders { ContentType = "text/plain" }, cancellationToken : cancellationToken).ConfigureAwait(false); await DownloadBlobContentAsync(blob, cancellationToken).ConfigureAwait(false); }
public DataStoreTestsFixture() { IConfiguration environment = new ConfigurationBuilder() .AddEnvironmentVariables() .Build(); _blobContainerConfiguration = new BlobContainerConfiguration { ContainerName = Guid.NewGuid().ToString() }; _metadataContainerConfiguration = new BlobContainerConfiguration { ContainerName = Guid.NewGuid().ToString() }; _blobDataStoreConfiguration = new BlobDataStoreConfiguration { ConnectionString = environment["BlobStore:ConnectionString"] ?? BlobLocalEmulator.ConnectionString, }; RecyclableMemoryStreamManager = new RecyclableMemoryStreamManager(); }
/// <inheritdoc /> public async Task OpenBlobClientAsync(BlobServiceClient client, BlobDataStoreConfiguration configuration, BlobContainerConfiguration blobContainerConfiguration) { EnsureArg.IsNotNull(client, nameof(client)); EnsureArg.IsNotNull(configuration, nameof(configuration)); EnsureArg.IsNotNull(blobContainerConfiguration, nameof(blobContainerConfiguration)); _logger.LogInformation("Opening blob client connection to container {containerName}", blobContainerConfiguration.ContainerName); try { await _testProvider.PerformTestAsync(client, configuration, blobContainerConfiguration); _logger.LogInformation("Established blob client connection to container {containerName}", blobContainerConfiguration.ContainerName); } catch (Exception e) { _logger.LogCritical(e, "Failed to connect to blob client container {containerName}", blobContainerConfiguration.ContainerName); throw; } }
/// <summary> /// Initializes a new instance of the <see cref="BlobHealthCheck"/> class. /// </summary> /// <param name="client">The cloud blob client factory.</param> /// <param name="configuration">The blob data store configuration.</param> /// <param name="namedBlobContainerConfigurationAccessor">The IOptions accessor to get a named container configuration version.</param> /// <param name="containerConfigurationName">Name to get corresponding container configuration.</param> /// <param name="testProvider">The test provider.</param> /// <param name="logger">The logger.</param> public BlobHealthCheck( BlobServiceClient client, BlobDataStoreConfiguration configuration, IOptionsSnapshot <BlobContainerConfiguration> namedBlobContainerConfigurationAccessor, string containerConfigurationName, IBlobClientTestProvider testProvider, ILogger <BlobHealthCheck> logger) { EnsureArg.IsNotNull(client, nameof(client)); EnsureArg.IsNotNull(configuration, nameof(configuration)); EnsureArg.IsNotNull(namedBlobContainerConfigurationAccessor, nameof(namedBlobContainerConfigurationAccessor)); EnsureArg.IsNotNullOrWhiteSpace(containerConfigurationName, nameof(containerConfigurationName)); EnsureArg.IsNotNull(testProvider, nameof(testProvider)); EnsureArg.IsNotNull(logger, nameof(logger)); _client = client; _configuration = configuration; _blobContainerConfiguration = namedBlobContainerConfigurationAccessor.Get(containerConfigurationName); _testProvider = testProvider; _logger = logger; }
/// <inheritdoc /> public BlobServiceClient CreateBlobClient(BlobDataStoreConfiguration configuration) { EnsureArg.IsNotNull(configuration, nameof(configuration)); _logger.LogInformation("Creating BlobClient instance"); // Configure the blob client default request options and retry logic var blobClientOptions = new BlobClientOptions(); blobClientOptions.Retry.MaxRetries = configuration.RequestOptions.ExponentialRetryMaxAttempts; blobClientOptions.Retry.Mode = Azure.Core.RetryMode.Exponential; blobClientOptions.Retry.Delay = TimeSpan.FromSeconds(configuration.RequestOptions.ExponentialRetryBackoffDeltaInSeconds); blobClientOptions.Retry.NetworkTimeout = TimeSpan.FromMinutes(configuration.RequestOptions.ServerTimeoutInMinutes); if (configuration.AuthenticationType == BlobDataStoreAuthenticationType.ManagedIdentity) { var defaultCredentials = new DefaultAzureCredential(); return(new BlobServiceClient(new Uri(configuration.ConnectionString), defaultCredentials, blobClientOptions)); } return(new BlobServiceClient(configuration.ConnectionString, blobClientOptions)); }
/// <inheritdoc /> public async Task InitializeDataStoreAsync(BlobServiceClient client, BlobDataStoreConfiguration configuration, IEnumerable <IBlobContainerInitializer> containerInitializers) { EnsureArg.IsNotNull(client, nameof(client)); EnsureArg.IsNotNull(configuration, nameof(configuration)); EnsureArg.IsNotNull(containerInitializers, nameof(containerInitializers)); try { _logger.LogInformation("Initializing Blob Storage and containers"); foreach (IBlobContainerInitializer collectionInitializer in containerInitializers) { await collectionInitializer.InitializeContainerAsync(client); } _logger.LogInformation("Blob Storage and containers successfully initialized"); } catch (Exception ex) { _logger.LogCritical(ex, "Blob Storage and containers initialization failed"); throw; } }