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();
 }
Example #2
0
        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);
        }
Example #6
0
        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;
            }
        }