Skip to content

Commit b9801e6

Browse files
committed
make it impossible double set conditions in a single loop
1 parent d390563 commit b9801e6

File tree

1 file changed

+26
-8
lines changed

1 file changed

+26
-8
lines changed

pkg/console/status/status.go

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -144,22 +144,39 @@ func setConditionValue(conditionType string, err error) operatorsv1.ConditionSta
144144
}
145145

146146
type StatusHandler struct {
147-
client v1helpers.OperatorClient
147+
client v1helpers.OperatorClient
148+
// conditionUpdates are keyed by condition type so that we always choose the latest as authoritative
149+
conditionUpdates map[string]v1helpers.UpdateStatusFunc
150+
148151
statusFuncs []v1helpers.UpdateStatusFunc
149152
}
150153

151-
func (c *StatusHandler) AddCondition(newStatusFunc v1helpers.UpdateStatusFunc) {
152-
c.statusFuncs = append(c.statusFuncs, newStatusFunc)
154+
type ConditionUpdate struct {
155+
ConditionType string
156+
StatusUpdateFn v1helpers.UpdateStatusFunc
157+
}
158+
159+
func (c *StatusHandler) AddCondition(conditionUpdate ConditionUpdate) {
160+
c.conditionUpdates[conditionUpdate.ConditionType] = conditionUpdate.StatusUpdateFn
153161
}
154162

155-
func (c *StatusHandler) AddConditions(newStatusFuncs []v1helpers.UpdateStatusFunc) {
156-
for _, newStatusFunc := range newStatusFuncs {
157-
c.statusFuncs = append(c.statusFuncs, newStatusFunc)
163+
func (c *StatusHandler) AddConditions(conditionUpdates []ConditionUpdate) {
164+
for i := range conditionUpdates {
165+
conditionUpdate := conditionUpdates[i]
166+
c.conditionUpdates[conditionUpdate.ConditionType] = conditionUpdate.StatusUpdateFn
158167
}
159168
}
160169

161170
func (c *StatusHandler) FlushAndReturn(returnErr error) error {
162-
if _, _, updateErr := v1helpers.UpdateStatus(context.TODO(), c.client, c.statusFuncs...); updateErr != nil {
171+
allStatusFns := []v1helpers.UpdateStatusFunc{}
172+
for i := range c.statusFuncs {
173+
allStatusFns = append(allStatusFns, c.statusFuncs[i])
174+
}
175+
for k := range c.conditionUpdates {
176+
allStatusFns = append(allStatusFns, c.conditionUpdates[k])
177+
}
178+
179+
if _, _, updateErr := v1helpers.UpdateStatus(context.TODO(), c.client, allStatusFns...); updateErr != nil {
163180
return updateErr
164181
}
165182
return returnErr
@@ -191,7 +208,8 @@ func (c *StatusHandler) UpdateDeploymentGeneration(actualDeployment *appsv1.Depl
191208

192209
func NewStatusHandler(client v1helpers.OperatorClient) StatusHandler {
193210
return StatusHandler{
194-
client: client,
211+
client: client,
212+
conditionUpdates: map[string]v1helpers.UpdateStatusFunc{},
195213
}
196214
}
197215

0 commit comments

Comments
 (0)