Skip to content

Commit 10c8d45

Browse files
committed
Merge branch 'select-latest-extension-by-default' into 'main'
feat: possibly choose the latest version of the extension See merge request ongresinc/stackgres!1661
2 parents 354d5ec + 9cf874a commit 10c8d45

4 files changed

Lines changed: 39 additions & 8 deletions

File tree

stackgres-k8s/src/common/src/main/java/io/stackgres/common/StackGresUtil.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.regex.Matcher;
3030
import java.util.regex.Pattern;
3131
import java.util.stream.Collectors;
32+
import java.util.stream.IntStream;
3233
import java.util.stream.Stream;
3334

3435
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -699,4 +700,18 @@ static String getImageNameWithTag(
699700
: containerRegistry + "/" + imageName + ":" + imageTag;
700701
}
701702

703+
static String sortableVersion(String version) {
704+
final String[] versionParts = version.split("\\.", -1);
705+
return IntStream.range(0, 5)
706+
.mapToObj(i -> zeroPad(i < versionParts.length ? versionParts[i] : "", 10))
707+
.collect(Collectors.joining());
708+
}
709+
710+
static String zeroPad(String string, int totalLength) {
711+
string = string.substring(0, Math.min(string.length(), 10));
712+
return IntStream.range(0, totalLength - string.length())
713+
.mapToObj(i -> "0")
714+
.collect(Collectors.joining()) + string;
715+
}
716+
702717
}

stackgres-k8s/src/common/src/main/java/io/stackgres/common/extension/ExtensionMetadataManager.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
import java.util.List;
1818
import java.util.Map;
1919
import java.util.Optional;
20+
import java.util.function.Function;
2021

2122
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
2223
import io.stackgres.common.CdiUtil;
24+
import io.stackgres.common.StackGresUtil;
2325
import io.stackgres.common.WebClientFactory;
2426
import io.stackgres.common.WebClientFactory.WebClient;
2527
import io.stackgres.common.crd.sgcluster.StackGresCluster;
@@ -90,7 +92,7 @@ public List<StackGresExtensionMetadata> getExtensionsSameMajorBuild(
9092
.ofNullable(getExtensionsMetadata().indexSameMajorBuilds
9193
.get(StackGresExtensionIndexSameMajorBuild
9294
.fromClusterExtension(cluster, extension, detectOs)))
93-
.map(this::extractLatestVersions)
95+
.map(this::extractLatestBuildVersions)
9496
.orElse(List.of());
9597
}
9698

@@ -106,11 +108,19 @@ public List<StackGresExtensionMetadata> getExtensionsAnyVersion(
106108
.ofNullable(getExtensionsMetadata().indexAnyVersions
107109
.get(StackGresExtensionIndexAnyVersion
108110
.fromClusterExtension(cluster, extension, detectOs)))
109-
.map(this::extractLatestVersions)
110-
.orElse(List.of());
111+
.map(this::extractLatestBuildVersions)
112+
.stream()
113+
.flatMap(List::stream)
114+
.sorted(Comparator.comparing(
115+
Function.<StackGresExtensionMetadata>identity()
116+
.andThen(StackGresExtensionMetadata::getVersion)
117+
.andThen(StackGresExtensionVersion::getVersion)
118+
.andThen(StackGresUtil::sortableVersion))
119+
.reversed())
120+
.toList();
111121
}
112122

113-
private List<StackGresExtensionMetadata> extractLatestVersions(
123+
private List<StackGresExtensionMetadata> extractLatestBuildVersions(
114124
List<StackGresExtensionMetadata> list) {
115125
return Seq.seq(list)
116126
.map(e -> Tuple.tuple(e.getVersion().getVersion(), e.getMajorBuild(), e))

stackgres-k8s/src/operator/src/main/java/io/stackgres/operator/mutation/AbstractExtensionsMutator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ private Optional<StackGresClusterInstalledExtension> findToInstallExtension(
204204
.or(() -> Optional.of(getExtensionMetadataManager()
205205
.getExtensionsAnyVersion(cluster, extension, false))
206206
.stream()
207-
.filter(list -> list.size() == 1)
207+
.filter(list -> list.size() >= 1)
208208
.flatMap(List::stream)
209209
.filter(foundExtension -> foundExtension
210210
.getTarget().getPostgresVersion().contains("."))
@@ -218,7 +218,7 @@ private Optional<StackGresClusterInstalledExtension> findToInstallExtension(
218218
.groupBy(Function.<StackGresExtensionMetadata>identity()
219219
.andThen(StackGresExtensionMetadata::getVersion)
220220
.andThen(StackGresExtensionVersion::getVersion))
221-
.size() == 1)
221+
.size() >= 1)
222222
.map(List::stream)
223223
.flatMap(Stream::findFirst))
224224
.map(extensionMetadata -> ExtensionUtil.getInstalledExtension(

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import static io.stackgres.common.StackGresUtil.getPostgresFlavorComponent;
99

10+
import java.util.Comparator;
1011
import java.util.List;
1112
import java.util.Map;
1213
import java.util.Objects;
@@ -17,6 +18,7 @@
1718
import io.fabric8.kubernetes.api.model.HasMetadata;
1819
import io.stackgres.common.ErrorType;
1920
import io.stackgres.common.ExtensionTuple;
21+
import io.stackgres.common.StackGresUtil;
2022
import io.stackgres.common.crd.sgcluster.StackGresCluster;
2123
import io.stackgres.common.crd.sgcluster.StackGresClusterExtension;
2224
import io.stackgres.common.crd.sgcluster.StackGresClusterExtensionBuilder;
@@ -164,8 +166,12 @@ private String getMissingExtensionsMessage(
164166
Map<String, List<String>> candidateExtensionVersions) {
165167
return Seq.seq(missingExtensions)
166168
.map(missingExtension -> {
167-
final Set<String> availableVersions =
168-
Set.copyOf(candidateExtensionVersions.get(missingExtension.extensionName()));
169+
final List<String> availableVersions =
170+
Set.copyOf(candidateExtensionVersions.get(missingExtension.extensionName()))
171+
.stream()
172+
.sorted(Comparator.comparing(StackGresUtil::sortableVersion)
173+
.reversed())
174+
.toList();
169175
if (!availableVersions.isEmpty()) {
170176
return missingExtension.extensionName()
171177
+ missingExtension.extensionVersion().map(v -> " " + v).orElse("")

0 commit comments

Comments
 (0)