Skip to content

Commit be896d7

Browse files
committed
pkg/cvo: Surface errors in update-risk detector creation
vendor/k8s.io/client-go/tools/cache/shared_informer.go has: func (s *sharedIndexInformer) AddEventHandlerWithOptions(handler ResourceEventHandler, options HandlerOptions) (ResourceEventHandlerRegistration, error) { s.startedLock.Lock() defer s.startedLock.Unlock() if s.stopped { return nil, fmt.Errorf("handler %v was not added to shared informer because it has stopped already", handler) } which might be the only reason AddEeventHandler could fail. But regardless, it is still good practice to bubble things up and fail fast, to summon a cluster administrator to help sort out whatever the issue is.
1 parent facddbc commit be896d7

9 files changed

Lines changed: 55 additions & 24 deletions

File tree

pkg/cvo/cvo.go

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -305,13 +305,31 @@ func New(
305305

306306
// make sure this is initialized after all the listers are initialized
307307
riskSourceCallback := func() { optr.availableUpdatesQueue.Add(optr.queueKey()) }
308-
optr.upgradeable = aggregate.New(
309-
updatingrisk.New("ClusterVersionUpdating", optr.name, cvInformer, riskSourceCallback),
310-
overrides.New("ClusterVersionOverrides", optr.name, cvInformer, riskSourceCallback),
311-
deletionrisk.New("ResourceDeletionInProgress", optr.currentVersion),
312-
adminack.New("AdminAck", optr.currentVersion, cmConfigManagedInformer, cmConfigInformer, riskSourceCallback),
313-
upgradeablerisk.New("ClusterOperatorUpgradeable", optr.currentVersion, coInformer, riskSourceCallback),
314-
)
308+
309+
risks := []riskSource{}
310+
if source, err := updatingrisk.New("ClusterVersionUpdating", optr.name, cvInformer, riskSourceCallback); err != nil {
311+
return optr, err
312+
} else {
313+
risks = append(risks, source)
314+
}
315+
if source, err := overrides.New("ClusterVersionOverrides", optr.name, cvInformer, riskSourceCallback); err != nil {
316+
return optr, err
317+
} else {
318+
risks = append(risks, source)
319+
}
320+
risks = append(risks, deletionrisk.New("ResourceDeletionInProgress", optr.currentVersion))
321+
if source, err := adminack.New("AdminAck", optr.currentVersion, cmConfigManagedInformer, cmConfigInformer, riskSourceCallback); err != nil {
322+
return optr, err
323+
} else {
324+
risks = append(risks, source)
325+
}
326+
if source, err := upgradeablerisk.New("ClusterOperatorUpgradeable", optr.currentVersion, coInformer, riskSourceCallback); err != nil {
327+
return optr, err
328+
} else {
329+
risks = append(risks, source)
330+
}
331+
332+
optr.upgradeable = aggregate.New(risks...)
315333

316334
optr.risks = aggregate.New(
317335
alert.New("Alert", promqlTarget),

pkg/risk/adminack/adminack.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package adminack
44

55
import (
66
"context"
7+
"errors"
78
"fmt"
89
"regexp"
910
"slices"
@@ -41,21 +42,21 @@ type adminAck struct {
4142
}
4243

4344
// New returns a new update-risk source, tracking administrator acknowledgements.
44-
func New(name string, currentVersion func() configv1.Release, adminGatesInformer, adminAcksInformer informerscorev1.ConfigMapInformer, changeCallback func()) risk.Source {
45+
func New(name string, currentVersion func() configv1.Release, adminGatesInformer, adminAcksInformer informerscorev1.ConfigMapInformer, changeCallback func()) (risk.Source, error) {
4546
adminGatesLister := adminGatesInformer.Lister().ConfigMaps(internal.ConfigManagedNamespace)
4647
adminAcksLister := adminAcksInformer.Lister().ConfigMaps(internal.ConfigNamespace)
4748
source := &adminAck{name: name, currentVersion: currentVersion, adminGatesLister: adminGatesLister, adminAcksLister: adminAcksLister}
48-
adminGatesInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
49+
_, err1 := adminGatesInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
4950
AddFunc: func(_ interface{}) { source.eventHandler(changeCallback) },
5051
UpdateFunc: func(_, _ interface{}) { source.eventHandler(changeCallback) },
5152
DeleteFunc: func(_ interface{}) { source.eventHandler(changeCallback) },
5253
})
53-
adminAcksInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
54+
_, err2 := adminAcksInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
5455
AddFunc: func(_ interface{}) { source.eventHandler(changeCallback) },
5556
UpdateFunc: func(_, _ interface{}) { source.eventHandler(changeCallback) },
5657
DeleteFunc: func(_ interface{}) { source.eventHandler(changeCallback) },
5758
})
58-
return source
59+
return source, errors.Join(err1, err2)
5960
}
6061

6162
// Name returns the source's name.

pkg/risk/adminack/adminack_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,10 @@ func TestOperator_upgradeableSync(t *testing.T) {
285285
for _, tt := range tests {
286286
{
287287
t.Run(tt.name, func(t *testing.T) {
288-
source := New("AdminAck", func() configv1.Release { return configv1.Release{Version: "4.21.0"} }, cmInformer, cmInformer, nil)
288+
source, err := New("AdminAck", func() configv1.Release { return configv1.Release{Version: "4.21.0"} }, cmInformer, cmInformer, nil)
289+
if err != nil {
290+
t.Fatal(err)
291+
}
289292
if tt.gateCm != nil {
290293
if tt.gateCm.Name == "delete" {
291294
err := f.CoreV1().ConfigMaps(internal.ConfigManagedNamespace).Delete(ctx, internal.AdminGatesConfigMap, metav1.DeleteOptions{})

pkg/risk/overrides/overrides.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ type overrides struct {
2929
}
3030

3131
// New returns a new update-risk source, tracking the use of ClusterVersion overrides.
32-
func New(name string, cvName string, cvInformer configinformersv1.ClusterVersionInformer, changeCallback func()) risk.Source {
32+
func New(name string, cvName string, cvInformer configinformersv1.ClusterVersionInformer, changeCallback func()) (risk.Source, error) {
3333
cvLister := cvInformer.Lister()
3434
source := &overrides{name: name, cvName: cvName, cvLister: cvLister}
35-
cvInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
35+
_, err := cvInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
3636
AddFunc: func(_ interface{}) { source.eventHandler(changeCallback) },
3737
UpdateFunc: func(_, _ interface{}) { source.eventHandler(changeCallback) },
3838
})
39-
return source
39+
return source, err
4040
}
4141

4242
// Name returns the source's name.

pkg/risk/overrides/overrides_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ func Test_New(t *testing.T) {
4242
versions := []string{"4.21.1", "4.22.0", "5.0.0"}
4343

4444
expectedName := "ClusterVersionOverrides"
45-
source := overrides.New(expectedName, cv.ObjectMeta.Name, cvInformer, changeCallback)
45+
source, err := overrides.New(expectedName, cv.ObjectMeta.Name, cvInformer, changeCallback)
46+
if err != nil {
47+
t.Fatal(err)
48+
}
4649

4750
t.Run("name", func(t *testing.T) {
4851
if name := source.Name(); name != expectedName {

pkg/risk/updating/updating.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ type updating struct {
3030
}
3131

3232
// New returns a new updating-risk source, tracking whether an update is in progress.
33-
func New(name string, cvName string, cvInformer configinformersv1.ClusterVersionInformer, changeCallback func()) risk.Source {
33+
func New(name string, cvName string, cvInformer configinformersv1.ClusterVersionInformer, changeCallback func()) (risk.Source, error) {
3434
cvLister := cvInformer.Lister()
3535
source := &updating{name: name, cvName: cvName, cvLister: cvLister}
36-
cvInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
36+
_, err := cvInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
3737
AddFunc: func(_ interface{}) { source.eventHandler(changeCallback) },
3838
UpdateFunc: func(_, _ interface{}) { source.eventHandler(changeCallback) },
3939
})
40-
return source
40+
return source, err
4141
}
4242

4343
// Name returns the source's name.

pkg/risk/updating/updating_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ func Test_New(t *testing.T) {
4343
versions := []string{"4.21.1", "4.22.0", "5.0.0"}
4444

4545
expectedName := "ClusterVersionUpdating"
46-
source := updating.New(expectedName, cv.ObjectMeta.Name, cvInformer, changeCallback)
46+
source, err := updating.New(expectedName, cv.ObjectMeta.Name, cvInformer, changeCallback)
47+
if err != nil {
48+
t.Fatal(err)
49+
}
4750

4851
t.Run("name", func(t *testing.T) {
4952
if name := source.Name(); name != expectedName {

pkg/risk/upgradeable/upgradeable.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ type upgradeable struct {
3030
}
3131

3232
// New returns a new update-risk source, tracking ClusterOperator Upgradeable conditions.
33-
func New(name string, currentVersion func() configv1.Release, coInformer configinformersv1.ClusterOperatorInformer, changeCallback func()) risk.Source {
33+
func New(name string, currentVersion func() configv1.Release, coInformer configinformersv1.ClusterOperatorInformer, changeCallback func()) (risk.Source, error) {
3434
coLister := coInformer.Lister()
3535
source := &upgradeable{name: name, currentVersion: currentVersion, coLister: coLister}
36-
coInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
36+
_, err := coInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
3737
AddFunc: func(_ interface{}) { source.eventHandler(changeCallback) },
3838
UpdateFunc: func(_, _ interface{}) { source.eventHandler(changeCallback) },
3939
})
40-
return source
40+
return source, err
4141
}
4242

4343
// Name returns the source's name.

pkg/risk/upgradeable/upgradeable_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ func Test_New(t *testing.T) {
5151
versions := []string{"4.21.1", "4.22.0", "5.0.0"}
5252

5353
expectedName := "ClusterOperatorUpgradeable"
54-
source := upgradeable.New(expectedName, currentVersion, coInformer, changeCallback)
54+
source, err := upgradeable.New(expectedName, currentVersion, coInformer, changeCallback)
55+
if err != nil {
56+
t.Fatal(err)
57+
}
5558

5659
t.Run("name", func(t *testing.T) {
5760
if name := source.Name(); name != expectedName {

0 commit comments

Comments
 (0)