Skip to content

Spring cloud azure 6.0 preview #45222

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 15 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions eng/versioning/external_dependencies.txt
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,7 @@ springboot3_io.netty:netty-transport-native-kqueue;4.1.119.Final
springboot3_io.netty:netty-transport;4.1.119.Final
springboot3_io.projectreactor.netty:reactor-netty;1.2.4
springboot3_io.projectreactor:reactor-test;3.7.4
springboot3_jakarta.annotations:jakarta.annotation-api;3.0.0
springboot3_jakarta.servlet:jakarta.servlet-api;6.0.0
springboot3_jakarta.validation:jakarta.validation-api;3.0.2
springboot3_javax.annotation:javax.annotation-api;1.3.2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,18 @@ AppConfigurationEventListener configListener(AppConfigurationRefresh appConfigur
"org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties",
"org.springframework.cloud.endpoint.RefreshEndpoint"
})
@Deprecated
static class AppConfigurationPushRefreshConfiguration {

@Bean
@Deprecated
AppConfigurationRefreshEndpoint appConfigurationRefreshEndpoint(ContextRefresher contextRefresher,
AppConfigurationProperties appConfiguration) {
return new AppConfigurationRefreshEndpoint(contextRefresher, appConfiguration);
}

@Bean
@Deprecated
AppConfigurationRefreshEventListener appConfigurationRefreshEventListener(
AppConfigurationRefresh appConfigurationRefresh) {
return new AppConfigurationRefreshEventListener(appConfigurationRefresh);
Expand All @@ -63,15 +66,18 @@ AppConfigurationRefreshEventListener appConfigurationRefreshEventListener(
"org.springframework.cloud.bus.BusProperties",
"org.springframework.cloud.bus.event.RefreshRemoteApplicationEvent",
"org.springframework.cloud.endpoint.RefreshEndpoint" })
@Deprecated
static class AppConfigurationBusConfiguration {

@Bean
@Deprecated
AppConfigurationBusRefreshEndpoint appConfigurationBusRefreshEndpoint(ApplicationContext context,
BusProperties bus, AppConfigurationProperties appConfiguration, Destination.Factory destinationFactory) {
return new AppConfigurationBusRefreshEndpoint(context, bus.getId(), destinationFactory, appConfiguration);
}

@Bean
@Deprecated
AppConfigurationBusRefreshEventListener appConfigurationBusRefreshEventListener(
AppConfigurationRefresh appConfigurationRefresh) {
return new AppConfigurationBusRefreshEventListener(appConfigurationRefresh);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.lang.NonNull;
import org.springframework.web.context.support.ServletRequestHandledEvent;

import com.azure.spring.cloud.appconfiguration.config.AppConfigurationRefresh;
Expand All @@ -32,7 +33,7 @@ public AppConfigurationEventListener(AppConfigurationRefresh appConfigurationRef
}

@Override
public void onApplicationEvent(ServletRequestHandledEvent event) {
public void onApplicationEvent(@NonNull ServletRequestHandledEvent event) {
try {
if (!(event.getRequestUrl().equals(ACTUATOR + APPCONFIGURATION_REFRESH)
|| event.getRequestUrl().equals(ACTUATOR + APPCONFIGURATION_REFRESH_BUS))) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.lang.NonNull;

import com.azure.spring.cloud.appconfiguration.config.AppConfigurationRefresh;

Expand All @@ -31,7 +32,7 @@ public AppConfigurationBusRefreshEventListener(AppConfigurationRefresh appConfig
* @param event Event Triggering refresh, contains valid config store endpoint.
*/
@Override
public void onApplicationEvent(AppConfigurationBusRefreshEvent event) {
public void onApplicationEvent(@NonNull AppConfigurationBusRefreshEvent event) {
try {
appConfigurationRefresh.expireRefreshInterval(event.getEndpoint(), event.getSyncToken());
} catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpoint;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.cloud.context.refresh.ContextRefresher;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.http.HttpStatus;
import org.springframework.lang.NonNull;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
Expand All @@ -29,8 +30,7 @@
/**
* Endpoint for requesting new configurations to be loaded.
*/
@SuppressWarnings("removal")
@ControllerEndpoint(id = APPCONFIGURATION_REFRESH)
@Endpoint(id = APPCONFIGURATION_REFRESH)
public class AppConfigurationRefreshEndpoint implements ApplicationEventPublisherAware {

private static final Logger LOGGER = LoggerFactory.getLogger(AppConfigurationRefreshEndpoint.class);
Expand Down Expand Up @@ -105,7 +105,7 @@ public String refresh(HttpServletRequest request, HttpServletResponse response,
}

@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
public void setApplicationEventPublisher(@NonNull ApplicationEventPublisher applicationEventPublisher) {
this.publisher = applicationEventPublisher;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.lang.NonNull;

import com.azure.spring.cloud.appconfiguration.config.AppConfigurationRefresh;

Expand Down Expand Up @@ -32,7 +33,7 @@ public AppConfigurationRefreshEventListener(AppConfigurationRefresh appConfigura
* @param event Event Triggering refresh, contains valid config store endpoint.
*/
@Override
public void onApplicationEvent(AppConfigurationRefreshEvent event) {
public void onApplicationEvent(@NonNull AppConfigurationRefreshEvent event) {
try {
appConfigurationRefresh.expireRefreshInterval(event.getEndpoint(), event.getSyncToken());
} catch (Exception e) {
Expand Down

This file was deleted.

11 changes: 6 additions & 5 deletions sdk/spring/spring-cloud-azure-appconfiguration-config/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,6 @@
<version>3.4.4</version> <!-- {x-version-update;springboot3_org.springframework.boot:spring-boot-configuration-processor;external_dependency} -->
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>4.2.1</version> <!-- {x-version-update;springboot3_org.springframework.cloud:spring-cloud-starter-bootstrap;external_dependency} -->
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
Expand All @@ -45,6 +40,11 @@
<version>3.4.4</version> <!-- {x-version-update;springboot3_org.springframework.boot:spring-boot-actuator;external_dependency} -->
<scope>compile</scope>
</dependency>
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>3.0.0</version> <!-- {x-version-update;springboot3_jakarta.annotation:jakarta.annotation-api;external_dependency} -->
</dependency>
<!--Azure Java SDK -->
<dependency>
<groupId>com.azure</groupId>
Expand Down Expand Up @@ -177,6 +177,7 @@
<rules>
<bannedDependencies>
<includes>
<include>jakarta.annotation:jakarta.annotation-api:[3.0.0]</include> <!-- {x-include-update;springboot3_jakarta.annotation:jakarta.annotation-api;external_dependency} -->
<include>com.fasterxml.jackson.core:jackson-annotations:[2.18.3]</include> <!-- {x-include-update;springboot3_com.fasterxml.jackson.core:jackson-annotations;external_dependency} -->
<include>com.fasterxml.jackson.core:jackson-databind:[2.18.3]</include> <!-- {x-include-update;springboot3_com.fasterxml.jackson.core:jackson-databind;external_dependency} -->
<include>org.springframework.boot:spring-boot-actuator:[3.4.4]</include> <!-- {x-include-update;springboot3_org.springframework.boot:spring-boot-actuator;external_dependency} -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,54 +2,46 @@
// Licensed under the MIT License.
package com.azure.spring.cloud.appconfiguration.config;

import org.springframework.boot.BootstrapContext;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.endpoint.RefreshEndpoint;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

import com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationPullRefresh;
import com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationRefreshUtil;
import com.azure.spring.cloud.appconfiguration.config.implementation.AppConfigurationReplicaClientFactory;
import com.azure.spring.cloud.appconfiguration.config.implementation.autofailover.ReplicaLookUp;
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationProperties;
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationProviderProperties;

/**
* Setup AppConfigurationRefresh when <i>spring.cloud.azure.appconfiguration.enabled</i> is enabled.
*/
@Configuration
@EnableAsync
@ConditionalOnProperty(prefix = AppConfigurationProperties.CONFIG_PREFIX, name = "enabled", matchIfMissing = true)
public class AppConfigurationAutoConfiguration {
@EnableConfigurationProperties({ AppConfigurationProperties.class })
@AutoConfiguration
@ConditionalOnClass(RefreshEndpoint.class)
public class AppConfigurationWatchAutoConfiguration {

/**
* Creates an instance of {@link AppConfigurationAutoConfiguration}
* Creates an instance of {@link AppConfigurationWatchAutoConfiguration}
*/
public AppConfigurationAutoConfiguration() {
public AppConfigurationWatchAutoConfiguration() {
}

/**
* Auto Watch
*/
@Configuration
@ConditionalOnClass(RefreshEndpoint.class)
public static class AppConfigurationWatchAutoConfiguration {

/**
* Creates an instance of {@link AppConfigurationWatchAutoConfiguration}
*/
public AppConfigurationWatchAutoConfiguration() {
}
@Bean
@ConditionalOnMissingBean
AppConfigurationRefresh appConfigurationRefresh(AppConfigurationProperties properties, BootstrapContext context) {
AppConfigurationReplicaClientFactory clientFactory = context
.get(AppConfigurationReplicaClientFactory.class);
ReplicaLookUp replicaLookUp = context.get(ReplicaLookUp.class);

@Bean
@ConditionalOnMissingBean
AppConfigurationRefresh appConfigurationRefresh(AppConfigurationProperties properties,
AppConfigurationProviderProperties appProperties, AppConfigurationReplicaClientFactory clientFactory, ReplicaLookUp replicaLookUp) {
return new AppConfigurationPullRefresh(clientFactory, properties.getRefreshInterval(),
appProperties.getDefaultMinBackoff(), replicaLookUp, new AppConfigurationRefreshUtil());
}
return new AppConfigurationPullRefresh(clientFactory, properties.getRefreshInterval(), replicaLookUp,
new AppConfigurationRefreshUtil());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.springframework.boot.context.properties.source.InvalidConfigurationPropertyValueException;
import org.springframework.util.StringUtils;

import com.azure.core.util.Context;
import com.azure.data.appconfiguration.models.ConfigurationSetting;
import com.azure.data.appconfiguration.models.FeatureFlagConfigurationSetting;
import com.azure.data.appconfiguration.models.SecretReferenceConfigurationSetting;
Expand Down Expand Up @@ -60,7 +61,7 @@ class AppConfigurationApplicationSettingPropertySource extends AppConfigurationP
* @param keyPrefixTrimValues prefixs to trim from key values
* @throws InvalidConfigurationPropertyValueException thrown if fails to parse Json content type
*/
public void initProperties(List<String> keyPrefixTrimValues, boolean isRefresh) throws InvalidConfigurationPropertyValueException {
public void initProperties(List<String> keyPrefixTrimValues, Context context) throws InvalidConfigurationPropertyValueException {

List<String> labels = Arrays.asList(labelFilters);
// Reverse labels so they have the right priority order.
Expand All @@ -70,7 +71,7 @@ public void initProperties(List<String> keyPrefixTrimValues, boolean isRefresh)
SettingSelector settingSelector = new SettingSelector().setKeyFilter(keyFilter + "*").setLabelFilter(label);

// * for wildcard match
processConfigurationSettings(replicaClient.listSettings(settingSelector, isRefresh), settingSelector.getKeyFilter(),
processConfigurationSettings(replicaClient.listSettings(settingSelector, context), settingSelector.getKeyFilter(),
keyPrefixTrimValues);
}
}
Expand Down Expand Up @@ -107,7 +108,7 @@ protected void processConfigurationSettings(List<ConfigurationSetting> settings,
* @return Key Vault Secret Value
* @throws InvalidConfigurationPropertyValueException
*/
protected void handleKeyVaultReference(String key, SecretReferenceConfigurationSetting secretReference)
private void handleKeyVaultReference(String key, SecretReferenceConfigurationSetting secretReference)
throws InvalidConfigurationPropertyValueException {
// Parsing Key Vault Reference for URI
try {
Expand All @@ -126,10 +127,11 @@ protected void handleKeyVaultReference(String key, SecretReferenceConfigurationS

void handleFeatureFlag(String key, FeatureFlagConfigurationSetting setting, List<String> trimStrings)
throws InvalidConfigurationPropertyValueException {
handleJson(setting, trimStrings);
// Feature Flags aren't loaded as configuration, but are loaded as feature flags when loading a snapshot.
return;
}

void handleJson(ConfigurationSetting setting, List<String> keyPrefixTrimValues)
private void handleJson(ConfigurationSetting setting, List<String> keyPrefixTrimValues)
throws InvalidConfigurationPropertyValueException {
Map<String, Object> jsonSettings = JsonConfigurationParser.parseJsonSetting(setting);
for (Entry<String, Object> jsonSetting : jsonSettings.entrySet()) {
Expand All @@ -138,7 +140,7 @@ void handleJson(ConfigurationSetting setting, List<String> keyPrefixTrimValues)
}
}

protected String trimKey(String key, List<String> trimStrings) {
private String trimKey(String key, List<String> trimStrings) {
key = key.trim();
if (trimStrings != null) {
for (String trim : trimStrings) {
Expand Down
Loading
Loading