Add dynamic configuration to disable directory reconciler
This commit is contained in:
parent
9734433f00
commit
d2bc3c7360
|
@ -487,7 +487,8 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
|
||||||
final DirectoryReconciliationClient directoryReconciliationClient = new DirectoryReconciliationClient(
|
final DirectoryReconciliationClient directoryReconciliationClient = new DirectoryReconciliationClient(
|
||||||
directoryServerConfiguration);
|
directoryServerConfiguration);
|
||||||
final DirectoryReconciler directoryReconciler = new DirectoryReconciler(
|
final DirectoryReconciler directoryReconciler = new DirectoryReconciler(
|
||||||
directoryServerConfiguration.getReplicationName(), directoryReconciliationClient);
|
directoryServerConfiguration.getReplicationName(), directoryReconciliationClient,
|
||||||
|
dynamicConfigurationManager);
|
||||||
// reconcilers are read-only
|
// reconcilers are read-only
|
||||||
accountDatabaseCrawlerListeners.add(directoryReconciler);
|
accountDatabaseCrawlerListeners.add(directoryReconciler);
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,9 @@ public class DynamicConfiguration {
|
||||||
@Valid
|
@Valid
|
||||||
private DynamicRateLimitChallengeConfiguration rateLimitChallenge = new DynamicRateLimitChallengeConfiguration();
|
private DynamicRateLimitChallengeConfiguration rateLimitChallenge = new DynamicRateLimitChallengeConfiguration();
|
||||||
|
|
||||||
|
@JsonProperty
|
||||||
|
private DynamicDirectoryReconcilerConfiguration directoryReconciler = new DynamicDirectoryReconcilerConfiguration();
|
||||||
|
|
||||||
public Optional<DynamicExperimentEnrollmentConfiguration> getExperimentEnrollmentConfiguration(
|
public Optional<DynamicExperimentEnrollmentConfiguration> getExperimentEnrollmentConfiguration(
|
||||||
final String experimentName) {
|
final String experimentName) {
|
||||||
return Optional.ofNullable(experiments.get(experimentName));
|
return Optional.ofNullable(experiments.get(experimentName));
|
||||||
|
@ -94,4 +97,8 @@ public class DynamicConfiguration {
|
||||||
public DynamicRateLimitChallengeConfiguration getRateLimitChallengeConfiguration() {
|
public DynamicRateLimitChallengeConfiguration getRateLimitChallengeConfiguration() {
|
||||||
return rateLimitChallenge;
|
return rateLimitChallenge;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DynamicDirectoryReconcilerConfiguration getDirectoryReconcilerConfiguration() {
|
||||||
|
return directoryReconciler;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2021 Signal Messenger, LLC
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.whispersystems.textsecuregcm.configuration.dynamic;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
|
||||||
|
public class DynamicDirectoryReconcilerConfiguration {
|
||||||
|
|
||||||
|
@JsonProperty
|
||||||
|
private boolean enabled = true;
|
||||||
|
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
}
|
|
@ -26,10 +26,13 @@ public class DirectoryReconciler extends AccountDatabaseCrawlerListener {
|
||||||
|
|
||||||
private final String replicationName;
|
private final String replicationName;
|
||||||
private final DirectoryReconciliationClient reconciliationClient;
|
private final DirectoryReconciliationClient reconciliationClient;
|
||||||
|
private final DynamicConfigurationManager dynamicConfigurationManager;
|
||||||
|
|
||||||
public DirectoryReconciler(String replicationName, DirectoryReconciliationClient reconciliationClient) {
|
public DirectoryReconciler(String replicationName, DirectoryReconciliationClient reconciliationClient,
|
||||||
|
DynamicConfigurationManager dynamicConfigurationManager) {
|
||||||
this.reconciliationClient = reconciliationClient;
|
this.reconciliationClient = reconciliationClient;
|
||||||
this.replicationName = replicationName;
|
this.replicationName = replicationName;
|
||||||
|
this.dynamicConfigurationManager = dynamicConfigurationManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -38,6 +41,10 @@ public class DirectoryReconciler extends AccountDatabaseCrawlerListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCrawlEnd(Optional<UUID> fromUuid) {
|
public void onCrawlEnd(Optional<UUID> fromUuid) {
|
||||||
|
if (!dynamicConfigurationManager.getConfiguration().getDirectoryReconcilerConfiguration().isEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
reconciliationClient.complete();
|
reconciliationClient.complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +52,10 @@ public class DirectoryReconciler extends AccountDatabaseCrawlerListener {
|
||||||
protected void onCrawlChunk(final Optional<UUID> fromUuid, final List<Account> accounts)
|
protected void onCrawlChunk(final Optional<UUID> fromUuid, final List<Account> accounts)
|
||||||
throws AccountDatabaseCrawlerRestartException {
|
throws AccountDatabaseCrawlerRestartException {
|
||||||
|
|
||||||
|
if (!dynamicConfigurationManager.getConfiguration().getDirectoryReconcilerConfiguration().isEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final DirectoryReconciliationRequest addUsersRequest;
|
final DirectoryReconciliationRequest addUsersRequest;
|
||||||
final DirectoryReconciliationRequest deleteUsersRequest;
|
final DirectoryReconciliationRequest deleteUsersRequest;
|
||||||
{
|
{
|
||||||
|
|
|
@ -374,4 +374,27 @@ class DynamicConfigurationTest {
|
||||||
assertThat(rateLimitChallengeConfiguration.isUnsealedSenderLimitEnforced()).isFalse();
|
assertThat(rateLimitChallengeConfiguration.isUnsealedSenderLimitEnforced()).isFalse();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testParseDirectoryReconciler() throws JsonProcessingException {
|
||||||
|
{
|
||||||
|
final String emptyConfigYaml = "test: true";
|
||||||
|
final DynamicConfiguration emptyConfig =
|
||||||
|
DynamicConfigurationManager.parseConfiguration(emptyConfigYaml).orElseThrow();
|
||||||
|
|
||||||
|
assertThat(emptyConfig.getDirectoryReconcilerConfiguration().isEnabled()).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
final String directoryReconcilerConfig =
|
||||||
|
"directoryReconciler:\n"
|
||||||
|
+ " enabled: false";
|
||||||
|
|
||||||
|
DynamicDirectoryReconcilerConfiguration directoryReconcilerConfiguration =
|
||||||
|
DynamicConfigurationManager.parseConfiguration(directoryReconcilerConfig).orElseThrow()
|
||||||
|
.getDirectoryReconcilerConfiguration();
|
||||||
|
|
||||||
|
assertThat(directoryReconcilerConfiguration.isEnabled()).isFalse();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ import java.util.UUID;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
|
import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration;
|
||||||
import org.whispersystems.textsecuregcm.entities.DirectoryReconciliationRequest;
|
import org.whispersystems.textsecuregcm.entities.DirectoryReconciliationRequest;
|
||||||
import org.whispersystems.textsecuregcm.entities.DirectoryReconciliationRequest.User;
|
import org.whispersystems.textsecuregcm.entities.DirectoryReconciliationRequest.User;
|
||||||
import org.whispersystems.textsecuregcm.entities.DirectoryReconciliationResponse;
|
import org.whispersystems.textsecuregcm.entities.DirectoryReconciliationResponse;
|
||||||
|
@ -27,6 +28,7 @@ import org.whispersystems.textsecuregcm.storage.Account;
|
||||||
import org.whispersystems.textsecuregcm.storage.AccountDatabaseCrawlerRestartException;
|
import org.whispersystems.textsecuregcm.storage.AccountDatabaseCrawlerRestartException;
|
||||||
import org.whispersystems.textsecuregcm.storage.DirectoryReconciler;
|
import org.whispersystems.textsecuregcm.storage.DirectoryReconciler;
|
||||||
import org.whispersystems.textsecuregcm.storage.DirectoryReconciliationClient;
|
import org.whispersystems.textsecuregcm.storage.DirectoryReconciliationClient;
|
||||||
|
import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager;
|
||||||
|
|
||||||
class DirectoryReconcilerTest {
|
class DirectoryReconcilerTest {
|
||||||
|
|
||||||
|
@ -38,12 +40,17 @@ class DirectoryReconcilerTest {
|
||||||
private final Account visibleAccount = mock(Account.class);
|
private final Account visibleAccount = mock(Account.class);
|
||||||
private final Account undiscoverableAccount = mock(Account.class);
|
private final Account undiscoverableAccount = mock(Account.class);
|
||||||
private final DirectoryReconciliationClient reconciliationClient = mock(DirectoryReconciliationClient.class);
|
private final DirectoryReconciliationClient reconciliationClient = mock(DirectoryReconciliationClient.class);
|
||||||
private final DirectoryReconciler directoryReconciler = new DirectoryReconciler("test", reconciliationClient);
|
private final DynamicConfigurationManager dynamicConfigurationManager = mock(DynamicConfigurationManager.class);
|
||||||
|
private final DirectoryReconciler directoryReconciler = new DirectoryReconciler("test", reconciliationClient,
|
||||||
|
dynamicConfigurationManager);
|
||||||
|
|
||||||
private final DirectoryReconciliationResponse successResponse = new DirectoryReconciliationResponse(DirectoryReconciliationResponse.Status.OK);
|
private final DirectoryReconciliationResponse successResponse = new DirectoryReconciliationResponse(
|
||||||
|
DirectoryReconciliationResponse.Status.OK);
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
void setup() {
|
void setup() {
|
||||||
|
when(dynamicConfigurationManager.getConfiguration()).thenReturn(new DynamicConfiguration());
|
||||||
|
|
||||||
when(visibleAccount.getUuid()).thenReturn(VALID_UUID);
|
when(visibleAccount.getUuid()).thenReturn(VALID_UUID);
|
||||||
when(visibleAccount.getNumber()).thenReturn(VALID_NUMBER);
|
when(visibleAccount.getNumber()).thenReturn(VALID_NUMBER);
|
||||||
when(visibleAccount.shouldBeVisibleInDirectory()).thenReturn(true);
|
when(visibleAccount.shouldBeVisibleInDirectory()).thenReturn(true);
|
||||||
|
|
Loading…
Reference in New Issue