From 03904d9c2fbb83ffc92637055cf6a63b73481608 Mon Sep 17 00:00:00 2001 From: Ankita Thomas Date: Mon, 25 Mar 2024 10:20:40 -0400 Subject: [PATCH] add Progressing condition Signed-off-by: Ankita Thomas --- api/v1alpha1/clusterextension_types.go | 42 +++++-- internal/controllers/common_controller.go | 114 ++++++++++++++---- internal/controllers/extension_controller.go | 59 +++++---- .../controllers/extension_controller_test.go | 93 +------------- 4 files changed, 158 insertions(+), 150 deletions(-) diff --git a/api/v1alpha1/clusterextension_types.go b/api/v1alpha1/clusterextension_types.go index 5af25e0b9..397356c3f 100644 --- a/api/v1alpha1/clusterextension_types.go +++ b/api/v1alpha1/clusterextension_types.go @@ -75,8 +75,15 @@ type ClusterExtensionSpec struct { const ( // TODO(user): add more Types, here and into init() + // TypeInstalled indicates whether the install for the bundle + // referenced in the status was completed. + // It does not indicate whether the App created by the bundle is healthy. TypeInstalled = "Installed" - TypeResolved = "Resolved" + // TypeProgressing indicates whether operator-controller is + // reconciling, installing, updating or deleting an extension. + TypeProgressing = "Progressing" + TypeResolved = "Resolved" + //TODO: Add a TypeHealthy to status of App health checks // TypeDeprecated is a rollup condition that is present when // any of the deprecated conditions are present. TypeDeprecated = "Deprecated" @@ -84,23 +91,29 @@ const ( TypeChannelDeprecated = "ChannelDeprecated" TypeBundleDeprecated = "BundleDeprecated" - ReasonBundleLookupFailed = "BundleLookupFailed" - ReasonInstallationFailed = "InstallationFailed" - ReasonInstallationStatusUnknown = "InstallationStatusUnknown" - ReasonInstallationSucceeded = "InstallationSucceeded" - ReasonInvalidSpec = "InvalidSpec" - ReasonResolutionFailed = "ResolutionFailed" - ReasonResolutionUnknown = "ResolutionUnknown" - ReasonSuccess = "Success" - ReasonDeprecated = "Deprecated" - ReasonDeleteFailed = "DeleteFailed" - ReasonDeleting = "Deleting" + ReasonBundleLookupFailed = "BundleLookupFailed" + ReasonInstallationFailed = "InstallationFailed" + ReasonInstallationStatusUnknown = "InstallationStatusUnknown" + ReasonInstallationSucceeded = "InstallationSucceeded" + ReasonInvalidSpec = "InvalidSpec" + ReasonResolutionFailed = "ResolutionFailed" + ReasonResolutionUnknown = "ResolutionUnknown" + ReasonSuccess = "Success" + ReasonDeprecated = "Deprecated" + ReasonDeleteFailed = "DeleteFailed" + ReasonDeleting = "Deleting" + ReasonUnknown = "Unknown" + ReasonPending = "Pending" + ReasonReconcileFailed = "ReconcileFailed" + ReasonReconciling = "Reconciling" + ReasonUnsupportedOrInvalidBundle = "UnsupportedOrInvalidBundle" ) func init() { // TODO(user): add Types from above conditionsets.ConditionTypes = append(conditionsets.ConditionTypes, TypeInstalled, + TypeProgressing, TypeResolved, TypeDeprecated, TypePackageDeprecated, @@ -120,6 +133,11 @@ func init() { ReasonDeprecated, ReasonDeleteFailed, ReasonDeleting, + ReasonUnknown, + ReasonPending, + ReasonReconcileFailed, + ReasonReconciling, + ReasonUnsupportedOrInvalidBundle, ) } diff --git a/internal/controllers/common_controller.go b/internal/controllers/common_controller.go index 2b2fcc743..816ca62c1 100644 --- a/internal/controllers/common_controller.go +++ b/internal/controllers/common_controller.go @@ -44,6 +44,39 @@ func setResolvedStatusConditionSuccess(conditions *[]metav1.Condition, message s }) } +// setResolvedStatusConditionFailed sets the resolved status condition to failed. +func setResolvedStatusConditionFailed(conditions *[]metav1.Condition, message string, generation int64) { + apimeta.SetStatusCondition(conditions, metav1.Condition{ + Type: ocv1alpha1.TypeResolved, + Status: metav1.ConditionFalse, + Reason: ocv1alpha1.ReasonResolutionFailed, + Message: message, + ObservedGeneration: generation, + }) +} + +// setInstalledStatusConditionSuccess sets the installed status condition to success. +func setInstalledStatusConditionSuccess(conditions *[]metav1.Condition, message string, generation int64) { + apimeta.SetStatusCondition(conditions, metav1.Condition{ + Type: ocv1alpha1.TypeInstalled, + Status: metav1.ConditionTrue, + Reason: ocv1alpha1.ReasonSuccess, + Message: message, + ObservedGeneration: generation, + }) +} + +// setInstalledStatusConditionFailed sets the installed status condition to failed. +func setInstalledStatusConditionFailed(conditions *[]metav1.Condition, message string, generation int64) { + apimeta.SetStatusCondition(conditions, metav1.Condition{ + Type: ocv1alpha1.TypeInstalled, + Status: metav1.ConditionFalse, + Reason: ocv1alpha1.ReasonInstallationFailed, + Message: message, + ObservedGeneration: generation, + }) +} + // setInstalledStatusConditionUnknown sets the installed status condition to unknown. func setInstalledStatusConditionUnknown(conditions *[]metav1.Condition, message string, generation int64) { apimeta.SetStatusCondition(conditions, metav1.Condition{ @@ -55,73 +88,106 @@ func setInstalledStatusConditionUnknown(conditions *[]metav1.Condition, message }) } -// setResolvedStatusConditionFailed sets the resolved status condition to failed. -func setResolvedStatusConditionFailed(conditions *[]metav1.Condition, message string, generation int64) { +// setProgressingStatusConditionFalse sets the progressing status condition to false, awaiting next reconcile. +func setProgressingStatusConditionFalse(conditions *[]metav1.Condition, message string, generation int64) { apimeta.SetStatusCondition(conditions, metav1.Condition{ - Type: ocv1alpha1.TypeResolved, + Type: ocv1alpha1.TypeProgressing, Status: metav1.ConditionFalse, - Reason: ocv1alpha1.ReasonResolutionFailed, + Reason: ocv1alpha1.ReasonPending, Message: message, ObservedGeneration: generation, }) } -// setResolvedStatusConditionUnknown sets the resolved status condition to unknown. -func setResolvedStatusConditionUnknown(conditions *[]metav1.Condition, message string, generation int64) { +// setProgressingStatusConditionUnknown sets the progressing status condition to unknown. +func setProgressingStatusConditionUnknown(conditions *[]metav1.Condition, message string, generation int64) { apimeta.SetStatusCondition(conditions, metav1.Condition{ - Type: ocv1alpha1.TypeResolved, + Type: ocv1alpha1.TypeProgressing, Status: metav1.ConditionUnknown, - Reason: ocv1alpha1.ReasonResolutionUnknown, + Reason: ocv1alpha1.ReasonUnknown, Message: message, ObservedGeneration: generation, }) } -// setInstalledStatusConditionSuccess sets the installed status condition to success. -func setInstalledStatusConditionSuccess(conditions *[]metav1.Condition, message string, generation int64) { +// setProgressingStatusConditionResolutionFailed sets the progressing status condition to false for failed bundle resolutions. +func setProgressingStatusConditionResolutionFailed(conditions *[]metav1.Condition, message string, generation int64) { apimeta.SetStatusCondition(conditions, metav1.Condition{ - Type: ocv1alpha1.TypeInstalled, + Type: ocv1alpha1.TypeProgressing, + Status: metav1.ConditionFalse, + Reason: ocv1alpha1.ReasonResolutionFailed, + Message: message, + ObservedGeneration: generation, + }) +} + +// setProgressingStatusConditionUnsupportedOrInvalidBundle sets the progressing status condition to false for unsupported/invalid bundles. +func setProgressingStatusConditionUnsupportedOrInvalidBundle(conditions *[]metav1.Condition, message string, generation int64) { + apimeta.SetStatusCondition(conditions, metav1.Condition{ + Type: ocv1alpha1.TypeProgressing, + Status: metav1.ConditionFalse, + Reason: ocv1alpha1.ReasonUnsupportedOrInvalidBundle, + Message: message, + ObservedGeneration: generation, + }) +} + +// setProgressingStatusConditionReconciling sets the progressing status condition to true for an app being reconciled. +func setProgressingStatusConditionReconciling(conditions *[]metav1.Condition, message string, generation int64) { + apimeta.SetStatusCondition(conditions, metav1.Condition{ + Type: ocv1alpha1.TypeProgressing, Status: metav1.ConditionTrue, - Reason: ocv1alpha1.ReasonSuccess, + Reason: ocv1alpha1.ReasonReconciling, Message: message, ObservedGeneration: generation, }) } -// setInstalledStatusConditionFailed sets the installed status condition to failed. -func setInstalledStatusConditionFailed(conditions *[]metav1.Condition, message string, generation int64) { +// setProgressingStatusConditionReconcileFailed sets the progressing status condition to false for an unsuccessfully reconciled app. +func setProgressingStatusConditionReconcileFailed(conditions *[]metav1.Condition, message string, generation int64) { apimeta.SetStatusCondition(conditions, metav1.Condition{ - Type: ocv1alpha1.TypeInstalled, + Type: ocv1alpha1.TypeProgressing, Status: metav1.ConditionFalse, - Reason: ocv1alpha1.ReasonInstallationFailed, + Reason: ocv1alpha1.ReasonReconcileFailed, Message: message, ObservedGeneration: generation, }) } -// setInstalledStatusConditionDeleting sets the installed status condition to unknown for deletes in progress. -func setInstalledStatusConditionDeleting(conditions *[]metav1.Condition, message string, generation int64) { +// setProgressingStatusConditionReconcileSuccess sets the progressing status condition to false for a successfully reconciled app. +func setProgressingStatusConditionReconcileSuccess(conditions *[]metav1.Condition, message string, generation int64) { apimeta.SetStatusCondition(conditions, metav1.Condition{ - Type: ocv1alpha1.TypeInstalled, - Status: metav1.ConditionUnknown, + Type: ocv1alpha1.TypeProgressing, + Status: metav1.ConditionFalse, + Reason: ocv1alpha1.ReasonSuccess, + Message: message, + ObservedGeneration: generation, + }) +} + +// setProgressingStatusConditionDeleting sets the progressing status condition to true for a progressing app delete. +func setProgressingStatusConditionDeleting(conditions *[]metav1.Condition, message string, generation int64) { + apimeta.SetStatusCondition(conditions, metav1.Condition{ + Type: ocv1alpha1.TypeProgressing, + Status: metav1.ConditionTrue, Reason: ocv1alpha1.ReasonDeleting, Message: message, ObservedGeneration: generation, }) } -// setInstalledStatusConditionDeleteFailed sets the installed status condition to unknown for failed deletes. -func setInstalledStatusConditionDeleteFailed(conditions *[]metav1.Condition, message string, generation int64) { +// setProgressingStatusConditionDeleteFailed sets the progressing status condition to false for failed app delete. +func setProgressingStatusConditionDeleteFailed(conditions *[]metav1.Condition, message string, generation int64) { apimeta.SetStatusCondition(conditions, metav1.Condition{ Type: ocv1alpha1.TypeInstalled, - Status: metav1.ConditionUnknown, + Status: metav1.ConditionFalse, Reason: ocv1alpha1.ReasonDeleteFailed, Message: message, ObservedGeneration: generation, }) } -// setDEprecationStatusesUnknown sets the deprecation status conditions to unknown. +// setDeprecationStatusesUnknown sets the deprecation status conditions to unknown. func setDeprecationStatusesUnknown(conditions *[]metav1.Condition, message string, generation int64) { conditionTypes := []string{ ocv1alpha1.TypeDeprecated, diff --git a/internal/controllers/extension_controller.go b/internal/controllers/extension_controller.go index 815ee2d49..5a932247d 100644 --- a/internal/controllers/extension_controller.go +++ b/internal/controllers/extension_controller.go @@ -129,10 +129,9 @@ func (r *ExtensionReconciler) reconcile(ctx context.Context, ext *ocv1alpha1.Ext // hasn't been attempted yet, due to the spec being invalid. ext.Status.InstalledBundleResource = "" setInstalledStatusConditionUnknown(&ext.Status.Conditions, "extension feature is disabled", ext.GetGeneration()) - // Set the TypeResolved condition to Unknown to indicate that the resolution - // hasn't been attempted yet, due to the spec being invalid. + ext.Status.ResolvedBundleResource = "" - setResolvedStatusConditionUnknown(&ext.Status.Conditions, "extension feature is disabled", ext.GetGeneration()) + setProgressingStatusConditionUnknown(&ext.Status.Conditions, "extension feature is disabled", ext.GetGeneration()) setDeprecationStatusesUnknown(&ext.Status.Conditions, "extension feature is disabled", ext.GetGeneration()) return ctrl.Result{}, nil @@ -148,10 +147,8 @@ func (r *ExtensionReconciler) reconcile(ctx context.Context, ext *ocv1alpha1.Ext if !r.HasKappApis { ext.Status.InstalledBundleResource = "" setInstalledStatusConditionFailed(&ext.Status.Conditions, errkappAPIUnavailable.Error(), ext.GetGeneration()) - ext.Status.ResolvedBundleResource = "" - setResolvedStatusConditionUnknown(&ext.Status.Conditions, "kapp apis are unavailable", ext.GetGeneration()) - + setProgressingStatusConditionUnknown(&ext.Status.Conditions, "kapp apis are unavailable", ext.GetGeneration()) setDeprecationStatusesUnknown(&ext.Status.Conditions, "kapp apis are unavailable", ext.GetGeneration()) return ctrl.Result{}, errkappAPIUnavailable } @@ -159,21 +156,26 @@ func (r *ExtensionReconciler) reconcile(ctx context.Context, ext *ocv1alpha1.Ext // TODO: Improve the resolution logic. bundle, err := r.resolve(ctx, *ext) if err != nil { - ext.Status.InstalledBundleResource = "" - setInstalledStatusConditionUnknown(&ext.Status.Conditions, "installation has not been attempted as resolution failed", ext.GetGeneration()) + if ext.Status.InstalledBundleResource == "" { + setInstalledStatusConditionUnknown(&ext.Status.Conditions, "installation has not been attempted as resolution failed", ext.GetGeneration()) + } ext.Status.ResolvedBundleResource = "" - setResolvedStatusConditionFailed(&ext.Status.Conditions, err.Error(), ext.GetGeneration()) + setProgressingStatusConditionResolutionFailed(&ext.Status.Conditions, "resolution failed: "+err.Error(), ext.GetGeneration()) setDeprecationStatusesUnknown(&ext.Status.Conditions, "deprecation checks have not been attempted as resolution failed", ext.GetGeneration()) return ctrl.Result{}, err } // Now we can set the Resolved Condition, and the resolvedBundleSource field to the bundle.Image value. ext.Status.ResolvedBundleResource = bundle.Image - setResolvedStatusConditionSuccess(&ext.Status.Conditions, fmt.Sprintf("resolved to %q", bundle.Image), ext.GetGeneration()) mediaType, err := bundle.MediaType() if err != nil { - setInstalledStatusConditionFailed(&ext.Status.Conditions, err.Error(), ext.GetGeneration()) + if ext.Status.InstalledBundleResource == "" { + // Set the TypeInstalled condition to Unknown to indicate that the resolution + // hasn't been attempted yet, due to the spec being invalid. + setInstalledStatusConditionUnknown(&ext.Status.Conditions, err.Error(), ext.GetGeneration()) + } + setProgressingStatusConditionUnsupportedOrInvalidBundle(&ext.Status.Conditions, "failed to read bundle mediaType: "+err.Error(), ext.GetGeneration()) setDeprecationStatusesUnknown(&ext.Status.Conditions, "deprecation checks have not been attempted as installation has failed", ext.GetGeneration()) return ctrl.Result{}, err } @@ -183,8 +185,10 @@ func (r *ExtensionReconciler) reconcile(ctx context.Context, ext *ocv1alpha1.Ext if mediaType != catalogmetadata.MediaTypePlain { // Set the TypeInstalled condition to Unknown to indicate that the resolution // hasn't been attempted yet, due to the spec being invalid. - ext.Status.InstalledBundleResource = "" - setInstalledStatusConditionUnknown(&ext.Status.Conditions, fmt.Sprintf("bundle type %s not supported currently", mediaType), ext.GetGeneration()) + if ext.Status.InstalledBundleResource == "" { + setInstalledStatusConditionUnknown(&ext.Status.Conditions, fmt.Sprintf("bundle type %s not supported currently", mediaType), ext.GetGeneration()) + } + setProgressingStatusConditionUnsupportedOrInvalidBundle(&ext.Status.Conditions, fmt.Sprintf("bundle type %s not supported currently", mediaType), ext.GetGeneration()) setDeprecationStatusesUnknown(&ext.Status.Conditions, "deprecation checks have not been attempted as installation has failed", ext.GetGeneration()) return ctrl.Result{}, nil } @@ -194,6 +198,8 @@ func (r *ExtensionReconciler) reconcile(ctx context.Context, ext *ocv1alpha1.Ext // originally Reason: ocv1alpha1.ReasonInstallationFailed ext.Status.InstalledBundleResource = "" setInstalledStatusConditionFailed(&ext.Status.Conditions, err.Error(), ext.GetGeneration()) + setProgressingStatusConditionFalse(&ext.Status.Conditions, "app install failed", ext.GetGeneration()) + setDeprecationStatusesUnknown(&ext.Status.Conditions, "deprecation checks have not been attempted as installation has failed", ext.GetGeneration()) return ctrl.Result{}, err } @@ -203,11 +209,15 @@ func (r *ExtensionReconciler) reconcile(ctx context.Context, ext *ocv1alpha1.Ext // originally Reason: ocv1alpha1.ReasonInstallationStatusUnknown ext.Status.InstalledBundleResource = "" setInstalledStatusConditionUnknown(&ext.Status.Conditions, err.Error(), ext.GetGeneration()) + setProgressingStatusConditionFalse(&ext.Status.Conditions, "app install failed", ext.GetGeneration()) setDeprecationStatusesUnknown(&ext.Status.Conditions, "deprecation checks have not been attempted as installation has failed", ext.GetGeneration()) return ctrl.Result{}, err } - MapAppStatusToCondition(existingTypedApp, ext, bundle.Image) + ext.Status.InstalledBundleResource = bundle.Image + setInstalledStatusConditionSuccess(&ext.Status.Conditions, "app install succeeded", ext.GetGeneration()) + + MapAppStatusToCondition(existingTypedApp, ext) SetDeprecationStatusInExtension(ext, bundle) return ctrl.Result{}, nil @@ -232,12 +242,12 @@ func (r *ExtensionReconciler) SetupWithManager(mgr ctrl.Manager) error { } // mapAppStatusToCondition maps the reconciling/deleting App conditions to the installed/deleting conditions on the Extension. -func MapAppStatusToCondition(existingApp *kappctrlv1alpha1.App, ext *ocv1alpha1.Extension, bundleImage string) { +func MapAppStatusToCondition(existingApp *kappctrlv1alpha1.App, ext *ocv1alpha1.Extension) { + // Note: App.Status.Inspect errors are never surfaced to App conditions, so are currently ignored when determining App status. if ext == nil { return } - message := "install status unknown" - ext.Status.InstalledBundleResource = "" + message := "app status unknown" if existingApp == nil { setInstalledStatusConditionUnknown(&ext.Status.Conditions, message, ext.Generation) @@ -256,26 +266,23 @@ func MapAppStatusToCondition(existingApp *kappctrlv1alpha1.App, ext *ocv1alpha1. kappctrlv1alpha1.Reconciling, } appStatusMapFn := map[kappctrlv1alpha1.ConditionType]func(*[]metav1.Condition, string, int64){ - kappctrlv1alpha1.DeleteFailed: setInstalledStatusConditionDeleteFailed, - kappctrlv1alpha1.Deleting: setInstalledStatusConditionDeleting, - kappctrlv1alpha1.ReconcileSucceeded: setInstalledStatusConditionSuccess, - kappctrlv1alpha1.ReconcileFailed: setInstalledStatusConditionFailed, - kappctrlv1alpha1.Reconciling: setInstalledStatusConditionUnknown, + kappctrlv1alpha1.DeleteFailed: setProgressingStatusConditionDeleteFailed, + kappctrlv1alpha1.Deleting: setProgressingStatusConditionDeleting, + kappctrlv1alpha1.ReconcileSucceeded: setProgressingStatusConditionReconcileSuccess, + kappctrlv1alpha1.ReconcileFailed: setProgressingStatusConditionReconcileFailed, + kappctrlv1alpha1.Reconciling: setProgressingStatusConditionReconciling, } for _, cond := range orderedAppStatuses { if c := findStatusCondition(existingApp.Status.GenericStatus.Conditions, cond); c != nil && c.Status == corev1.ConditionTrue { if len(message) == 0 { message = c.Message } - if c.Type == kappctrlv1alpha1.ReconcileSucceeded { - ext.Status.InstalledBundleResource = bundleImage - } appStatusMapFn[cond](&ext.Status.Conditions, message, ext.Generation) return } } if len(message) == 0 { - message = "install status unknown" + message = "app status unknown" } setInstalledStatusConditionUnknown(&ext.Status.Conditions, message, ext.Generation) } diff --git a/internal/controllers/extension_controller_test.go b/internal/controllers/extension_controller_test.go index a23c82dd9..6389b5cdc 100644 --- a/internal/controllers/extension_controller_test.go +++ b/internal/controllers/extension_controller_test.go @@ -117,11 +117,10 @@ func verifyExtensionConditionsInvariants(t *testing.T, ext *ocv1alpha1.Extension func TestMapAppCondtitionToStatus(t *testing.T) { testCases := []struct { - name string - app *kappctrlv1alpha1.App - ext *ocv1alpha1.Extension - bundleImage string - expected *ocv1alpha1.Extension + name string + app *kappctrlv1alpha1.App + ext *ocv1alpha1.Extension + expected *ocv1alpha1.Extension }{ { name: "preserve existing conditions on extension while reconciling", @@ -178,88 +177,6 @@ func TestMapAppCondtitionToStatus(t *testing.T) { }, }, }, - - { - name: "update installedBundleResource on successful reconcile", - bundleImage: "test-bundle", - app: &kappctrlv1alpha1.App{ - Status: kappctrlv1alpha1.AppStatus{ - GenericStatus: kappctrlv1alpha1.GenericStatus{ - Conditions: []kappctrlv1alpha1.Condition{{ - Type: kappctrlv1alpha1.ReconcileSucceeded, - Status: corev1.ConditionTrue, - // Reason: "", - Message: "Reconcile Succeeded", - }}, - }, - }, - }, - ext: &ocv1alpha1.Extension{ - Status: ocv1alpha1.ExtensionStatus{ - Conditions: []metav1.Condition{ - { - Type: ocv1alpha1.TypeInstalled, - Status: metav1.ConditionUnknown, - Reason: ocv1alpha1.ReasonInstallationStatusUnknown, - }, - }, - }, - }, - expected: &ocv1alpha1.Extension{ - Status: ocv1alpha1.ExtensionStatus{ - InstalledBundleResource: "test-bundle", - Conditions: []metav1.Condition{ - { - Type: ocv1alpha1.TypeInstalled, - Status: metav1.ConditionTrue, - Reason: ocv1alpha1.ReasonSuccess, - Message: "Reconcile Succeeded", - }, - }, - }, - }, - }, - { - name: "remove installedBundleResource when not successful reconcile", - bundleImage: "test-bundle", - app: &kappctrlv1alpha1.App{ - Status: kappctrlv1alpha1.AppStatus{ - GenericStatus: kappctrlv1alpha1.GenericStatus{ - Conditions: []kappctrlv1alpha1.Condition{{ - Type: kappctrlv1alpha1.Reconciling, - Status: corev1.ConditionTrue, - Message: "Reconciling", - }}, - FriendlyDescription: "Reconciling", - }, - }, - }, - ext: &ocv1alpha1.Extension{ - Status: ocv1alpha1.ExtensionStatus{ - InstalledBundleResource: "test-bundle", - Conditions: []metav1.Condition{ - { - Type: ocv1alpha1.TypeInstalled, - Status: metav1.ConditionTrue, - Reason: ocv1alpha1.ReasonSuccess, - Message: "Success", - }, - }, - }, - }, - expected: &ocv1alpha1.Extension{ - Status: ocv1alpha1.ExtensionStatus{ - Conditions: []metav1.Condition{ - { - Type: ocv1alpha1.TypeInstalled, - Status: metav1.ConditionUnknown, - Reason: ocv1alpha1.ReasonInstallationStatusUnknown, - Message: "Reconciling", - }, - }, - }, - }, - }, { name: "show UsefulErrorMessage when referenced by FriendlyErrorMessage", app: &kappctrlv1alpha1.App{ @@ -408,7 +325,7 @@ func TestMapAppCondtitionToStatus(t *testing.T) { } for _, tt := range testCases { - controllers.MapAppStatusToCondition(tt.app, tt.ext, tt.bundleImage) + controllers.MapAppStatusToCondition(tt.app, tt.ext) for i := range tt.ext.Status.Conditions { //unset transition time for comparison tt.ext.Status.Conditions[i].LastTransitionTime = metav1.Time{}