diff --git a/spring-cloud-kubernetes-commons/pom.xml b/spring-cloud-kubernetes-commons/pom.xml index 3b7f91a8..9bd38c4e 100644 --- a/spring-cloud-kubernetes-commons/pom.xml +++ b/spring-cloud-kubernetes-commons/pom.xml @@ -30,6 +30,11 @@ spring-boot-configuration-processor true + + org.springframework.integration + spring-integration-core + true + org.springframework.cloud spring-cloud-loadbalancer diff --git a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Leader.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/Leader.java similarity index 96% rename from spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Leader.java rename to spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/Leader.java index 1d8b1bd0..fa179fe4 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Leader.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/Leader.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.leader; +package org.springframework.cloud.kubernetes.commons.leader; import java.util.Objects; diff --git a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderContext.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderContext.java similarity index 95% rename from spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderContext.java rename to spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderContext.java index d8337e93..ef91a2f7 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderContext.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderContext.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.leader; +package org.springframework.cloud.kubernetes.commons.leader; import org.springframework.integration.leader.Candidate; import org.springframework.integration.leader.Context; diff --git a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInfoContributor.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderInfoContributor.java similarity index 96% rename from spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInfoContributor.java rename to spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderInfoContributor.java index c457b9bf..d49f48ed 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInfoContributor.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderInfoContributor.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.leader; +package org.springframework.cloud.kubernetes.commons.leader; import java.util.HashMap; import java.util.Map; diff --git a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInitiator.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderInitiator.java similarity index 97% rename from spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInitiator.java rename to spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderInitiator.java index 67a83276..3e6c682b 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInitiator.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderInitiator.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.leader; +package org.springframework.cloud.kubernetes.commons.leader; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; diff --git a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderProperties.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderProperties.java similarity index 98% rename from spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderProperties.java rename to spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderProperties.java index c133f86b..e66ebe53 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderProperties.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.leader; +package org.springframework.cloud.kubernetes.commons.leader; import java.time.Duration; diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderRecordWatcher.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderRecordWatcher.java new file mode 100644 index 00000000..121afabe --- /dev/null +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeaderRecordWatcher.java @@ -0,0 +1,28 @@ +/* + * Copyright 2013-2020 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.kubernetes.commons.leader; + +/** + * @author Ryan Baxter + */ +public interface LeaderRecordWatcher { + + void start(); + + void stop(); + +} diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeadershipController.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeadershipController.java new file mode 100644 index 00000000..c4d401ea --- /dev/null +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/LeadershipController.java @@ -0,0 +1,158 @@ +/* + * Copyright 2013-2020 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.kubernetes.commons.leader; + +import java.util.Collections; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.integration.leader.Candidate; +import org.springframework.integration.leader.Context; +import org.springframework.integration.leader.event.LeaderEventPublisher; + +/** + * @author Ryan Baxter + */ +public abstract class LeadershipController { + + private static final Logger LOGGER = LoggerFactory.getLogger(LeadershipController.class); + + protected static final String PROVIDER_KEY = "provider"; + + protected static final String PROVIDER = "spring-cloud-kubernetes"; + + protected static final String KIND_KEY = "kind"; + + protected static final String KIND = "leaders"; + + protected Candidate candidate; + + protected Leader localLeader; + + protected LeaderProperties leaderProperties; + + protected LeaderEventPublisher leaderEventPublisher; + + protected PodReadinessWatcher leaderReadinessWatcher; + + public LeadershipController(Candidate candidate, LeaderProperties leaderProperties, + LeaderEventPublisher leaderEventPublisher) { + this.candidate = candidate; + this.leaderProperties = leaderProperties; + this.leaderEventPublisher = leaderEventPublisher; + } + + public Optional getLocalLeader() { + return Optional.ofNullable(this.localLeader); + } + + public abstract void update(); + + public abstract void revoke(); + + protected String getLeaderKey() { + return this.leaderProperties.getLeaderIdPrefix() + this.candidate.getRole(); + } + + protected Map getLeaderData(Candidate candidate) { + String leaderKey = getLeaderKey(); + return Collections.singletonMap(leaderKey, candidate.getId()); + } + + protected Leader extractLeader(Map data) { + if (data == null) { + return null; + } + + String leaderKey = getLeaderKey(); + String leaderId = data.get(leaderKey); + if (leaderId == null) { + return null; + } + + return new Leader(this.candidate.getRole(), leaderId); + } + + protected void handleLeaderChange(Leader newLeader) { + if (Objects.equals(this.localLeader, newLeader)) { + LOGGER.debug("Leader is still '{}'", this.localLeader); + return; + } + + Leader oldLeader = this.localLeader; + this.localLeader = newLeader; + + if (oldLeader != null && oldLeader.isCandidate(this.candidate)) { + notifyOnRevoked(); + } + else if (newLeader != null && newLeader.isCandidate(this.candidate)) { + notifyOnGranted(); + } + + restartLeaderReadinessWatcher(); + + LOGGER.debug("New leader is '{}'", this.localLeader); + } + + protected void notifyOnGranted() { + LOGGER.debug("Leadership has been granted for '{}'", this.candidate); + + Context context = new LeaderContext(this.candidate, this); + this.leaderEventPublisher.publishOnGranted(this, context, this.candidate.getRole()); + try { + this.candidate.onGranted(context); + } + catch (InterruptedException e) { + LOGGER.warn(e.getMessage()); + Thread.currentThread().interrupt(); + } + } + + protected void notifyOnRevoked() { + LOGGER.debug("Leadership has been revoked for '{}'", this.candidate); + + Context context = new LeaderContext(this.candidate, this); + this.leaderEventPublisher.publishOnRevoked(this, context, this.candidate.getRole()); + this.candidate.onRevoked(context); + } + + protected void notifyOnFailedToAcquire() { + if (this.leaderProperties.isPublishFailedEvents()) { + Context context = new LeaderContext(this.candidate, this); + this.leaderEventPublisher.publishOnFailedToAcquire(this, context, this.candidate.getRole()); + } + } + + protected void restartLeaderReadinessWatcher() { + if (this.leaderReadinessWatcher != null) { + this.leaderReadinessWatcher.stop(); + this.leaderReadinessWatcher = null; + } + + if (this.localLeader != null && !this.localLeader.isCandidate(this.candidate)) { + this.leaderReadinessWatcher = createPodReadinessWatcher(this.localLeader.getId()); + this.leaderReadinessWatcher.start(); + } + } + + protected abstract PodReadinessWatcher createPodReadinessWatcher(String localLeaderId); + +} diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/PodReadinessWatcher.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/PodReadinessWatcher.java new file mode 100644 index 00000000..f0f9d719 --- /dev/null +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/leader/PodReadinessWatcher.java @@ -0,0 +1,28 @@ +/* + * Copyright 2013-2020 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.kubernetes.commons.leader; + +/** + * @author Ryan Baxter + */ +public interface PodReadinessWatcher { + + void start(); + + void stop(); + +} diff --git a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderAutoConfiguration.java b/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeaderAutoConfiguration.java similarity index 63% rename from spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderAutoConfiguration.java rename to spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeaderAutoConfiguration.java index 2304099c..10de2f75 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderAutoConfiguration.java +++ b/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeaderAutoConfiguration.java @@ -27,6 +27,9 @@ 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.kubernetes.commons.leader.LeaderInfoContributor; +import org.springframework.cloud.kubernetes.commons.leader.LeaderInitiator; +import org.springframework.cloud.kubernetes.commons.leader.LeaderProperties; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -42,7 +45,7 @@ import org.springframework.integration.leader.event.LeaderEventPublisher; @EnableConfigurationProperties(LeaderProperties.class) @ConditionalOnBean(KubernetesClient.class) @ConditionalOnProperty(value = "spring.cloud.kubernetes.leader.enabled", matchIfMissing = true) -public class LeaderAutoConfiguration { +public class Fabric8LeaderAutoConfiguration { @Bean @ConditionalOnMissingBean(LeaderEventPublisher.class) @@ -59,33 +62,36 @@ public class LeaderAutoConfiguration { } @Bean - public LeadershipController leadershipController(Candidate candidate, LeaderProperties leaderProperties, + public Fabric8LeadershipController leadershipController(Candidate candidate, LeaderProperties leaderProperties, LeaderEventPublisher leaderEventPublisher, KubernetesClient kubernetesClient) { - return new LeadershipController(candidate, leaderProperties, leaderEventPublisher, kubernetesClient); + return new Fabric8LeadershipController(candidate, leaderProperties, leaderEventPublisher, kubernetesClient); } @Bean - public LeaderRecordWatcher leaderRecordWatcher(LeaderProperties leaderProperties, - LeadershipController leadershipController, KubernetesClient kubernetesClient) { - return new LeaderRecordWatcher(leaderProperties, leadershipController, kubernetesClient); + public Fabric8LeaderRecordWatcher leaderRecordWatcher(LeaderProperties leaderProperties, + Fabric8LeadershipController fabric8LeadershipController, KubernetesClient kubernetesClient) { + return new Fabric8LeaderRecordWatcher(leaderProperties, fabric8LeadershipController, kubernetesClient); } @Bean - public PodReadinessWatcher hostPodWatcher(Candidate candidate, KubernetesClient kubernetesClient, - LeadershipController leadershipController) { - return new PodReadinessWatcher(candidate.getId(), kubernetesClient, leadershipController); + public Fabric8PodReadinessWatcher hostPodWatcher(Candidate candidate, KubernetesClient kubernetesClient, + Fabric8LeadershipController fabric8LeadershipController) { + return new Fabric8PodReadinessWatcher(candidate.getId(), kubernetesClient, fabric8LeadershipController); } @Bean(destroyMethod = "stop") - public LeaderInitiator leaderInitiator(LeaderProperties leaderProperties, LeadershipController leadershipController, - LeaderRecordWatcher leaderRecordWatcher, PodReadinessWatcher hostPodWatcher) { - return new LeaderInitiator(leaderProperties, leadershipController, leaderRecordWatcher, hostPodWatcher); + public LeaderInitiator leaderInitiator(LeaderProperties leaderProperties, + Fabric8LeadershipController fabric8LeadershipController, + Fabric8LeaderRecordWatcher fabric8LeaderRecordWatcher, Fabric8PodReadinessWatcher hostPodWatcher) { + return new LeaderInitiator(leaderProperties, fabric8LeadershipController, fabric8LeaderRecordWatcher, + hostPodWatcher); } @Bean @ConditionalOnClass(InfoContributor.class) - public LeaderInfoContributor leaderInfoContributor(LeadershipController leadershipController, Candidate candidate) { - return new LeaderInfoContributor(leadershipController, candidate); + public LeaderInfoContributor leaderInfoContributor(Fabric8LeadershipController fabric8LeadershipController, + Candidate candidate) { + return new LeaderInfoContributor(fabric8LeadershipController, candidate); } } diff --git a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderRecordWatcher.java b/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeaderRecordWatcher.java similarity index 77% rename from spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderRecordWatcher.java rename to spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeaderRecordWatcher.java index 391318b6..1420a7ee 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderRecordWatcher.java +++ b/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeaderRecordWatcher.java @@ -24,16 +24,19 @@ import io.fabric8.kubernetes.client.Watcher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.cloud.kubernetes.commons.leader.LeaderProperties; + /** * @author Gytis Trikleris */ -public class LeaderRecordWatcher implements Watcher { +public class Fabric8LeaderRecordWatcher + implements org.springframework.cloud.kubernetes.commons.leader.LeaderRecordWatcher, Watcher { - private static final Logger LOGGER = LoggerFactory.getLogger(LeaderRecordWatcher.class); + private static final Logger LOGGER = LoggerFactory.getLogger(Fabric8LeaderRecordWatcher.class); private final Object lock = new Object(); - private final LeadershipController leadershipController; + private final Fabric8LeadershipController fabric8LeadershipController; private final LeaderProperties leaderProperties; @@ -41,9 +44,9 @@ public class LeaderRecordWatcher implements Watcher { private Watch watch; - public LeaderRecordWatcher(LeaderProperties leaderProperties, LeadershipController leadershipController, - KubernetesClient kubernetesClient) { - this.leadershipController = leadershipController; + public Fabric8LeaderRecordWatcher(LeaderProperties leaderProperties, + Fabric8LeadershipController fabric8LeadershipController, KubernetesClient kubernetesClient) { + this.fabric8LeadershipController = fabric8LeadershipController; this.leaderProperties = leaderProperties; this.kubernetesClient = kubernetesClient; } @@ -78,7 +81,7 @@ public class LeaderRecordWatcher implements Watcher { LOGGER.debug("'{}' event received, triggering leadership update", action); if (!Action.ERROR.equals(action)) { - this.leadershipController.update(); + this.fabric8LeadershipController.update(); } } diff --git a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeadershipController.java b/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeadershipController.java similarity index 58% rename from spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeadershipController.java rename to spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeadershipController.java index 3717c630..757bd46c 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/LeadershipController.java +++ b/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeadershipController.java @@ -16,10 +16,7 @@ package org.springframework.cloud.kubernetes.fabric8.leader; -import java.util.Collections; import java.util.Map; -import java.util.Objects; -import java.util.Optional; import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; @@ -28,49 +25,29 @@ import io.fabric8.kubernetes.client.KubernetesClientException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.cloud.kubernetes.commons.leader.Leader; +import org.springframework.cloud.kubernetes.commons.leader.LeaderProperties; +import org.springframework.cloud.kubernetes.commons.leader.LeadershipController; +import org.springframework.cloud.kubernetes.commons.leader.PodReadinessWatcher; import org.springframework.integration.leader.Candidate; -import org.springframework.integration.leader.Context; import org.springframework.integration.leader.event.LeaderEventPublisher; /** * @author Gytis Trikleris */ -public class LeadershipController { +public class Fabric8LeadershipController extends LeadershipController { - private static final String PROVIDER_KEY = "provider"; - - private static final String PROVIDER = "spring-cloud-kubernetes"; - - private static final String KIND_KEY = "kind"; - - private static final String KIND = "leaders"; - - private static final Logger LOGGER = LoggerFactory.getLogger(LeadershipController.class); - - private final Candidate candidate; - - private final LeaderProperties leaderProperties; - - private final LeaderEventPublisher leaderEventPublisher; + private static final Logger LOGGER = LoggerFactory.getLogger(Fabric8LeadershipController.class); private final KubernetesClient kubernetesClient; - private Leader localLeader; - - private PodReadinessWatcher leaderReadinessWatcher; - - public LeadershipController(Candidate candidate, LeaderProperties leaderProperties, + public Fabric8LeadershipController(Candidate candidate, LeaderProperties leaderProperties, LeaderEventPublisher leaderEventPublisher, KubernetesClient kubernetesClient) { - this.candidate = candidate; - this.leaderProperties = leaderProperties; - this.leaderEventPublisher = leaderEventPublisher; + super(candidate, leaderProperties, leaderEventPublisher); this.kubernetesClient = kubernetesClient; } - public Optional getLocalLeader() { - return Optional.ofNullable(this.localLeader); - } - + @Override public synchronized void update() { LOGGER.debug("Checking leader state"); ConfigMap configMap = getConfigMap(); @@ -137,91 +114,17 @@ public class LeadershipController { } } - private void handleLeaderChange(Leader newLeader) { - if (Objects.equals(this.localLeader, newLeader)) { - LOGGER.debug("Leader is still '{}'", this.localLeader); - return; - } - - Leader oldLeader = this.localLeader; - this.localLeader = newLeader; - - if (oldLeader != null && oldLeader.isCandidate(this.candidate)) { - notifyOnRevoked(); - } - else if (newLeader != null && newLeader.isCandidate(this.candidate)) { - notifyOnGranted(); - } - - restartLeaderReadinessWatcher(); - - LOGGER.debug("New leader is '{}'", this.localLeader); - } - - private void notifyOnGranted() { - LOGGER.debug("Leadership has been granted for '{}'", this.candidate); - - Context context = new LeaderContext(this.candidate, this); - this.leaderEventPublisher.publishOnGranted(this, context, this.candidate.getRole()); - try { - this.candidate.onGranted(context); - } - catch (InterruptedException e) { - LOGGER.warn(e.getMessage()); - Thread.currentThread().interrupt(); - } - } - - private void notifyOnRevoked() { - LOGGER.debug("Leadership has been revoked for '{}'", this.candidate); - - Context context = new LeaderContext(this.candidate, this); - this.leaderEventPublisher.publishOnRevoked(this, context, this.candidate.getRole()); - this.candidate.onRevoked(context); - } - - private void notifyOnFailedToAcquire() { - if (this.leaderProperties.isPublishFailedEvents()) { - Context context = new LeaderContext(this.candidate, this); - this.leaderEventPublisher.publishOnFailedToAcquire(this, context, this.candidate.getRole()); - } - } - - private void restartLeaderReadinessWatcher() { - if (this.leaderReadinessWatcher != null) { - this.leaderReadinessWatcher.stop(); - this.leaderReadinessWatcher = null; - } - - if (this.localLeader != null && !this.localLeader.isCandidate(this.candidate)) { - this.leaderReadinessWatcher = new PodReadinessWatcher(this.localLeader.getId(), this.kubernetesClient, - this); - this.leaderReadinessWatcher.start(); - } - } - - private String getLeaderKey() { - return this.leaderProperties.getLeaderIdPrefix() + this.candidate.getRole(); - } - - private Map getLeaderData(Candidate candidate) { - String leaderKey = getLeaderKey(); - return Collections.singletonMap(leaderKey, candidate.getId()); + @Override + protected PodReadinessWatcher createPodReadinessWatcher(String localLeaderId) { + return new Fabric8PodReadinessWatcher(localLeaderId, this.kubernetesClient, this); } private Leader extractLeader(ConfigMap configMap) { - if (configMap == null || configMap.getData() == null) { + if (configMap == null) { return null; } - Map data = configMap.getData(); - String leaderKey = getLeaderKey(); - String leaderId = data.get(leaderKey); - if (leaderId == null) { - return null; - } - - return new Leader(this.candidate.getRole(), leaderId); + return extractLeader(configMap.getData()); } private boolean isPodReady(String name) { diff --git a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/PodReadinessWatcher.java b/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8PodReadinessWatcher.java similarity index 81% rename from spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/PodReadinessWatcher.java rename to spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8PodReadinessWatcher.java index 31c23284..ed9e81ff 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/PodReadinessWatcher.java +++ b/spring-cloud-kubernetes-fabric8-leader/src/main/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8PodReadinessWatcher.java @@ -27,12 +27,14 @@ import io.fabric8.kubernetes.client.internal.readiness.Readiness; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.cloud.kubernetes.commons.leader.PodReadinessWatcher; + /** * @author Gytis Trikleris */ -public class PodReadinessWatcher implements Watcher { +public class Fabric8PodReadinessWatcher implements PodReadinessWatcher, Watcher { - private static final Logger LOGGER = LoggerFactory.getLogger(PodReadinessWatcher.class); + private static final Logger LOGGER = LoggerFactory.getLogger(Fabric8PodReadinessWatcher.class); private final Object lock = new Object(); @@ -40,19 +42,20 @@ public class PodReadinessWatcher implements Watcher { private final KubernetesClient kubernetesClient; - private final LeadershipController leadershipController; + private final Fabric8LeadershipController fabric8LeadershipController; private boolean previousState; private Watch watch; - public PodReadinessWatcher(String podName, KubernetesClient kubernetesClient, - LeadershipController leadershipController) { + public Fabric8PodReadinessWatcher(String podName, KubernetesClient kubernetesClient, + Fabric8LeadershipController fabric8LeadershipController) { this.podName = podName; this.kubernetesClient = kubernetesClient; - this.leadershipController = leadershipController; + this.fabric8LeadershipController = fabric8LeadershipController; } + @Override public void start() { if (this.watch == null) { synchronized (this.lock) { @@ -66,6 +69,7 @@ public class PodReadinessWatcher implements Watcher { } } + @Override public void stop() { if (this.watch != null) { synchronized (this.lock) { @@ -87,7 +91,7 @@ public class PodReadinessWatcher implements Watcher { LOGGER.debug("'{}' readiness status changed to '{}', triggering leadership update", this.podName, currentState); this.previousState = currentState; - this.leadershipController.update(); + this.fabric8LeadershipController.update(); } } } diff --git a/spring-cloud-kubernetes-fabric8-leader/src/main/resources/META-INF/spring.factories b/spring-cloud-kubernetes-fabric8-leader/src/main/resources/META-INF/spring.factories index cb614f8a..4eed4fdc 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-kubernetes-fabric8-leader/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.springframework.cloud.kubernetes.fabric8.leader.LeaderAutoConfiguration +org.springframework.cloud.kubernetes.fabric8.leader.Fabric8LeaderAutoConfiguration diff --git a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderAutoConfigurationTests.java b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeaderAutoConfigurationTests.java similarity index 97% rename from spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderAutoConfigurationTests.java rename to spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeaderAutoConfigurationTests.java index f4f175e9..22dae888 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderAutoConfigurationTests.java +++ b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeaderAutoConfigurationTests.java @@ -34,7 +34,7 @@ import static org.hamcrest.Matchers.containsString; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = { // Make sure test passes without Kubernetes cluster "spring.cloud.kubernetes.leader.autoStartup=false" }) -public class LeaderAutoConfigurationTests { +public class Fabric8LeaderAutoConfigurationTests { @Value("${local.server.port}") private int port; diff --git a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderRecordWatcherTest.java b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeaderRecordWatcherTest.java similarity index 88% rename from spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderRecordWatcherTest.java rename to spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeaderRecordWatcherTest.java index 075be6fa..4c026ad5 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderRecordWatcherTest.java +++ b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeaderRecordWatcherTest.java @@ -32,6 +32,8 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.cloud.kubernetes.commons.leader.LeaderProperties; + import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -40,13 +42,13 @@ import static org.mockito.Mockito.verify; * @author Gytis Trikleris */ @ExtendWith(MockitoExtension.class) -public class LeaderRecordWatcherTest { +public class Fabric8LeaderRecordWatcherTest { @Mock private LeaderProperties mockLeaderProperties; @Mock - private LeadershipController mockLeadershipController; + private Fabric8LeadershipController mockFabric8LeadershipController; @Mock private KubernetesClient mockKubernetesClient; @@ -69,11 +71,11 @@ public class LeaderRecordWatcherTest { @Mock private KubernetesClientException mockKubernetesClientException; - private LeaderRecordWatcher watcher; + private Fabric8LeaderRecordWatcher watcher; @BeforeEach public void before() { - this.watcher = new LeaderRecordWatcher(this.mockLeaderProperties, this.mockLeadershipController, + this.watcher = new Fabric8LeaderRecordWatcher(this.mockLeaderProperties, this.mockFabric8LeadershipController, this.mockKubernetesClient); } @@ -102,14 +104,14 @@ public class LeaderRecordWatcherTest { this.watcher.eventReceived(Watcher.Action.DELETED, this.mockConfigMap); this.watcher.eventReceived(Watcher.Action.MODIFIED, this.mockConfigMap); - verify(this.mockLeadershipController, times(3)).update(); + verify(this.mockFabric8LeadershipController, times(3)).update(); } @Test public void shouldIgnoreErrorEvent() { this.watcher.eventReceived(Watcher.Action.ERROR, this.mockConfigMap); - verify(this.mockLeadershipController, times(0)).update(); + verify(this.mockFabric8LeadershipController, times(0)).update(); } @Test diff --git a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeadershipControllerTest.java b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeadershipControllerTest.java similarity index 76% rename from spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeadershipControllerTest.java rename to spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeadershipControllerTest.java index 9e18226b..690df9ae 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeadershipControllerTest.java +++ b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8LeadershipControllerTest.java @@ -23,6 +23,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.cloud.kubernetes.commons.leader.LeaderProperties; import org.springframework.integration.leader.Candidate; import org.springframework.integration.leader.event.LeaderEventPublisher; @@ -32,7 +33,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Gytis Trikleris */ @ExtendWith(MockitoExtension.class) -public class LeadershipControllerTest { +public class Fabric8LeadershipControllerTest { @Mock private Candidate mockCandidate; @@ -46,17 +47,17 @@ public class LeadershipControllerTest { @Mock private KubernetesClient mockKubernetesClient; - private LeadershipController leadershipController; + private Fabric8LeadershipController fabric8LeadershipController; @BeforeEach public void before() { - this.leadershipController = new LeadershipController(this.mockCandidate, this.mockLeaderProperties, - this.mockLeaderEventPublisher, this.mockKubernetesClient); + this.fabric8LeadershipController = new Fabric8LeadershipController(this.mockCandidate, + this.mockLeaderProperties, this.mockLeaderEventPublisher, this.mockKubernetesClient); } @Test public void shouldGetEmptyLocalLeader() { - assertThat(this.leadershipController.getLocalLeader().isPresent()).isFalse(); + assertThat(this.fabric8LeadershipController.getLocalLeader().isPresent()).isFalse(); } } diff --git a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/PodReadinessWatcherTest.java b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8PodReadinessWatcherTest.java similarity index 89% rename from spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/PodReadinessWatcherTest.java rename to spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8PodReadinessWatcherTest.java index 1639876f..3793202e 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/PodReadinessWatcherTest.java +++ b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/Fabric8PodReadinessWatcherTest.java @@ -40,12 +40,12 @@ import static org.mockito.Mockito.verify; * @author Gytis Trikleris */ @ExtendWith(MockitoExtension.class) -public class PodReadinessWatcherTest { +public class Fabric8PodReadinessWatcherTest { private static final String POD_NAME = "test-pod"; @Mock - private LeadershipController mockLeadershipController; + private Fabric8LeadershipController mockFabric8LeadershipController; @Mock private KubernetesClient mockKubernetesClient; @@ -68,11 +68,12 @@ public class PodReadinessWatcherTest { @Mock private KubernetesClientException mockKubernetesClientException; - private PodReadinessWatcher watcher; + private Fabric8PodReadinessWatcher watcher; @BeforeEach public void before() { - this.watcher = new PodReadinessWatcher(POD_NAME, this.mockKubernetesClient, this.mockLeadershipController); + this.watcher = new Fabric8PodReadinessWatcher(POD_NAME, this.mockKubernetesClient, + this.mockFabric8LeadershipController); } @Test @@ -103,7 +104,7 @@ public class PodReadinessWatcherTest { this.watcher.start(); this.watcher.eventReceived(Watcher.Action.ADDED, this.mockPod); - verify(this.mockLeadershipController).update(); + verify(this.mockFabric8LeadershipController).update(); } @Test @@ -114,7 +115,7 @@ public class PodReadinessWatcherTest { this.watcher.start(); this.watcher.eventReceived(Watcher.Action.ADDED, this.mockPod); - verify(this.mockLeadershipController, times(0)).update(); + verify(this.mockFabric8LeadershipController, times(0)).update(); } @Test diff --git a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderContextTest.java b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderContextTest.java index 8e304b07..41055988 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderContextTest.java +++ b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderContextTest.java @@ -24,6 +24,8 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.cloud.kubernetes.commons.leader.Leader; +import org.springframework.cloud.kubernetes.commons.leader.LeaderContext; import org.springframework.integration.leader.Candidate; import static org.assertj.core.api.Assertions.assertThat; @@ -40,7 +42,7 @@ public class LeaderContextTest { private Candidate mockCandidate; @Mock - private LeadershipController mockLeadershipController; + private Fabric8LeadershipController mockFabric8LeadershipController; @Mock private Leader mockLeader; @@ -49,12 +51,12 @@ public class LeaderContextTest { @BeforeEach public void before() { - this.leaderContext = new LeaderContext(this.mockCandidate, this.mockLeadershipController); + this.leaderContext = new LeaderContext(this.mockCandidate, this.mockFabric8LeadershipController); } @Test public void testIsLeaderWithoutLeader() { - given(this.mockLeadershipController.getLocalLeader()).willReturn(Optional.empty()); + given(this.mockFabric8LeadershipController.getLocalLeader()).willReturn(Optional.empty()); boolean result = this.leaderContext.isLeader(); @@ -63,7 +65,7 @@ public class LeaderContextTest { @Test public void testIsLeaderWithAnotherLeader() { - given(this.mockLeadershipController.getLocalLeader()).willReturn(Optional.of(this.mockLeader)); + given(this.mockFabric8LeadershipController.getLocalLeader()).willReturn(Optional.of(this.mockLeader)); boolean result = this.leaderContext.isLeader(); @@ -72,7 +74,7 @@ public class LeaderContextTest { @Test public void testIsLeaderWhenLeader() { - given(this.mockLeadershipController.getLocalLeader()).willReturn(Optional.of(this.mockLeader)); + given(this.mockFabric8LeadershipController.getLocalLeader()).willReturn(Optional.of(this.mockLeader)); given(this.mockLeader.isCandidate(this.mockCandidate)).willReturn(true); boolean result = this.leaderContext.isLeader(); @@ -84,7 +86,7 @@ public class LeaderContextTest { public void shouldYieldLeadership() { this.leaderContext.yield(); - verify(this.mockLeadershipController).revoke(); + verify(this.mockFabric8LeadershipController).revoke(); } } diff --git a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInfoContributorTest.java b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInfoContributorTest.java index 88c67b21..40931ca2 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInfoContributorTest.java +++ b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInfoContributorTest.java @@ -26,6 +26,8 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.boot.actuate.info.Info; +import org.springframework.cloud.kubernetes.commons.leader.Leader; +import org.springframework.cloud.kubernetes.commons.leader.LeaderInfoContributor; import org.springframework.integration.leader.Candidate; import static org.assertj.core.api.Assertions.assertThat; @@ -38,7 +40,7 @@ public class LeaderInfoContributorTest { private Candidate mockCandidate; @Mock - private LeadershipController mockLeadershipController; + private Fabric8LeadershipController mockFabric8LeadershipController; @Mock private Leader mockLeader; @@ -47,7 +49,8 @@ public class LeaderInfoContributorTest { @BeforeEach public void before() { - this.leaderInfoContributor = new LeaderInfoContributor(this.mockLeadershipController, this.mockCandidate); + this.leaderInfoContributor = new LeaderInfoContributor(this.mockFabric8LeadershipController, + this.mockCandidate); } @SuppressWarnings("unchecked") @@ -64,7 +67,7 @@ public class LeaderInfoContributorTest { @SuppressWarnings("unchecked") @Test public void infoWhenLeader() { - given(this.mockLeadershipController.getLocalLeader()).willReturn(Optional.of(this.mockLeader)); + given(this.mockFabric8LeadershipController.getLocalLeader()).willReturn(Optional.of(this.mockLeader)); given(this.mockLeader.isCandidate(this.mockCandidate)).willReturn(true); given(this.mockLeader.getRole()).willReturn("testRole"); given(this.mockLeader.getId()).willReturn("id"); @@ -81,7 +84,7 @@ public class LeaderInfoContributorTest { @SuppressWarnings("unchecked") @Test public void infoWhenAnotherIsLeader() { - given(this.mockLeadershipController.getLocalLeader()).willReturn(Optional.of(this.mockLeader)); + given(this.mockFabric8LeadershipController.getLocalLeader()).willReturn(Optional.of(this.mockLeader)); given(this.mockLeader.getRole()).willReturn("testRole"); given(this.mockLeader.getId()).willReturn("id"); Info.Builder builder = new Info.Builder(); diff --git a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInitiatorTest.java b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInitiatorTest.java index 19666da6..e54e7e1c 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInitiatorTest.java +++ b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderInitiatorTest.java @@ -25,6 +25,9 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.cloud.kubernetes.commons.leader.LeaderInitiator; +import org.springframework.cloud.kubernetes.commons.leader.LeaderProperties; + import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.verify; @@ -40,13 +43,13 @@ public class LeaderInitiatorTest { private LeaderProperties mockLeaderProperties; @Mock - private LeadershipController mockLeadershipController; + private Fabric8LeadershipController mockFabric8LeadershipController; @Mock - private LeaderRecordWatcher mockLeaderRecordWatcher; + private Fabric8LeaderRecordWatcher mockFabric8LeaderRecordWatcher; @Mock - private PodReadinessWatcher mockPodReadinessWatcher; + private Fabric8PodReadinessWatcher mockFabric8PodReadinessWatcher; @Mock private Runnable mockRunnable; @@ -55,8 +58,8 @@ public class LeaderInitiatorTest { @BeforeEach public void before() { - this.leaderInitiator = new LeaderInitiator(this.mockLeaderProperties, this.mockLeadershipController, - this.mockLeaderRecordWatcher, this.mockPodReadinessWatcher); + this.leaderInitiator = new LeaderInitiator(this.mockLeaderProperties, this.mockFabric8LeadershipController, + this.mockFabric8LeaderRecordWatcher, this.mockFabric8PodReadinessWatcher); } @AfterEach @@ -78,10 +81,10 @@ public class LeaderInitiatorTest { this.leaderInitiator.start(); assertThat(this.leaderInitiator.isRunning()).isTrue(); - verify(this.mockLeaderRecordWatcher).start(); - verify(this.mockPodReadinessWatcher).start(); + verify(this.mockFabric8LeaderRecordWatcher).start(); + verify(this.mockFabric8PodReadinessWatcher).start(); Thread.sleep(10); - verify(this.mockLeadershipController, atLeastOnce()).update(); + verify(this.mockFabric8LeadershipController, atLeastOnce()).update(); } @Test @@ -91,7 +94,7 @@ public class LeaderInitiatorTest { this.leaderInitiator.start(); this.leaderInitiator.start(); - verify(this.mockLeaderRecordWatcher).start(); + verify(this.mockFabric8LeaderRecordWatcher).start(); } @Test @@ -102,9 +105,9 @@ public class LeaderInitiatorTest { this.leaderInitiator.stop(); assertThat(this.leaderInitiator.isRunning()).isFalse(); - verify(this.mockLeaderRecordWatcher).stop(); - verify(this.mockPodReadinessWatcher).start(); - verify(this.mockLeadershipController).revoke(); + verify(this.mockFabric8LeaderRecordWatcher).stop(); + verify(this.mockFabric8PodReadinessWatcher).start(); + verify(this.mockFabric8LeadershipController).revoke(); } @Test @@ -115,7 +118,7 @@ public class LeaderInitiatorTest { this.leaderInitiator.stop(); this.leaderInitiator.stop(); - verify(this.mockLeaderRecordWatcher).stop(); + verify(this.mockFabric8LeaderRecordWatcher).stop(); } @Test @@ -126,9 +129,9 @@ public class LeaderInitiatorTest { this.leaderInitiator.stop(this.mockRunnable); assertThat(this.leaderInitiator.isRunning()).isFalse(); - verify(this.mockLeaderRecordWatcher).stop(); - verify(this.mockPodReadinessWatcher).start(); - verify(this.mockLeadershipController).revoke(); + verify(this.mockFabric8LeaderRecordWatcher).stop(); + verify(this.mockFabric8PodReadinessWatcher).start(); + verify(this.mockFabric8LeadershipController).revoke(); verify(this.mockRunnable).run(); } diff --git a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderTest.java b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderTest.java index b36a970d..e5d6619f 100644 --- a/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderTest.java +++ b/spring-cloud-kubernetes-fabric8-leader/src/test/java/org/springframework/cloud/kubernetes/fabric8/leader/LeaderTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.cloud.kubernetes.commons.leader.Leader; import org.springframework.integration.leader.Candidate; import static org.assertj.core.api.Assertions.assertThat;