Skip to content

Commit 524cee0

Browse files
author
David Shiflet
committed
SMO testing - cache SecretClient for faster AKV access
Each new SecretClient instance probes available authentication methods, so caching it between secret fetches speeds things up a few seconds per secret.
1 parent 53a18b0 commit 524cee0

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

src/FunctionalTest/Framework/Helpers/AzureKeyVaultHelper.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ public class AzureKeyVaultHelper
3838
private static readonly object syncObj = new object();
3939
public static readonly string SSMS_TEST_SECRET_PREFIX = "SQLA-SSMS-Test-";
4040

41+
private SecretClient secretClient = null;
42+
4143
/// <summary>
4244
/// Constructs a new AzureKeyVaultHelper that relies on an instance of Azure.Identity.DefaultAzureCredential to access the given vault.
4345
/// </summary>
@@ -73,22 +75,25 @@ public string GetDecryptedSecret(string secretName)
7375
}
7476
if (string.IsNullOrEmpty(secret))
7577
{
76-
Azure.Core.TokenCredential credential = new DefaultAzureCredential();
77-
foreach (var thumbprint in CertificateThumbprints ?? Enumerable.Empty<string>())
78+
// It's ok if multiple threads race to construct this secretClient instance
79+
if (secretClient == null)
7880
{
79-
var certificate = FindCertificate(thumbprint);
80-
if (certificate != null)
81+
Azure.Core.TokenCredential credential = new DefaultAzureCredential();
82+
foreach (var thumbprint in CertificateThumbprints ?? Enumerable.Empty<string>())
8183
{
82-
credential = new ClientCertificateCredential(AzureTenantId, AzureApplicationId, certificate);
84+
var certificate = FindCertificate(thumbprint);
85+
if (certificate != null)
86+
{
87+
credential = new ClientCertificateCredential(AzureTenantId, AzureApplicationId, certificate);
88+
}
89+
break;
8390
}
84-
break;
91+
secretClient = new SecretClient(new Uri($"https://{KeyVaultName}.vault.azure.net"), credential);
8592
}
86-
8793
var secretIdentifier = $"https://{KeyVaultName}.vault.azure.net/secrets/{lookupName}";
8894
TraceHelper.TraceInformation("Secret {0} not set as environment variable. Looking in AKV for {1}.", secretName, secretIdentifier);
8995
try
9096
{
91-
var secretClient = new SecretClient(new Uri($"https://{KeyVaultName}.vault.azure.net"), credential);
9297
secret = secretClient.GetSecret(lookupName).Value.Value;
9398
}
9499
catch (Exception e)

0 commit comments

Comments
 (0)