Skip to content

Commit cb9580e

Browse files
committed
optimize azure front door scenario
1 parent c87b130 commit cb9580e

File tree

7 files changed

+88
-11
lines changed

7 files changed

+88
-11
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public static async Task<bool> HaveCollectionsChanged(
9595
LabelFilter = keyValueSelector.LabelFilter
9696
};
9797

98-
AsyncPageable<ConfigurationSetting> pageable = client.GetConfigurationSettingsAsync(selector, cancellationToken);
98+
AsyncPageable<ConfigurationSetting> pageable = client.CheckConfigurationSettingsAsync(selector, cancellationToken);
9999

100100
using IEnumerator<WatchedPage> existingPageWatcherEnumerator = pageWatchers.GetEnumerator();
101101

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/Microsoft.Extensions.Configuration.AzureAppConfiguration.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<Import Project="..\..\build\NugetProperties.props" />
44

@@ -15,7 +15,7 @@
1515
</PropertyGroup>
1616

1717
<ItemGroup>
18-
<PackageReference Include="Azure.Data.AppConfiguration" Version="1.7.0" />
18+
<PackageReference Include="Azure.Data.AppConfiguration" Version="1.8.0" />
1919
<PackageReference Include="Azure.Messaging.EventGrid" Version="5.0.0" />
2020
<PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.8.0" />
2121
<PackageReference Include="DnsClient" Version="1.7.0" />

tests/Tests.AzureAppConfiguration/Unit/AfdTests.cs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -242,10 +242,12 @@ public async Task AfdTests_RegisterAllRefresh()
242242
var mockAsyncPageable4 = new MockAsyncPageable(keyValueCollection3, null, 3, responses4);
243243

244244
mockClient.SetupSequence(c => c.GetConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
245-
.Returns(mockAsyncPageable1)
246-
.Returns(mockAsyncPageable2)
247-
.Returns(mockAsyncPageable3)
248-
.Returns(mockAsyncPageable4);
245+
.Returns(mockAsyncPageable1) // initial load
246+
.Returns(mockAsyncPageable3); // reload after change detected
247+
248+
mockClient.SetupSequence(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
249+
.Returns(mockAsyncPageable2) // first check - stale, should not refresh
250+
.Returns(mockAsyncPageable3); // second check - should trigger refresh
249251

250252
var afdEndpoint = new Uri("https://test.b01.azurefd.net");
251253
IConfigurationRefresher refresher = null;
@@ -381,10 +383,12 @@ public async Task AfdTests_FeatureFlagsRefresh()
381383
mockClient.SetupSequence(c => c.GetConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
382384
.Returns(mockAsyncPageable1) // default load configuration settings
383385
.Returns(mockAsyncPageable1) // load feature flag
386+
.Returns(mockAsyncPageable3) // reload after change detected
387+
.Returns(mockAsyncPageable3); // reload feature flags
388+
389+
mockClient.SetupSequence(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
384390
.Returns(mockAsyncPageable2) // watch request, should not trigger refresh
385-
.Returns(mockAsyncPageable3) // watch request, should trigger refresh
386-
.Returns(mockAsyncPageable3) // default load configuration settings
387-
.Returns(mockAsyncPageable3); // load feature flag
391+
.Returns(mockAsyncPageable3); // watch request, should trigger refresh
388392

389393
var afdEndpoint = new Uri("https://test.b01.azurefd.net");
390394
IConfigurationRefresher refresher = null;

tests/Tests.AzureAppConfiguration/Unit/FeatureManagementTests.cs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,10 @@ public async Task WatchesFeatureFlags()
777777
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
778778
.Returns(mockAsyncPageable);
779779

780+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
781+
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
782+
.Returns(mockAsyncPageable);
783+
780784
IConfigurationRefresher refresher = null;
781785
var config = new ConfigurationBuilder()
782786
.AddAzureAppConfiguration(options =>
@@ -849,6 +853,10 @@ public async Task WatchesFeatureFlagsUsingCacheExpirationInterval()
849853
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
850854
.Returns(mockAsyncPageable);
851855

856+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
857+
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
858+
.Returns(mockAsyncPageable);
859+
852860
var cacheExpirationInterval = TimeSpan.FromSeconds(1);
853861

854862
IConfigurationRefresher refresher = null;
@@ -923,6 +931,10 @@ public async Task SkipRefreshIfRefreshIntervalHasNotElapsed()
923931
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
924932
.Returns(mockAsyncPageable);
925933

934+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
935+
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
936+
.Returns(mockAsyncPageable);
937+
926938
IConfigurationRefresher refresher = null;
927939
var config = new ConfigurationBuilder()
928940
.AddAzureAppConfiguration(options =>
@@ -994,6 +1006,10 @@ public async Task SkipRefreshIfCacheNotExpired()
9941006
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
9951007
.Returns(mockAsyncPageable);
9961008

1009+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
1010+
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
1011+
.Returns(mockAsyncPageable);
1012+
9971013
IConfigurationRefresher refresher = null;
9981014
var config = new ConfigurationBuilder()
9991015
.AddAzureAppConfiguration(options =>
@@ -1118,6 +1134,10 @@ public async Task DoesNotUseEtagForFeatureFlagRefresh()
11181134
.Callback(() => mockAsyncPageable.UpdateCollection(new List<ConfigurationSetting> { _kv }))
11191135
.Returns(mockAsyncPageable);
11201136

1137+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
1138+
.Callback(() => mockAsyncPageable.UpdateCollection(new List<ConfigurationSetting> { _kv }))
1139+
.Returns(mockAsyncPageable);
1140+
11211141
IConfigurationRefresher refresher = null;
11221142
var config = new ConfigurationBuilder()
11231143
.AddAzureAppConfiguration(options =>
@@ -1134,7 +1154,8 @@ public async Task DoesNotUseEtagForFeatureFlagRefresh()
11341154
Thread.Sleep(RefreshInterval);
11351155

11361156
await refresher.TryRefreshAsync();
1137-
mockClient.Verify(c => c.GetConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()), Times.Exactly(3));
1157+
mockClient.Verify(c => c.GetConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()), Times.Exactly(2));
1158+
mockClient.Verify(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()), Times.Once());
11381159
}
11391160

11401161
[Fact]
@@ -1569,6 +1590,12 @@ public async Task DifferentCacheExpirationsForMultipleFeatureFlagRegistrations()
15691590
(s.Key.StartsWith(FeatureManagementConstants.FeatureFlagMarker + prefix2) && s.Label == label2 && s.Key != FeatureManagementConstants.FeatureFlagMarker + "App2_Feature3")).ToList()))
15701591
.Returns(mockAsyncPageable);
15711592

1593+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
1594+
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlagCollection.Where(s =>
1595+
(s.Key.StartsWith(FeatureManagementConstants.FeatureFlagMarker + prefix1) && s.Label == label1) ||
1596+
(s.Key.StartsWith(FeatureManagementConstants.FeatureFlagMarker + prefix2) && s.Label == label2 && s.Key != FeatureManagementConstants.FeatureFlagMarker + "App2_Feature3")).ToList()))
1597+
.Returns(mockAsyncPageable);
1598+
15721599
var config = new ConfigurationBuilder()
15731600
.AddAzureAppConfiguration(options =>
15741601
{
@@ -1739,6 +1766,11 @@ public async Task SelectAndRefreshSingleFeatureFlag()
17391766
s.Key.Equals(FeatureManagementConstants.FeatureFlagMarker + prefix1) && s.Label == label1).ToList()))
17401767
.Returns(mockAsyncPageable);
17411768

1769+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
1770+
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlagCollection.Where(s =>
1771+
s.Key.Equals(FeatureManagementConstants.FeatureFlagMarker + prefix1) && s.Label == label1).ToList()))
1772+
.Returns(mockAsyncPageable);
1773+
17421774
var config = new ConfigurationBuilder()
17431775
.AddAzureAppConfiguration(options =>
17441776
{
@@ -1802,6 +1834,10 @@ public async Task ValidateCorrectFeatureFlagLoggedIfModifiedOrRemovedDuringRefre
18021834
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
18031835
.Returns(mockAsyncPageable);
18041836

1837+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
1838+
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
1839+
.Returns(mockAsyncPageable);
1840+
18051841
mockClient.Setup(c => c.GetConfigurationSettingAsync(It.IsAny<ConfigurationSetting>(), It.IsAny<bool>(), It.IsAny<CancellationToken>()))
18061842
.ReturnsAsync((Func<ConfigurationSetting, bool, CancellationToken, Response<ConfigurationSetting>>)GetIfChanged);
18071843

@@ -1886,6 +1922,10 @@ public async Task ValidateFeatureFlagsUnchangedLogged()
18861922
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
18871923
.Returns(mockAsyncPageable);
18881924

1925+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
1926+
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
1927+
.Returns(mockAsyncPageable);
1928+
18891929
mockClient.Setup(c => c.GetConfigurationSettingAsync(It.IsAny<ConfigurationSetting>(), It.IsAny<bool>(), It.IsAny<CancellationToken>()))
18901930
.ReturnsAsync((Func<ConfigurationSetting, bool, CancellationToken, Response<ConfigurationSetting>>)GetIfChanged);
18911931

@@ -1964,6 +2004,10 @@ public async Task MapTransformFeatureFlagWithRefresh()
19642004
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
19652005
.Returns(mockAsyncPageable);
19662006

2007+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
2008+
.Callback(() => mockAsyncPageable.UpdateCollection(featureFlags))
2009+
.Returns(mockAsyncPageable);
2010+
19672011
mockClient.Setup(c => c.GetConfigurationSettingAsync(It.IsAny<ConfigurationSetting>(), It.IsAny<bool>(), It.IsAny<CancellationToken>()))
19682012
.ReturnsAsync((Func<ConfigurationSetting, bool, CancellationToken, Response<ConfigurationSetting>>)GetIfChanged);
19692013

tests/Tests.AzureAppConfiguration/Unit/HealthCheckTest.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ public async Task HealthCheckTests_ReturnsUnhealthyWhenRefreshFailed()
6868

6969
mockClient.SetupSequence(c => c.GetConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
7070
.Returns(new MockAsyncPageable(kvCollection))
71+
.Returns(new MockAsyncPageable(Enumerable.Empty<ConfigurationSetting>().ToList()))
72+
.Returns(new MockAsyncPageable(Enumerable.Empty<ConfigurationSetting>().ToList()));
73+
74+
mockClient.SetupSequence(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
7175
.Throws(new RequestFailedException(503, "Request failed."))
7276
.Returns(new MockAsyncPageable(Enumerable.Empty<ConfigurationSetting>().ToList()))
7377
.Returns(new MockAsyncPageable(Enumerable.Empty<ConfigurationSetting>().ToList()));

tests/Tests.AzureAppConfiguration/Unit/RefreshTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,10 @@ public async Task RefreshTests_SelectedKeysRefreshWithRegisterAll()
11281128
.Callback(() => mockAsyncPageable.UpdateCollection(_kvCollection))
11291129
.Returns(mockAsyncPageable);
11301130

1131+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
1132+
.Callback(() => mockAsyncPageable.UpdateCollection(_kvCollection))
1133+
.Returns(mockAsyncPageable);
1134+
11311135
var config = new ConfigurationBuilder()
11321136
.AddAzureAppConfiguration(options =>
11331137
{
@@ -1218,6 +1222,9 @@ MockAsyncPageable GetTestKeys(SettingSelector selector, CancellationToken ct)
12181222
mockClient.Setup(c => c.GetConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
12191223
.Returns((Func<SettingSelector, CancellationToken, MockAsyncPageable>)GetTestKeys);
12201224

1225+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
1226+
.Returns((Func<SettingSelector, CancellationToken, MockAsyncPageable>)GetTestKeys);
1227+
12211228
var config = new ConfigurationBuilder()
12221229
.AddAzureAppConfiguration(options =>
12231230
{
@@ -1303,6 +1310,10 @@ public async Task RefreshTests_StartsRefreshActivity()
13031310
.Callback(() => mockAsyncPageable.UpdateCollection(_kvCollection))
13041311
.Returns(mockAsyncPageable);
13051312

1313+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
1314+
.Callback(() => mockAsyncPageable.UpdateCollection(_kvCollection))
1315+
.Returns(mockAsyncPageable);
1316+
13061317
var config = new ConfigurationBuilder()
13071318
.AddAzureAppConfiguration(options =>
13081319
{
@@ -1417,6 +1428,12 @@ Response<ConfigurationSetting> GetIfChanged(ConfigurationSetting setting, bool o
14171428
return new MockAsyncPageable(_kvCollection.Select(setting => TestHelpers.CloneSetting(setting)).ToList());
14181429
});
14191430

1431+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
1432+
.Returns(() =>
1433+
{
1434+
return new MockAsyncPageable(_kvCollection.Select(setting => TestHelpers.CloneSetting(setting)).ToList());
1435+
});
1436+
14201437
mockClient.Setup(c => c.GetConfigurationSettingAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
14211438
.ReturnsAsync((Func<string, string, CancellationToken, Response<ConfigurationSetting>>)GetTestKey);
14221439

@@ -1456,6 +1473,9 @@ Response<ConfigurationSetting> GetIfChanged(ConfigurationSetting setting, bool o
14561473
mockClient.Setup(c => c.GetConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
14571474
.Returns((Func<SettingSelector, CancellationToken, MockAsyncPageable>)GetTestKeys);
14581475

1476+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
1477+
.Returns((Func<SettingSelector, CancellationToken, MockAsyncPageable>)GetTestKeys);
1478+
14591479
mockClient.Setup(c => c.GetConfigurationSettingAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
14601480
.ReturnsAsync((Func<string, string, CancellationToken, Response<ConfigurationSetting>>)GetTestKey);
14611481

tests/Tests.AzureAppConfiguration/Unit/TagFiltersTests.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,11 @@ public async Task TagFiltersTests_BasicRefresh()
532532
kv.Tags.ContainsKey("Environment") && kv.Tags["Environment"] == "Development")))
533533
.Returns(mockAsyncPageable);
534534

535+
mockClient.Setup(c => c.CheckConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
536+
.Callback(() => mockAsyncPageable.UpdateCollection(_kvCollection.FindAll(kv =>
537+
kv.Tags.ContainsKey("Environment") && kv.Tags["Environment"] == "Development")))
538+
.Returns(mockAsyncPageable);
539+
535540
var config = new ConfigurationBuilder()
536541
.AddAzureAppConfiguration(options =>
537542
{

0 commit comments

Comments
 (0)