Makes disabling service registry by properties consistent. (#634)

Fixes gh-619
This commit is contained in:
Spencer Gibb
2020-04-20 12:53:18 -04:00
committed by GitHub
parent c5959c00ad
commit 9f8c0dd8ef
6 changed files with 209 additions and 32 deletions

View File

@@ -20,6 +20,7 @@ import com.ecwid.consul.v1.ConsulClient;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
@@ -41,6 +42,7 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
matchIfMissing = true)
@ConditionalOnDiscoveryEnabled
@AutoConfigureAfter({ ConsulDiscoveryClientConfiguration.class })
@ConditionalOnBean(ConsulDiscoveryProperties.class)
public class ConsulCatalogWatchAutoConfiguration {
/**

View File

@@ -23,6 +23,7 @@ import javax.servlet.ServletContext;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.AllNestedConditions;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -34,6 +35,7 @@ import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties;
import org.springframework.cloud.consul.discovery.HeartbeatProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
/**
@@ -44,8 +46,7 @@ import org.springframework.context.annotation.Configuration;
@ConditionalOnMissingBean(
type = "org.springframework.cloud.consul.discovery.ConsulLifecycle")
@ConditionalOnConsulEnabled
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
matchIfMissing = true)
@Conditional(ConsulAutoServiceRegistrationAutoConfiguration.OnConsulRegistrationEnabledCondition.class)
@AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class,
ConsulServiceRegistryAutoConfiguration.class })
public class ConsulAutoServiceRegistrationAutoConfiguration {
@@ -95,4 +96,39 @@ public class ConsulAutoServiceRegistrationAutoConfiguration {
}
protected static class OnConsulRegistrationEnabledCondition
extends AllNestedConditions {
OnConsulRegistrationEnabledCondition() {
super(ConfigurationPhase.REGISTER_BEAN);
}
@ConditionalOnProperty(
value = "spring.cloud.service-registry.auto-registration.enabled",
matchIfMissing = true)
static class AutoRegistrationEnabledClass {
}
@ConditionalOnProperty(
value = "spring.cloud.consul.service-registry.auto-registration.enabled",
matchIfMissing = true)
static class ConsulAutoRegistrationEnabledClass {
}
@ConditionalOnProperty(value = "spring.cloud.service-registry.enabled",
matchIfMissing = true)
static class ServiceRegistryEnabledClass {
}
@ConditionalOnProperty(value = "spring.cloud.consul.service-registry.enabled",
matchIfMissing = true)
static class ConsulServiceRegistryEnabledClass {
}
}
}

View File

@@ -20,6 +20,7 @@ import com.ecwid.consul.v1.ConsulClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.AllNestedConditions;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.client.serviceregistry.ServiceRegistryAutoConfiguration;
@@ -29,6 +30,7 @@ import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties;
import org.springframework.cloud.consul.discovery.HeartbeatProperties;
import org.springframework.cloud.consul.discovery.TtlScheduler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
/**
@@ -37,8 +39,7 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnConsulEnabled
@ConditionalOnProperty(value = "spring.cloud.service-registry.enabled",
matchIfMissing = true)
@Conditional(ConsulServiceRegistryAutoConfiguration.OnConsulRegistrationEnabledCondition.class)
@AutoConfigureBefore(ServiceRegistryAutoConfiguration.class)
public class ConsulServiceRegistryAutoConfiguration {
@@ -64,4 +65,25 @@ public class ConsulServiceRegistryAutoConfiguration {
return new ConsulDiscoveryProperties(inetUtils);
}
protected static class OnConsulRegistrationEnabledCondition
extends AllNestedConditions {
OnConsulRegistrationEnabledCondition() {
super(ConfigurationPhase.REGISTER_BEAN);
}
@ConditionalOnProperty(value = "spring.cloud.service-registry.enabled",
matchIfMissing = true)
static class ServiceRegistryEnabledClass {
}
@ConditionalOnProperty(value = "spring.cloud.consul.service-registry.enabled",
matchIfMissing = true)
static class ConsulServiceRegistryEnabledClass {
}
}
}

View File

@@ -0,0 +1,28 @@
{
"properties": [
{
"name": "spring.cloud.service-registry.enabled",
"type": "java.lang.Boolean",
"description": "Enables Service Registry functionality.",
"defaultValue": "true"
},
{
"name": "spring.cloud.consul.service-registry.enabled",
"type": "java.lang.Boolean",
"description": "Enables Consul Service Registry functionality.",
"defaultValue": "true"
},
{
"name": "spring.cloud.service-registry.auto-registration.enabled",
"type": "java.lang.Boolean",
"description": "Enables Service Registry Auto-registration.",
"defaultValue": "true"
},
{
"name": "spring.cloud.consul.service-registry.auto-registration.enabled",
"type": "java.lang.Boolean",
"description": "Enables Consul Service Registry Auto-registration.",
"defaultValue": "true"
}
]
}

View File

@@ -22,52 +22,68 @@ import com.ecwid.consul.v1.ConsulClient;
import com.ecwid.consul.v1.Response;
import com.ecwid.consul.v1.agent.model.Service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration;
import org.springframework.cloud.consul.ConsulAutoConfiguration;
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.junit4.SpringRunner;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
/**
* @author Spencer Gibb
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ConsulAutoServiceRegistrationDisabledTests.TestConfig.class,
properties = { "spring.application.name=myTestNotRegisteredService2",
"spring.cloud.service-registry.auto-registration.enabled=false" },
webEnvironment = RANDOM_PORT)
public class ConsulAutoServiceRegistrationDisabledTests {
@Autowired
private ConsulClient consul;
@Autowired(required = false)
private ConsulAutoServiceRegistration autoServiceRegistration;
@Test
public void disabledViaSpringCloudProperty() {
testAutoRegistrationDisabled("myTestNotRegisteredService2",
"spring.cloud.service-registry.auto-registration.enabled");
}
@Test
public void contextLoads() {
assertThat(this.autoServiceRegistration)
.as("ConsulAutoServiceRegistration was created").isNull();
public void disabledViaConsulProperty() {
testAutoRegistrationDisabled("myTestNotRegisteredService3",
"spring.cloud.consul.service-registry.auto-registration.enabled");
}
Response<Map<String, Service>> response = this.consul.getAgentServices();
Map<String, Service> services = response.getValue();
Service service = services.get("myTestNotRegisteredService2");
assertThat(service).as("service was registered").isNull();
@Test
public void disabledViaSpringCloudServiceRegistryProperty() {
testAutoRegistrationDisabled("myTestNotRegisteredService4",
"spring.cloud.service-registry.enabled");
}
@Test
public void disabledViaConsulServiceRegistryProperty() {
testAutoRegistrationDisabled("myTestNotRegisteredService5",
"spring.cloud.consul.service-registry.enabled");
}
private void testAutoRegistrationDisabled(String testName, String disableProperty) {
new WebApplicationContextRunner().withUserConfiguration(TestConfig.class)
.withPropertyValues("spring.application.name=" + testName,
disableProperty + "=false", "server.port=0")
.run(context -> {
assertThat(context)
.doesNotHaveBean(ConsulAutoServiceRegistration.class);
assertThat(context)
.doesNotHaveBean(ConsulAutoServiceRegistrationListener.class);
assertThat(context).doesNotHaveBean(ConsulAutoRegistration.class);
assertThat(context)
.doesNotHaveBean(ConsulRegistrationCustomizer.class);
ConsulClient consul = context.getBean(ConsulClient.class);
Response<Map<String, Service>> response = consul.getAgentServices();
Map<String, Service> services = response.getValue();
Service service = services.get(testName);
assertThat(service).as("service was registered").isNull();
});
}
@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration
@ImportAutoConfiguration({ AutoServiceRegistrationConfiguration.class,
ConsulAutoConfiguration.class,
ConsulAutoServiceRegistrationAutoConfiguration.class })
public static class TestConfig {
}

View File

@@ -0,0 +1,73 @@
/*
* Copyright 2013-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.cloud.consul.serviceregistry;
import java.util.Map;
import com.ecwid.consul.v1.ConsulClient;
import com.ecwid.consul.v1.Response;
import com.ecwid.consul.v1.agent.model.Service;
import org.junit.Test;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
import org.springframework.cloud.consul.discovery.HeartbeatProperties;
import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Spencer Gibb
*/
public class ConsulServiceRegistryDisabledTests {
@Test
public void disabledViaSpringCloudProperty() {
testAutoRegistrationDisabled("serviceRegistryDisabledTest1",
"spring.cloud.service-registry.enabled");
}
@Test
public void disabledViaConsulProperty() {
testAutoRegistrationDisabled("serviceRegistryDisabledTest2",
"spring.cloud.consul.service-registry.enabled");
}
private void testAutoRegistrationDisabled(String testName, String disableProperty) {
new WebApplicationContextRunner().withUserConfiguration(TestConfig.class)
.withPropertyValues("spring.application.name=" + testName,
disableProperty + "=false", "server.port=0")
.run(context -> {
assertThat(context).doesNotHaveBean(ConsulServiceRegistry.class);
assertThat(context).doesNotHaveBean(HeartbeatProperties.class);
ConsulClient consul = context.getBean(ConsulClient.class);
Response<Map<String, Service>> response = consul.getAgentServices();
Map<String, Service> services = response.getValue();
Service service = services.get(testName);
assertThat(service).as("service was registered").isNull();
});
}
@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration
public static class TestConfig {
}
}