< Summary - Envilder .NET SDK

Information
Class: Envilder.Infrastructure.Aws.AwsSsmSecretProvider
Assembly: Envilder
File(s): /home/runner/work/envilder/envilder/src/sdks/dotnet/Infrastructure/Aws/AwsSsmSecretProvider.cs
Tag: 299_25910610327
Line coverage
88%
Covered lines: 16
Uncovered lines: 2
Coverable lines: 18
Total lines: 68
Line coverage: 88.8%
Branch coverage
50%
Covered branches: 3
Total branches: 6
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)50%22100%
GetSecretAsync()50%2285.71%
GetSecret(...)50%2287.5%

File(s)

/home/runner/work/envilder/envilder/src/sdks/dotnet/Infrastructure/Aws/AwsSsmSecretProvider.cs

#LineLine coverage
 1namespace Envilder.Infrastructure.Aws;
 2
 3using Amazon.SimpleSystemsManagement;
 4using Amazon.SimpleSystemsManagement.Model;
 5using Envilder.Domain.Ports;
 6using System;
 7using System.Threading;
 8using System.Threading.Tasks;
 9
 10/// <summary>
 11/// <see cref="ISecretProvider"/> backed by AWS Systems Manager Parameter Store.
 12/// Parameters are retrieved with decryption enabled so that <c>SecureString</c>
 13/// values are returned in plain text.
 14/// </summary>
 15public class AwsSsmSecretProvider : ISecretProvider
 16{
 17  private readonly IAmazonSimpleSystemsManagement _ssmClient;
 18
 19  /// <summary>
 20  /// Initializes a new instance using the supplied SSM client.
 21  /// </summary>
 22  /// <param name="ssmClient">A configured <see cref="IAmazonSimpleSystemsManagement"/> instance.</param>
 123  public AwsSsmSecretProvider(IAmazonSimpleSystemsManagement ssmClient)
 24  {
 125    _ssmClient = ssmClient ?? throw new ArgumentNullException(nameof(ssmClient));
 126  }
 27
 28  /// <inheritdoc />
 29  public async Task<string?> GetSecretAsync(string name, CancellationToken cancellationToken = default)
 30  {
 131    if (string.IsNullOrWhiteSpace(name))
 32    {
 033      throw new ArgumentException("Secret name cannot be null or whitespace.", nameof(name));
 34    }
 35
 36    try
 37    {
 138      var response = await _ssmClient.GetParameterAsync(new() { Name = name, WithDecryption = true }, cancellationToken)
 139      return response.Parameter.Value;
 40    }
 141    catch (ParameterNotFoundException)
 42    {
 143      return null;
 44    }
 145  }
 46
 47  /// <inheritdoc />
 48  public string? GetSecret(string name)
 49  {
 150    if (string.IsNullOrWhiteSpace(name))
 51    {
 052      throw new ArgumentException("Secret name cannot be null or whitespace.", nameof(name));
 53    }
 54
 55    try
 56    {
 157      using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(60));
 58#pragma warning disable VSTHRD002 // AWS SDK v4 has no synchronous GetParameter API
 159      var response = Task.Run(() => _ssmClient.GetParameterAsync(new() { Name = name, WithDecryption = true }, cts.Token
 60#pragma warning restore VSTHRD002
 161      return response.Parameter.Value;
 62    }
 163    catch (ParameterNotFoundException)
 64    {
 165      return null;
 66    }
 167  }
 68}