Skip to content

Commit 41469c0

Browse files
committed
Gracefully handle service unavailable errors from kube-apiserver
Signed-off-by: Joe Lanford <[email protected]>
1 parent fd0ce87 commit 41469c0

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

pkg/controller/operators/olm/apiservices.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,8 @@ func (a *Operator) areAPIServicesAvailable(csv *v1alpha1.ClusterServiceVersion)
239239
return false, nil
240240
}
241241

242-
if err := a.isGVKRegistered(desc.Group, desc.Version, desc.Kind); err != nil {
243-
return false, nil
242+
if ok, err := a.isGVKRegistered(desc.Group, desc.Version, desc.Kind); !ok || err != nil {
243+
return false, err
244244
}
245245
}
246246

pkg/controller/operators/olm/operator.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1782,6 +1782,11 @@ func (a *Operator) updateInstallStatus(csv *v1alpha1.ClusterServiceVersion, inst
17821782
return nil
17831783
}
17841784

1785+
if err := findFirstError(k8serrors.IsServiceUnavailable, strategyErr, apiServiceErr, webhookErr); err != nil {
1786+
csv.SetPhaseWithEventIfChanged(v1alpha1.CSVPhasePending, v1alpha1.CSVReasonDetectedClusterChange, err.Error(), now, a.recorder)
1787+
return err
1788+
}
1789+
17851790
// installcheck determined we can't progress (e.g. deployment failed to come up in time)
17861791
if install.IsErrorUnrecoverable(strategyErr) {
17871792
csv.SetPhaseWithEventIfChanged(v1alpha1.CSVPhaseFailed, v1alpha1.CSVReasonInstallCheckFailed, fmt.Sprintf("install failed: %s", strategyErr), now, a.recorder)
@@ -1829,6 +1834,15 @@ func (a *Operator) updateInstallStatus(csv *v1alpha1.ClusterServiceVersion, inst
18291834
return nil
18301835
}
18311836

1837+
func findFirstError(f func(error) bool, errs ...error) error {
1838+
for _, err := range errs {
1839+
if f(err) {
1840+
return err
1841+
}
1842+
}
1843+
return nil
1844+
}
1845+
18321846
// parseStrategiesAndUpdateStatus returns a StrategyInstaller and a Strategy for a CSV if it can, else it sets a status on the CSV and returns
18331847
func (a *Operator) parseStrategiesAndUpdateStatus(csv *v1alpha1.ClusterServiceVersion) (install.StrategyInstaller, install.Strategy) {
18341848
strategy, err := a.resolver.UnmarshalStrategy(csv.Spec.InstallStrategy)

pkg/controller/operators/olm/requirements.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1212

1313
"github.com/operator-framework/api/pkg/operators/v1alpha1"
14-
olmErrors "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/errors"
1514
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
1615
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
1716
)
@@ -156,7 +155,7 @@ func (a *Operator) requirementStatus(strategyDetailsDeployment *v1alpha1.Strateg
156155
}
157156

158157
// Check if GVK exists
159-
if err := a.isGVKRegistered(r.Group, r.Version, r.Kind); err != nil {
158+
if ok, err := a.isGVKRegistered(r.Group, r.Version, r.Kind); !ok || err != nil {
160159
status.Status = "NotPresent"
161160
met = false
162161
statuses = append(statuses, status)
@@ -219,7 +218,7 @@ func (a *Operator) requirementStatus(strategyDetailsDeployment *v1alpha1.Strateg
219218
Name: name,
220219
}
221220

222-
if err := a.isGVKRegistered(r.Group, r.Version, r.Kind); err != nil {
221+
if ok, err := a.isGVKRegistered(r.Group, r.Version, r.Kind); !ok || err != nil {
223222
status.Status = v1alpha1.RequirementStatusReasonNotPresent
224223
status.Message = "Native API does not exist"
225224
met = false
@@ -397,7 +396,7 @@ func (a *Operator) requirementAndPermissionStatus(csv *v1alpha1.ClusterServiceVe
397396
return met, statuses, nil
398397
}
399398

400-
func (a *Operator) isGVKRegistered(group, version, kind string) error {
399+
func (a *Operator) isGVKRegistered(group, version, kind string) (bool, error) {
401400
logger := a.logger.WithFields(logrus.Fields{
402401
"group": group,
403402
"version": version,
@@ -408,15 +407,15 @@ func (a *Operator) isGVKRegistered(group, version, kind string) error {
408407
resources, err := a.opClient.KubernetesInterface().Discovery().ServerResourcesForGroupVersion(gv.String())
409408
if err != nil {
410409
logger.WithField("err", err).Info("could not query for GVK in api discovery")
411-
return err
410+
return false, err
412411
}
413412

414413
for _, r := range resources.APIResources {
415414
if r.Kind == kind {
416-
return nil
415+
return true, nil
417416
}
418417
}
419418

420419
logger.Info("couldn't find GVK in api discovery")
421-
return olmErrors.GroupVersionKindNotFoundError{group, version, kind}
420+
return false, nil
422421
}

0 commit comments

Comments
 (0)