use of com.couchbase.client.core.node.NodeIdentifier in project couchbase-jvm-clients by couchbase.
the class GlobalLoaderIntegrationTest method loadGlobalConfigViaCarrierPublication.
/**
* This is a very simplistic test that makes sure that we can "round trip" in the
* {@link GlobalLoader} by grabbing a JSON decodable config through the full stack.
*/
@Test
void loadGlobalConfigViaCarrierPublication() {
TestNodeConfig config = config().firstNodeWith(Services.KV).get();
Core core = Core.create(env, authenticator(), seedNodes());
GlobalLoader loader = new GlobalLoader(core);
ProposedGlobalConfigContext globalConfigContext = loader.load(new NodeIdentifier(config.hostname(), config.ports().get(Services.MANAGER)), config.ports().get(Services.KV)).block();
assertNotNull(globalConfigContext);
assertNotNull(globalConfigContext.config());
core.shutdown().block();
}
use of com.couchbase.client.core.node.NodeIdentifier in project couchbase-jvm-clients by couchbase.
the class KeyValueBucketLoaderIntegrationTest method loadConfigViaCarrierPublication.
/**
* This is a very simplistic test that makes sure that we can "round trip" in the
* {@link KeyValueBucketLoader} by grabbing a JSON decodable config through the full stack.
*/
@Test
void loadConfigViaCarrierPublication() {
TestNodeConfig config = config().firstNodeWith(Services.KV).get();
Core core = Core.create(env, authenticator(), seedNodes());
KeyValueBucketLoader loader = new KeyValueBucketLoader(core);
ProposedBucketConfigContext loaded = loader.load(new NodeIdentifier(config.hostname(), config.ports().get(Services.MANAGER)), config.ports().get(Services.KV), config().bucketname(), Optional.empty()).block();
assertNotNull(loaded);
assertEquals(config().bucketname(), loaded.bucketName());
core.shutdown().block();
}
use of com.couchbase.client.core.node.NodeIdentifier in project couchbase-jvm-clients by couchbase.
the class DefaultConfigurationProvider method loadAndRefreshGlobalConfig.
@Override
public Mono<Void> loadAndRefreshGlobalConfig() {
return Mono.defer(() -> {
if (!shutdown.get()) {
globalConfigLoadInProgress = true;
boolean tls = core.context().environment().securityConfig().tlsEnabled();
int kvPort = tls ? DEFAULT_KV_TLS_PORT : DEFAULT_KV_PORT;
final AtomicBoolean hasErrored = new AtomicBoolean();
return Flux.range(1, Math.min(MAX_PARALLEL_LOADERS, currentSeedNodes().size())).flatMap(index -> Flux.fromIterable(currentSeedNodes()).take(Math.min(index, currentSeedNodes().size())).last().flatMap(seed -> {
long start = System.nanoTime();
if (!currentSeedNodes().contains(seed)) {
// node we are about to load is still part of the list.
return Mono.empty();
}
NodeIdentifier identifier = new NodeIdentifier(seed.address(), seed.clusterManagerPort().orElse(DEFAULT_MANAGER_PORT));
return globalLoader.load(identifier, seed.kvPort().orElse(kvPort)).doOnError(throwable -> core.context().environment().eventBus().publish(new IndividualGlobalConfigLoadFailedEvent(Duration.ofNanos(System.nanoTime() - start), core.context(), throwable, seed.address())));
}).retryWhen(Retry.from(companion -> companion.flatMap(rs -> {
Throwable f = rs.failure();
if (shutdown.get()) {
return Mono.error(new AlreadyShutdownException());
}
if (f instanceof UnsupportedConfigMechanismException) {
return Mono.error(Exceptions.propagate(f));
}
Duration delay = Duration.ofMillis(1);
eventBus.publish(new GlobalConfigRetriedEvent(delay, core.context(), f));
return Mono.just(rs.totalRetries()).delayElement(delay, core.context().environment().scheduler());
}))).onErrorResume(throwable -> {
if (hasErrored.compareAndSet(false, true)) {
return Mono.error(throwable);
}
return Mono.empty();
})).take(1).switchIfEmpty(Mono.error(new ConfigException("Could not locate a single global configuration"))).map(ctx -> {
proposeGlobalConfig(ctx);
return ctx;
}).then(globalRefresher.start()).doOnTerminate(() -> globalConfigLoadInProgress = false);
} else {
return Mono.error(new AlreadyShutdownException());
}
});
}
use of com.couchbase.client.core.node.NodeIdentifier in project couchbase-jvm-clients by couchbase.
the class CoreTest method removeNodesAndServicesOnNewConfig.
@Test
@SuppressWarnings("unchecked")
void removeNodesAndServicesOnNewConfig() {
final ConfigurationProvider configProvider = mock(ConfigurationProvider.class);
DirectProcessor<ClusterConfig> configs = DirectProcessor.create();
ClusterConfig clusterConfig = new ClusterConfig();
when(configProvider.configs()).thenReturn(configs);
when(configProvider.config()).thenReturn(clusterConfig);
Node mock101 = mock(Node.class);
when(mock101.identifier()).thenReturn(new NodeIdentifier("10.143.190.101", 8091));
when(mock101.addService(any(ServiceType.class), anyInt(), any(Optional.class))).thenReturn(Mono.empty());
when(mock101.removeService(any(ServiceType.class), any(Optional.class))).thenReturn(Mono.empty());
when(mock101.serviceEnabled(any(ServiceType.class))).thenReturn(true);
when(mock101.disconnect()).thenReturn(Mono.empty());
Node mock102 = mock(Node.class);
when(mock102.identifier()).thenReturn(new NodeIdentifier("10.143.190.102", 8091));
when(mock102.addService(any(ServiceType.class), anyInt(), any(Optional.class))).thenReturn(Mono.empty());
when(mock102.removeService(any(ServiceType.class), any(Optional.class))).thenReturn(Mono.empty());
when(mock102.serviceEnabled(any(ServiceType.class))).thenReturn(true);
when(mock102.disconnect()).thenReturn(Mono.empty());
final Map<String, Node> mocks = new HashMap<>();
mocks.put("10.143.190.101", mock101);
mocks.put("10.143.190.102", mock102);
new Core(ENV, AUTHENTICATOR, SeedNode.LOCALHOST) {
@Override
public ConfigurationProvider createConfigurationProvider() {
return configProvider;
}
@Override
protected Node createNode(final NodeIdentifier target, final Optional<String> alternate) {
return mocks.get(target.address());
}
};
configs.onNext(clusterConfig);
BucketConfig twoNodesConfig = BucketConfigParser.parse(readResource("two_nodes_config_more_services.json", CoreTest.class), ENV, LOCALHOST);
clusterConfig.setBucketConfig(twoNodesConfig);
configs.onNext(clusterConfig);
verify(mock101, times(1)).addService(ServiceType.VIEWS, 8092, Optional.empty());
verify(mock101, times(1)).addService(ServiceType.MANAGER, 8091, Optional.empty());
verify(mock101, times(1)).addService(ServiceType.QUERY, 8093, Optional.empty());
verify(mock101, times(1)).addService(ServiceType.KV, 11210, Optional.of("travel-sample"));
verify(mock102, times(1)).addService(ServiceType.VIEWS, 8092, Optional.empty());
verify(mock102, times(1)).addService(ServiceType.MANAGER, 8091, Optional.empty());
verify(mock102, times(1)).addService(ServiceType.QUERY, 8093, Optional.empty());
verify(mock102, times(1)).addService(ServiceType.KV, 11210, Optional.of("travel-sample"));
verify(mock102, times(1)).addService(ServiceType.SEARCH, 8094, Optional.empty());
BucketConfig twoNodesLessServices = BucketConfigParser.parse(readResource("two_nodes_config.json", CoreTest.class), ENV, LOCALHOST);
clusterConfig.setBucketConfig(twoNodesLessServices);
configs.onNext(clusterConfig);
verify(mock102, times(1)).removeService(ServiceType.SEARCH, Optional.empty());
}
use of com.couchbase.client.core.node.NodeIdentifier in project couchbase-jvm-clients by couchbase.
the class CoreTest method addsSecondNodeIfBothSameHostname.
/**
* With cluster_run it is possible to run more than one node on the same hostname. So we need to make sure that
* the node is identified by a tuple of hostname and manager port, and this should work.
*/
@Test
@SuppressWarnings("unchecked")
void addsSecondNodeIfBothSameHostname() {
final ConfigurationProvider configProvider = mock(ConfigurationProvider.class);
DirectProcessor<ClusterConfig> configs = DirectProcessor.create();
ClusterConfig clusterConfig = new ClusterConfig();
when(configProvider.configs()).thenReturn(configs);
when(configProvider.config()).thenReturn(clusterConfig);
Node mock101 = mock(Node.class);
when(mock101.identifier()).thenReturn(new NodeIdentifier(LOCALHOST, 9000));
when(mock101.addService(any(ServiceType.class), anyInt(), any(Optional.class))).thenReturn(Mono.empty());
when(mock101.removeService(any(ServiceType.class), any(Optional.class))).thenReturn(Mono.empty());
when(mock101.serviceEnabled(any(ServiceType.class))).thenReturn(true);
when(mock101.disconnect()).thenReturn(Mono.empty());
Node mock102 = mock(Node.class);
when(mock102.identifier()).thenReturn(new NodeIdentifier(LOCALHOST, 9001));
when(mock102.addService(any(ServiceType.class), anyInt(), any(Optional.class))).thenReturn(Mono.empty());
when(mock102.removeService(any(ServiceType.class), any(Optional.class))).thenReturn(Mono.empty());
when(mock102.serviceEnabled(any(ServiceType.class))).thenReturn(true);
when(mock102.disconnect()).thenReturn(Mono.empty());
final Map<String, Node> mocks = new HashMap<>();
mocks.put("127.0.0.1:9000", mock101);
mocks.put("127.0.0.1:9001", mock102);
new Core(ENV, AUTHENTICATOR, SeedNode.LOCALHOST) {
@Override
public ConfigurationProvider createConfigurationProvider() {
return configProvider;
}
@Override
protected Node createNode(final NodeIdentifier target, final Optional<String> alternate) {
return mocks.get(target.address() + ":" + target.managerPort());
}
};
configs.onNext(clusterConfig);
BucketConfig oneNodeConfig = BucketConfigParser.parse(readResource("cluster_run_two_nodes.json", CoreTest.class), ENV, LOCALHOST);
clusterConfig.setBucketConfig(oneNodeConfig);
configs.onNext(clusterConfig);
verify(mock101, times(1)).addService(ServiceType.VIEWS, 9500, Optional.empty());
verify(mock101, times(1)).addService(ServiceType.MANAGER, 9000, Optional.empty());
verify(mock101, times(1)).addService(ServiceType.KV, 12000, Optional.of("default"));
verify(mock102, times(1)).addService(ServiceType.VIEWS, 9501, Optional.empty());
verify(mock102, times(1)).addService(ServiceType.MANAGER, 9001, Optional.empty());
verify(mock102, times(1)).addService(ServiceType.KV, 12002, Optional.of("default"));
}
Aggregations