Skip to content

Commit

Permalink
Use error type rather than strings
Browse files Browse the repository at this point in the history
Signed-off-by: Todd Short <tshort@redhat.com>
  • Loading branch information
tmshort committed May 21, 2024
1 parent 53577db commit ec163f2
Showing 1 changed file with 40 additions and 7 deletions.
47 changes: 40 additions & 7 deletions internal/controllers/clusterextension_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,37 @@ import (
"github.com/operator-framework/operator-controller/internal/labels"
)

// No Package error type

type NoPackageError struct {
message string
}

func NewNoPackageError(m string) NoPackageError {
return NoPackageError{
message: m,
}
}
func (e NoPackageError) Error() string {
return e.message
}

// Invalid Version Range error type

type InvalidVersionRangeError struct {
origErr error
}

func NewInvalidVersionRangeError(e error) InvalidVersionRangeError {
return InvalidVersionRangeError{
origErr: e,
}
}

func (e InvalidVersionRangeError) Error() string {
return e.origErr.Error()
}

// ClusterExtensionReconciler reconciles a ClusterExtension object
type ClusterExtensionReconciler struct {
client.Client
Expand Down Expand Up @@ -184,11 +215,11 @@ func (r *ClusterExtensionReconciler) handleResolutionErrors(ext *ocv1alpha1.Clus
if errors.As(err, &aggErrs) {
for _, err := range aggErrs.Errors() {
errorMessage := err.Error()
if strings.Contains(errorMessage, "no package") {
if errors.As(err, &NoPackageError{}) {
// Handle no package found errors, potentially setting status conditions
setResolvedStatusConditionFailed(&ext.Status.Conditions, errorMessage, ext.Generation)
ensureAllConditionsWithReason(ext, "ResolutionFailed", errorMessage)
} else if strings.Contains(errorMessage, "invalid version range") {
} else if errors.As(err, &InvalidVersionRangeError{}) {
// Handle invalid version range errors, potentially setting status conditions
setResolvedStatusConditionFailed(&ext.Status.Conditions, errorMessage, ext.Generation)
ensureAllConditionsWithReason(ext, "ResolutionFailed", errorMessage)
Expand Down Expand Up @@ -428,7 +459,7 @@ func (r *ClusterExtensionReconciler) resolve(ctx context.Context, ext ocv1alpha1
if versionRange != "" {
vr, err := mmsemver.NewConstraint(versionRange)
if err != nil {
return nil, utilerrors.NewAggregate([]error{fmt.Errorf("invalid version range '%s': %w", versionRange, err)})
return nil, NewInvalidVersionRangeError(fmt.Errorf("invalid version range %q: %w", versionRange, err))
}
predicates = append(predicates, catalogfilter.InMastermindsSemverRange(vr))
}
Expand All @@ -453,16 +484,18 @@ func (r *ClusterExtensionReconciler) resolve(ctx context.Context, ext ocv1alpha1
upgradeErrorPrefix = fmt.Sprintf("error upgrading from currently installed version %q: ", installedBundleVersion.String())
}
if len(resultSet) == 0 {
var msg string
switch {
case versionRange != "" && channelName != "":
return nil, fmt.Errorf("%sno package %q matching version %q in channel %q found", upgradeErrorPrefix, packageName, versionRange, channelName)
msg = fmt.Sprintf("%sno package %q matching version %q in channel %q found", upgradeErrorPrefix, packageName, versionRange, channelName)
case versionRange != "":
return nil, fmt.Errorf("%sno package %q matching version %q found", upgradeErrorPrefix, packageName, versionRange)
msg = fmt.Sprintf("%sno package %q matching version %q found", upgradeErrorPrefix, packageName, versionRange)
case channelName != "":
return nil, fmt.Errorf("%sno package %q in channel %q found", upgradeErrorPrefix, packageName, channelName)
msg = fmt.Sprintf("%sno package %q in channel %q found", upgradeErrorPrefix, packageName, channelName)
default:
return nil, fmt.Errorf("%sno package %q found", upgradeErrorPrefix, packageName)
msg = fmt.Sprintf("%sno package %q found", upgradeErrorPrefix, packageName)
}
return nil, NewNoPackageError(msg)
}

sort.SliceStable(resultSet, func(i, j int) bool {
Expand Down

0 comments on commit ec163f2

Please sign in to comment.