Skip to content

Commit 3d8a38e

Browse files
authored
Add support for getting secrets from environment variables when running tests (#10594)
1 parent adf9655 commit 3d8a38e

2 files changed

Lines changed: 63 additions & 2 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Threading.Tasks;
6+
using Microsoft.Extensions.Logging;
7+
using NuGet.Services.KeyVault;
8+
9+
namespace NuGetGallery.FunctionalTests
10+
{
11+
class EnvVarWrapperSecretReader : ISecretReader
12+
{
13+
private readonly Lazy<ISecretReader> _secretReader;
14+
15+
public EnvVarWrapperSecretReader(ISecretReaderFactory factory) => _secretReader = new Lazy<ISecretReader>(factory.CreateSecretReader);
16+
public Task<string> GetSecretAsync(string secretName)=> GetSecretAsync(secretName, logger: null);
17+
public Task<ISecret> GetSecretObjectAsync(string secretName) => GetSecretObjectAsync(secretName, logger: null);
18+
19+
public Task<string> GetSecretAsync(string secretName, ILogger logger)
20+
{
21+
if (TryGetFromEnvironmentVariable(secretName, logger) is string envVarValue)
22+
{
23+
return Task.FromResult(envVarValue);
24+
}
25+
26+
return _secretReader.Value.GetSecretAsync(secretName, logger);
27+
}
28+
29+
public Task<ISecret> GetSecretObjectAsync(string secretName, ILogger logger)
30+
{
31+
if (TryGetFromEnvironmentVariable(secretName, logger) is string envVarValue)
32+
{
33+
ISecret result = new KeyVaultSecret(secretName, envVarValue, null);
34+
return Task.FromResult(result);
35+
}
36+
37+
return _secretReader.Value.GetSecretObjectAsync(secretName, logger);
38+
}
39+
40+
private string TryGetFromEnvironmentVariable(string secretName, ILogger logger)
41+
{
42+
var message = $"Source of secret '{secretName}': ";
43+
var envVarValue = Environment.GetEnvironmentVariable(secretName);
44+
if (string.IsNullOrWhiteSpace(envVarValue))
45+
{
46+
message += "KEY VAULT";
47+
envVarValue = null;
48+
}
49+
else
50+
{
51+
message += "ENV VAR";
52+
}
53+
54+
logger?.LogInformation(message);
55+
Console.WriteLine(message);
56+
57+
return envVarValue;
58+
}
59+
}
60+
}

tests/NuGetGallery.FunctionalTests.Core/GalleryConfiguration.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) .NET Foundation. All rights reserved.
1+
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
@@ -46,7 +46,8 @@ static GalleryConfiguration()
4646

4747
// Initialize KeyVault integration.
4848
var secretReaderFactory = new ConfigurationRootSecretReaderFactory(uninjectedConfiguration);
49-
var secretInjector = secretReaderFactory.CreateSecretInjector(secretReaderFactory.CreateSecretReader());
49+
var secretReader = new EnvVarWrapperSecretReader(secretReaderFactory);
50+
var secretInjector = secretReaderFactory.CreateSecretInjector(secretReader);
5051

5152
// Initialize the configuration with KeyVault secrets injected.
5253
var builder = new ConfigurationBuilder()

0 commit comments

Comments
 (0)