LeaderContext
This commit is contained in:
committed by
Ioannis Canellos
parent
f8bd3d7272
commit
eb3bc07d9b
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright 2018 Red Hat, Inc, and individual contributors.
|
||||
*
|
||||
* 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.kubernetes.leader;
|
||||
|
||||
import org.springframework.integration.leader.Candidate;
|
||||
import org.springframework.integration.leader.Context;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
*/
|
||||
public class LeaderContext implements Context {
|
||||
|
||||
private final Candidate candidate;
|
||||
|
||||
private final LeadershipController leadershipController;
|
||||
|
||||
public LeaderContext(Candidate candidate, LeadershipController leadershipController) {
|
||||
this.candidate = candidate;
|
||||
this.leadershipController = leadershipController;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeader() {
|
||||
Leader leader = leadershipController.getLeader(candidate.getRole());
|
||||
if (leader == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return candidate.getId().equals(leader.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void yield() {
|
||||
leadershipController.revoke(candidate);
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,7 @@ import io.fabric8.kubernetes.client.KubernetesClientException;
|
||||
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;
|
||||
|
||||
/**
|
||||
@@ -123,9 +124,10 @@ public class LeadershipController {
|
||||
}
|
||||
|
||||
private void handleOnGranted(Candidate candidate) {
|
||||
leaderEventPublisher.publishOnGranted(this, null, candidate.getRole());
|
||||
Context context = new LeaderContext(candidate, this);
|
||||
leaderEventPublisher.publishOnGranted(this, context, candidate.getRole());
|
||||
try {
|
||||
candidate.onGranted(null); // TODO context
|
||||
candidate.onGranted(context);
|
||||
} catch (InterruptedException e) {
|
||||
LOGGER.warn(e.getMessage());
|
||||
Thread.currentThread().interrupt();
|
||||
@@ -133,7 +135,8 @@ public class LeadershipController {
|
||||
}
|
||||
|
||||
private void handleOnFailed(Candidate candidate) {
|
||||
leaderEventPublisher.publishOnFailedToAcquire(this, null, candidate.getRole()); // TODO context
|
||||
Context context = new LeaderContext(candidate, this);
|
||||
leaderEventPublisher.publishOnFailedToAcquire(this, context, candidate.getRole());
|
||||
}
|
||||
|
||||
private Map<String, String> getLeaderData(Candidate candidate) {
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
package org.springframework.cloud.kubernetes.leader;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnitRunner;
|
||||
import org.springframework.integration.leader.Candidate;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
*/
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class LeaderContextTest {
|
||||
|
||||
private static final String ROLE = "test-role";
|
||||
|
||||
private static final String ID = "test-id";
|
||||
|
||||
@Mock
|
||||
private Candidate mockCandidate;
|
||||
|
||||
@Mock
|
||||
private LeadershipController mockLeadershipController;
|
||||
|
||||
@Mock
|
||||
private Leader mockLeader;
|
||||
|
||||
private LeaderContext leaderContext;
|
||||
|
||||
@Before
|
||||
public void before() {
|
||||
given(mockCandidate.getRole()).willReturn(ROLE);
|
||||
given(mockCandidate.getId()).willReturn(ID);
|
||||
|
||||
leaderContext = new LeaderContext(mockCandidate, mockLeadershipController);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsLeaderWithoutLeader() {
|
||||
boolean result = leaderContext.isLeader();
|
||||
|
||||
assertThat(result).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsLeaderWithAnotherLeader() {
|
||||
given(mockLeadershipController.getLeader(ROLE)).willReturn(mockLeader);
|
||||
given(mockLeader.getId()).willReturn("another-test-id");
|
||||
|
||||
boolean result = leaderContext.isLeader();
|
||||
|
||||
assertThat(result).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsLeaderWhenLeader() {
|
||||
given(mockLeadershipController.getLeader(ROLE)).willReturn(mockLeader);
|
||||
given(mockLeader.getId()).willReturn(ID);
|
||||
|
||||
boolean result = leaderContext.isLeader();
|
||||
|
||||
assertThat(result).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldYieldLeadership() {
|
||||
leaderContext.yield();
|
||||
|
||||
verify(mockLeadershipController).revoke(mockCandidate);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import io.fabric8.kubernetes.client.KubernetesClientException;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnitRunner;
|
||||
import org.springframework.integration.leader.Candidate;
|
||||
@@ -15,6 +16,7 @@ import org.springframework.integration.leader.event.LeaderEventPublisher;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.doThrow;
|
||||
import static org.mockito.Mockito.times;
|
||||
@@ -67,7 +69,7 @@ public class LeadershipControllerTest {
|
||||
|
||||
assertThat(result).isTrue();
|
||||
verify(mockKubernetesHelper).createConfigMap(Collections.singletonMap(PREFIX + ROLE, ID));
|
||||
verify(mockLeaderEventPublisher).publishOnGranted(leadershipController, null, ROLE);
|
||||
verifyPublishOnGranted();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -78,7 +80,7 @@ public class LeadershipControllerTest {
|
||||
|
||||
assertThat(result).isTrue();
|
||||
verify(mockKubernetesHelper).updateConfigMap(mockConfigMap, leaderData);
|
||||
verify(mockLeaderEventPublisher).publishOnGranted(leadershipController, null, ROLE);
|
||||
verifyPublishOnGranted();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -109,7 +111,7 @@ public class LeadershipControllerTest {
|
||||
|
||||
assertThat(result).isTrue();
|
||||
verify(mockKubernetesHelper).updateConfigMap(mockConfigMap, Collections.singletonMap(PREFIX + ROLE, anotherId));
|
||||
verify(mockLeaderEventPublisher).publishOnGranted(leadershipController, null, ROLE);
|
||||
verifyPublishOnGranted();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -124,7 +126,7 @@ public class LeadershipControllerTest {
|
||||
assertThat(result).isFalse();
|
||||
verify(mockKubernetesHelper, times(0)).createConfigMap(any());
|
||||
verify(mockKubernetesHelper, times(0)).updateConfigMap(any(), any());
|
||||
verify(mockLeaderEventPublisher).publishOnFailedToAcquire(leadershipController, null, ROLE);
|
||||
verifyPublishOnFailedToAcquire();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -134,7 +136,7 @@ public class LeadershipControllerTest {
|
||||
boolean result = leadershipController.acquire(mockCandidate);
|
||||
|
||||
assertThat(result).isFalse();
|
||||
verify(mockLeaderEventPublisher).publishOnFailedToAcquire(leadershipController, null, ROLE);
|
||||
verifyPublishOnFailedToAcquire();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -182,4 +184,20 @@ public class LeadershipControllerTest {
|
||||
assertThat(leader).isNull();
|
||||
}
|
||||
|
||||
private void verifyPublishOnGranted() {
|
||||
ArgumentCaptor<LeaderContext> leaderContextCaptor = ArgumentCaptor.forClass(LeaderContext.class);
|
||||
verify(mockLeaderEventPublisher).publishOnGranted(eq(leadershipController),
|
||||
leaderContextCaptor.capture(), eq(ROLE));
|
||||
LeaderContext expectedLeaderContext = new LeaderContext(mockCandidate, leadershipController);
|
||||
assertThat(leaderContextCaptor.getValue()).isEqualToComparingFieldByField(expectedLeaderContext);
|
||||
}
|
||||
|
||||
public void verifyPublishOnFailedToAcquire() {
|
||||
ArgumentCaptor<LeaderContext> leaderContextCaptor = ArgumentCaptor.forClass(LeaderContext.class);
|
||||
verify(mockLeaderEventPublisher).publishOnFailedToAcquire(eq(leadershipController),
|
||||
leaderContextCaptor.capture(), eq(ROLE));
|
||||
LeaderContext expectedLeaderContext = new LeaderContext(mockCandidate, leadershipController);
|
||||
assertThat(leaderContextCaptor.getValue()).isEqualToComparingFieldByField(expectedLeaderContext);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user