Skip to content

Commit 52897bb

Browse files
committed
feat: remove reference validation
1 parent 191f37c commit 52897bb

62 files changed

Lines changed: 119 additions & 5338 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

stackgres-k8s/src/common/src/main/java/io/stackgres/common/crd/sgcluster/StackGresClusterRestoreFromBackup.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import io.sundr.builder.annotations.Buildable;
1818
import jakarta.validation.Valid;
1919
import jakarta.validation.constraints.AssertTrue;
20+
import jakarta.validation.constraints.NotNull;
2021

2122
@RegisterForReflection
2223
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
@@ -28,6 +29,7 @@ public class StackGresClusterRestoreFromBackup {
2829

2930
private String uid;
3031

32+
@NotNull(message = "name cannot be null")
3133
private String name;
3234

3335
private String target;
@@ -45,8 +47,8 @@ public class StackGresClusterRestoreFromBackup {
4547
@Valid
4648
private StackGresClusterRestorePitr pointInTimeRecovery;
4749

48-
@ReferencedField("name")
49-
interface Name extends FieldReference { }
50+
@ReferencedField("uid")
51+
interface Uid extends FieldReference { }
5052

5153
@ReferencedField("targetName")
5254
interface TargetName extends FieldReference { }
@@ -61,11 +63,10 @@ interface TargetLsn extends FieldReference { }
6163
interface PointInTimeRecovery extends FieldReference { }
6264

6365
@JsonIgnore
64-
@AssertTrue(message = "name cannot be null",
65-
payload = { Name.class })
66-
public boolean isNameNotNullOrUidNotNull() {
67-
return (name != null && uid == null) // NOPMD
68-
|| (name == null && uid != null); // NOPMD
66+
@AssertTrue(message = "uid is deprecated, use name instead!",
67+
payload = { Uid.class })
68+
public boolean isUidNull() {
69+
return uid == null;
6970
}
7071

7172
@JsonIgnore

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

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,18 @@ public List<HasMetadata> getRequiredResources(StackGresCluster cluster) {
178178
.orElseThrow(() -> new IllegalArgumentException(
179179
"SGCluster " + clusterNamespace + "." + clusterName
180180
+ " have a non existent SGPostgresConfig postgresconf"));
181+
String givenPgVersion = Optional.of(cluster.getSpec())
182+
.map(StackGresClusterSpec::getPostgres)
183+
.map(StackGresClusterPostgres::getVersion)
184+
.orElse(null);
185+
String givenMajorVersion = getPostgresFlavorComponent(cluster).get(cluster)
186+
.getMajorVersion(givenPgVersion);
187+
String pgVersion = pgConfig.getSpec().getPostgresVersion();
188+
189+
if (!pgVersion.equals(givenMajorVersion)) {
190+
throw new IllegalArgumentException("Invalid postgres version, must be "
191+
+ pgVersion + " to use SGPostgresConfig " + clusterConfiguration.getSgPostgresConfig());
192+
}
181193

182194
final StackGresProfile profile = profileFinder
183195
.findByNameAndNamespace(spec.getSgInstanceProfile(), clusterNamespace)
@@ -893,14 +905,47 @@ private Set<String> getClusterBackupNamespaces(final String clusterNamespace) {
893905
.keySet();
894906
}
895907

896-
private Optional<StackGresBackup> findRestoreBackup(StackGresCluster config,
908+
private Optional<StackGresBackup> findRestoreBackup(
909+
StackGresCluster cluster,
897910
final String clusterNamespace) {
898-
return Optional
899-
.ofNullable(config.getSpec().getInitialData())
911+
Optional<StackGresBackup> restoreBackup = Optional
912+
.ofNullable(cluster.getSpec().getInitialData())
900913
.map(StackGresClusterInitialData::getRestore)
901914
.map(StackGresClusterRestore::getFromBackup)
902915
.map(StackGresClusterRestoreFromBackup::getName)
903916
.flatMap(backupName -> backupFinder.findByNameAndNamespace(backupName, clusterNamespace));
917+
if (restoreBackup.isPresent()) {
918+
if (restoreBackup
919+
.map(StackGresBackup::getStatus)
920+
.map(StackGresBackupStatus::getProcess)
921+
.map(StackGresBackupProcess::getStatus)
922+
.map(BackupStatus.COMPLETED.status()::equals)
923+
.map(completed -> !completed)
924+
.orElse(true)) {
925+
throw new IllegalArgumentException("Cannot restore from SGBackup "
926+
+ restoreBackup.get().getMetadata().getName()
927+
+ " because it's not Completed");
928+
}
929+
930+
String backupMajorVersion = restoreBackup.get()
931+
.getStatus()
932+
.getBackupInformation()
933+
.getPostgresMajorVersion();
934+
935+
String givenPgVersion = cluster.getSpec()
936+
.getPostgres().getVersion();
937+
String givenMajorVersion = getPostgresFlavorComponent(cluster)
938+
.get(cluster)
939+
.getMajorVersion(givenPgVersion);
940+
941+
if (!backupMajorVersion.equals(givenMajorVersion)) {
942+
throw new IllegalArgumentException("Cannot restore from SGBackup "
943+
+ restoreBackup.get().getMetadata().getName()
944+
+ " because it has been created from a postgres instance"
945+
+ " with version " + backupMajorVersion);
946+
}
947+
}
948+
return restoreBackup;
904949
}
905950

906951
}

stackgres-k8s/src/operator/src/main/java/io/stackgres/operator/conciliation/shardedcluster/ShardedClusterRequiredResourcesGenerator.java

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import static io.stackgres.common.StackGresShardedClusterUtil.CERTIFICATE_KEY;
99
import static io.stackgres.common.StackGresShardedClusterUtil.PRIVATE_KEY_KEY;
1010
import static io.stackgres.common.StackGresShardedClusterUtil.postgresSslSecretName;
11+
import static io.stackgres.common.StackGresUtil.getPostgresFlavorComponent;
1112

1213
import java.util.List;
1314
import java.util.Optional;
@@ -36,7 +37,9 @@
3637
import io.stackgres.common.crd.sgcluster.StackGresClusterUsersCredentials;
3738
import io.stackgres.common.crd.sgconfig.StackGresConfig;
3839
import io.stackgres.common.crd.sgpgconfig.StackGresPostgresConfig;
40+
import io.stackgres.common.crd.sgshardedbackup.ShardedBackupStatus;
3941
import io.stackgres.common.crd.sgshardedbackup.StackGresShardedBackup;
42+
import io.stackgres.common.crd.sgshardedbackup.StackGresShardedBackupProcess;
4043
import io.stackgres.common.crd.sgshardedbackup.StackGresShardedBackupSpec;
4144
import io.stackgres.common.crd.sgshardedbackup.StackGresShardedBackupStatus;
4245
import io.stackgres.common.crd.sgshardedcluster.StackGresShardedCluster;
@@ -146,14 +149,53 @@ public List<HasMetadata> getRequiredResources(StackGresShardedCluster cluster) {
146149
.isPresent()) {
147150
String backupName = cluster.getSpec().getInitialData().getRestore()
148151
.getFromBackup().getName();
149-
var sgBackups = backupFinder.findByNameAndNamespace(
150-
backupName,
151-
clusterNamespace)
152+
StackGresShardedBackup restoreBackup = backupFinder
153+
.findByNameAndNamespace(backupName, clusterNamespace)
154+
.orElseThrow(() -> new IllegalArgumentException(
155+
"SGShardedBackup " + backupName + " not found"));
156+
157+
if (Optional.of(restoreBackup)
158+
.map(StackGresShardedBackup::getStatus)
159+
.map(StackGresShardedBackupStatus::getProcess)
160+
.map(StackGresShardedBackupProcess::getStatus)
161+
.map(ShardedBackupStatus.COMPLETED.status()::equals)
162+
.map(completed -> !completed)
163+
.orElse(true)) {
164+
throw new IllegalArgumentException("Cannot restore from SGShardedBackup "
165+
+ backupName + " because it's not Completed");
166+
}
167+
168+
int clusters = 1 + cluster.getSpec().getShards().getClusters();
169+
var sgBackups = Optional.of(restoreBackup)
152170
.map(StackGresShardedBackup::getStatus)
153171
.map(StackGresShardedBackupStatus::getSgBackups)
154-
.orElseThrow(() -> new IllegalArgumentException(
155-
"SGShardedBackup " + backupName + " not found"
156-
+ " or SGBackup reference not found in it"));
172+
.orElse(null);
173+
if (!Optional.ofNullable(sgBackups)
174+
.map(list -> list.size() == clusters)
175+
.orElse(false)) {
176+
throw new IllegalArgumentException(
177+
"In SGShardedBackup " + backupName
178+
+ " sgBackups must be an array of size " + clusters
179+
+ " (the coordinator plus the number of shards)"
180+
+ " but was " + Optional.ofNullable(sgBackups)
181+
.map(List::size)
182+
.orElse(null));
183+
}
184+
185+
String backupMajorVersion = restoreBackup.getStatus()
186+
.getBackupInformation().getPostgresVersion().split("\\.")[0];
187+
String givenPgVersion = cluster.getSpec()
188+
.getPostgres().getVersion();
189+
String givenMajorVersion = getPostgresFlavorComponent(cluster)
190+
.get(cluster)
191+
.getMajorVersion(givenPgVersion);
192+
193+
if (!backupMajorVersion.equals(givenMajorVersion)) {
194+
throw new IllegalArgumentException(
195+
"Cannot restore from SGShardedBackup " + backupName
196+
+ " because it has been created from a postgres instance"
197+
+ " with version " + backupMajorVersion);
198+
}
157199
if (cluster.getStatus() == null) {
158200
cluster.setStatus(new StackGresShardedClusterStatus());
159201
}

stackgres-k8s/src/operator/src/main/java/io/stackgres/operator/validation/AbstractDefaultConfigKeeper.java

Lines changed: 0 additions & 55 deletions
This file was deleted.

stackgres-k8s/src/operator/src/main/java/io/stackgres/operator/validation/AbstractDefaultCustomResourceHolder.java

Lines changed: 0 additions & 46 deletions
This file was deleted.

stackgres-k8s/src/operator/src/main/java/io/stackgres/operator/validation/AbstractReferenceValidator.java

Lines changed: 0 additions & 103 deletions
This file was deleted.

0 commit comments

Comments
 (0)