Ejemplo n.º 1
0
        public BlobMetadataStore(
            BlobServiceClient client,
            JsonSerializer jsonSerializer,
            IOptionsMonitor <BlobContainerConfiguration> namedBlobContainerConfigurationAccessor,
            RecyclableMemoryStreamManager recyclableMemoryStreamManager)
        {
            EnsureArg.IsNotNull(client, nameof(client));
            EnsureArg.IsNotNull(jsonSerializer, nameof(jsonSerializer));
            EnsureArg.IsNotNull(namedBlobContainerConfigurationAccessor, nameof(namedBlobContainerConfigurationAccessor));
            EnsureArg.IsNotNull(recyclableMemoryStreamManager, nameof(recyclableMemoryStreamManager));

            BlobContainerConfiguration containerConfiguration = namedBlobContainerConfigurationAccessor.Get(Constants.ContainerConfigurationName);

            _container      = client.GetBlobContainerClient(containerConfiguration.ContainerName);
            _jsonSerializer = jsonSerializer;
            _recyclableMemoryStreamManager = recyclableMemoryStreamManager;
        }
Ejemplo n.º 2
0
        public BlobFileStore(
            BlobServiceClient client,
            IOptionsMonitor <BlobContainerConfiguration> namedBlobContainerConfigurationAccessor,
            RecyclableMemoryStreamManager recyclableMemoryStreamManager,
            BlobDataStoreConfiguration blobDataStoreConfiguration)
        {
            EnsureArg.IsNotNull(client, nameof(client));
            EnsureArg.IsNotNull(namedBlobContainerConfigurationAccessor, nameof(namedBlobContainerConfigurationAccessor));
            EnsureArg.IsNotNull(recyclableMemoryStreamManager, nameof(recyclableMemoryStreamManager));
            EnsureArg.IsNotNull(blobDataStoreConfiguration, nameof(blobDataStoreConfiguration));

            BlobContainerConfiguration containerConfiguration = namedBlobContainerConfigurationAccessor.Get(Constants.ContainerConfigurationName);

            _container = client.GetBlobContainerClient(containerConfiguration.ContainerName);
            _recyclableMemoryStreamManager = recyclableMemoryStreamManager;
            _blobDataStoreConfiguration    = blobDataStoreConfiguration;
        }
Ejemplo n.º 3
0
        public static void AddFileTypeCheckHandler(
            this BlobContainerConfiguration containerConfiguration,
            Action <FileTypeCheckHandlerConfiguration> configureAction)
        {
            var blobProcessHandlers = containerConfiguration.GetConfigurationOrDefault(
                DigniteAbpBlobContainerConfigurationNames.BlobProcessHandlers,
                new TypeList <IBlobProcessHandler>());

            if (blobProcessHandlers.TryAdd <FileTypeCheckHandler>())
            {
                configureAction(new FileTypeCheckHandlerConfiguration(containerConfiguration));

                containerConfiguration.SetConfiguration(
                    DigniteAbpBlobContainerConfigurationNames.BlobProcessHandlers,
                    blobProcessHandlers);
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Gets a <see cref="BlobContainerClient"/> using <see cref="BlobContainerConfiguration"/>
        /// stored in a tenant.
        /// </summary>
        /// <param name="blobContainerSource">
        /// The <see cref="IBlobContainerSourceFromDynamicConfiguration"/> that provides the underlying
        /// ability to supply a <see cref="BlobContainerClient"/> for a
        /// <see cref="BlobContainerConfiguration"/>.
        /// </param>
        /// <param name="tenant">
        /// The tenant containing the <see cref="BlobContainerConfiguration"/>.
        /// </param>
        /// <param name="configurationKey">
        /// The key identifying the <see cref="ITenant.Properties"/> entry containing the
        /// <see cref="BlobContainerConfiguration"/> to use.
        /// </param>
        /// <param name="containerName">
        /// An optional container name to use. If this is null, the container name specified in the
        /// <see cref="BlobContainerConfiguration"/> will be used. In cases where multiple
        /// containers are in use, it's common to have one <see cref="BlobContainerConfiguration"/>
        /// with a null <see cref="BlobContainerConfiguration.Container"/>, and to specify the
        /// container name required when asking for a <see cref="BlobContainerClient"/>.
        /// </param>
        /// <returns>
        /// A value task that produces a <see cref="BlobContainerClient"/>.
        /// </returns>
        public static async ValueTask <BlobContainerClient> GetBlobContainerClientFromTenantAsync(
            this IBlobContainerSourceFromDynamicConfiguration blobContainerSource,
            ITenant tenant,
            string configurationKey,
            string?containerName = null)
        {
            BlobContainerConfiguration configuration = tenant.GetBlobContainerConfiguration(configurationKey);

            if (containerName is not null)
            {
                configuration = configuration with
                {
                    Container = containerName,
                };
            }

            return(await blobContainerSource.GetStorageContextAsync(configuration).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();
        }
Ejemplo n.º 6
0
 public DigniteAbpBlobContainer(
     string containerName,
     BlobContainerConfiguration configuration,
     IBlobProvider provider,
     ICurrentTenant currentTenant,
     ICancellationTokenProvider cancellationTokenProvider,
     IBlobNormalizeNamingService blobNormalizeNamingService,
     IServiceProvider serviceProvider) : base(
         containerName,
         configuration,
         provider,
         currentTenant,
         cancellationTokenProvider,
         blobNormalizeNamingService,
         serviceProvider
         )
 {
 }
        protected virtual string NormalizeContainerName(BlobContainerConfiguration configuration, string containerName)
        {
            if (!configuration.NamingNormalizers.Any())
            {
                return(containerName);
            }

            using (var scope = ServiceProvider.CreateScope())
            {
                foreach (var normalizerType in configuration.NamingNormalizers)
                {
                    var normalizer = scope.ServiceProvider
                                     .GetRequiredService(normalizerType)
                                     .As <IBlobNamingNormalizer>();

                    containerName = normalizer.NormalizeContainerName(containerName);
                }

                return(containerName);
            }
        }
        /// <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;
        }
Ejemplo n.º 9
0
        private static BlobContainerConfiguration V3ConfigurationFromLegacy(
            ITenant tenant,
            string?containerName,
            LegacyV2BlobStorageConfiguration legacyConfiguration)
        {
            BlobContainerConfiguration v3Configuration = LegacyConfigurationConverter.FromV2ToV3(legacyConfiguration);

            if (legacyConfiguration.Container is not null)
            {
                v3Configuration = v3Configuration with
                {
                    Container = string.IsNullOrWhiteSpace(legacyConfiguration.Container)
                        ? containerName is null ? null : AzureStorageBlobContainerNaming.HashAndEncodeBlobContainerName(containerName)
                            : AzureStorageBlobContainerNaming.HashAndEncodeBlobContainerName(
                        legacyConfiguration.DisableTenantIdPrefix
                                ? legacyConfiguration.Container
                                : AzureStorageBlobTenantedContainerNaming.GetTenantedLogicalBlobContainerNameFor(tenant, legacyConfiguration.Container)),
                };
            }

            return(AddContainerNameIfNotInConfig(v3Configuration, containerName));
        }
Ejemplo n.º 10
0
        private static IDicomServerBuilder AddMetadataPersistence(this IDicomServerBuilder serverBuilder, IConfiguration configuration)
        {
            IServiceCollection services = serverBuilder.Services;

            services.AddBlobDataStore();

            services.Configure <BlobContainerConfiguration>(
                Constants.ContainerConfigurationName,
                containerConfiguration => configuration.GetSection(DicomServerBlobConfigurationSectionName)
                .Bind(containerConfiguration));

            services.Add(sp =>
            {
                ILoggerFactory loggerFactory = sp.GetService <ILoggerFactory>();
                IOptionsMonitor <BlobContainerConfiguration> namedBlobContainerConfiguration = sp.GetService <IOptionsMonitor <BlobContainerConfiguration> >();
                BlobContainerConfiguration blobContainerConfiguration = namedBlobContainerConfiguration.Get(Constants.ContainerConfigurationName);

                return(new BlobContainerInitializer(
                           blobContainerConfiguration.ContainerName,
                           loggerFactory.CreateLogger <BlobContainerInitializer>()));
            })
            .Singleton()
            .AsService <IBlobContainerInitializer>();

            services.Add <BlobMetadataStore>()
            .Scoped()
            .AsSelf()
            .AsImplementedInterfaces();

            // TODO: Ideally, the logger can be registered in the API layer since it's agnostic to the implementation.
            // However, the current implementation of the decorate method requires the concrete type to be already registered,
            // so we need to register here. Need to some more investigation to see how we might be able to do this.
            services.Decorate <IMetadataStore, LoggingMetadataStore>();

            return(serverBuilder);
        }
 public static AliyunBlobProviderConfiguration GetAliyunConfiguration(
     this BlobContainerConfiguration containerConfiguration)
 {
     return(new AliyunBlobProviderConfiguration(containerConfiguration));
 }
Ejemplo n.º 12
0
 public static AzureBlobProviderConfiguration GetAzureConfiguration(
     this BlobContainerConfiguration containerConfiguration)
 {
     return(new AzureBlobProviderConfiguration(containerConfiguration));
 }
Ejemplo n.º 13
0
        protected virtual IOss GetOssClient(BlobContainerConfiguration blobContainerConfiguration)
        {
            var aliyunConfig = blobContainerConfiguration.GetAliyunConfiguration();

            return(OssClientFactory.Create(aliyunConfig));
        }
 public static MyCustomBlobProviderConfiguration GetMyCustomBlobProviderConfiguration(
     this BlobContainerConfiguration containerConfiguration)
 {
     return(new MyCustomBlobProviderConfiguration(containerConfiguration));
 }
Ejemplo n.º 15
0
 public static FileSystemBlobProviderConfiguration GetFileSystemConfiguration(
     this BlobContainerConfiguration containerConfiguration)
 {
     return(new FileSystemBlobProviderConfiguration(containerConfiguration));
 }
 public static AuthorizationHandlerConfiguration GetGeneralAuthorizationConfiguration(
     this BlobContainerConfiguration containerConfiguration)
 {
     return(new AuthorizationHandlerConfiguration(containerConfiguration));
 }
 public static MinioBlobProviderConfiguration GetMinioConfiguration(
     this BlobContainerConfiguration containerConfiguration)
 {
     return(new MinioBlobProviderConfiguration(containerConfiguration));
 }
        /// <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;
            }
        }
 public static T GetConfiguration <T>(
     [NotNull] this BlobContainerConfiguration containerConfiguration,
     [NotNull] string name)
 {
     return((T)containerConfiguration.GetConfiguration(name));
 }
Ejemplo n.º 20
0
 public static BlobContainerConfiguration UseDatabase(
     this BlobContainerConfiguration containerConfiguration)
 {
     containerConfiguration.ProviderType = typeof(DatabaseBlobProvider);
     return(containerConfiguration);
 }
Ejemplo n.º 21
0
 public BlobContainerConfiguration(BlobContainerConfiguration fallbackConfiguration = null)
 {
     NamingNormalizers      = new TypeList <IBlobNamingNormalizer>();
     _fallbackConfiguration = fallbackConfiguration;
     _properties            = new Dictionary <string, object>();
 }
Ejemplo n.º 22
0
        /// <inheritdoc/>
        public async ValueTask <BlobContainerConfiguration?> MigrateToV3Async(
            ITenant tenant,
            string v2ConfigurationKey,
            string v3ConfigurationKey,
            IEnumerable <string>?containerNames,
            BlobClientOptions?blobClientOptions,
            CancellationToken cancellationToken)
        {
            if (tenant.Properties.TryGet(v3ConfigurationKey, out BlobContainerConfiguration _))
            {
                return(null);
            }

            if (!tenant.Properties.TryGet(v2ConfigurationKey, out LegacyV2BlobStorageConfiguration legacyConfiguration))
            {
                throw new InvalidOperationException("Tenant did not contain blob storage configuration under specified v2 or v3 keys");
            }

            if (containerNames == null)
            {
                if (legacyConfiguration.Container is string containerNameFromConfig)
                {
                    containerNames = new[] { containerNameFromConfig };
                }
                else
                {
                    throw new InvalidOperationException($"When the configuration does not specify a Container, you must supply a non-null {nameof(containerNames)}");
                }
            }

            string?logicalContainerName = null;
            int    containerCount       = 0;

            foreach (string rawContainerName in containerNames)
            {
                containerCount      += 1;
                logicalContainerName = rawContainerName;

                // BlobContainerConfiguration thisConfig = GetConfigForContainer(tenant, rawContainerName, v3Configuration);
                BlobContainerConfiguration thisConfig       = V3ConfigurationFromLegacy(tenant, rawContainerName, legacyConfiguration);
                PublicAccessType           publicAccessType = legacyConfiguration.AccessType switch
                {
                    LegacyV2BlobContainerPublicAccessType.Blob => PublicAccessType.Blob,
                    LegacyV2BlobContainerPublicAccessType.Container => PublicAccessType.BlobContainer,
                    _ => PublicAccessType.None,
                };

                BlobContainerClient result = await this.blobContainerSource.GetStorageContextAsync(
                    thisConfig,
                    blobClientOptions,
                    cancellationToken)
                                             .ConfigureAwait(false);

                await result.CreateIfNotExistsAsync(
                    publicAccessType,
                    cancellationToken : cancellationToken)
                .ConfigureAwait(false);
            }

            // In cases where the legacy configuration had no Container property, and we were
            // passed a containerNames containing exactly one name, we can set the Container
            // in the V3 config. But if there were multiple logical container names, we don't
            // want to set the Container in the V3 config because the application is likely
            // plugging in specific container names at runtime.
            if (containerCount > 1)
            {
                logicalContainerName = null;
            }

            return(V3ConfigurationFromLegacy(tenant, logicalContainerName, legacyConfiguration));
        }
Ejemplo n.º 23
0
 public static TencentCloudBlobProviderConfiguration GetTencentCloudConfiguration(
     this BlobContainerConfiguration containerConfiguration)
 {
     return(new TencentCloudBlobProviderConfiguration(containerConfiguration));
 }
 public static ImageProcessHandlerConfiguration GetImageResizeConfiguration(
     this BlobContainerConfiguration containerConfiguration)
 {
     return(new ImageProcessHandlerConfiguration(containerConfiguration));
 }
Ejemplo n.º 25
0
 public static FileTypeCheckHandlerConfiguration GetFileTypeCheckConfiguration(
     this BlobContainerConfiguration containerConfiguration)
 {
     return(new FileTypeCheckHandlerConfiguration(containerConfiguration));
 }
Ejemplo n.º 26
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);

            await blob.UploadAsync(
                new MemoryStream(Encoding.UTF8.GetBytes(TestBlobContent)),
                new BlobHttpHeaders()
            {
                ContentType = "text/plain",
            });

            await DownloadBlobContentAsync(blob, cancellationToken);
        }
 public static BlobSizeLimitHandlerConfiguration GetBlobSizeLimitConfiguration(
     this BlobContainerConfiguration containerConfiguration)
 {
     return(new BlobSizeLimitHandlerConfiguration(containerConfiguration));
 }