Skip to content

Commit e63ce71

Browse files
todvoramoesterheld
andauthored
Run cert provisioning even for explicitly configured datanodes (#26332)
* Run cert provisioning even for explicitly configured datanodes * added changelog --------- Co-authored-by: Matthias Oesterheld <33032967+moesterheld@users.noreply.github.com>
1 parent e59026a commit e63ce71

6 files changed

Lines changed: 51 additions & 0 deletions

File tree

changelog/unreleased/pr-26332.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
type = "f"
2+
message = "Run cert provisioning even for explicitly configured datanodes."
3+
pulls = ["26332"]

graylog2-server/src/main/java/org/graylog2/configuration/IndexerDiscoveryCertProvisioning.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
import jakarta.inject.Inject;
2020
import org.graylog2.bootstrap.preflight.GraylogCertificateProvisioner;
2121

22+
import java.net.URI;
23+
import java.util.List;
24+
2225
public class IndexerDiscoveryCertProvisioning implements IndexerDiscoveryListener {
2326

2427
private final GraylogCertificateProvisioner graylogCertificateProvisioner;
@@ -33,6 +36,14 @@ public void beforeIndexerDiscovery() {
3336

3437
}
3538

39+
@Override
40+
public void onExplicitlyConfiguredNodes(List<URI> hosts) {
41+
// the user has some explicitly configured nodes. They might still need fresh certificates.
42+
// the downside here is that there is no loop, no waiting, like in the onDiscoveryRetry method.
43+
// Any node needing fresh cert has to trigger a CSR before the server starts and checks CSRs here.
44+
graylogCertificateProvisioner.runProvisioning();
45+
}
46+
3647
@Override
3748
public void onDiscoveryRetry() {
3849
// let's try to provision certificates, maybe there are datanodes waiting for these

graylog2-server/src/main/java/org/graylog2/configuration/IndexerDiscoveryListener.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@
1616
*/
1717
package org.graylog2.configuration;
1818

19+
import java.net.URI;
20+
import java.util.List;
21+
1922
public interface IndexerDiscoveryListener {
23+
void onExplicitlyConfiguredNodes(List<URI> hosts);
2024
/**
2125
* Triggered before we start with indexer discovery. Won't be triggered if there are any indexers
2226
* explicitly defined in the configuration.

graylog2-server/src/main/java/org/graylog2/configuration/IndexerDiscoveryProvider.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ private List<URI> doGet() {
9191
// configured hosts, just use these and don't try any detection
9292
if (hosts != null && !hosts.isEmpty()) {
9393
LOG.info("Indexer hosts are set in configuration, using {} provided hosts", hosts.size()); // do not log hosts, may contain uname+pass
94+
indexerDiscoveryListeners.forEach(listener -> listener.onExplicitlyConfiguredNodes(hosts));
9495
return hosts;
9596
}
9697

graylog2-server/src/main/java/org/graylog2/configuration/IndexerDiscoverySecurityAutoconfig.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import org.slf4j.Logger;
2727
import org.slf4j.LoggerFactory;
2828

29+
import java.net.URI;
30+
import java.util.List;
2931
import java.util.Optional;
3032

3133
public class IndexerDiscoverySecurityAutoconfig implements IndexerDiscoveryListener {
@@ -63,6 +65,11 @@ private Optional<RenewalPolicy> getRenewalPolicy() {
6365
return Optional.ofNullable(this.clusterConfigService.get(RenewalPolicy.class));
6466
}
6567

68+
@Override
69+
public void onExplicitlyConfiguredNodes(List<URI> hosts) {
70+
71+
}
72+
6673
@Override
6774
public void beforeIndexerDiscovery() {
6875
if (configuration.selfsignedStartupEnabled()) {

graylog2-server/src/test/java/org/graylog2/configuration/IndexerDiscoveryProviderTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,27 @@ void testAutomaticDiscoveryOneUnconfigured() {
102102
}
103103

104104

105+
@Test
106+
void testCertProvisioningTriggeredForExplicitlyConfiguredNodes() {
107+
final GraylogCertificateProvisioner provisioner = Mockito.mock(GraylogCertificateProvisioner.class);
108+
final IndexerDiscoveryCertProvisioning listener = new IndexerDiscoveryCertProvisioning(provisioner);
109+
110+
final IndexerDiscoveryProvider provider = new IndexerDiscoveryProvider(
111+
List.of(URI.create("http://datanode:9200")),
112+
1,
113+
Duration.seconds(1),
114+
preflightConfig(null),
115+
nodes(),
116+
Collections.singleton(listener)
117+
);
118+
119+
provider.get();
120+
121+
// Even with explicitly configured hosts a DataNode may still need a fresh certificate,
122+
// so provisioning must run exactly once on this path.
123+
Mockito.verify(provisioner, Mockito.times(1)).runProvisioning();
124+
}
125+
105126
@Test
106127
void testPreconfiguredIndexers() {
107128
final IndexerDiscoveryProvider provider = new IndexerDiscoveryProvider(
@@ -157,6 +178,10 @@ void testProvisioningWillBeTriggered() {
157178
final GraylogCertificateProvisioner provisioner = Mockito.mock(GraylogCertificateProvisioner.class);
158179
final org.graylog2.configuration.IndexerDiscoveryListener indexerDiscoveryListener = new IndexerDiscoveryListener() {
159180

181+
@Override
182+
public void onExplicitlyConfiguredNodes(List<URI> hosts) {
183+
}
184+
160185
@Override
161186
public void beforeIndexerDiscovery() {
162187

0 commit comments

Comments
 (0)