Skip to content

Commit e0db0ab

Browse files
committed
Sort template names before reconciliation to ensure consistent condition messages
When reconciling infrastructure services (RabbitMQ, Galera, Memcached, Redis), the code iterates over template maps and aggregates failure messages. Since Go map iteration order is random, the same set of failures could produce different concatenated error messages across reconciliations, causing unwanted CR status updates. This change sorts template names alphabetically before iteration, ensuring that error messages are always constructed in the same order. For example, instead of alternating between "instance2(error),instance1(error)" and "instance1(error),instance2(error)", the message will consistently be "instance1(error),instance2(error)". This improves condition message stability without changing the underlying error reporting behavior. Jira: OSPRH-18311 AssistedBy: cloude-4-sonnet Signed-off-by: Martin Schuppert <[email protected]>
1 parent 1a33605 commit e0db0ab

File tree

4 files changed

+41
-4
lines changed

4 files changed

+41
-4
lines changed

pkg/openstack/galera.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"fmt"
77
"reflect"
8+
"sort"
89
"strings"
910

1011
certmgrv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
@@ -102,7 +103,15 @@ func ReconcileGaleras(
102103
// List of conditions to consider later for mirroring
103104
conditions := condition.Conditions{}
104105

105-
for name, spec := range *instance.Spec.Galera.Templates {
106+
// Sort template names to ensure consistent ordering
107+
templateNames := make([]string, 0, len(*instance.Spec.Galera.Templates))
108+
for name := range *instance.Spec.Galera.Templates {
109+
templateNames = append(templateNames, name)
110+
}
111+
sort.Strings(templateNames)
112+
113+
for _, name := range templateNames {
114+
spec := (*instance.Spec.Galera.Templates)[name]
106115
hostname := fmt.Sprintf("%s.%s.svc", name, instance.Namespace)
107116
hostnameHeadless := fmt.Sprintf("%s-galera.%s.svc", name, instance.Namespace)
108117

pkg/openstack/memcached.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"reflect"
7+
"sort"
78
"strings"
89

910
certmgrv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
@@ -97,7 +98,16 @@ func ReconcileMemcacheds(
9798
var ctrlResult ctrl.Result
9899
var err error
99100
var status memcachedStatus
100-
for name, spec := range *instance.Spec.Memcached.Templates {
101+
102+
// Sort template names to ensure consistent ordering
103+
templateNames := make([]string, 0, len(*instance.Spec.Memcached.Templates))
104+
for name := range *instance.Spec.Memcached.Templates {
105+
templateNames = append(templateNames, name)
106+
}
107+
sort.Strings(templateNames)
108+
109+
for _, name := range templateNames {
110+
spec := (*instance.Spec.Memcached.Templates)[name]
101111
var memcached *memcachedv1.Memcached
102112

103113
status, memcached, ctrlResult, err = reconcileMemcached(ctx, instance, version, helper, name, &spec)

pkg/openstack/rabbitmq.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"sort"
78
"strings"
89

910
certmgrv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
@@ -104,7 +105,15 @@ func ReconcileRabbitMQs(
104105
instance.Spec.Rabbitmq.Templates = ptr.To(map[string]rabbitmqv1.RabbitMqSpecCore{})
105106
}
106107

107-
for name, spec := range *instance.Spec.Rabbitmq.Templates {
108+
// Sort template names to ensure consistent ordering
109+
templateNames := make([]string, 0, len(*instance.Spec.Rabbitmq.Templates))
110+
for name := range *instance.Spec.Rabbitmq.Templates {
111+
templateNames = append(templateNames, name)
112+
}
113+
sort.Strings(templateNames)
114+
115+
for _, name := range templateNames {
116+
spec := (*instance.Spec.Rabbitmq.Templates)[name]
108117
status, ctrlResult, err = reconcileRabbitMQ(ctx, instance, version, helper, name, spec)
109118

110119
switch status {

pkg/openstack/redis.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"reflect"
7+
"sort"
78
"strings"
89

910
certmgrv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
@@ -114,7 +115,15 @@ func ReconcileRedis(
114115
var err error
115116
var status redisStatus
116117

117-
for name, spec := range *instance.Spec.Redis.Templates {
118+
// Sort template names to ensure consistent ordering
119+
templateNames := make([]string, 0, len(*instance.Spec.Redis.Templates))
120+
for name := range *instance.Spec.Redis.Templates {
121+
templateNames = append(templateNames, name)
122+
}
123+
sort.Strings(templateNames)
124+
125+
for _, name := range templateNames {
126+
spec := (*instance.Spec.Redis.Templates)[name]
118127
var redis *redisv1.Redis
119128

120129
status, redis, ctrlResult, err = reconcileRedis(ctx, instance, version, helper, name, &spec)

0 commit comments

Comments
 (0)