Skip to content

Commit 3d7de64

Browse files
committed
Refactor out the common methods used for reconciling the internal secrets into ReconcilerUtils
Signed-off-by: Gantigmaa Selenge <[email protected]>
1 parent ff98a7e commit 3d7de64

File tree

7 files changed

+112
-131
lines changed

7 files changed

+112
-131
lines changed

cluster-operator/src/main/java/io/strimzi/operator/cluster/model/KafkaCluster.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1681,6 +1681,7 @@ public ClusterRoleBinding generateClusterRoleBinding(String assemblyNamespace) {
16811681
public Role generateRole() {
16821682
List<String> certSecretNames = new ArrayList<>();
16831683
certSecretNames.add(KafkaResources.clusterCaCertificateSecretName(cluster));
1684+
certSecretNames.add(KafkaResources.clientsCaCertificateSecretName(cluster));
16841685
certSecretNames.add(KafkaResources.internalAuthzTrustedCertsSecretName(cluster));
16851686
certSecretNames.add(KafkaResources.internalOauthTrustedCertsSecretName(cluster));
16861687
certSecretNames.addAll(nodes().stream().map(NodeRef::podName).toList());

cluster-operator/src/main/java/io/strimzi/operator/cluster/model/KafkaConnectCluster.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -940,16 +940,15 @@ public RoleBinding generateRoleBindingForRole() {
940940
}
941941

942942
/**
943-
* Creates a secret that contains the TLS certificates from one or more secrets
943+
* Creates a secret with the given name and data
944944
* in the same namespace as the resource.
945-
* This is used for loading truststore certificates from the secret directly.
946-
**
945+
*
947946
* @param secretData secret data
948947
* @param secretName secret name
949948
*
950-
* @return secret for tls certificates
949+
* @return secret
951950
*/
952-
public Secret generateTlsTrustedCertsSecret(Map<String, String> secretData, String secretName) {
951+
public Secret generateSecret(Map<String, String> secretData, String secretName) {
953952
return ModelUtils.createSecret(secretName, namespace, labels, ownerReference, secretData, Map.of(), Map.of());
954953
}
955954

cluster-operator/src/main/java/io/strimzi/operator/cluster/operator/assembly/AbstractConnectOperator.java

Lines changed: 5 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import io.strimzi.api.kafka.model.connector.KafkaConnector;
3030
import io.strimzi.api.kafka.model.connector.KafkaConnectorSpec;
3131
import io.strimzi.api.kafka.model.connector.ListOffsets;
32+
import io.strimzi.api.kafka.model.kafka.KafkaResources;
3233
import io.strimzi.api.kafka.model.kafka.Status;
3334
import io.strimzi.api.kafka.model.mirrormaker2.KafkaMirrorMaker2;
3435
import io.strimzi.operator.cluster.ClusterOperatorConfig;
@@ -62,7 +63,6 @@
6263
import io.strimzi.operator.common.BackOff;
6364
import io.strimzi.operator.common.Reconciliation;
6465
import io.strimzi.operator.common.ReconciliationLogger;
65-
import io.strimzi.operator.common.Util;
6666
import io.strimzi.operator.common.model.InvalidResourceException;
6767
import io.strimzi.operator.common.model.Labels;
6868
import io.strimzi.operator.common.model.OrderedProperties;
@@ -84,7 +84,6 @@
8484
import java.util.Optional;
8585
import java.util.Set;
8686
import java.util.TreeMap;
87-
import java.util.concurrent.ConcurrentHashMap;
8887
import java.util.function.BiFunction;
8988
import java.util.function.Function;
9089
import java.util.stream.Collectors;
@@ -274,7 +273,7 @@ protected Future<ReconcileResult<NetworkPolicy>> connectNetworkPolicy(Reconcilia
274273
*
275274
* @return Future which completes when the reconciliation is done
276275
*/
277-
protected Future<Void> tlsTrustedCertsSecret(Reconciliation reconciliation, String namespace, KafkaConnectCluster connect) {
276+
protected Future<Void> tlsTrustedCertsSecret(Reconciliation reconciliation, KafkaConnectCluster connect) {
278277
ClientTls tls = connect.getTls();
279278
Set<String> secretsToCopy = new HashSet<>();
280279

@@ -286,27 +285,7 @@ protected Future<Void> tlsTrustedCertsSecret(Reconciliation reconciliation, Stri
286285
return Future.succeededFuture();
287286
}
288287

289-
ConcurrentHashMap<String, String> secretData = new ConcurrentHashMap<>();
290-
return Future.join(secretsToCopy.stream()
291-
.map(secretName -> secretOperations.getAsync(namespace, secretName)
292-
.compose(secret -> {
293-
if (secret == null) {
294-
return Future.failedFuture("Secret " + secretName + " not found");
295-
} else {
296-
secret.getData().entrySet().stream()
297-
.filter(e -> e.getKey().contains(".crt"))
298-
// In case secrets contain the same key, append the secret name into the key
299-
.forEach(e -> secretData.put(secretName + "-" + e.getKey(), e.getValue()));
300-
}
301-
return Future.succeededFuture();
302-
}))
303-
.collect(Collectors.toList()))
304-
.compose(ignore -> secretOperations.reconcile(
305-
reconciliation,
306-
namespace,
307-
KafkaConnectResources.internalTlsTrustedCertsSecretName(connect.getCluster()),
308-
connect.generateTlsTrustedCertsSecret(secretData, KafkaConnectResources.internalTlsTrustedCertsSecretName(connect.getCluster())))
309-
.mapEmpty());
288+
return ReconcilerUtils.generateTlsTrustedCertsSecret(reconciliation, secretsToCopy, KafkaConnectResources.internalTlsTrustedCertsSecretName(connect.getCluster()), secretOperations, connect::generateSecret).mapEmpty();
310289
}
311290

312291
/**
@@ -316,7 +295,7 @@ protected Future<Void> tlsTrustedCertsSecret(Reconciliation reconciliation, Stri
316295
*
317296
* @return Future which completes when the reconciliation is done
318297
*/
319-
protected Future<Void> oauthTrustedCertsSecret(Reconciliation reconciliation, String namespace, KafkaConnectCluster connect) {
298+
protected Future<Void> oauthTrustedCertsSecret(Reconciliation reconciliation, KafkaConnectCluster connect) {
320299
KafkaClientAuthentication authentication = connect.getAuthentication();
321300
Set<String> secretsToCopy = new HashSet<>();
322301

@@ -328,42 +307,7 @@ protected Future<Void> oauthTrustedCertsSecret(Reconciliation reconciliation, St
328307
return Future.succeededFuture();
329308
}
330309

331-
List<String> certs = new ArrayList<>();
332-
String oauthSecret = KafkaConnectResources.internalOauthTrustedCertsSecretName(connect.getCluster());
333-
return Future.join(secretsToCopy.stream()
334-
.map(secretName -> secretOperations.getAsync(namespace, secretName)
335-
.compose(secret -> {
336-
if (secret == null) {
337-
return Future.failedFuture("Secret " + secretName + " not found");
338-
} else {
339-
secret.getData().entrySet().stream()
340-
.filter(e -> e.getKey().contains(".crt"))
341-
// In case secrets contain the same key, append the secret name into the key
342-
.forEach(e -> certs.add(e.getValue()));
343-
}
344-
return Future.succeededFuture();
345-
}))
346-
.collect(Collectors.toList()))
347-
.compose(ignore -> secretOperations.reconcile(
348-
reconciliation,
349-
namespace,
350-
oauthSecret,
351-
connect.generateTlsTrustedCertsSecret(Map.of(oauthSecret + ".crt", mergeAndEncodeCerts(certs)), oauthSecret))
352-
.mapEmpty());
353-
}
354-
355-
private String mergeAndEncodeCerts(List<String> certs) {
356-
if (certs.size() > 1) {
357-
String decodedAndMergedCerts = certs.stream()
358-
.map(Util::decodeFromBase64)
359-
.collect(Collectors.joining("\n"));
360-
361-
return Util.encodeToBase64(decodedAndMergedCerts);
362-
} else if (certs.size() < 1) {
363-
return "";
364-
} else {
365-
return certs.get(0);
366-
}
310+
return ReconcilerUtils.generateOauthTrustedCertsSecret(reconciliation, secretsToCopy, KafkaResources.internalOauthTrustedCertsSecretName(connect.getCluster()), secretOperations, connect::generateSecret);
367311
}
368312

369313
/**

cluster-operator/src/main/java/io/strimzi/operator/cluster/operator/assembly/KafkaConnectAssemblyOperator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,8 @@ protected Future<KafkaConnectStatus> createOrUpdate(Reconciliation reconciliatio
180180
})
181181
.compose(i -> serviceOperations.reconcile(reconciliation, namespace, connect.getServiceName(), connect.generateService()))
182182
.compose(i -> serviceOperations.reconcile(reconciliation, namespace, connect.getComponentName(), connect.generateHeadlessService()))
183-
.compose(i -> tlsTrustedCertsSecret(reconciliation, namespace, connect))
184-
.compose(i -> oauthTrustedCertsSecret(reconciliation, namespace, connect))
183+
.compose(i -> tlsTrustedCertsSecret(reconciliation, connect))
184+
.compose(i -> oauthTrustedCertsSecret(reconciliation, connect))
185185
.compose(i -> generateMetricsAndLoggingConfigMap(reconciliation, connect))
186186
.compose(logAndMetricsConfigMap -> {
187187
String logging = logAndMetricsConfigMap.getData().get(connect.logging().configMapKey());

cluster-operator/src/main/java/io/strimzi/operator/cluster/operator/assembly/KafkaMirrorMaker2AssemblyOperator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ protected Future<KafkaMirrorMaker2Status> createOrUpdate(Reconciliation reconcil
126126
.compose(i -> manualRollingUpdate(reconciliation, mirrorMaker2Cluster))
127127
.compose(i -> serviceOperations.reconcile(reconciliation, namespace, mirrorMaker2Cluster.getServiceName(), mirrorMaker2Cluster.generateService()))
128128
.compose(i -> serviceOperations.reconcile(reconciliation, namespace, mirrorMaker2Cluster.getComponentName(), mirrorMaker2Cluster.generateHeadlessService()))
129-
.compose(i -> tlsTrustedCertsSecret(reconciliation, namespace, mirrorMaker2Cluster))
130-
.compose(i -> oauthTrustedCertsSecret(reconciliation, namespace, mirrorMaker2Cluster))
129+
.compose(i -> tlsTrustedCertsSecret(reconciliation, mirrorMaker2Cluster))
130+
.compose(i -> oauthTrustedCertsSecret(reconciliation, mirrorMaker2Cluster))
131131
.compose(i -> generateMetricsAndLoggingConfigMap(reconciliation, mirrorMaker2Cluster))
132132
.compose(logAndMetricsConfigMap -> {
133133
String logging = logAndMetricsConfigMap.getData().get(mirrorMaker2Cluster.logging().configMapKey());

cluster-operator/src/main/java/io/strimzi/operator/cluster/operator/assembly/KafkaReconciler.java

Lines changed: 4 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -872,7 +872,6 @@ protected Future<Void> updateCertificateSecrets(List<Secret> secrets) {
872872
@Deprecated
873873
protected Future<Void> authzTrustedCertsSecret() {
874874
Set<String> secretsToCopy = new HashSet<>();
875-
List<Integer> certHashes = new ArrayList<>();
876875

877876
if (kafka.getAuthorization() instanceof KafkaAuthorizationOpa opaAuthz && opaAuthz.getTlsTrustedCertificates() != null) {
878877
secretsToCopy.addAll(opaAuthz.getTlsTrustedCertificates().stream().map(CertSecretSource::getSecretName).toList());
@@ -886,31 +885,9 @@ protected Future<Void> authzTrustedCertsSecret() {
886885
return Future.succeededFuture();
887886
}
888887

889-
ConcurrentHashMap<String, String> secretData = new ConcurrentHashMap<>();
890-
return Future.join(secretsToCopy.stream()
891-
.map(secretName -> secretOperator.getAsync(reconciliation.namespace(), secretName)
892-
.compose(secret -> {
893-
if (secret == null) {
894-
return Future.failedFuture("Secret " + secretName + " not found");
895-
} else {
896-
secret.getData().entrySet().stream()
897-
.filter(e -> e.getKey().contains(".crt"))
898-
// In case secrets contain the same key, append the secret name into the key
899-
.forEach(e -> {
900-
secretData.put(secretName + "-" + e.getKey(), e.getValue());
901-
certHashes.add(e.getValue().hashCode());
902-
});
903-
}
904-
return Future.succeededFuture();
905-
}))
906-
.collect(Collectors.toList()))
907-
.compose(ignore -> secretOperator.reconcile(
908-
reconciliation,
909-
reconciliation.namespace(),
910-
KafkaResources.internalAuthzTrustedCertsSecretName(kafka.getCluster()),
911-
kafka.generateSecret(secretData, KafkaResources.internalAuthzTrustedCertsSecretName(kafka.getCluster()))))
912-
.compose(ignore -> {
913-
authorizerServerCertificateHash = certHashes.stream().mapToInt(e -> e).sum();
888+
return ReconcilerUtils.generateTlsTrustedCertsSecret(reconciliation, secretsToCopy, KafkaResources.internalAuthzTrustedCertsSecretName(kafka.getCluster()), secretOperator, kafka::generateSecret)
889+
.compose(certHashes -> {
890+
authorizerServerCertificateHash = certHashes;
914891
return Future.succeededFuture();
915892
});
916893
}
@@ -936,43 +913,9 @@ protected Future<Void> oauthTrustedCertsSecret() {
936913
return Future.succeededFuture();
937914
}
938915

939-
List<String> certs = new ArrayList<>();
940-
String oauthSecret = KafkaResources.internalOauthTrustedCertsSecretName(kafka.getCluster());
941-
return Future.join(secretsToCopy.stream()
942-
.map(secretName -> secretOperator.getAsync(reconciliation.namespace(), secretName)
943-
.compose(secret -> {
944-
if (secret == null) {
945-
return Future.failedFuture("Secret " + secretName + " not found");
946-
} else {
947-
secret.getData().entrySet().stream()
948-
.filter(e -> e.getKey().contains(".crt"))
949-
// certificates appended under a same key so that we create a single volume mounted file
950-
.forEach(e -> certs.add(e.getValue()));
951-
}
952-
return Future.succeededFuture();
953-
}))
954-
.collect(Collectors.toList()))
955-
.compose(ignore -> secretOperator.reconcile(
956-
reconciliation,
957-
reconciliation.namespace(),
958-
oauthSecret,
959-
kafka.generateSecret(Map.of(oauthSecret + ".crt", mergeAndEncodeCerts(certs)), oauthSecret))
960-
.mapEmpty());
916+
return ReconcilerUtils.generateOauthTrustedCertsSecret(reconciliation, secretsToCopy, KafkaResources.internalOauthTrustedCertsSecretName(kafka.getCluster()), secretOperator, kafka::generateSecret);
961917
}
962918

963-
private String mergeAndEncodeCerts(List<String> certs) {
964-
if (certs.size() > 1) {
965-
String decodedAndMergedCerts = certs.stream()
966-
.map(Util::decodeFromBase64)
967-
.collect(Collectors.joining("\n"));
968-
969-
return Util.encodeToBase64(decodedAndMergedCerts);
970-
} else if (certs.size() < 1) {
971-
return "";
972-
} else {
973-
return certs.get(0);
974-
}
975-
}
976919
/**
977920
* Manages the secret with JMX credentials when JMX is enabled
978921
*

0 commit comments

Comments
 (0)