Skip to content

Commit 1a1467c

Browse files
authored
Increase IMDS retry count to 5 (#43249)
1 parent 0f3696b commit 1a1467c

File tree

6 files changed

+31
-14
lines changed

6 files changed

+31
-14
lines changed

eng/Packages.Data.props

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,13 +153,13 @@
153153
<!-- Other approved packages -->
154154
<PackageReference Update="Microsoft.Azure.Amqp" Version="2.6.5" />
155155
<PackageReference Update="Microsoft.Azure.WebPubSub.Common" Version="1.2.0" />
156-
<PackageReference Update="Microsoft.Identity.Client" Version="4.59.0" />
157-
<PackageReference Update="Microsoft.Identity.Client.Extensions.Msal" Version="4.59.0" />
156+
<PackageReference Update="Microsoft.Identity.Client" Version="4.60.1" />
157+
<PackageReference Update="Microsoft.Identity.Client.Extensions.Msal" Version="4.60.1" />
158158
<!--
159159
TODO: This package needs to be released as GA and arch-board approved before taking a dependency in any stable SDK library.
160160
Currently, it is referencd by Azure.Identity.Broker which is still in beta
161161
-->
162-
<PackageReference Update="Microsoft.Identity.Client.Broker" Version="4.59.0" />
162+
<PackageReference Update="Microsoft.Identity.Client.Broker" Version="4.60.1" />
163163

164164
<!-- TODO: Make sure this package is arch-board approved -->
165165
<PackageReference Update="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="6.35.0" />

sdk/identity/Azure.Identity/src/CredentialPipeline.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,29 @@ public CredentialPipeline(HttpPipeline httpPipeline, ClientDiagnostics diagnosti
2626
Diagnostics = diagnostics;
2727
}
2828

29-
public static CredentialPipeline GetInstance(TokenCredentialOptions options)
29+
public static CredentialPipeline GetInstance(TokenCredentialOptions options, bool IsManagedIdentityCredential = false)
3030
{
31-
return options is null ? s_singleton.Value : new CredentialPipeline(options);
31+
return options switch
32+
{
33+
_ when IsManagedIdentityCredential => configureOptionsForManagedIdentity(options),
34+
not null => new CredentialPipeline(options),
35+
_ => s_singleton.Value,
36+
37+
};
38+
}
39+
40+
private static CredentialPipeline configureOptionsForManagedIdentity(TokenCredentialOptions options)
41+
{
42+
var clonedOptions = options switch
43+
{
44+
DefaultAzureCredentialOptions dac => dac.Clone<DefaultAzureCredentialOptions>(),
45+
_ => options?.Clone<TokenCredentialOptions>() ?? new TokenCredentialOptions(),
46+
};
47+
// Set the custom retry policy
48+
clonedOptions.Retry.MaxRetries = 5;
49+
clonedOptions.RetryPolicy ??= new DefaultAzureCredentialImdsRetryPolicy(clonedOptions.Retry);
50+
clonedOptions.IsChainedCredential = clonedOptions is DefaultAzureCredentialOptions;
51+
return new CredentialPipeline(clonedOptions);
3252
}
3353

3454
public HttpPipeline HttpPipeline { get; }

sdk/identity/Azure.Identity/src/Credentials/ManagedIdentityCredential.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ protected ManagedIdentityCredential()
4141
/// </param>
4242
/// <param name="options">Options to configure the management of the requests sent to Microsoft Entra ID.</param>
4343
public ManagedIdentityCredential(string clientId = null, TokenCredentialOptions options = null)
44-
: this(new ManagedIdentityClient(new ManagedIdentityClientOptions { ClientId = clientId, Pipeline = CredentialPipeline.GetInstance(options), Options = options }))
44+
: this(new ManagedIdentityClient(new ManagedIdentityClientOptions { ClientId = clientId, Pipeline = CredentialPipeline.GetInstance(options, IsManagedIdentityCredential: true), Options = options }))
4545
{
4646
_logAccountDetails = options?.Diagnostics?.IsAccountIdentifierLoggingEnabled ?? false;
4747
}
@@ -55,7 +55,7 @@ public ManagedIdentityCredential(string clientId = null, TokenCredentialOptions
5555
/// </param>
5656
/// <param name="options">Options to configure the management of the requests sent to Microsoft Entra ID.</param>
5757
public ManagedIdentityCredential(ResourceIdentifier resourceId, TokenCredentialOptions options = null)
58-
: this(new ManagedIdentityClient(new ManagedIdentityClientOptions { ResourceIdentifier = resourceId, Pipeline = CredentialPipeline.GetInstance(options), Options = options }))
58+
: this(new ManagedIdentityClient(new ManagedIdentityClientOptions { ResourceIdentifier = resourceId, Pipeline = CredentialPipeline.GetInstance(options, IsManagedIdentityCredential: true), Options = options }))
5959
{
6060
_logAccountDetails = options?.Diagnostics?.IsAccountIdentifierLoggingEnabled ?? false;
6161
_clientId = resourceId.ToString();

sdk/identity/Azure.Identity/src/DefaultAzureCredentialFactory.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,16 +121,13 @@ public virtual TokenCredential CreateWorkloadIdentityCredential()
121121
public virtual TokenCredential CreateManagedIdentityCredential()
122122
{
123123
var options = Options.Clone<DefaultAzureCredentialOptions>();
124-
// Set the custom retry policy
125-
options.Retry.MaxRetries = 4;
126-
options.RetryPolicy ??= new DefaultAzureCredentialImdsRetryPolicy(options.Retry);
127124
options.IsChainedCredential = true;
128125

129126
var miOptions = new ManagedIdentityClientOptions
130127
{
131128
ResourceIdentifier = options.ManagedIdentityResourceId,
132129
ClientId = options.ManagedIdentityClientId,
133-
Pipeline = CredentialPipeline.GetInstance(options),
130+
Pipeline = CredentialPipeline.GetInstance(options, IsManagedIdentityCredential: true),
134131
Options = options,
135132
InitialImdsConnectionTimeout = TimeSpan.FromSeconds(1),
136133
ExcludeTokenExchangeManagedIdentitySource = options.ExcludeWorkloadIdentityCredential

sdk/identity/Azure.Identity/tests/ImdsManagedIdentitySourceTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public void ManagedIdentityCredentialUsesDefaultTimeoutAndRetries()
120120

121121
Assert.ThrowsAsync<AuthenticationFailedException>(async () => await cred.GetTokenAsync(new(new[] { "test" })));
122122

123-
var expectedTimeouts = new TimeSpan?[] { null, null, null, null };
123+
var expectedTimeouts = new TimeSpan?[] { null, null, null, null, null, null };
124124
CollectionAssert.AreEqual(expectedTimeouts, networkTimeouts);
125125
}
126126

sdk/identity/Azure.Identity/tests/ManagedIdentityCredentialTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -683,13 +683,13 @@ public async Task VerifyMsiUnavailableOnIMDSRequestFailedExcpetion()
683683
{
684684
using var environment = new TestEnvVar(new() { { "MSI_ENDPOINT", null }, { "MSI_SECRET", null }, { "IDENTITY_ENDPOINT", null }, { "IDENTITY_HEADER", null }, { "AZURE_POD_IDENTITY_AUTHORITY_HOST", "http://169.254.169.001/" } });
685685

686-
var options = new TokenCredentialOptions() { Retry = { MaxRetries = 0, NetworkTimeout = TimeSpan.FromMilliseconds(100) } };
686+
var options = new TokenCredentialOptions() { Retry = { MaxRetries = 0, NetworkTimeout = TimeSpan.FromMilliseconds(100), MaxDelay = TimeSpan.Zero } };
687687

688688
var credential = InstrumentClient(new ManagedIdentityCredential(options: options));
689689

690690
var ex = Assert.ThrowsAsync<CredentialUnavailableException>(async () => await credential.GetTokenAsync(new TokenRequestContext(MockScopes.Default)));
691691

692-
Assert.That(ex.Message, Does.Contain(ImdsManagedIdentitySource.NoResponseError));
692+
Assert.That(ex.Message, Does.Contain(ImdsManagedIdentitySource.AggregateError));
693693

694694
await Task.CompletedTask;
695695
}

0 commit comments

Comments
 (0)