Skip to content

Commit 4985932

Browse files
authored
Merge pull request #479 from Project-MONAI/nds-changeplugin-config
Nds changeplugin config
2 parents cf7f112 + ebb0a51 commit 4985932

File tree

80 files changed

+593
-328
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+593
-328
lines changed

Dockerfile

100644100755
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
FROM mcr.microsoft.com/dotnet/sdk:6.0-jammy as build
15+
FROM mcr.microsoft.com/dotnet/sdk:6.0-focal as build
1616

1717
# Install the tools
1818
RUN dotnet tool install --tool-path /tools dotnet-trace
@@ -26,7 +26,7 @@ RUN echo "Building MONAI Deploy Informatics Gateway..."
2626
RUN dotnet publish -c Release -o out --nologo src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj
2727

2828
# Build runtime image
29-
FROM mcr.microsoft.com/dotnet/aspnet:6.0-jammy
29+
FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal
3030

3131
# Enable elastic client compatibility mode
3232
ENV ELASTIC_CLIENT_APIVERSIONING=true

src/Client/Test/packages.lock.json

100644100755
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1921,6 +1921,7 @@
19211921
"Microsoft.Extensions.Configuration": "[6.0.1, )",
19221922
"Microsoft.Extensions.Configuration.FileExtensions": "[6.0.0, )",
19231923
"Microsoft.Extensions.Configuration.Json": "[6.0.0, )",
1924+
"Microsoft.Extensions.Options.ConfigurationExtensions": "[6.0.0, )",
19241925
"Monai.Deploy.InformaticsGateway.Api": "[0.4.1, )",
19251926
"Monai.Deploy.InformaticsGateway.Configuration": "[1.0.0, )",
19261927
"Monai.Deploy.InformaticsGateway.Database.Api": "[1.0.0, )",

src/Configuration/DatabaseConfiguration.cs renamed to src/Configuration/DatabaseOptions.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
/*
2-
* Copyright 2021-2022 MONAI Consortium
1+
/*
2+
* Copyright 2022 MONAI Consortium
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -18,8 +18,11 @@
1818

1919
namespace Monai.Deploy.InformaticsGateway.Configuration
2020
{
21-
public class DatabaseConfiguration
21+
public class DatabaseOptions
2222
{
23+
[ConfigurationKeyName("DatabaseName")]
24+
public string DatabaseName { get; set; } = string.Empty;
25+
2326
/// <summary>
2427
/// Gets or sets retry options relate to reading/writing to the database.
2528
/// </summary>

src/Configuration/InformaticsGatewayConfiguration.cs

100644100755
Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -70,19 +70,6 @@ public class InformaticsGatewayConfiguration
7070
[ConfigurationKeyName("messaging")]
7171
public MessageBrokerConfiguration Messaging { get; set; }
7272

73-
/// <summary>
74-
/// Represents the <c>database</c> section of the configuration file.
75-
/// </summary>
76-
[ConfigurationKeyName("database")]
77-
public DatabaseConfiguration Database { get; set; }
78-
79-
/// <summary>
80-
/// Represents the <c>pluginConfiguration</c> section of the configuration file.
81-
/// </summary>
82-
[ConfigurationKeyName("plugins")]
83-
public PlugInConfiguration PlugInConfigurations { get; set; }
84-
85-
8673
public InformaticsGatewayConfiguration()
8774
{
8875
Dicom = new DicomConfiguration();
@@ -91,9 +78,7 @@ public InformaticsGatewayConfiguration()
9178
Fhir = new FhirConfiguration();
9279
Export = new DataExportConfiguration();
9380
Messaging = new MessageBrokerConfiguration();
94-
Database = new DatabaseConfiguration();
9581
Hl7 = new Hl7Configuration();
96-
PlugInConfigurations = new PlugInConfiguration();
9782
}
9883
}
9984
}

src/Configuration/RetryConfiguration.cs

100644100755
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class RetryConfiguration
2929
/// Default is 250, 500, 1000.
3030
/// </summary>
3131
[ConfigurationKeyName("delays")]
32-
public int[] DelaysMilliseconds { get; set; } = new[] { 750, 1200, 2500 };
32+
public int[] DelaysMilliseconds { get; set; }
3333

3434
// Gets the delays in TimeSpan objects
3535
public IEnumerable<TimeSpan> RetryDelays
@@ -42,5 +42,12 @@ public IEnumerable<TimeSpan> RetryDelays
4242
}
4343
}
4444
}
45+
public RetryConfiguration()
46+
{
47+
if (DelaysMilliseconds is null || DelaysMilliseconds.Length == 0)
48+
{
49+
DelaysMilliseconds = new[] { 250, 500, 1000 };
50+
}
51+
}
4552
}
4653
}

src/Database/Api/DatabaseOptions.cs

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/Database/Api/DatabaseRegistrationBase.cs

100644100755
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@
1414
* limitations under the License.
1515
*/
1616

17+
using Microsoft.Extensions.Configuration;
1718
using Microsoft.Extensions.DependencyInjection;
1819
using Microsoft.Extensions.Logging;
1920

2021
namespace Monai.Deploy.InformaticsGateway.Database.Api
2122
{
2223
public abstract class DatabaseRegistrationBase
2324
{
24-
public abstract IServiceCollection Configure(IServiceCollection services, DatabaseType databaseType, string? connectionString, ILogger logger);
25+
public abstract IServiceCollection Configure(IServiceCollection services, DatabaseType databaseType, IConfigurationSection? connectionstringConfigurationSection, IConfigurationSection? pluginsConfigurationSection, ILoggerFactory loggerFactory);
2526
}
2627
}

src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs

100644100755
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories
2727
public abstract class InferenceRequestRepositoryBase : IInferenceRequestRepository
2828
{
2929
private readonly ILogger _logger;
30-
private readonly IOptions<InformaticsGatewayConfiguration> _options;
30+
private readonly IOptions<DatabaseOptions> _options;
3131

3232
protected InferenceRequestRepositoryBase(
3333
ILogger logger,
34-
IOptions<InformaticsGatewayConfiguration> options)
34+
IOptions<DatabaseOptions> options)
3535
{
3636
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
3737
_options = options ?? throw new ArgumentNullException(nameof(options));
@@ -72,7 +72,7 @@ public async Task UpdateAsync(InferenceRequest inferenceRequest, InferenceReques
7272
}
7373
else
7474
{
75-
if (++inferenceRequest.TryCount > _options.Value.Database.Retries.DelaysMilliseconds.Length)
75+
if (++inferenceRequest.TryCount > _options.Value.Retries.DelaysMilliseconds.Length)
7676
{
7777
_logger.InferenceRequestUpdateExceededMaximumRetries();
7878
inferenceRequest.State = InferenceRequestState.Completed;

src/Database/Api/StorageMetadataWrapper.cs

100644100755
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ namespace Monai.Deploy.InformaticsGateway.Database.Api
2727
/// </summary>
2828
public class StorageMetadataWrapper : MongoDBEntityBase
2929
{
30-
private readonly JsonSerializerOptions _options;
3130

3231
[JsonPropertyName("correlationId")]
3332
public string CorrelationId { get; set; } = string.Empty;
@@ -92,4 +91,4 @@ public override string ToString()
9291
return $"Identity: {Identity}";
9392
}
9493
}
95-
}
94+
}

src/Database/DatabaseManager.cs

100644100755
Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
using Microsoft.Extensions.Configuration;
2525
using Microsoft.Extensions.DependencyInjection;
2626
using Microsoft.Extensions.Logging;
27+
using Monai.Deploy.InformaticsGateway.Configuration;
2728
using Monai.Deploy.InformaticsGateway.Database.Api;
2829
using Monai.Deploy.InformaticsGateway.Database.Api.Repositories;
2930
using Monai.Deploy.InformaticsGateway.Database.EntityFramework;
@@ -63,16 +64,17 @@ public static IHealthChecksBuilder AddDatabaseHealthCheck(this IHealthChecksBuil
6364
}
6465
}
6566

66-
public static IServiceCollection ConfigureDatabase(this IServiceCollection services, IConfigurationSection? connectionStringConfigurationSection, ILogger logger)
67-
=> services.ConfigureDatabase(connectionStringConfigurationSection, new FileSystem(), logger);
67+
public static IServiceCollection ConfigureDatabase(this IServiceCollection services, IConfigurationSection? connectionStringConfigurationSection, IConfigurationSection? pluginsConfigurationSection, ILoggerFactory loggerFactory)
68+
=> services.ConfigureDatabase(connectionStringConfigurationSection, pluginsConfigurationSection, new FileSystem(), loggerFactory);
6869

69-
public static IServiceCollection ConfigureDatabase(this IServiceCollection services, IConfigurationSection? connectionStringConfigurationSection, IFileSystem fileSystem, ILogger logger)
70+
public static IServiceCollection ConfigureDatabase(this IServiceCollection services, IConfigurationSection? connectionStringConfigurationSection, IConfigurationSection? pluginsConfigurationSection, IFileSystem fileSystem, ILoggerFactory loggerFactory)
7071
{
72+
7173
if (connectionStringConfigurationSection is null)
7274
{
7375
throw new ConfigurationException("No database connections found in configuration section 'ConnectionStrings'.");
7476
}
75-
77+
services.Configure<DatabaseOptions>(connectionStringConfigurationSection.GetSection("DatabaseOptions"));
7678
var databaseType = connectionStringConfigurationSection["Type"].ToLowerInvariant();
7779
switch (databaseType)
7880
{
@@ -90,13 +92,11 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi
9092
services.AddScoped(typeof(IDicomAssociationInfoRepository), typeof(EntityFramework.Repositories.DicomAssociationInfoRepository));
9193
services.AddScoped(typeof(IVirtualApplicationEntityRepository), typeof(EntityFramework.Repositories.VirtualApplicationEntityRepository));
9294

93-
services.ConfigureDatabaseFromPlugIns(DatabaseType.EntityFramework, fileSystem, connectionStringConfigurationSection, logger);
95+
services.ConfigureDatabaseFromPlugIns(DatabaseType.EntityFramework, fileSystem, connectionStringConfigurationSection, pluginsConfigurationSection, loggerFactory);
9496
return services;
9597

9698
case DbType_MongoDb:
9799
services.AddSingleton<IMongoClient, MongoClient>(s => new MongoClient(connectionStringConfigurationSection[SR.DatabaseConnectionStringKey]));
98-
services.Configure<DatabaseOptions>(connectionStringConfigurationSection);
99-
100100
services.AddScoped<IDatabaseMigrationManager, MongoDatabaseMigrationManager>();
101101
services.AddScoped(typeof(IDestinationApplicationEntityRepository), typeof(MongoDB.Repositories.DestinationApplicationEntityRepository));
102102
services.AddScoped(typeof(IInferenceRequestRepository), typeof(MongoDB.Repositories.InferenceRequestRepository));
@@ -107,7 +107,7 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi
107107
services.AddScoped(typeof(IDicomAssociationInfoRepository), typeof(MongoDB.Repositories.DicomAssociationInfoRepository));
108108
services.AddScoped(typeof(IVirtualApplicationEntityRepository), typeof(MongoDB.Repositories.VirtualApplicationEntityRepository));
109109

110-
services.ConfigureDatabaseFromPlugIns(DatabaseType.MongoDb, fileSystem, connectionStringConfigurationSection, logger);
110+
services.ConfigureDatabaseFromPlugIns(DatabaseType.MongoDb, fileSystem, connectionStringConfigurationSection, pluginsConfigurationSection, loggerFactory);
111111

112112
return services;
113113

@@ -120,7 +120,8 @@ public static IServiceCollection ConfigureDatabaseFromPlugIns(this IServiceColle
120120
DatabaseType databaseType,
121121
IFileSystem fileSystem,
122122
IConfigurationSection? connectionStringConfigurationSection,
123-
ILogger logger)
123+
IConfigurationSection? pluginsConfigurationSection,
124+
ILoggerFactory loggerFactory)
124125
{
125126
Guard.Against.Null(fileSystem, nameof(fileSystem));
126127

@@ -133,7 +134,7 @@ public static IServiceCollection ConfigureDatabaseFromPlugIns(this IServiceColle
133134
{
134135
throw new ConfigurationException($"Error activating database registration from type '{type.FullName}'.");
135136
}
136-
registrar.Configure(services, databaseType, connectionStringConfigurationSection?[SR.DatabaseConnectionStringKey], logger);
137+
registrar.Configure(services, databaseType, connectionStringConfigurationSection, pluginsConfigurationSection, loggerFactory);
137138
}
138139
return services;
139140
}
@@ -153,6 +154,7 @@ internal static Type[] FindMatchingTypesFromAssemblies(Assembly[] assemblies)
153154
return matchingTypes.ToArray();
154155
}
155156

157+
[System.Diagnostics.CodeAnalysis.SuppressMessage("SonarLint", "S3885", Justification = "assembly.Load does not full register the contents, but assembly.LoadFrom does, this is need to load .dlls from the plug-ins folder that plugins use")]
156158
internal static Assembly[] LoadAssemblyFromPlugInsDirectory(IFileSystem fileSystem)
157159
{
158160
Guard.Against.Null(fileSystem, nameof(fileSystem));
@@ -167,8 +169,8 @@ internal static Assembly[] LoadAssemblyFromPlugInsDirectory(IFileSystem fileSyst
167169

168170
foreach (var plugin in plugins)
169171
{
170-
var asesmblyeData = fileSystem.File.ReadAllBytes(plugin);
171-
assemblies.Add(Assembly.Load(asesmblyeData));
172+
173+
assemblies.Add(Assembly.LoadFrom(plugin));
172174
}
173175
return assemblies.ToArray();
174176
}

src/Database/EntityFramework/Configuration/DicomAssociationInfoConfiguration.cs

100644100755
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ internal class DicomAssociationInfoConfiguration : IEntityTypeConfiguration<Dico
2929
public void Configure(EntityTypeBuilder<DicomAssociationInfo> builder)
3030
{
3131
var comparer = new ValueComparer<HashSet<string>>(
32-
(c1, c2) => c1.SequenceEqual(c2),
32+
(c1, c2) => c1!.SequenceEqual(c2!),
3333
c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())),
3434
c => c.ToHashSet());
3535

@@ -50,7 +50,7 @@ public void Configure(EntityTypeBuilder<DicomAssociationInfo> builder)
5050
builder.Property(j => j.PayloadIds).IsRequired()
5151
.HasConversion(
5252
v => JsonSerializer.Serialize(v, jsonSerializerSettings),
53-
v => JsonSerializer.Deserialize<HashSet<string>>(v, jsonSerializerSettings))
53+
v => JsonSerializer.Deserialize<HashSet<string>>(v, jsonSerializerSettings) ?? new HashSet<string>())
5454
.Metadata.SetValueComparer(comparer);
5555
}
5656
}

src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs

100644100755
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public class DestinationApplicationEntityRepository : IDestinationApplicationEnt
4141
public DestinationApplicationEntityRepository(
4242
IServiceScopeFactory serviceScopeFactory,
4343
ILogger<DestinationApplicationEntityRepository> logger,
44-
IOptions<InformaticsGatewayConfiguration> options)
44+
IOptions<DatabaseOptions> options)
4545
{
4646
Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory));
4747
Guard.Against.Null(options, nameof(options));
@@ -51,7 +51,7 @@ public DestinationApplicationEntityRepository(
5151
_scope = serviceScopeFactory.CreateScope();
5252
_informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService<InformaticsGatewayContext>();
5353
_retryPolicy = Policy.Handle<Exception>().WaitAndRetryAsync(
54-
options.Value.Database.Retries.RetryDelays,
54+
options.Value.Retries.RetryDelays,
5555
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));
5656
_dataset = _informaticsGatewayContext.Set<DestinationApplicationEntity>();
5757
}

src/Database/EntityFramework/Repositories/DicomAssociationInfoRepository.cs

100644100755
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public class DicomAssociationInfoRepository : IDicomAssociationInfoRepository, I
4040
public DicomAssociationInfoRepository(
4141
IServiceScopeFactory serviceScopeFactory,
4242
ILogger<DicomAssociationInfoRepository> logger,
43-
IOptions<InformaticsGatewayConfiguration> options)
43+
IOptions<DatabaseOptions> options)
4444
{
4545
Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory));
4646
Guard.Against.Null(options, nameof(options));
@@ -50,7 +50,7 @@ public DicomAssociationInfoRepository(
5050
_scope = serviceScopeFactory.CreateScope();
5151
_informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService<InformaticsGatewayContext>();
5252
_retryPolicy = Policy.Handle<Exception>().WaitAndRetryAsync(
53-
options.Value.Database.Retries.RetryDelays,
53+
options.Value.Retries.RetryDelays,
5454
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));
5555
_dataset = _informaticsGatewayContext.Set<DicomAssociationInfo>();
5656
}

src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ public class InferenceRequestRepository : InferenceRequestRepositoryBase, IDispo
4444
public InferenceRequestRepository(
4545
IServiceScopeFactory serviceScopeFactory,
4646
ILogger<InferenceRequestRepository> logger,
47-
IOptions<InformaticsGatewayConfiguration> options) : base(logger, options)
47+
IOptions<DatabaseOptions> options) : base(logger, options)
4848
{
4949
Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory));
5050

5151
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
5252
_scope = serviceScopeFactory.CreateScope();
5353
_informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService<InformaticsGatewayContext>();
5454
_retryPolicy = Policy.Handle<Exception>().WaitAndRetryAsync(
55-
options.Value.Database.Retries.RetryDelays,
55+
options.Value.Retries.RetryDelays,
5656
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));
5757
_dataset = _informaticsGatewayContext.Set<InferenceRequest>();
5858
}

src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs

100644100755
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public class MonaiApplicationEntityRepository : IMonaiApplicationEntityRepositor
4141
public MonaiApplicationEntityRepository(
4242
IServiceScopeFactory serviceScopeFactory,
4343
ILogger<MonaiApplicationEntityRepository> logger,
44-
IOptions<InformaticsGatewayConfiguration> options)
44+
IOptions<DatabaseOptions> options)
4545
{
4646
Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory));
4747
Guard.Against.Null(options, nameof(options));
@@ -51,7 +51,7 @@ public MonaiApplicationEntityRepository(
5151
_scope = serviceScopeFactory.CreateScope();
5252
_informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService<InformaticsGatewayContext>();
5353
_retryPolicy = Policy.Handle<Exception>().WaitAndRetryAsync(
54-
options.Value.Database.Retries.RetryDelays,
54+
options.Value.Retries.RetryDelays,
5555
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));
5656
_dataset = _informaticsGatewayContext.Set<MonaiApplicationEntity>();
5757
}

src/Database/EntityFramework/Repositories/PayloadRepository.cs

100644100755
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public class PayloadRepository : IPayloadRepository, IDisposable
4040
public PayloadRepository(
4141
IServiceScopeFactory serviceScopeFactory,
4242
ILogger<PayloadRepository> logger,
43-
IOptions<InformaticsGatewayConfiguration> options)
43+
IOptions<DatabaseOptions> options)
4444
{
4545
Guard.Against.Null(serviceScopeFactory, nameof(serviceScopeFactory));
4646
Guard.Against.Null(options, nameof(options));
@@ -50,7 +50,7 @@ public PayloadRepository(
5050
_scope = serviceScopeFactory.CreateScope();
5151
_informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService<InformaticsGatewayContext>();
5252
_retryPolicy = Policy.Handle<Exception>().WaitAndRetryAsync(
53-
options.Value.Database.Retries.RetryDelays,
53+
options.Value.Retries.RetryDelays,
5454
(exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception));
5555
_dataset = _informaticsGatewayContext.Set<Payload>();
5656
}

0 commit comments

Comments
 (0)