App Configuration Provider - Tag filters#47985
Conversation
There was a problem hiding this comment.
Pull request overview
Adds support for filtering App Configuration settings and feature flags by tag expressions (via tags-filter), and updates selector model JavaDocs intended to improve configuration metadata/YAML hinting.
Changes:
- Adds
tagsFilterto key/value selector models and propagates it intoSettingSelectorwhen listing settings and feature flags. - Updates loader/client/property source APIs to thread tags filter through the loading pipeline.
- Expands unit test coverage for tags filter behavior (null/empty/custom) and snapshot incompatibility.
Reviewed changes
Copilot reviewed 16 out of 16 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AzureAppConfigDataLoader.java | Passes tagsFilter into setting/feature-flag loads and watched-settings selectors. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationApplicationSettingPropertySource.java | Adds tagsFilter field and applies it to SettingSelector for listing settings. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationSnapshotPropertySource.java | Updates superclass constructor call for new tags-filter parameter. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/FeatureFlagClient.java | Adds tags-filter support when listing feature flags. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/AppConfigurationKeyValueSelector.java | Introduces tagsFilter, adds snapshot vs tags validation, and refreshes JavaDocs. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/ConfigStore.java | Updates selector documentation/default initialization behavior (relies on selector default key filter behavior). |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/FeatureFlagKeyValueSelector.java | Introduces tagsFilter and refreshes JavaDocs for feature-flag selection behavior. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/FeatureFlagStore.java | JavaDoc refresh and minor init-doc clarification. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/AppConfigurationProperties.java | JavaDoc refresh for configuration properties root. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/AppConfigurationStoreMonitoring.java | JavaDoc refresh and clarified validation description. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/AppConfigurationStoreTrigger.java | JavaDoc refresh for trigger semantics. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/test/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationApplicationSettingPropertySourceTest.java | Adds tests asserting tags-filter propagation into SettingSelector for settings loads. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/test/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationPropertySourceKeyVaultTest.java | Updates constructor usage for new tags-filter parameter. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/test/java/com/azure/spring/cloud/appconfiguration/config/implementation/FeatureFlagClientTest.java | Updates client calls for new tags-filter parameter and adds tags-filter propagation tests. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/test/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/AppConfigurationKeyValueSelectorTest.java | Adds tests for tags-filter get/set behavior and snapshot incompatibility. |
| sdk/spring/spring-cloud-azure-appconfiguration-config/src/test/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/FeatureFlagKeyValueSelectorTest.java | Adds tests for tags-filter get/set behavior. |
Comments suppressed due to low confidence (1)
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/FeatureFlagKeyValueSelector.java:91
getLabelFilter(List<String> profiles)reverses the providedprofileslist in-place. This can throwUnsupportedOperationExceptionwhenprofilesis immutable (e.g., Spring Boot may supply an unmodifiable list), and it also mutates caller state. Consider making a defensive copy (e.g., new ArrayList<>(profiles)) before reversing, similar toAppConfigurationKeyValueSelector.getLabelFilter’s approach.
public String[] getLabelFilter(List<String> profiles) {
if (labelFilter == null && profiles.size() > 0) {
Collections.reverse(profiles);
return profiles.toArray(new String[profiles.size()]);
} else if (!StringUtils.hasText(labelFilter)) {
...ing/cloud/appconfiguration/config/implementation/properties/FeatureFlagKeyValueSelector.java
Show resolved
Hide resolved
...loud/appconfiguration/config/implementation/properties/AppConfigurationKeyValueSelector.java
Outdated
Show resolved
Hide resolved
...loud/appconfiguration/config/implementation/properties/AppConfigurationKeyValueSelector.java
Outdated
Show resolved
Hide resolved
...in/java/com/azure/spring/cloud/appconfiguration/config/implementation/FeatureFlagClient.java
Show resolved
Hide resolved
...ing/cloud/appconfiguration/config/implementation/properties/FeatureFlagKeyValueSelector.java
Outdated
Show resolved
Hide resolved
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
...ing/cloud/appconfiguration/config/implementation/properties/FeatureFlagKeyValueSelector.java
Outdated
Show resolved
Hide resolved
...loud/appconfiguration/config/implementation/properties/AppConfigurationKeyValueSelector.java
Outdated
Show resolved
Hide resolved
...loud/appconfiguration/config/implementation/properties/AppConfigurationKeyValueSelector.java
Outdated
Show resolved
Hide resolved
| public void setTagsFilterReturnsSelectorTest() { | ||
| FeatureFlagKeyValueSelector selector = new FeatureFlagKeyValueSelector(); | ||
| FeatureFlagKeyValueSelector returned = selector.setTagsFilter(Arrays.asList("env=dev")); | ||
| assertEquals(selector, returned); | ||
| } |
There was a problem hiding this comment.
This test is asserting fluent API behavior, but assertEquals will pass as long as equals() considers the objects equal. Use assertSame(selector, returned) to ensure the method returns the exact same instance (this).
| public void setTagsFilterReturnsSelectorTest() { | ||
| // Test fluent API returns the selector | ||
| AppConfigurationKeyValueSelector returned = selector.setTagsFilter(Arrays.asList("env=dev")); | ||
| assertEquals(selector, returned); | ||
| } |
There was a problem hiding this comment.
To verify the fluent setter returns the same instance (this), prefer assertSame(selector, returned) instead of assertEquals(...). assertEquals can still pass if equals() is overridden in the future.
Description
tags-filterlabel-filterAll SDK Contribution checklist:
General Guidelines and Best Practices
Testing Guidelines