Skip to content

Commit 1478e94

Browse files
handle keyvault reference error
1 parent 00e2e6b commit 1478e94

File tree

3 files changed

+29
-12
lines changed

3 files changed

+29
-12
lines changed

src/AzureAppConfigurationImpl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,8 +369,8 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
369369
postAttempts += 1;
370370
backoffDuration = calculateBackoffDuration(postAttempts);
371371
}
372+
console.warn(`Failed to load. Error message: ${error.message}. It Will retry in ${backoffDuration} ms.`);
372373
await new Promise(resolve => setTimeout(resolve, backoffDuration));
373-
console.warn("Failed to load configuration settings at startup. Retrying...");
374374
}
375375
} while (!abortSignal.aborted);
376376
}

src/error.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ export class ArgumentError extends Error {
2323
}
2424
}
2525

26+
/**
27+
* Error thrown when it fails to get the secret from the Key Vault.
28+
*/
29+
export class KeyVaultReferenceError extends Error {
30+
constructor(message: string) {
31+
super(message);
32+
this.name = "KeyVaultReferenceError";
33+
}
34+
}
35+
2636
export function isFailoverableError(error: any): boolean {
2737
if (!isRestError(error)) {
2838
return false;

src/keyvault/AzureKeyVaultKeyValueAdapter.ts

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { ConfigurationSetting, isSecretReference, parseSecretReference } from "@
55
import { IKeyValueAdapter } from "../IKeyValueAdapter.js";
66
import { KeyVaultOptions } from "./KeyVaultOptions.js";
77
import { getUrlHost } from "../common/utils.js";
8-
import { ArgumentError } from "../error.js";
8+
import { ArgumentError, KeyVaultReferenceError } from "../error.js";
99
import { SecretClient, parseKeyVaultSecretIdentifier } from "@azure/keyvault-secrets";
1010

1111
export class AzureKeyVaultKeyValueAdapter implements IKeyValueAdapter {
@@ -29,21 +29,24 @@ export class AzureKeyVaultKeyValueAdapter implements IKeyValueAdapter {
2929
throw new ArgumentError("Failed to process the key vault reference. The keyVaultOptions is not configured.");
3030
}
3131

32-
// precedence: secret clients > credential > secret resolver
3332
const { name: secretName, vaultUrl, sourceId, version } = parseKeyVaultSecretIdentifier(
3433
parseSecretReference(setting).value.secretId
3534
);
36-
37-
const client = this.#getSecretClient(new URL(vaultUrl));
38-
if (client) {
39-
const secret = await client.getSecret(secretName, { version });
40-
return [setting.key, secret.value];
41-
}
42-
43-
if (this.#keyVaultOptions.secretResolver) {
44-
return [setting.key, await this.#keyVaultOptions.secretResolver(new URL(sourceId))];
35+
try {
36+
// precedence: secret clients > credential > secret resolver
37+
const client = this.#getSecretClient(new URL(vaultUrl));
38+
if (client) {
39+
const secret = await client.getSecret(secretName, { version });
40+
return [setting.key, secret.value];
41+
}
42+
if (this.#keyVaultOptions.secretResolver) {
43+
return [setting.key, await this.#keyVaultOptions.secretResolver(new URL(sourceId))];
44+
}
45+
} catch (error) {
46+
throw new KeyVaultReferenceError(buildKeyVaultReferenceErrorMessage(error.message, setting, sourceId));
4547
}
4648

49+
// When code reaches here, it means that the key vault reference cannot be resolved in all possible ways.
4750
throw new ArgumentError("Failed to process the key vault reference. No key vault secret client, credential or secret resolver callback is configured.");
4851
}
4952

@@ -75,3 +78,7 @@ export class AzureKeyVaultKeyValueAdapter implements IKeyValueAdapter {
7578
return undefined;
7679
}
7780
}
81+
82+
function buildKeyVaultReferenceErrorMessage(message: string, setting: ConfigurationSetting, secretIdentifier?: string ): string {
83+
return `${message} Key: ${setting.key} Label: ${setting.label ?? ""} ETag: ${setting.etag ?? ""} SecretIdentifier: ${secretIdentifier ?? ""}`;
84+
}

0 commit comments

Comments
 (0)