Skip to content

Commit 4b8e17f

Browse files
committed
fix: NullPointerException when SGCluster not found for a copied SGBackup
1 parent 05e5d11 commit 4b8e17f

7 files changed

Lines changed: 90 additions & 26 deletions

File tree

stackgres-k8s/src/operator/src/main/java/io/stackgres/operator/conciliation/factory/AbstractClusterAnnotationDecorator.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,31 +10,32 @@
1010

1111
import com.google.common.collect.ImmutableMap;
1212
import io.fabric8.kubernetes.api.model.HasMetadata;
13+
import io.fabric8.kubernetes.api.model.ObjectMeta;
1314
import io.stackgres.common.PatroniUtil;
1415
import io.stackgres.common.StackGresContext;
1516
import io.stackgres.common.StackGresProperty;
16-
import io.stackgres.common.crd.sgcluster.StackGresCluster;
17-
import io.stackgres.common.crd.sgcluster.StackGresClusterSpec;
1817
import io.stackgres.common.crd.sgcluster.StackGresClusterSpecAnnotations;
1918
import io.stackgres.common.crd.sgcluster.StackGresClusterSpecMetadata;
2019
import org.jetbrains.annotations.NotNull;
2120

2221
public abstract class AbstractClusterAnnotationDecorator<T>
2322
extends AbstractAnnotationDecorator<T> {
2423

25-
protected abstract StackGresCluster getCluster(T context);
24+
protected abstract Optional<StackGresClusterSpecMetadata> getSpecMetadata(T context);
25+
26+
protected abstract Optional<ObjectMeta> getMetadata(T context);
2627

2728
@Override
2829
protected @NotNull Map<String, String> getAllResourcesAnnotations(
2930
@NotNull T context) {
30-
var allResourcesAnnotations = Optional.ofNullable(getCluster(context).getSpec())
31-
.map(StackGresClusterSpec::getMetadata)
31+
var allResourcesAnnotations =
32+
getSpecMetadata(context)
3233
.map(StackGresClusterSpecMetadata::getAnnotations)
3334
.map(StackGresClusterSpecAnnotations::getAllResources)
3435
.orElse(Map.of());
3536

3637
final Map<String, String> clusterAnnotations =
37-
getCluster(context).getMetadata().getAnnotations();
38+
getMetadata(context).map(ObjectMeta::getAnnotations).orElse(Map.of());
3839

3940
return ImmutableMap.<String, String>builder()
4041
.putAll(allResourcesAnnotations)
@@ -48,8 +49,7 @@ public abstract class AbstractClusterAnnotationDecorator<T>
4849
protected @NotNull Map<String, String> getServiceAnnotations(
4950
@NotNull T context) {
5051
Map<String, String> servicesSpecificAnnotations =
51-
Optional.ofNullable(getCluster(context).getSpec())
52-
.map(StackGresClusterSpec::getMetadata)
52+
getSpecMetadata(context)
5353
.map(StackGresClusterSpecMetadata::getAnnotations)
5454
.map(StackGresClusterSpecAnnotations::getServices)
5555
.orElse(Map.of());
@@ -63,8 +63,7 @@ public abstract class AbstractClusterAnnotationDecorator<T>
6363
protected @NotNull Map<String, String> getPrimaryServiceAnnotations(
6464
@NotNull T context) {
6565
Map<String, String> primaryServiceAnnotations =
66-
Optional.ofNullable(getCluster(context).getSpec())
67-
.map(StackGresClusterSpec::getMetadata)
66+
getSpecMetadata(context)
6867
.map(StackGresClusterSpecMetadata::getAnnotations)
6968
.map(StackGresClusterSpecAnnotations::getPrimaryService)
7069
.orElse(Map.of());
@@ -78,8 +77,7 @@ public abstract class AbstractClusterAnnotationDecorator<T>
7877
protected @NotNull Map<String, String> getReplicasServiceAnnotations(
7978
@NotNull T context) {
8079
Map<String, String> replicaServiceAnnotations =
81-
Optional.ofNullable(getCluster(context).getSpec())
82-
.map(StackGresClusterSpec::getMetadata)
80+
getSpecMetadata(context)
8381
.map(StackGresClusterSpecMetadata::getAnnotations)
8482
.map(StackGresClusterSpecAnnotations::getReplicasService)
8583
.orElse(Map.of());
@@ -111,8 +109,7 @@ protected void decorateService(@NotNull T context,
111109
protected @NotNull Map<String, String> getPodAnnotations(
112110
@NotNull T context) {
113111
Map<String, String> podSpecificAnnotations =
114-
Optional.ofNullable(getCluster(context).getSpec())
115-
.map(StackGresClusterSpec::getMetadata)
112+
getSpecMetadata(context)
116113
.map(StackGresClusterSpecMetadata::getAnnotations)
117114
.map(StackGresClusterSpecAnnotations::getClusterPods)
118115
.orElse(Map.of());

stackgres-k8s/src/operator/src/main/java/io/stackgres/operator/conciliation/factory/backup/BackupAnnotationDecorator.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@
55

66
package io.stackgres.operator.conciliation.factory.backup;
77

8+
import java.util.Optional;
9+
10+
import io.fabric8.kubernetes.api.model.ObjectMeta;
11+
import io.stackgres.common.crd.sgbackup.StackGresBackup;
812
import io.stackgres.common.crd.sgcluster.StackGresCluster;
13+
import io.stackgres.common.crd.sgcluster.StackGresClusterSpec;
14+
import io.stackgres.common.crd.sgcluster.StackGresClusterSpecMetadata;
915
import io.stackgres.operator.conciliation.OperatorVersionBinder;
1016
import io.stackgres.operator.conciliation.backup.StackGresBackupContext;
1117
import io.stackgres.operator.conciliation.factory.AbstractClusterAnnotationDecorator;
@@ -17,8 +23,13 @@ public class BackupAnnotationDecorator
1723
extends AbstractClusterAnnotationDecorator<StackGresBackupContext> {
1824

1925
@Override
20-
protected StackGresCluster getCluster(StackGresBackupContext context) {
21-
return context.getCluster();
26+
protected Optional<StackGresClusterSpecMetadata> getSpecMetadata(StackGresBackupContext context) {
27+
return context.getFoundCluster().map(StackGresCluster::getSpec).map(StackGresClusterSpec::getMetadata);
28+
}
29+
30+
@Override
31+
protected Optional<ObjectMeta> getMetadata(StackGresBackupContext context) {
32+
return Optional.of(context.getSource()).map(StackGresBackup::getMetadata);
2233
}
2334

2435
}

stackgres-k8s/src/operator/src/main/java/io/stackgres/operator/conciliation/factory/cluster/ClusterAnnotationDecorator.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@
55

66
package io.stackgres.operator.conciliation.factory.cluster;
77

8+
import java.util.Optional;
9+
10+
import io.fabric8.kubernetes.api.model.ObjectMeta;
811
import io.stackgres.common.crd.sgcluster.StackGresCluster;
12+
import io.stackgres.common.crd.sgcluster.StackGresClusterSpec;
13+
import io.stackgres.common.crd.sgcluster.StackGresClusterSpecMetadata;
914
import io.stackgres.operator.conciliation.OperatorVersionBinder;
1015
import io.stackgres.operator.conciliation.cluster.StackGresClusterContext;
1116
import io.stackgres.operator.conciliation.factory.AbstractClusterAnnotationDecorator;
@@ -17,8 +22,13 @@ public class ClusterAnnotationDecorator
1722
extends AbstractClusterAnnotationDecorator<StackGresClusterContext> {
1823

1924
@Override
20-
protected StackGresCluster getCluster(StackGresClusterContext context) {
21-
return context.getCluster();
25+
protected Optional<StackGresClusterSpecMetadata> getSpecMetadata(StackGresClusterContext context) {
26+
return Optional.of(context.getSource()).map(StackGresCluster::getSpec).map(StackGresClusterSpec::getMetadata);
27+
}
28+
29+
@Override
30+
protected Optional<ObjectMeta> getMetadata(StackGresClusterContext context) {
31+
return Optional.of(context.getSource()).map(StackGresCluster::getMetadata);
2232
}
2333

2434
}

stackgres-k8s/src/operator/src/main/java/io/stackgres/operator/conciliation/factory/dbops/DbOpsAnnotationDecorator.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@
55

66
package io.stackgres.operator.conciliation.factory.dbops;
77

8+
import java.util.Optional;
9+
10+
import io.fabric8.kubernetes.api.model.ObjectMeta;
811
import io.stackgres.common.crd.sgcluster.StackGresCluster;
12+
import io.stackgres.common.crd.sgcluster.StackGresClusterSpec;
13+
import io.stackgres.common.crd.sgcluster.StackGresClusterSpecMetadata;
14+
import io.stackgres.common.crd.sgdbops.StackGresDbOps;
915
import io.stackgres.operator.conciliation.OperatorVersionBinder;
1016
import io.stackgres.operator.conciliation.dbops.StackGresDbOpsContext;
1117
import io.stackgres.operator.conciliation.factory.AbstractClusterAnnotationDecorator;
@@ -17,8 +23,13 @@ public class DbOpsAnnotationDecorator
1723
extends AbstractClusterAnnotationDecorator<StackGresDbOpsContext> {
1824

1925
@Override
20-
protected StackGresCluster getCluster(StackGresDbOpsContext context) {
21-
return context.getCluster();
26+
protected Optional<StackGresClusterSpecMetadata> getSpecMetadata(StackGresDbOpsContext context) {
27+
return context.getFoundCluster().map(StackGresCluster::getSpec).map(StackGresClusterSpec::getMetadata);
28+
}
29+
30+
@Override
31+
protected Optional<ObjectMeta> getMetadata(StackGresDbOpsContext context) {
32+
return Optional.of(context.getSource()).map(StackGresDbOps::getMetadata);
2233
}
2334

2435
}

stackgres-k8s/src/operator/src/main/java/io/stackgres/operator/conciliation/factory/distributedlogs/DistributedLogsAnnotationDecorator.java

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,56 @@
55

66
package io.stackgres.operator.conciliation.factory.distributedlogs;
77

8+
import java.util.Map;
9+
import java.util.Optional;
10+
import java.util.function.BiConsumer;
11+
12+
import io.fabric8.kubernetes.api.model.HasMetadata;
13+
import io.fabric8.kubernetes.api.model.ObjectMeta;
14+
import io.stackgres.common.StackGresContext;
815
import io.stackgres.common.crd.sgcluster.StackGresCluster;
16+
import io.stackgres.common.crd.sgcluster.StackGresClusterSpec;
17+
import io.stackgres.common.crd.sgcluster.StackGresClusterSpecMetadata;
18+
import io.stackgres.common.crd.sgdistributedlogs.StackGresDistributedLogs;
919
import io.stackgres.operator.conciliation.OperatorVersionBinder;
10-
import io.stackgres.operator.conciliation.cluster.StackGresClusterContext;
20+
import io.stackgres.operator.conciliation.distributedlogs.StackGresDistributedLogsContext;
1121
import io.stackgres.operator.conciliation.factory.AbstractClusterAnnotationDecorator;
1222
import jakarta.inject.Singleton;
23+
import org.jetbrains.annotations.NotNull;
24+
import org.jooq.lambda.Seq;
25+
import org.jooq.lambda.tuple.Tuple;
26+
import org.jooq.lambda.tuple.Tuple2;
1327

1428
@Singleton
1529
@OperatorVersionBinder
1630
public class DistributedLogsAnnotationDecorator
17-
extends AbstractClusterAnnotationDecorator<StackGresClusterContext> {
31+
extends AbstractClusterAnnotationDecorator<StackGresDistributedLogsContext> {
1832

1933
@Override
20-
protected StackGresCluster getCluster(StackGresClusterContext context) {
21-
return context.getCluster();
34+
protected Optional<StackGresClusterSpecMetadata> getSpecMetadata(StackGresDistributedLogsContext context) {
35+
return context.getCluster().map(StackGresCluster::getSpec).map(StackGresClusterSpec::getMetadata);
36+
}
37+
38+
@Override
39+
protected Optional<ObjectMeta> getMetadata(StackGresDistributedLogsContext context) {
40+
return Optional.of(context.getSource()).map(StackGresDistributedLogs::getMetadata);
41+
}
42+
43+
@Override
44+
protected @NotNull Map<Class<?>, BiConsumer<StackGresDistributedLogsContext, HasMetadata>> getCustomDecorators() {
45+
return Seq.seq(super.getCustomDecorators())
46+
.append(Tuple.tuple(StackGresCluster.class, this::decorateCluster))
47+
.toMap(Tuple2::v1, Tuple2::v2);
48+
}
49+
50+
private void decorateCluster(
51+
@NotNull StackGresDistributedLogsContext context,
52+
@NotNull HasMetadata cluster) {
53+
decorateResource(
54+
cluster,
55+
Seq.seq(getAllResourcesAnnotations(context))
56+
.filter(annotation -> !annotation.v1.equals(StackGresContext.VERSION_KEY))
57+
.toMap(Tuple2::v1, Tuple2::v2));
2258
}
2359

2460
}

stackgres-k8s/src/operator/src/test/java/io/stackgres/operator/conciliation/backup/context/BackupClusterContextAppenderTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import static org.junit.jupiter.api.Assertions.assertEquals;
99
import static org.junit.jupiter.api.Assertions.assertThrows;
10-
import static org.mockito.ArgumentMatchers.any;
1110
import static org.mockito.Mockito.verify;
1211
import static org.mockito.Mockito.when;
1312

stackgres-k8s/src/operator/src/test/java/io/stackgres/operator/conciliation/factory/cluster/ClusterAnnotationDecoratorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class ClusterAnnotationDecoratorTest {
5151
void setUp() {
5252
defaultCluster = Fixtures.cluster().loadDefault().get();
5353

54-
when(context.getCluster()).thenReturn(defaultCluster);
54+
when(context.getSource()).thenReturn(defaultCluster);
5555

5656
final ObjectMeta metadata = defaultCluster.getMetadata();
5757
metadata.getAnnotations().put(StackGresContext.VERSION_KEY,

0 commit comments

Comments
 (0)