Skip to content

Commit c465dda

Browse files
committed
Revert "Give the users the ability to have control over ConfigurationClient instance(s) used by the provider (#598) (#617)"
This reverts commit 6dc9ae2.
1 parent d592329 commit c465dda

File tree

5 files changed

+79
-127
lines changed

5 files changed

+79
-127
lines changed

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationClientFactory.cs

Lines changed: 0 additions & 74 deletions
This file was deleted.

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationOptions.cs

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
//
44
using Azure.Core;
55
using Azure.Data.AppConfiguration;
6-
using Microsoft.Extensions.Azure;
76
using Microsoft.Extensions.Configuration.AzureAppConfiguration.AzureKeyVault;
87
using Microsoft.Extensions.Configuration.AzureAppConfiguration.Extensions;
98
using Microsoft.Extensions.Configuration.AzureAppConfiguration.FeatureManagement;
@@ -148,11 +147,6 @@ internal IEnumerable<IKeyValueAdapter> Adapters
148147
/// </summary>
149148
internal StartupOptions Startup { get; set; } = new StartupOptions();
150149

151-
/// <summary>
152-
/// Client factory that is responsible for creating instances of ConfigurationClient.
153-
/// </summary>
154-
internal IAzureClientFactory<ConfigurationClient> ClientFactory { get; private set; }
155-
156150
/// <summary>
157151
/// Initializes a new instance of the <see cref="AzureAppConfigurationOptions"/> class.
158152
/// </summary>
@@ -169,17 +163,6 @@ public AzureAppConfigurationOptions()
169163
_selectors = new List<KeyValueSelector> { DefaultQuery };
170164
}
171165

172-
/// <summary>
173-
/// Sets the client factory used to create ConfigurationClient instances.
174-
/// </summary>
175-
/// <param name="factory">The client factory.</param>
176-
/// <returns>The current <see cref="AzureAppConfigurationOptions"/> instance.</returns>
177-
public AzureAppConfigurationOptions SetClientFactory(IAzureClientFactory<ConfigurationClient> factory)
178-
{
179-
ClientFactory = factory ?? throw new ArgumentNullException(nameof(factory));
180-
return this;
181-
}
182-
183166
/// <summary>
184167
/// Specify what key-values to include in the configuration provider.
185168
/// <see cref="Select"/> can be called multiple times to include multiple sets of key-values.

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationSource.cs

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT license.
33
//
4-
using Azure.Data.AppConfiguration;
5-
using Microsoft.Extensions.Azure;
64
using System;
7-
using System.Collections.Generic;
8-
using System.Linq;
95

106
namespace Microsoft.Extensions.Configuration.AzureAppConfiguration
117
{
@@ -33,33 +29,35 @@ public IConfigurationProvider Build(IConfigurationBuilder builder)
3329
try
3430
{
3531
AzureAppConfigurationOptions options = _optionsProvider();
32+
IConfigurationClientManager clientManager;
3633

3734
if (options.ClientManager != null)
3835
{
39-
return new AzureAppConfigurationProvider(options.ClientManager, options, _optional);
36+
clientManager = options.ClientManager;
4037
}
41-
42-
IEnumerable<Uri> endpoints;
43-
IAzureClientFactory<ConfigurationClient> clientFactory = options.ClientFactory;
44-
45-
if (options.ConnectionStrings != null)
38+
else if (options.ConnectionStrings != null)
4639
{
47-
endpoints = options.ConnectionStrings.Select(cs => new Uri(ConnectionStringUtils.Parse(cs, ConnectionStringUtils.EndpointSection)));
48-
49-
clientFactory ??= new AzureAppConfigurationClientFactory(options.ConnectionStrings, options.ClientOptions);
40+
clientManager = new ConfigurationClientManager(
41+
options.ConnectionStrings,
42+
options.ClientOptions,
43+
options.ReplicaDiscoveryEnabled,
44+
options.LoadBalancingEnabled);
5045
}
5146
else if (options.Endpoints != null && options.Credential != null)
5247
{
53-
endpoints = options.Endpoints;
54-
55-
clientFactory ??= new AzureAppConfigurationClientFactory(options.Credential, options.ClientOptions);
48+
clientManager = new ConfigurationClientManager(
49+
options.Endpoints,
50+
options.Credential,
51+
options.ClientOptions,
52+
options.ReplicaDiscoveryEnabled,
53+
options.LoadBalancingEnabled);
5654
}
5755
else
5856
{
5957
throw new ArgumentException($"Please call {nameof(AzureAppConfigurationOptions)}.{nameof(AzureAppConfigurationOptions.Connect)} to specify how to connect to Azure App Configuration.");
6058
}
6159

62-
provider = new AzureAppConfigurationProvider(new ConfigurationClientManager(clientFactory, endpoints, options.ReplicaDiscoveryEnabled, options.LoadBalancingEnabled), options, _optional);
60+
provider = new AzureAppConfigurationProvider(clientManager, options, _optional);
6361
}
6462
catch (InvalidOperationException ex) // InvalidOperationException is thrown when any problems are found while configuring AzureAppConfigurationOptions or when SDK fails to create a configurationClient.
6563
{

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/ConfigurationClientManager.cs

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
// Licensed under the MIT license.
33
//
44

5+
using Azure.Core;
56
using Azure.Data.AppConfiguration;
67
using DnsClient;
78
using DnsClient.Protocol;
8-
using Microsoft.Extensions.Azure;
99
using Microsoft.Extensions.Configuration.AzureAppConfiguration.Extensions;
1010
using System;
1111
using System.Collections.Generic;
@@ -26,11 +26,12 @@ namespace Microsoft.Extensions.Configuration.AzureAppConfiguration
2626
/// </remarks>
2727
internal class ConfigurationClientManager : IConfigurationClientManager, IDisposable
2828
{
29-
private readonly IAzureClientFactory<ConfigurationClient> _clientFactory;
3029
private readonly IList<ConfigurationClientWrapper> _clients;
31-
3230
private readonly Uri _endpoint;
33-
31+
private readonly string _secret;
32+
private readonly string _id;
33+
private readonly TokenCredential _credential;
34+
private readonly ConfigurationClientOptions _clientOptions;
3435
private readonly bool _replicaDiscoveryEnabled;
3536
private readonly SrvLookupClient _srvLookupClient;
3637
private readonly string _validDomain;
@@ -51,20 +52,61 @@ internal class ConfigurationClientManager : IConfigurationClientManager, IDispos
5152
internal int RefreshClientsCalled { get; set; } = 0;
5253

5354
public ConfigurationClientManager(
54-
IAzureClientFactory<ConfigurationClient> clientFactory,
55-
IEnumerable<Uri> endpoints,
55+
IEnumerable<string> connectionStrings,
56+
ConfigurationClientOptions clientOptions,
5657
bool replicaDiscoveryEnabled,
5758
bool loadBalancingEnabled)
5859
{
59-
_clientFactory = clientFactory ?? throw new ArgumentNullException(nameof(clientFactory));
60+
if (connectionStrings == null || !connectionStrings.Any())
61+
{
62+
throw new ArgumentNullException(nameof(connectionStrings));
63+
}
64+
65+
string connectionString = connectionStrings.First();
66+
_endpoint = new Uri(ConnectionStringUtils.Parse(connectionString, ConnectionStringUtils.EndpointSection));
67+
_secret = ConnectionStringUtils.Parse(connectionString, ConnectionStringUtils.SecretSection);
68+
_id = ConnectionStringUtils.Parse(connectionString, ConnectionStringUtils.IdSection);
69+
_clientOptions = clientOptions;
70+
_replicaDiscoveryEnabled = replicaDiscoveryEnabled;
71+
72+
// If load balancing is enabled, shuffle the passed in connection strings to randomize the endpoint used on startup
73+
if (loadBalancingEnabled)
74+
{
75+
connectionStrings = connectionStrings.ToList().Shuffle();
76+
}
77+
78+
_validDomain = GetValidDomain(_endpoint);
79+
_srvLookupClient = new SrvLookupClient();
6080

81+
_clients = connectionStrings
82+
.Select(cs =>
83+
{
84+
var endpoint = new Uri(ConnectionStringUtils.Parse(cs, ConnectionStringUtils.EndpointSection));
85+
return new ConfigurationClientWrapper(endpoint, new ConfigurationClient(cs, _clientOptions));
86+
})
87+
.ToList();
88+
}
89+
90+
public ConfigurationClientManager(
91+
IEnumerable<Uri> endpoints,
92+
TokenCredential credential,
93+
ConfigurationClientOptions clientOptions,
94+
bool replicaDiscoveryEnabled,
95+
bool loadBalancingEnabled)
96+
{
6197
if (endpoints == null || !endpoints.Any())
6298
{
6399
throw new ArgumentNullException(nameof(endpoints));
64100
}
65101

66-
_endpoint = endpoints.First();
102+
if (credential == null)
103+
{
104+
throw new ArgumentNullException(nameof(credential));
105+
}
67106

107+
_endpoint = endpoints.First();
108+
_credential = credential;
109+
_clientOptions = clientOptions;
68110
_replicaDiscoveryEnabled = replicaDiscoveryEnabled;
69111

70112
// If load balancing is enabled, shuffle the passed in endpoints to randomize the endpoint used on startup
@@ -77,7 +119,7 @@ public ConfigurationClientManager(
77119
_srvLookupClient = new SrvLookupClient();
78120

79121
_clients = endpoints
80-
.Select(endpoint => new ConfigurationClientWrapper(endpoint, clientFactory.CreateClient(endpoint.AbsoluteUri)))
122+
.Select(endpoint => new ConfigurationClientWrapper(endpoint, new ConfigurationClient(endpoint, _credential, _clientOptions)))
81123
.ToList();
82124
}
83125

@@ -247,7 +289,9 @@ private async Task RefreshFallbackClients(CancellationToken cancellationToken)
247289
{
248290
var targetEndpoint = new Uri($"https://{host}");
249291

250-
ConfigurationClient configClient = _clientFactory.CreateClient(targetEndpoint.AbsoluteUri);
292+
var configClient = _credential == null
293+
? new ConfigurationClient(ConnectionStringUtils.Build(targetEndpoint, _id, _secret), _clientOptions)
294+
: new ConfigurationClient(targetEndpoint, _credential, _clientOptions);
251295

252296
newDynamicClients.Add(new ConfigurationClientWrapper(targetEndpoint, configClient));
253297
}

tests/Tests.AzureAppConfiguration/FailoverTests.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -268,11 +268,10 @@ public void FailOverTests_AutoFailover()
268268
[Fact]
269269
public void FailOverTests_ValidateEndpoints()
270270
{
271-
var clientFactory = new AzureAppConfigurationClientFactory(new DefaultAzureCredential(), new ConfigurationClientOptions());
272-
273271
var configClientManager = new ConfigurationClientManager(
274-
clientFactory,
275272
new[] { new Uri("https://foobar.azconfig.io") },
273+
new DefaultAzureCredential(),
274+
new ConfigurationClientOptions(),
276275
true,
277276
false);
278277

@@ -286,8 +285,9 @@ public void FailOverTests_ValidateEndpoints()
286285
Assert.False(configClientManager.IsValidEndpoint("azure.azconfig.bad.io"));
287286

288287
var configClientManager2 = new ConfigurationClientManager(
289-
clientFactory,
290288
new[] { new Uri("https://foobar.appconfig.azure.com") },
289+
new DefaultAzureCredential(),
290+
new ConfigurationClientOptions(),
291291
true,
292292
false);
293293

@@ -301,17 +301,19 @@ public void FailOverTests_ValidateEndpoints()
301301
Assert.False(configClientManager2.IsValidEndpoint("azure.appconfigbad.azure.com"));
302302

303303
var configClientManager3 = new ConfigurationClientManager(
304-
clientFactory,
305304
new[] { new Uri("https://foobar.azconfig-test.io") },
305+
new DefaultAzureCredential(),
306+
new ConfigurationClientOptions(),
306307
true,
307308
false);
308309

309310
Assert.False(configClientManager3.IsValidEndpoint("azure.azconfig-test.io"));
310311
Assert.False(configClientManager3.IsValidEndpoint("azure.azconfig.io"));
311312

312313
var configClientManager4 = new ConfigurationClientManager(
313-
clientFactory,
314314
new[] { new Uri("https://foobar.z1.appconfig-test.azure.com") },
315+
new DefaultAzureCredential(),
316+
new ConfigurationClientOptions(),
315317
true,
316318
false);
317319

@@ -323,11 +325,10 @@ public void FailOverTests_ValidateEndpoints()
323325
[Fact]
324326
public void FailOverTests_GetNoDynamicClient()
325327
{
326-
var clientFactory = new AzureAppConfigurationClientFactory(new DefaultAzureCredential(), new ConfigurationClientOptions());
327-
328328
var configClientManager = new ConfigurationClientManager(
329-
clientFactory,
330329
new[] { new Uri("https://azure.azconfig.io") },
330+
new DefaultAzureCredential(),
331+
new ConfigurationClientOptions(),
331332
true,
332333
false);
333334

0 commit comments

Comments
 (0)