Skip to content

Commit

Permalink
feat: Added AWS SNS package
Browse files Browse the repository at this point in the history
  • Loading branch information
samtrion committed Dec 18, 2024
1 parent 12f287a commit 6382ad5
Show file tree
Hide file tree
Showing 15 changed files with 316 additions and 4 deletions.
4 changes: 3 additions & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<GlobalPackageReference Include="SonarAnalyzer.CSharp" Version="10.4.0.108396" Condition=" '$(BuildingInsideVisualStudio)' == 'true' " />
</ItemGroup>
<ItemGroup>
<PackageVersion Include="AWSSDK.SimpleNotificationService" Version="3.7.400.65" />
<PackageVersion Include="Azure.Data.Tables" Version="12.9.1" />
<PackageVersion Include="Azure.Identity" Version="1.13.1" />
<PackageVersion Include="Azure.Storage.Blobs" Version="12.23.0" />
Expand Down Expand Up @@ -43,6 +44,7 @@
<PackageVersion Include="Testcontainers.Azurite" Version="4.1.0" />
<PackageVersion Include="Testcontainers.ClickHouse" Version="4.1.0" />
<PackageVersion Include="Testcontainers.Kafka" Version="4.1.0" />
<PackageVersion Include="Testcontainers.LocalStack" Version="4.1.0" />
<PackageVersion Include="Testcontainers.MsSql" Version="4.1.0" />
<PackageVersion Include="Testcontainers.MySql" Version="4.1.0" />
<PackageVersion Include="Testcontainers.Oracle" Version="4.1.0" />
Expand All @@ -60,4 +62,4 @@
<ItemGroup Condition=" '$(TargetFramework)' == 'net8.0'">
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="8.0.10" />
</ItemGroup>
</Project>
</Project>
15 changes: 15 additions & 0 deletions HealthChecks.sln
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetEvolve.HealthChecks.Test
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetEvolve.HealthChecks.Tests.Architecture", "tests\NetEvolve.HealthChecks.Tests.Architecture\NetEvolve.HealthChecks.Tests.Architecture.csproj", "{17BCA132-1FBB-46C1-B6A1-60F64969383D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetEvolve.HealthChecks.AWS.SNS", "src\NetEvolve.HealthChecks.AWS.SNS\NetEvolve.HealthChecks.AWS.SNS.csproj", "{546D5904-1811-457F-8C48-3F78D7F0C803}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -315,6 +317,18 @@ Global
{17BCA132-1FBB-46C1-B6A1-60F64969383D}.Release|x64.Build.0 = Release|Any CPU
{17BCA132-1FBB-46C1-B6A1-60F64969383D}.Release|x86.ActiveCfg = Release|Any CPU
{17BCA132-1FBB-46C1-B6A1-60F64969383D}.Release|x86.Build.0 = Release|Any CPU
{546D5904-1811-457F-8C48-3F78D7F0C803}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{546D5904-1811-457F-8C48-3F78D7F0C803}.Debug|Any CPU.Build.0 = Debug|Any CPU
{546D5904-1811-457F-8C48-3F78D7F0C803}.Debug|x64.ActiveCfg = Debug|Any CPU
{546D5904-1811-457F-8C48-3F78D7F0C803}.Debug|x64.Build.0 = Debug|Any CPU
{546D5904-1811-457F-8C48-3F78D7F0C803}.Debug|x86.ActiveCfg = Debug|Any CPU
{546D5904-1811-457F-8C48-3F78D7F0C803}.Debug|x86.Build.0 = Debug|Any CPU
{546D5904-1811-457F-8C48-3F78D7F0C803}.Release|Any CPU.ActiveCfg = Release|Any CPU
{546D5904-1811-457F-8C48-3F78D7F0C803}.Release|Any CPU.Build.0 = Release|Any CPU
{546D5904-1811-457F-8C48-3F78D7F0C803}.Release|x64.ActiveCfg = Release|Any CPU
{546D5904-1811-457F-8C48-3F78D7F0C803}.Release|x64.Build.0 = Release|Any CPU
{546D5904-1811-457F-8C48-3F78D7F0C803}.Release|x86.ActiveCfg = Release|Any CPU
{546D5904-1811-457F-8C48-3F78D7F0C803}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -340,6 +354,7 @@ Global
{66406BE8-0281-4C95-B90B-20CAE4516A16} = {E412EC77-2022-4A1D-AAC1-FDF1A4A45827}
{2B089420-E791-44E7-B471-F6F527B33E1C} = {E412EC77-2022-4A1D-AAC1-FDF1A4A45827}
{17BCA132-1FBB-46C1-B6A1-60F64969383D} = {E412EC77-2022-4A1D-AAC1-FDF1A4A45827}
{546D5904-1811-457F-8C48-3F78D7F0C803} = {EF615D18-42E2-48A4-8EBA-E652DC574C56}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {28B4CC2B-39E8-49C0-9687-78121BD83A53}
Expand Down
6 changes: 6 additions & 0 deletions src/NetEvolve.HealthChecks.AWS.SNS/CreationMode.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace NetEvolve.HealthChecks.AWS.SNS;

public enum CreationMode

Check warning on line 3 in src/NetEvolve.HealthChecks.AWS.SNS/CreationMode.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / CodeQL / Run CodeQL

Missing XML comment for publicly visible type or member 'CreationMode'

Check failure on line 3 in src/NetEvolve.HealthChecks.AWS.SNS/CreationMode.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / Tests / Testing .NET solution

Missing XML comment for publicly visible type or member 'CreationMode'
{
BasicAuthentication = 0,

Check warning on line 5 in src/NetEvolve.HealthChecks.AWS.SNS/CreationMode.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / CodeQL / Run CodeQL

Missing XML comment for publicly visible type or member 'CreationMode.BasicAuthentication'

Check failure on line 5 in src/NetEvolve.HealthChecks.AWS.SNS/CreationMode.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / Tests / Testing .NET solution

Missing XML comment for publicly visible type or member 'CreationMode.BasicAuthentication'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
namespace NetEvolve.HealthChecks.AWS.SNS;

using System;
using System.Diagnostics.CodeAnalysis;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using NetEvolve.Arguments;
using NetEvolve.HealthChecks.Abstractions;

/// <summary>
/// Extensions methods for <see cref="IHealthChecksBuilder"/> with custom Health Checks.
/// </summary>
public static class DependencyInjectionExtensions
{
private static readonly string[] _defaultTags = ["aws", "sns", "message-queue"];

/// <summary>
/// Add a health check for AWS SimpleNotificationService (SNS).
/// </summary>
/// <param name="builder">The <see cref="IHealthChecksBuilder"/>.</param>
/// <param name="name">The name of the <see cref="SimpleNotificationServiceHealthCheck"/>.</param>
/// <param name="options">An optional action to configure.</param>
/// <param name="tags">A list of additional tags that can be used to filter sets of health checks. Optional.</param>
/// <exception cref="ArgumentNullException">The <paramref name="builder"/> is <see langword="null" />.</exception>
/// <exception cref="ArgumentNullException">The <paramref name="name"/> is <see langword="null" />.</exception>
/// <exception cref="ArgumentException">The <paramref name="name"/> is <see langword="null" /> or <c>whitespace</c>.</exception>
/// <exception cref="ArgumentException">The <paramref name="name"/> is already in use.</exception>
/// <exception cref="ArgumentNullException">The <paramref name="tags"/> is <see langword="null" />.</exception>
public static IHealthChecksBuilder AddSimpleNotificationService(
[NotNull] this IHealthChecksBuilder builder,
[NotNull] string name,
Action<SimpleNotificationServiceOptions>? options = null,
params string[] tags
)
{
ArgumentNullException.ThrowIfNull(builder);
Argument.ThrowIfNullOrEmpty(name);
ArgumentNullException.ThrowIfNull(tags);

if (!builder.IsServiceTypeRegistered<SimpleNotificationServiceCheckMarker>())
{
_ = builder
.Services.AddSingleton<SimpleNotificationServiceCheckMarker>()
.AddSingleton<SimpleNotificationServiceHealthCheck>()
.ConfigureOptions<SimpleNotificationServiceConfigure>();
}

if (builder.IsNameAlreadyUsed<SimpleNotificationServiceHealthCheck>(name))
{
throw new ArgumentException($"Name `{name}` already in use.", nameof(name), null);
}

if (options is not null)
{
_ = builder.Services.Configure(name, options);
}

return builder.AddCheck<SimpleNotificationServiceHealthCheck>(
name,
HealthStatus.Unhealthy,
_defaultTags.Union(tags, StringComparer.OrdinalIgnoreCase)
);
}

private sealed partial class SimpleNotificationServiceCheckMarker { }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>$(_ProjectTargetFrameworks)</TargetFrameworks>

<Description>Contains HealthChecks for AWS Simple Notification Service (SNS).</Description>
<PackageTags>$(PackageTags);aws;sns;</PackageTags>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AWSSDK.SimpleNotificationService" />
<PackageReference Include="NetEvolve.Extensions.Tasks" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\NetEvolve.HealthChecks.Abstractions\NetEvolve.HealthChecks.Abstractions.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace NetEvolve.HealthChecks.AWS.SNS;

using Microsoft.Extensions.Options;

internal sealed class SimpleNotificationServiceConfigure
: IConfigureNamedOptions<SimpleNotificationServiceOptions>,
IValidateOptions<SimpleNotificationServiceOptions>
{
public void Configure(string? name, SimpleNotificationServiceOptions options) { }

public void Configure(SimpleNotificationServiceOptions options) { }

public ValidateOptionsResult Validate(string? name, SimpleNotificationServiceOptions options) =>
ValidateOptionsResult.Success;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
namespace NetEvolve.HealthChecks.AWS.SNS;

using System;
using System.Threading;
using System.Threading.Tasks;
using Amazon;
using Amazon.SimpleNotificationService;
using Amazon.SimpleNotificationService.Model;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Options;
using NetEvolve.Extensions.Tasks;
using NetEvolve.HealthChecks.Abstractions;

internal sealed class SimpleNotificationServiceHealthCheck
: ConfigurableHealthCheckBase<SimpleNotificationServiceOptions>
{
public SimpleNotificationServiceHealthCheck(
IOptionsMonitor<SimpleNotificationServiceOptions> optionsMonitor
)
: base(optionsMonitor) { }

protected override async ValueTask<HealthCheckResult> ExecuteHealthCheckAsync(
string name,
HealthStatus failureStatus,
SimpleNotificationServiceOptions options,
CancellationToken cancellationToken
)
{
using var client = CreateClient(options);

var (isValid, topic) = await client
.GetSubscriptionAttributesAsync(
new GetSubscriptionAttributesRequest { SubscriptionArn = options.TopicName },
cancellationToken
)
.WithTimeoutAsync(options.Timeout, cancellationToken)
.ConfigureAwait(false);

return HealthCheckState(isValid && topic is not null, name);
}

private static AmazonSimpleNotificationServiceClient CreateClient(
SimpleNotificationServiceOptions options
)
{
var hasCredentials = options.GetCredentials() is not null;
var hasEndpoint = options.GetRegionEndpoint() is not null;

var config = new AmazonSimpleNotificationServiceConfig
{
ServiceURL = options.ServiceUrl,
RegionEndpoint = RegionEndpoint.USEast1,
};

return (hasCredentials, hasEndpoint) switch
{
(true, true) => new AmazonSimpleNotificationServiceClient(
options.GetCredentials(),
options.GetRegionEndpoint()
),
(true, false) => new AmazonSimpleNotificationServiceClient(
options.GetCredentials(),
config
),
(false, true) => new AmazonSimpleNotificationServiceClient(options.GetRegionEndpoint()),
_ => throw new InvalidOperationException("Invalid ClientCreationMode."),
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
namespace NetEvolve.HealthChecks.AWS.SNS;

using System;
using Amazon;
using Amazon.Runtime;

public sealed class SimpleNotificationServiceOptions

Check warning on line 7 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / CodeQL / Run CodeQL

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions'

Check failure on line 7 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / Tests / Testing .NET solution

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions'
{
public string? AccessKey { get; set; }

Check warning on line 9 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / CodeQL / Run CodeQL

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions.AccessKey'

Check failure on line 9 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / Tests / Testing .NET solution

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions.AccessKey'

public CreationMode CreationMode { get; set; }

Check warning on line 11 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / CodeQL / Run CodeQL

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions.CreationMode'

Check failure on line 11 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / Tests / Testing .NET solution

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions.CreationMode'

public string? SecretKey { get; set; }

Check warning on line 13 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / CodeQL / Run CodeQL

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions.SecretKey'

Check failure on line 13 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / Tests / Testing .NET solution

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions.SecretKey'

#pragma warning disable CA1056 // URI-like properties should not be strings
public string? ServiceUrl { get; set; }

Check warning on line 16 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / CodeQL / Run CodeQL

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions.ServiceUrl'

Check failure on line 16 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / Tests / Testing .NET solution

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions.ServiceUrl'
#pragma warning restore CA1056 // URI-like properties should not be strings

public string? TopicName { get; set; }

Check warning on line 19 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / CodeQL / Run CodeQL

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions.TopicName'

Check failure on line 19 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / Tests / Testing .NET solution

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions.TopicName'

public int Timeout { get; set; } = 100;

Check warning on line 21 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / CodeQL / Run CodeQL

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions.Timeout'

Check failure on line 21 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / Tests / Testing .NET solution

Missing XML comment for publicly visible type or member 'SimpleNotificationServiceOptions.Timeout'

internal AWSCredentials? GetCredentials()
{
return CreationMode switch

Check warning on line 25 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / CodeQL / Run CodeQL

Use expression body for method (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0022)
{
CreationMode.BasicAuthentication => new BasicAWSCredentials(AccessKey, SecretKey),
_ => null,
};
}

internal RegionEndpoint? GetRegionEndpoint() => CreationMode == CreationMode ? null : null;

Check failure on line 32 in src/NetEvolve.HealthChecks.AWS.SNS/SimpleNotificationServiceOptions.cs

View workflow job for this annotation

GitHub Actions / Build & Tests / Tests / Testing .NET solution

This conditional operation returns the same value whether the condition is "true" or "false". (https://rules.sonarsource.com/csharp/RSPEC-3923)
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,8 @@ public async Task<HealthCheckResult> CheckHealthAsync(
);
}

var result = await InternalAsync(configurationName, failureStatus, cancellationToken)
return await InternalAsync(configurationName, failureStatus, cancellationToken)
.ConfigureAwait(false);

return result;
}

private async Task<HealthCheckResult> InternalAsync(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using ArchUnitNET.Domain;
using ArchUnitNET.Loader;
using NetEvolve.HealthChecks.Apache.Kafka;
using NetEvolve.HealthChecks.AWS.SNS;
using NetEvolve.HealthChecks.Azure.Blobs;
using NetEvolve.HealthChecks.Azure.Queues;
using NetEvolve.HealthChecks.Azure.Tables;
Expand Down Expand Up @@ -34,10 +35,15 @@ private static Architecture LoadArchitecture()
{
System.Reflection.Assembly[] assemblies =
[
// Apache
typeof(KafkaCheck).Assembly,
// AWS
typeof(SimpleNotificationServiceHealthCheck).Assembly,
// Azure
typeof(BlobContainerAvailableHealthCheck).Assembly,
typeof(QueueClientAvailableHealthCheck).Assembly,
typeof(TableClientAvailableHealthCheck).Assembly,
// Others
typeof(ClickHouseCheck).Assembly,
typeof(DaprHealthCheck).Assembly,
typeof(MySqlCheck).Assembly,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<ItemGroup>
<ProjectReference Include="..\..\src\NetEvolve.HealthChecks.Abstractions\NetEvolve.HealthChecks.Abstractions.csproj" />
<ProjectReference Include="..\..\src\NetEvolve.HealthChecks.Apache.Kafka\NetEvolve.HealthChecks.Apache.Kafka.csproj" />
<ProjectReference Include="..\..\src\NetEvolve.HealthChecks.AWS.SNS\NetEvolve.HealthChecks.AWS.SNS.csproj" />
<ProjectReference Include="..\..\src\NetEvolve.HealthChecks.Azure.Blobs\NetEvolve.HealthChecks.Azure.Blobs.csproj" />
<ProjectReference Include="..\..\src\NetEvolve.HealthChecks.Azure.Queues\NetEvolve.HealthChecks.Azure.Queues.csproj" />
<ProjectReference Include="..\..\src\NetEvolve.HealthChecks.Azure.Tables\NetEvolve.HealthChecks.Azure.Tables.csproj" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
namespace NetEvolve.HealthChecks.Tests.Integration.AWS;

using System.Threading.Tasks;
using Testcontainers.LocalStack;
using TestContainer = Testcontainers.LocalStack.LocalStackContainer;

public sealed class LocalStackInstance : IAsyncLifetime
{
/// <summary>Access Key</summary>
/// <see href="https://docs.localstack.cloud/references/credentials/#access-key-id" />
internal const string AccessKey = "LSIAQAAAAAAVNCBMPNSG";
internal const string SecretKey = "test";

private readonly TestContainer _container = new LocalStackBuilder()
.WithEnvironment("AWS_ACCESS_KEY_ID", AccessKey)
.WithEnvironment("AWS_SECRET_ACCESS_KEY", SecretKey)
.Build();

internal string ConnectionString => _container.GetConnectionString();

public async Task DisposeAsync() => await _container.DisposeAsync().ConfigureAwait(false);

public async Task InitializeAsync() => await _container.StartAsync().ConfigureAwait(false);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
namespace NetEvolve.HealthChecks.Tests.Integration.AWS.SNS;

using NetEvolve.HealthChecks.AWS.SNS;
using NodaTime;

public class SimpleNotificationServiceHealthCheckTests
: HealthCheckTestBase,
IClassFixture<LocalStackInstance>
{
private readonly LocalStackInstance _instance;

public SimpleNotificationServiceHealthCheckTests(LocalStackInstance instance)
{
_instance = instance;
}

[Fact]
public async Task AddSimpleNotificationService_UseOptionsCreate_ShouldReturnHealthy() =>
await RunAndVerify(healthChecks =>
{
_ = healthChecks.AddSimpleNotificationService(
"TestContainerHealthy",
options =>
{
options.AccessKey = LocalStackInstance.AccessKey;
options.SecretKey = LocalStackInstance.SecretKey;
options.ServiceUrl = _instance.ConnectionString;
}
);
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
<PackageReference Include="Testcontainers.Azurite" />
<PackageReference Include="Testcontainers.ClickHouse" />
<PackageReference Include="Testcontainers.Kafka" />
<PackageReference Include="Testcontainers.LocalStack" />
<PackageReference Include="Testcontainers.MsSql" />
<PackageReference Include="Testcontainers.MySql" />
<PackageReference Include="Testcontainers.Oracle" />
Expand All @@ -35,6 +36,7 @@
<ItemGroup>
<ProjectReference Include="..\..\src\NetEvolve.HealthChecks.Abstractions\NetEvolve.HealthChecks.Abstractions.csproj" />
<ProjectReference Include="..\..\src\NetEvolve.HealthChecks.Apache.Kafka\NetEvolve.HealthChecks.Apache.Kafka.csproj" />
<ProjectReference Include="..\..\src\NetEvolve.HealthChecks.AWS.SNS\NetEvolve.HealthChecks.AWS.SNS.csproj" />
<ProjectReference Include="..\..\src\NetEvolve.HealthChecks.Azure.Blobs\NetEvolve.HealthChecks.Azure.Blobs.csproj" />
<ProjectReference Include="..\..\src\NetEvolve.HealthChecks.Azure.Queues\NetEvolve.HealthChecks.Azure.Queues.csproj" />
<ProjectReference Include="..\..\src\NetEvolve.HealthChecks.Azure.Tables\NetEvolve.HealthChecks.Azure.Tables.csproj" />
Expand Down
Loading

0 comments on commit 6382ad5

Please sign in to comment.