Skip to content

Commit cf87fbb

Browse files
committed
fix: minor version upgrade SGDbOps fails to perform minor version upgrade
1 parent 2b683e7 commit cf87fbb

3 files changed

Lines changed: 51 additions & 6 deletions

File tree

stackgres-k8s/e2e/spec/dbops-minor-version-upgrade

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ check_minor_version_upgrade() {
7979
assert_dbops_completion "$DBOPS_NAME" "$CLUSTER_NAMESPACE" "$((E2E_TIMEOUT * 2))"
8080

8181
if [ "$(kubectl get pod -n "$CLUSTER_NAMESPACE" \
82-
-l "app=StackGresCluster,stackgres.io/cluster-name=$CLUSTER_NAME,stackgres.io/cluster=true"
83-
--template '{{ range .spec.containers }}{{ printf "%s\n" .image }}{{ end }}' \
84-
| grep ".-pg${E2E_MINOR_TARGET_POSTGRES_VERSION}-" \
82+
-l "app=StackGresCluster,stackgres.io/cluster-name=$CLUSTER_NAME,stackgres.io/cluster=true" \
83+
--template '{{ range .items }}{{ range .spec.containers }}{{ printf "%s\n" .image }}{{ end }}{{ end }}' \
84+
| grep -F -- "-pg${E2E_MINOR_TARGET_POSTGRES_VERSION}-" \
8585
| wc -l)" = 2 ]
8686
then
8787
success "Postgres minor version was updated"

stackgres-k8s/src/operator/src/main/java/io/stackgres/operator/common/DbOpsUtil.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import io.stackgres.common.crd.Condition;
1616
import io.stackgres.common.crd.sgcluster.StackGresCluster;
17+
import io.stackgres.common.crd.sgdbops.DbOpsOperation;
1718
import io.stackgres.common.crd.sgdbops.DbOpsStatusCondition;
1819
import io.stackgres.common.crd.sgdbops.DbOpsStatusCondition.Status;
1920
import io.stackgres.common.crd.sgdbops.DbOpsStatusCondition.Type;
@@ -25,9 +26,9 @@
2526
public interface DbOpsUtil {
2627

2728
List<String> ROLLOUT_OPS = List.of(
28-
"restart",
29-
"securityUpgrade",
30-
"minorVersionUpgrade");
29+
DbOpsOperation.RESTART.toString(),
30+
DbOpsOperation.SECURITY_UPGRADE.toString(),
31+
DbOpsOperation.MINOR_VERSION_UPGRADE.toString());
3132

3233
Pattern UPPERCASE_LETTER_PATTERN = Pattern.compile("([A-Z])");
3334

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,27 @@
1414
import java.util.function.Predicate;
1515
import java.util.function.Supplier;
1616

17+
import io.fabric8.kubernetes.api.model.Container;
1718
import io.fabric8.kubernetes.api.model.Endpoints;
1819
import io.fabric8.kubernetes.api.model.HasMetadata;
1920
import io.fabric8.kubernetes.api.model.ObjectMeta;
2021
import io.fabric8.kubernetes.api.model.Pod;
22+
import io.fabric8.kubernetes.api.model.PodSpec;
2123
import io.fabric8.kubernetes.api.model.apps.StatefulSet;
2224
import io.fabric8.kubernetes.api.model.apps.StatefulSetStatus;
2325
import io.fabric8.kubernetes.api.model.batch.v1.Job;
2426
import io.fabric8.kubernetes.api.model.batch.v1.JobStatus;
2527
import io.stackgres.common.PatroniUtil;
2628
import io.stackgres.common.StackGresContext;
29+
import io.stackgres.common.StackGresProperty;
30+
import io.stackgres.common.StackGresUtil;
2731
import io.stackgres.common.crd.Condition;
2832
import io.stackgres.common.crd.sgcluster.ClusterDbOpsRestartStatus;
2933
import io.stackgres.common.crd.sgcluster.StackGresCluster;
3034
import io.stackgres.common.crd.sgcluster.StackGresClusterDbOpsStatus;
3135
import io.stackgres.common.crd.sgcluster.StackGresClusterStatus;
3236
import io.stackgres.common.crd.sgdbops.DbOpsMethodType;
37+
import io.stackgres.common.crd.sgdbops.DbOpsOperation;
3338
import io.stackgres.common.crd.sgdbops.DbOpsRestartStatus;
3439
import io.stackgres.common.crd.sgdbops.DbOpsStatusCondition;
3540
import io.stackgres.common.crd.sgdbops.StackGresDbOps;
@@ -163,10 +168,49 @@ private void updateRolloutBasedDbOps(StackGresDbOps source) {
163168
.filter(pod -> !ClusterRolloutUtil.getRestartReasons(
164169
cluster, statefulSet, pod, patroniMembers).requiresRestart())
165170
.toList();
171+
final boolean securityUpgradeWasApplied;
172+
if (Objects.equals(
173+
DbOpsOperation.SECURITY_UPGRADE.toString(),
174+
source.getSpec().getOp())) {
175+
securityUpgradeWasApplied = podsReadyAndUpdated
176+
.stream()
177+
.allMatch(pod -> Optional.of(pod)
178+
.map(Pod::getMetadata)
179+
.map(ObjectMeta::getAnnotations)
180+
.map(Map::entrySet)
181+
.stream()
182+
.flatMap(Set::stream)
183+
.anyMatch(Map.entry(
184+
StackGresContext.VERSION_KEY,
185+
StackGresProperty.OPERATOR_VERSION.getString())::equals));
186+
} else {
187+
securityUpgradeWasApplied = true;
188+
}
189+
final boolean minorVersionUpgradeWasApplied;
190+
if (Objects.equals(
191+
DbOpsOperation.MINOR_VERSION_UPGRADE.toString(),
192+
source.getSpec().getOp())) {
193+
final String targetPatroniImage = StackGresUtil.getPatroniImageName(
194+
cluster,
195+
source.getSpec().getMinorVersionUpgrade().getPostgresVersion());
196+
minorVersionUpgradeWasApplied = podsReadyAndUpdated
197+
.stream()
198+
.allMatch(pod -> Optional.of(pod)
199+
.map(Pod::getSpec)
200+
.map(PodSpec::getContainers)
201+
.stream()
202+
.flatMap(List::stream)
203+
.map(Container::getImage)
204+
.anyMatch(targetPatroniImage::equals));
205+
} else {
206+
minorVersionUpgradeWasApplied = true;
207+
}
166208
if (source.getStatus() == null) {
167209
source.setStatus(new StackGresDbOpsStatus());
168210
}
169211
if ((primaryIsReadyAndUpdated || primaryIsExternal)
212+
&& securityUpgradeWasApplied
213+
&& minorVersionUpgradeWasApplied
170214
&& pods.size() == podsReadyAndUpdated.size()) {
171215
updateCondition(getRolloutCompleted(), source);
172216
if (Optional.ofNullable(cluster.getMetadata().getAnnotations())

0 commit comments

Comments
 (0)