Skip to content

Commit 8ed4901

Browse files
authored
Adding Default Filters (#43935)
* Adding Default Filters * Fixing Feature flag loading after both redesigns * Fixing issues after just 2.0 schema and properties * Clearing up feature return * fixing usage of default min backoff * Removed dead code + tests * Update TargetingContextAccessorTestConfiguration.java * Update FeatureManagementConfiguration.java
1 parent cb2c369 commit 8ed4901

23 files changed

+225
-280
lines changed

sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/AppConfigurationWatchAutoConfiguration.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,13 @@
1717
import com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationReplicaClientFactory;
1818
import com.azure.spring.cloud.appconfiguration.config.implementation.autofailover.ReplicaLookUp;
1919
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationProperties;
20-
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationProviderProperties;
2120

2221
/**
2322
* Setup AppConfigurationRefresh when <i>spring.cloud.azure.appconfiguration.enabled</i> is enabled.
2423
*/
2524
@EnableAsync
2625
@ConditionalOnProperty(prefix = AppConfigurationProperties.CONFIG_PREFIX, name = "enabled", matchIfMissing = true)
27-
@EnableConfigurationProperties({ AppConfigurationProperties.class, AppConfigurationProviderProperties.class })
26+
@EnableConfigurationProperties({ AppConfigurationProperties.class })
2827
@AutoConfiguration
2928
@ConditionalOnClass(RefreshEndpoint.class)
3029
public class AppConfigurationWatchAutoConfiguration {
@@ -37,13 +36,12 @@ public AppConfigurationWatchAutoConfiguration() {
3736

3837
@Bean
3938
@ConditionalOnMissingBean
40-
AppConfigurationRefresh appConfigurationRefresh(AppConfigurationProperties properties,
41-
AppConfigurationProviderProperties appProperties, BootstrapContext context) {
39+
AppConfigurationRefresh appConfigurationRefresh(AppConfigurationProperties properties, BootstrapContext context) {
4240
AppConfigurationReplicaClientFactory clientFactory = context
4341
.get(AppConfigurationReplicaClientFactory.class);
4442
ReplicaLookUp replicaLookUp = context.get(ReplicaLookUp.class);
4543

46-
return new AppConfigurationPullRefresh(clientFactory, properties.getRefreshInterval(),
47-
appProperties.getDefaultMinBackoff(), replicaLookUp, new AppConfigurationRefreshUtil());
44+
return new AppConfigurationPullRefresh(clientFactory, properties.getRefreshInterval(), replicaLookUp,
45+
new AppConfigurationRefreshUtil());
4846
}
4947
}

sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationFeatureManagementPropertySource.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22
// Licensed under the MIT License.
33
package com.azure.spring.cloud.appconfiguration.config.implementation;
44

5+
import java.util.List;
6+
57
import org.springframework.core.env.EnumerablePropertySource;
68

9+
import com.fasterxml.jackson.databind.ObjectMapper;
10+
import com.fasterxml.jackson.databind.json.JsonMapper;
11+
712
/**
813
* Azure App Configuration PropertySource unique per Store Label(Profile) combo.
914
*
@@ -19,21 +24,25 @@ class AppConfigurationFeatureManagementPropertySource extends EnumerableProperty
1924

2025
private static final String FEATURE_FLAG_KEY = FEATURE_MANAGEMENT_KEY + ".feature_flags";
2126

27+
private static final ObjectMapper MAPPER = JsonMapper.builder().build();
28+
2229
AppConfigurationFeatureManagementPropertySource(FeatureFlagClient featureFlagLoader) {
2330
super(FEATURE_MANAGEMENT_KEY, featureFlagLoader);
2431
this.featureFlagLoader = featureFlagLoader;
2532
}
2633

2734
@Override
2835
public String[] getPropertyNames() {
29-
String[] names = { FEATURE_FLAG_KEY };
30-
return names;
36+
if (featureFlagLoader != null && featureFlagLoader.getFeatureFlags().size() > 0) {
37+
return new String[]{ FEATURE_FLAG_KEY };
38+
}
39+
return new String[0];
3140
}
3241

3342
@Override
3443
public Object getProperty(String name) {
3544
if (FEATURE_FLAG_KEY.equals(name)) {
36-
return featureFlagLoader.getProperties();
45+
return MAPPER.convertValue(featureFlagLoader.getFeatureFlags(), List.class);
3746
}
3847
return null;
3948
}

sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationKeyVaultClientFactory.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,24 @@ class AppConfigurationKeyVaultClientFactory {
2323
private final boolean credentialsConfigured;
2424

2525
private final boolean isConfigured;
26-
27-
private final int timeout;
2826

2927
AppConfigurationKeyVaultClientFactory(SecretClientCustomizer keyVaultClientProvider,
3028
KeyVaultSecretProvider keyVaultSecretProvider, SecretClientBuilderFactory secretClientFactory,
31-
boolean credentialsConfigured, int timeout) {
29+
boolean credentialsConfigured) {
3230
this.keyVaultClientProvider = keyVaultClientProvider;
3331
this.keyVaultSecretProvider = keyVaultSecretProvider;
3432
this.secretClientFactory = secretClientFactory;
3533
keyVaultClients = new HashMap<>();
3634
this.credentialsConfigured = credentialsConfigured;
3735
isConfigured = keyVaultClientProvider != null || credentialsConfigured;
38-
this.timeout = timeout;
3936
}
4037

4138
AppConfigurationSecretClientManager getClient(String host) {
4239
// Check if we already have a client for this key vault, if not we will make
4340
// one
4441
if (!keyVaultClients.containsKey(host)) {
4542
AppConfigurationSecretClientManager client = new AppConfigurationSecretClientManager(host,
46-
keyVaultClientProvider, keyVaultSecretProvider, secretClientFactory, credentialsConfigured, timeout);
43+
keyVaultClientProvider, keyVaultSecretProvider, secretClientFactory, credentialsConfigured);
4744
keyVaultClients.put(host, client);
4845
}
4946
return keyVaultClients.get(host);

sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationPullRefresh.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ public class AppConfigurationPullRefresh implements AppConfigurationRefresh {
3030
private final AtomicBoolean running = new AtomicBoolean(false);
3131

3232
private ApplicationEventPublisher publisher;
33-
34-
private final Long defaultMinBackoff;
33+
34+
private final Long defaultMinBackoff = (long) 30;
3535

3636
private final AppConfigurationReplicaClientFactory clientFactory;
3737

@@ -46,11 +46,9 @@ public class AppConfigurationPullRefresh implements AppConfigurationRefresh {
4646
*
4747
* @param clientFactory Clients stores used to connect to App Configuration. * @param defaultMinBackoff default
4848
* @param refreshInterval time between refresh intervals
49-
* @param defaultMinBackoff minimum time between backoff retries minimum backoff time
5049
*/
5150
public AppConfigurationPullRefresh(AppConfigurationReplicaClientFactory clientFactory, Duration refreshInterval,
52-
Long defaultMinBackoff, ReplicaLookUp replicaLookUp, AppConfigurationRefreshUtil refreshUtils) {
53-
this.defaultMinBackoff = defaultMinBackoff;
51+
ReplicaLookUp replicaLookUp, AppConfigurationRefreshUtil refreshUtils) {
5452
this.refreshInterval = refreshInterval;
5553
this.clientFactory = clientFactory;
5654
this.replicaLookUp = replicaLookUp;

sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationReplicaClientsBuilder.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,10 @@ public class AppConfigurationReplicaClientsBuilder {
7878

7979
private final boolean credentialConfigured;
8080

81-
private final int defaultMaxRetries;
81+
private final int defaultMaxRetries = 2;
8282

83-
AppConfigurationReplicaClientsBuilder(int defaultMaxRetries, ConfigurationClientBuilderFactory clientFactory,
83+
AppConfigurationReplicaClientsBuilder(ConfigurationClientBuilderFactory clientFactory,
8484
ConfigurationClientCustomizer clientCustomizer, boolean credentialConfigured, boolean isKeyVaultConfigured) {
85-
this.defaultMaxRetries = defaultMaxRetries;
8685
this.credentialConfigured = credentialConfigured;
8786
this.clientFactory = clientFactory;
8887
this.clientCustomizer = clientCustomizer;

sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AzureAppConfigBoostrapRegistrar.java

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import org.springframework.boot.BootstrapRegistry.InstanceSupplier;
66
import org.springframework.boot.context.config.ConfigDataLocationResolverContext;
7-
import org.springframework.boot.context.properties.EnableConfigurationProperties;
87
import org.springframework.boot.context.properties.bind.Bindable;
98
import org.springframework.boot.context.properties.bind.Binder;
109
import org.springframework.util.StringUtils;
@@ -15,9 +14,9 @@
1514
import com.azure.spring.cloud.appconfiguration.config.SecretClientCustomizer;
1615
import com.azure.spring.cloud.appconfiguration.config.implementation.autofailover.ReplicaLookUp;
1716
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationProperties;
18-
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationProviderProperties;
1917
import com.azure.spring.cloud.autoconfigure.implementation.appconfiguration.AzureAppConfigurationProperties;
2018
import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties;
19+
import com.azure.spring.cloud.autoconfigure.implementation.keyvault.secrets.properties.AzureKeyVaultSecretProperties;
2120
import com.azure.spring.cloud.autoconfigure.implementation.properties.core.AbstractAzureHttpConfigurationProperties;
2221
import com.azure.spring.cloud.autoconfigure.implementation.properties.core.authentication.TokenCredentialConfigurationProperties;
2322
import com.azure.spring.cloud.autoconfigure.implementation.properties.utils.AzureGlobalPropertiesUtils;
@@ -26,12 +25,10 @@
2625
import com.azure.spring.cloud.service.implementation.appconfiguration.ConfigurationClientBuilderFactory;
2726
import com.azure.spring.cloud.service.implementation.keyvault.secrets.SecretClientBuilderFactory;
2827

29-
@EnableConfigurationProperties(AppConfigurationProviderProperties.class)
3028
class AzureAppConfigurationBootstrapRegistrar {
3129

3230
static void register(ConfigDataLocationResolverContext context, Binder binder,
33-
AppConfigurationProperties properties, AppConfigurationProviderProperties appProperties,
34-
ReplicaLookUp replicaLookup) {
31+
AppConfigurationProperties properties, ReplicaLookUp replicaLookup) {
3532

3633
AzureGlobalProperties globalProperties = binder
3734
.bind(AzureGlobalProperties.PREFIX, Bindable.of(AzureGlobalProperties.class))
@@ -46,9 +43,9 @@ static void register(ConfigDataLocationResolverContext context, Binder binder,
4643
boolean isCredentialConfigured = isCredentialConfigured(loadedProperties);
4744

4845
AppConfigurationKeyVaultClientFactory keyVaultClientFactory = appConfigurationKeyVaultClientFactory(context,
49-
isCredentialConfigured, appProperties.getMaxRetryTime());
50-
AppConfigurationReplicaClientsBuilder replicaClientsBuilder = replicaClientBuilder(context, binder,
51-
keyVaultClientFactory, loadedProperties, isCredentialConfigured, appProperties.getMaxRetries());
46+
binder, isCredentialConfigured);
47+
AppConfigurationReplicaClientsBuilder replicaClientsBuilder = replicaClientBuilder(context,
48+
keyVaultClientFactory, loadedProperties, isCredentialConfigured);
5249

5350
context.getBootstrapContext().registerIfAbsent(AppConfigurationKeyVaultClientFactory.class,
5451
InstanceSupplier.from(() -> keyVaultClientFactory));
@@ -57,17 +54,23 @@ static void register(ConfigDataLocationResolverContext context, Binder binder,
5754
}
5855

5956
private static AppConfigurationKeyVaultClientFactory appConfigurationKeyVaultClientFactory(
60-
ConfigDataLocationResolverContext context, boolean isCredentialConfigured, Integer maxRetryTime)
57+
ConfigDataLocationResolverContext context, Binder binder, boolean isCredentialConfigured)
6158
throws IllegalArgumentException {
6259

6360
SecretClientCustomizer customizer = context.getBootstrapContext().getOrElse(SecretClientCustomizer.class, null);
6461
KeyVaultSecretProvider secretProvider = context.getBootstrapContext().getOrElse(KeyVaultSecretProvider.class,
6562
null);
66-
SecretClientBuilderFactory secretClientFactory = context.getBootstrapContext()
67-
.getOrElse(SecretClientBuilderFactory.class, null);
6863

69-
return new AppConfigurationKeyVaultClientFactory(customizer, secretProvider, secretClientFactory,
70-
isCredentialConfigured, maxRetryTime);
64+
AzureKeyVaultSecretProperties secretClientProperties = binder
65+
.bind(AzureKeyVaultSecretProperties.PREFIX, Bindable.of(AzureKeyVaultSecretProperties.class))
66+
.orElseGet(AzureKeyVaultSecretProperties::new);
67+
SecretClientBuilderFactory secretClientBuilderFactory = new SecretClientBuilderFactory(secretClientProperties);
68+
69+
context.getBootstrapContext().registerIfAbsent(SecretClientBuilderFactory.class,
70+
InstanceSupplier.from(() -> secretClientBuilderFactory));
71+
72+
return new AppConfigurationKeyVaultClientFactory(customizer, secretProvider, secretClientBuilderFactory,
73+
isCredentialConfigured);
7174
}
7275

7376
private static AppConfigurationReplicaClientFactory buildClientFactory(
@@ -78,8 +81,8 @@ private static AppConfigurationReplicaClientFactory buildClientFactory(
7881

7982
@SuppressWarnings("unchecked")
8083
private static AppConfigurationReplicaClientsBuilder replicaClientBuilder(ConfigDataLocationResolverContext context,
81-
Binder binder, AppConfigurationKeyVaultClientFactory keyVaultClientFactory,
82-
AzureAppConfigurationProperties properties, boolean isCredentialConfigured, Integer maxRetries) {
84+
AppConfigurationKeyVaultClientFactory keyVaultClientFactory, AzureAppConfigurationProperties properties,
85+
boolean isCredentialConfigured) {
8386

8487
InstanceSupplier<AzureServiceClientBuilderCustomizer<ConfigurationClientBuilder>> customizer = context
8588
.getBootstrapContext()
@@ -108,8 +111,8 @@ private static AppConfigurationReplicaClientsBuilder replicaClientBuilder(Config
108111
clientCustomizer = configurationClientCustomizer.get(context.getBootstrapContext());
109112
}
110113

111-
return new AppConfigurationReplicaClientsBuilder(maxRetries, clientFactory, clientCustomizer,
112-
isCredentialConfigured, keyVaultClientFactory.isConfigured());
114+
return new AppConfigurationReplicaClientsBuilder(clientFactory, clientCustomizer, isCredentialConfigured,
115+
keyVaultClientFactory.isConfigured());
113116
}
114117

115118
private static boolean isCredentialConfigured(AbstractAzureHttpConfigurationProperties properties) {

sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AzureAppConfigDataLoader.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import org.springframework.boot.context.config.ConfigDataLoader;
1515
import org.springframework.boot.context.config.ConfigDataLoaderContext;
1616
import org.springframework.boot.context.config.ConfigDataResourceNotFoundException;
17-
import org.springframework.boot.context.properties.EnableConfigurationProperties;
1817
import org.springframework.boot.logging.DeferredLog;
1918
import org.springframework.boot.logging.DeferredLogFactory;
2019
import org.springframework.core.env.EnumerablePropertySource;
@@ -24,12 +23,10 @@
2423
import com.azure.data.appconfiguration.models.ConfigurationSetting;
2524
import com.azure.spring.cloud.appconfiguration.config.implementation.feature.FeatureFlags;
2625
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationKeyValueSelector;
27-
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationProviderProperties;
2826
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationStoreMonitoring;
2927
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationStoreMonitoring.PushNotification;
3028
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.FeatureFlagKeyValueSelector;
3129

32-
@EnableConfigurationProperties(AppConfigurationProviderProperties.class)
3330
public class AzureAppConfigDataLoader implements ConfigDataLoader<AzureAppConfigDataResource> {
3431

3532
private static Log logger = new DeferredLog();
@@ -46,6 +43,10 @@ public class AzureAppConfigDataLoader implements ConfigDataLoader<AzureAppConfig
4643

4744
private Context requestContext;
4845

46+
private static final Instant START_DATE = Instant.now();
47+
48+
private static final Integer PREKILL_TIME = 5;
49+
4950
public AzureAppConfigDataLoader(DeferredLogFactory logFactory) {
5051
logger = logFactory.getLog(getClass());
5152
}
@@ -200,8 +201,7 @@ private List<FeatureFlags> createFeatureFlags(AppConfigurationReplicaClient clie
200201

201202
private void delayException() {
202203
Instant currentDate = Instant.now();
203-
Instant preKillTIme = resource.getAppProperties().getStartDate()
204-
.plusSeconds(resource.getAppProperties().getPrekillTime());
204+
Instant preKillTIme = START_DATE.plusSeconds(PREKILL_TIME);
205205
if (currentDate.isBefore(preKillTIme)) {
206206
long diffInMillies = Math.abs(preKillTIme.toEpochMilli() - currentDate.toEpochMilli());
207207
try {

0 commit comments

Comments
 (0)