Skip to content

Commit 72a3b53

Browse files
authored
Added configuration for disabling feature management requests (Azure#18582)
1 parent 059d0fe commit 72a3b53

File tree

3 files changed

+68
-23
lines changed

3 files changed

+68
-23
lines changed

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.io.IOException;
3131
import java.net.URI;
3232
import java.net.URISyntaxException;
33+
import java.util.ArrayList;
3334
import java.util.Date;
3435
import java.util.HashMap;
3536
import java.util.LinkedHashMap;
@@ -150,12 +151,15 @@ FeatureSet initProperties(FeatureSet featureSet) throws IOException {
150151
settingSelector.setKeyFilter(context + "*");
151152
List<ConfigurationSetting> settings = clients.listSettings(settingSelector, storeName);
152153

154+
List<ConfigurationSetting> features = new ArrayList<ConfigurationSetting>();
153155
// Reading In Features
154-
settingSelector.setKeyFilter(".appconfig*");
155-
List<ConfigurationSetting> features = clients.listSettings(settingSelector, storeName);
156+
if (configStore.isUseFeatureManagement()) {
157+
settingSelector.setKeyFilter(".appconfig*");
158+
features = clients.listSettings(settingSelector, storeName);
156159

157-
if (features == null) {
158-
throw new IOException("Unable to load properties from App Configuration Store.");
160+
if (features == null) {
161+
throw new IOException("Unable to load properties from App Configuration Store.");
162+
}
159163
}
160164

161165
if (settings == null) {

sdk/appconfiguration/azure-spring-cloud-appconfiguration-config/src/main/java/com/microsoft/azure/spring/cloud/config/properties/ConfigStore.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,28 @@
44

55
import static com.microsoft.azure.spring.cloud.config.properties.AppConfigurationProperties.LABEL_SEPARATOR;
66

7-
import com.microsoft.azure.spring.cloud.config.resource.Connection;
87
import java.net.URI;
98
import java.net.URISyntaxException;
109
import java.util.Arrays;
1110
import java.util.Collections;
1211
import java.util.List;
1312
import java.util.stream.Collectors;
13+
1414
import javax.annotation.PostConstruct;
1515
import javax.validation.constraints.Pattern;
16+
1617
import org.springframework.lang.Nullable;
1718
import org.springframework.util.Assert;
1819
import org.springframework.util.StringUtils;
1920

21+
import com.microsoft.azure.spring.cloud.config.resource.Connection;
22+
2023
public class ConfigStore {
2124

2225
private static final String EMPTY_LABEL = "\0";
23-
private static final String[] EMPTY_LABEL_ARRAY = {EMPTY_LABEL};
26+
27+
private static final String[] EMPTY_LABEL_ARRAY = { EMPTY_LABEL };
28+
2429
private String endpoint; // Config store endpoint
2530

2631
@Nullable
@@ -35,6 +40,8 @@ public class ConfigStore {
3540

3641
private boolean failFast = true;
3742

43+
private boolean useFeatureManagement = false;
44+
3845
private AppConfigurationStoreMonitoring monitoring = new AppConfigurationStoreMonitoring();
3946

4047
public ConfigStore() {
@@ -81,6 +88,14 @@ public void setFailFast(boolean failFast) {
8188
this.failFast = failFast;
8289
}
8390

91+
public boolean isUseFeatureManagement() {
92+
return useFeatureManagement;
93+
}
94+
95+
public void setUseFeatureManagement(boolean useFeatureManagement) {
96+
this.useFeatureManagement = useFeatureManagement;
97+
}
98+
8499
/**
85100
* @return the monitoring
86101
*/

sdk/appconfiguration/azure-spring-cloud-appconfiguration-config/src/test/java/com/microsoft/azure/spring/cloud/config/AppConfigurationPropertySourceTest.java

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,28 +25,17 @@
2525
import static com.microsoft.azure.spring.cloud.config.TestUtils.createItem;
2626
import static org.assertj.core.api.Assertions.assertThat;
2727
import static org.junit.Assert.assertEquals;
28+
import static org.junit.Assert.assertNull;
2829
import static org.junit.Assert.fail;
2930
import static org.mockito.Mockito.when;
3031

31-
import com.azure.core.http.rest.PagedFlux;
32-
import com.azure.core.http.rest.PagedResponse;
33-
import com.azure.data.appconfiguration.ConfigurationAsyncClient;
34-
import com.azure.data.appconfiguration.models.ConfigurationSetting;
35-
import com.fasterxml.jackson.databind.ObjectMapper;
36-
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
37-
import com.microsoft.azure.spring.cloud.config.feature.management.entity.Feature;
38-
import com.microsoft.azure.spring.cloud.config.feature.management.entity.FeatureFilterEvaluationContext;
39-
import com.microsoft.azure.spring.cloud.config.feature.management.entity.FeatureSet;
40-
import com.microsoft.azure.spring.cloud.config.properties.AppConfigurationProperties;
41-
import com.microsoft.azure.spring.cloud.config.properties.AppConfigurationProviderProperties;
42-
import com.microsoft.azure.spring.cloud.config.properties.ConfigStore;
43-
import com.microsoft.azure.spring.cloud.config.stores.ClientStore;
4432
import java.io.IOException;
4533
import java.util.ArrayList;
4634
import java.util.HashMap;
4735
import java.util.Iterator;
4836
import java.util.LinkedHashMap;
4937
import java.util.List;
38+
5039
import org.apache.commons.lang3.ArrayUtils;
5140
import org.junit.Before;
5241
import org.junit.BeforeClass;
@@ -56,6 +45,21 @@
5645
import org.mockito.Mock;
5746
import org.mockito.Mockito;
5847
import org.mockito.MockitoAnnotations;
48+
49+
import com.azure.core.http.rest.PagedFlux;
50+
import com.azure.core.http.rest.PagedResponse;
51+
import com.azure.data.appconfiguration.ConfigurationAsyncClient;
52+
import com.azure.data.appconfiguration.models.ConfigurationSetting;
53+
import com.fasterxml.jackson.databind.ObjectMapper;
54+
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
55+
import com.microsoft.azure.spring.cloud.config.feature.management.entity.Feature;
56+
import com.microsoft.azure.spring.cloud.config.feature.management.entity.FeatureFilterEvaluationContext;
57+
import com.microsoft.azure.spring.cloud.config.feature.management.entity.FeatureSet;
58+
import com.microsoft.azure.spring.cloud.config.properties.AppConfigurationProperties;
59+
import com.microsoft.azure.spring.cloud.config.properties.AppConfigurationProviderProperties;
60+
import com.microsoft.azure.spring.cloud.config.properties.ConfigStore;
61+
import com.microsoft.azure.spring.cloud.config.stores.ClientStore;
62+
5963
import reactor.core.publisher.Flux;
6064
import reactor.core.publisher.Mono;
6165

@@ -140,6 +144,9 @@ public class AppConfigurationPropertySourceTest {
140144

141145
@Mock
142146
private PagedResponse<ConfigurationSetting> pagedResponseMock;
147+
148+
@Mock
149+
private ConfigStore configStoreMock;
143150

144151
private AppConfigurationProviderProperties appProperties;
145152

@@ -163,18 +170,17 @@ public void setup() {
163170
MockitoAnnotations.initMocks(this);
164171
appConfigurationProperties = new AppConfigurationProperties();
165172
appProperties = new AppConfigurationProviderProperties();
166-
ConfigStore configStore = new ConfigStore();
167-
configStore.setEndpoint(TEST_STORE_NAME);
168173
ArrayList<String> contexts = new ArrayList<String>();
169174
contexts.add("/application/*");
170-
propertySource = new AppConfigurationPropertySource(TEST_CONTEXT, configStore, "\0",
175+
propertySource = new AppConfigurationPropertySource(TEST_CONTEXT, configStoreMock, "\0",
171176
appConfigurationProperties, clientStoreMock, appProperties, tokenCredentialProvider, null);
172177

173178
testItems = new ArrayList<ConfigurationSetting>();
174179
testItems.add(item1);
175180
testItems.add(item2);
176181
testItems.add(item3);
177182

183+
when(configStoreMock.getEndpoint()).thenReturn(TEST_STORE_NAME);
178184
when(configClientMock.listConfigurationSettings(Mockito.any())).thenReturn(settingsMock);
179185
when(settingsMock.byPage()).thenReturn(pageMock);
180186
when(pageMock.collectList()).thenReturn(collectionMock);
@@ -236,6 +242,7 @@ public void testPropertyNameSlashConvertedToDots() throws IOException {
236242
public void testFeatureFlagCanBeInitedAndQueried() throws IOException {
237243
when(clientStoreMock.listSettings(Mockito.any(), Mockito.anyString()))
238244
.thenReturn(new ArrayList<ConfigurationSetting>()).thenReturn(FEATURE_ITEMS);
245+
when(configStoreMock.isUseFeatureManagement()).thenReturn(true);
239246

240247
FeatureSet featureSet = new FeatureSet();
241248
try {
@@ -271,6 +278,23 @@ public void testFeatureFlagCanBeInitedAndQueried() throws IOException {
271278

272279
assertEquals(convertedValue, propertySource.getProperty(FEATURE_MANAGEMENT_KEY));
273280
}
281+
282+
@Test
283+
public void testFeatureFlagDisabled() throws IOException {
284+
when(clientStoreMock.listSettings(Mockito.any(), Mockito.anyString()))
285+
.thenReturn(new ArrayList<ConfigurationSetting>()).thenReturn(FEATURE_ITEMS);
286+
when(configStoreMock.isUseFeatureManagement()).thenReturn(false);
287+
288+
FeatureSet featureSet = new FeatureSet();
289+
try {
290+
propertySource.initProperties(featureSet);
291+
} catch (IOException e) {
292+
fail("Failed Reading in Feature Flags");
293+
}
294+
propertySource.initFeatures(featureSet);
295+
296+
assertNull(propertySource.getProperty(FEATURE_MANAGEMENT_KEY));
297+
}
274298

275299
@Test
276300
public void testFeatureFlagThrowError() throws IOException {
@@ -285,6 +309,7 @@ public void testFeatureFlagThrowError() throws IOException {
285309
@Test
286310
public void testFeatureFlagBuildError() throws IOException {
287311
when(clientStoreMock.listSettings(Mockito.any(), Mockito.anyString())).thenReturn(FEATURE_ITEMS);
312+
when(configStoreMock.isUseFeatureManagement()).thenReturn(true);
288313

289314
FeatureSet featureSet = new FeatureSet();
290315
try {
@@ -375,7 +400,8 @@ public void initNullInvalidContentTypeFeatureFlagTest() throws IOException {
375400
public void testFeatureFlagTargeting() throws IOException {
376401
when(clientStoreMock.listSettings(Mockito.any(), Mockito.anyString()))
377402
.thenReturn(new ArrayList<ConfigurationSetting>()).thenReturn(FEATURE_ITEMS_TARGETING);
378-
403+
when(configStoreMock.isUseFeatureManagement()).thenReturn(true);
404+
379405
FeatureSet featureSet = new FeatureSet();
380406
try {
381407
propertySource.initProperties(featureSet);

0 commit comments

Comments
 (0)