From 8484572fd90d7cc8853553a6bafb5ffd533782e1 Mon Sep 17 00:00:00 2001 From: Jon Freedman Date: Tue, 24 Oct 2017 01:34:23 +0100 Subject: [PATCH] Allow deregister on shutdown to be disabled (#322) Fixes gh-321 --- .../discovery/ConsulDiscoveryProperties.java | 3 + .../ConsulAutoServiceRegistration.java | 4 +- ...utoServiceDeRegistrationDisabledTests.java | 89 +++++++++++++++++++ 3 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceDeRegistrationDisabledTests.java diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryProperties.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryProperties.java index 7041a329..2aa00a58 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryProperties.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryProperties.java @@ -151,6 +151,9 @@ public class ConsulDiscoveryProperties { /** Register as a service in consul. */ private boolean register = true; + /** Disable automatic de-registration of service in consul. */ + private boolean deregister = true; + /** Register health check in consul. Useful during development of a service. */ private boolean registerHealthCheck = true; diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistration.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistration.java index 72deb984..d9fdf988 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistration.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistration.java @@ -99,7 +99,7 @@ public class ConsulAutoServiceRegistration extends AbstractAutoServiceRegistrati @Override protected void deregister() { - if (!this.properties.isRegister()) { + if (!this.properties.isRegister() || !this.properties.isDeregister()) { return; } super.deregister(); @@ -107,7 +107,7 @@ public class ConsulAutoServiceRegistration extends AbstractAutoServiceRegistrati @Override protected void deregisterManagement() { - if (!this.properties.isRegister()) { + if (!this.properties.isRegister() || !this.properties.isDeregister()) { return; } super.deregisterManagement(); diff --git a/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceDeRegistrationDisabledTests.java b/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceDeRegistrationDisabledTests.java new file mode 100644 index 00000000..bc86eecb --- /dev/null +++ b/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceDeRegistrationDisabledTests.java @@ -0,0 +1,89 @@ +/* + * Copyright 2013-2017 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 + * + * http://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 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.cloud.consul.discovery.ConsulDiscoveryProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.Map; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +/** + * @author Jon Freedman + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConsulAutoServiceRegistrationDisabledTests.TestConfig.class, + properties = {"spring.application.name=myTestNotDeRegisteredService", + "spring.cloud.consul.discovery.instanceId=myTestNotDeRegisteredService-D", + "spring.cloud.consul.discovery.deregister=false"}, + webEnvironment = RANDOM_PORT) +public class ConsulAutoServiceDeRegistrationDisabledTests { + @Autowired + private ConsulClient consul; + + @Autowired(required = false) + private ConsulAutoServiceRegistration autoServiceRegistration; + + @Autowired(required = false) + private ConsulDiscoveryProperties discoveryProperties; + + @Test + public void contextLoads() { + assertNotNull("ConsulAutoServiceRegistration was not created", autoServiceRegistration); + assertNotNull("ConsulDiscoveryProperties was not created", discoveryProperties); + + checkService(true); + autoServiceRegistration.deregister(); + checkService(true); + discoveryProperties.setDeregister(true); + autoServiceRegistration.deregister(); + checkService(false); + } + + private void checkService(final boolean expected) { + final Response> response = consul.getAgentServices(); + final Map services = response.getValue(); + final Service service = services.get("myTestNotDeRegisteredService-D"); + if (expected) { + assertNotNull("service was not registered", service); + } else { + assertNull("service was registered", service); + } + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({AutoServiceRegistrationConfiguration.class, ConsulAutoConfiguration.class, + ConsulAutoServiceRegistrationAutoConfiguration.class}) + public static class TestConfig { + } +}