From 0d89b907214ffb3d38c74fc83fc7f7dd4fece508 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Thu, 17 Nov 2022 18:13:21 -0800 Subject: [PATCH] pkg/cvo/status: Always set 'reason' for Available, Failing, and Progressing From [1]: > Operators should set `reason` and `message` for both happy and sad > conditions. For sad conditions, the strings help explain what is > going wrong. For happy conditions, the strings help convince users > that things are going well. > > `AsExpected` is a common choice for happy reasons with messages like `All is well` or `NodeInstallerProgressing: 3 nodes are at revision 7`. > > Having an explicit happy reasons also make it easier to do things like: > > sort_desc(count by (reason) (cluster_operator_conditions{name="cloud-credential",condition="Degraded"})) > > for convenient aggregation, without having to mix in the time-series > values to distinguish happy and sad cases. [1]: https://github.com/openshift/enhancements/pull/1266 --- pkg/cvo/cvo_scenarios_test.go | 114 +++++++++++++++++----------------- pkg/cvo/cvo_test.go | 70 ++++++++++----------- pkg/cvo/status.go | 17 ++++- 3 files changed, 107 insertions(+), 94 deletions(-) diff --git a/pkg/cvo/cvo_scenarios_test.go b/pkg/cvo/cvo_scenarios_test.go index 3ba1ac660c..b9bd30aab6 100644 --- a/pkg/cvo/cvo_scenarios_test.go +++ b/pkg/cvo/cvo_scenarios_test.go @@ -173,7 +173,7 @@ func TestCVO_StartupAndSync(t *testing.T) { }, Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, - {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, + {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse, Reason: "Unavailable", Message: "No previous Available condition, and have not completely reconciled "}, // report back to the user that we don't have enough info to proceed {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Reason: "NoDesiredImage", Message: "No configured operator version, unable to update cluster"}, {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "NoDesiredImage", Message: "Unable to apply : an unknown error has occurred: NoDesiredImage"}, @@ -222,10 +222,10 @@ func TestCVO_StartupAndSync(t *testing.T) { }, Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, - {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, + {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse, Reason: "Unavailable", Message: "No previous Available condition, and have not completely reconciled "}, // cleared failing status and set progressing - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, @@ -404,8 +404,8 @@ func TestCVO_StartupAndSync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.0-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "Updating", Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, @@ -590,7 +590,7 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { }, Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, - {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, + {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse, Reason: "Unavailable", Message: "No previous Available condition, and have not completely reconciled "}, // report back to the user that we don't have enough info to proceed {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Reason: "NoDesiredImage", Message: "No configured operator version, unable to update cluster"}, {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "NoDesiredImage", Message: "Unable to apply : an unknown error has occurred: NoDesiredImage"}, @@ -639,10 +639,10 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { }, Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, - {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, + {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse, Reason: "Unavailable", Message: "No previous Available condition, and have not completely reconciled "}, // cleared failing status and set progressing - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, @@ -810,8 +810,8 @@ func TestCVO_StartupAndSyncUnverifiedPayload(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.0-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, @@ -994,7 +994,7 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { }, Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, - {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, + {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse, Reason: "Unavailable", Message: "No previous Available condition, and have not completely reconciled "}, // report back to the user that we don't have enough info to proceed {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Reason: "NoDesiredImage", Message: "No configured operator version, unable to update cluster"}, {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "NoDesiredImage", Message: "Unable to apply : an unknown error has occurred: NoDesiredImage"}, @@ -1043,10 +1043,10 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { }, Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, - {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, + {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse, Reason: "Unavailable", Message: "No previous Available condition, and have not completely reconciled "}, // cleared failing status and set progressing - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, @@ -1209,8 +1209,8 @@ func TestCVO_StartupAndSyncPreconditionFailing(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.0-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, @@ -1459,9 +1459,9 @@ func TestCVO_UpgradeUnverifiedPayload(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionFalse, Reason: "RetrievePayload", Message: "Retrieving payload failed version=\"1.0.1-abc\" image=\"image/image:1\" failure=The update cannot be verified: some random error"}, - {Type: "Available", Status: "False"}, - {Type: "Failing", Status: "False"}, - {Type: "Progressing", Status: "True", Message: "Working towards 1.0.1-abc"}, + {Type: configv1.OperatorAvailable, Status: "False", Reason: "Unavailable", Message: "No previous Available condition, and have not completely reconciled 1.0.1-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 1.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -1591,8 +1591,8 @@ func TestCVO_UpgradeUnverifiedPayload(t *testing.T) { {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.1-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.1-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 1.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -1718,9 +1718,9 @@ func TestCVO_ResetPayloadLoadStatus(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionFalse, Reason: "RetrievePayload", Message: "Retrieving payload failed version=\"1.0.1-abc\" image=\"image/image:1\" failure=The update cannot be verified: some random error"}, - {Type: "Available", Status: "False"}, - {Type: "Failing", Status: "False"}, - {Type: "Progressing", Status: "True", Message: "Working towards 1.0.1-abc"}, + {Type: configv1.OperatorAvailable, Status: "False", Reason: "Unavailable", Message: "No previous Available condition, and have not completely reconciled 1.0.1-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 1.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -1837,9 +1837,9 @@ func TestCVO_ResetPayloadLoadStatus(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:0\""}, - {Type: "Available", Status: "False"}, - {Type: "Failing", Status: "False"}, - {Type: "Progressing", Status: "False", Message: "Cluster version is 1.0.0-abc"}, + {Type: configv1.OperatorAvailable, Status: "False", Reason: "Unavailable", Message: "No previous Available condition, and have not completely reconciled 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: "False", Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -2118,9 +2118,9 @@ func TestCVO_InitImplicitlyEnabledCaps(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: configv1.ConditionTrue, Reason: "CapabilitiesImplicitlyEnabled", Message: "The following capabilities could not be disabled: CSISnapshot, Console, Insights, Storage, marketplace, openshift-samples"}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, - {Type: "Available", Status: "False"}, - {Type: "Failing", Status: "False"}, - {Type: "Progressing", Status: "True", Message: "Working towards 1.0.1-abc"}, + {Type: configv1.OperatorAvailable, Status: "False", Reason: "Unavailable", Message: "No previous Available condition, and have not completely reconciled 1.0.1-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 1.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -2158,8 +2158,8 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.0-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -2249,8 +2249,8 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.0-abc"}, // cleared failing status and set progressing - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 1.0.1-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionFalse, Reason: "RetrievePayload", Message: "Retrieving payload failed version=\"1.0.1-abc\" image=\"image/image:1\" failure=The update cannot be verified: some random error"}, @@ -2381,8 +2381,8 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.1-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.1-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 1.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, @@ -2455,8 +2455,8 @@ func TestCVO_UpgradePreconditionFailing(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.0-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -2688,8 +2688,8 @@ func TestCVO_UpgradePreconditionFailing(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.1-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.1-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 1.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, @@ -2729,8 +2729,8 @@ func TestCVO_UpgradePreconditionFailingAcceptedRisks(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.0-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -2875,8 +2875,8 @@ func TestCVO_UpgradeVerifiedPayload(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.0-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -2943,8 +2943,8 @@ func TestCVO_UpgradeVerifiedPayload(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.0-abc"}, // cleared failing status and set progressing - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 1.0.1-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", Message: "Payload loaded version=\"1.0.1-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, @@ -2997,8 +2997,8 @@ func TestCVO_RestartAndReconcile(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.0-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -3302,8 +3302,8 @@ func TestCVO_ErrorDuringReconcile(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.0-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -3740,7 +3740,7 @@ func TestCVO_ParallelError(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: DesiredReleaseAccepted, Status: configv1.ConditionTrue, Reason: "PayloadLoaded", Message: "Payload loaded version=\"1.0.0-abc\" image=\"image/image:1\" architecture=\"" + architecture + "\""}, - {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, + {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse, Reason: "Unavailable", Message: "No previous Available condition, and have not completely reconciled "}, {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Reason: "MultipleErrors", Message: "Multiple errors are preventing progress:\n* Failed to reconcile 10-a-file resource\n* Failed to reconcile 20-b-file resource"}, {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "MultipleErrors", Message: "Unable to apply 1.0.0-abc: an unknown error has occurred: MultipleErrors"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, @@ -3785,8 +3785,8 @@ func TestCVO_VerifyInitializingPayloadState(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.0-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -3846,8 +3846,8 @@ func TestCVO_VerifyUpdatingPayloadState(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 1.0.0-abc"}, - {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 1.0.0-abc"}, + {Type: ClusterStatusFailing, Status: "False", Reason: "AsExpected", Message: "All is well."}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 1.0.0-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, diff --git a/pkg/cvo/cvo_test.go b/pkg/cvo/cvo_test.go index ea80304103..5636da73e3 100644 --- a/pkg/cvo/cvo_test.go +++ b/pkg/cvo/cvo_test.go @@ -222,7 +222,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Reason: "UpdatePayloadIntegrity", Message: "unable to apply object"}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 4.0.1"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 4.0.1"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -297,7 +297,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Reason: "UpdatePayloadIntegrity", Message: "unable to apply object"}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 4.0.1"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 4.0.1"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, }, @@ -375,7 +375,7 @@ func TestOperator_sync(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Reason: "UpdatePayloadIntegrity", Message: "unable to apply object"}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 4.0.1"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 4.0.1"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -447,7 +447,7 @@ func TestOperator_sync(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Message: "unable to apply object"}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 4.0.1"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 4.0.1"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -479,8 +479,8 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, - {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Message: "injected error"}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Unable to apply 0.0.1-abc: an error occurred"}, + {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Reason: "UnknownError", Message: "injected error"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "UnknownError", Message: "Unable to apply 0.0.1-abc: an error occurred"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -534,8 +534,8 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, - {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Message: "file does not exist"}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Unable to apply 4.0.1: an error occurred"}, + {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Reason: "UnknownError", Message: "file does not exist"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "UnknownError", Message: "Unable to apply 4.0.1: an error occurred"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -601,10 +601,10 @@ func TestOperator_sync(t *testing.T) { VersionHash: "", Conditions: []configv1.ClusterOperatorStatusCondition{ // the order of progressing in the conditions array is preserved - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Unable to apply 4.0.1: an error occurred"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "UnknownError", Message: "Unable to apply 4.0.1: an error occurred"}, {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, - {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Message: "file does not exist"}, + {Type: ClusterStatusFailing, Status: configv1.ConditionTrue, Reason: "UnknownError", Message: "file does not exist"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -665,7 +665,7 @@ func TestOperator_sync(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards image/image:v4.0.1"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards image/image:v4.0.1"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -753,7 +753,7 @@ func TestOperator_sync(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 4.0.2"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 4.0.2"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -810,7 +810,7 @@ func TestOperator_sync(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 4.0.2"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 4.0.2"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -865,7 +865,7 @@ func TestOperator_sync(t *testing.T) { {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, // we don't reset the message here until the image is loaded - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 4.0.1"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 4.0.1"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -926,7 +926,7 @@ func TestOperator_sync(t *testing.T) { {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, // we don't reset the message here until the image is loaded - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 4.0.2"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 4.0.2"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -978,7 +978,7 @@ func TestOperator_sync(t *testing.T) { {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, // we correct the message that was incorrect from the previous state - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 4.0.1: 334 of 1000 done (33% complete)"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 4.0.1: 334 of 1000 done (33% complete)"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -1079,7 +1079,7 @@ func TestOperator_sync(t *testing.T) { {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, // we correct the message that was incorrect from the previous state - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards image/image:v4.0.1"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards image/image:v4.0.1"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -1155,7 +1155,7 @@ func TestOperator_sync(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Message: "Working towards 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionTrue, Reason: "Updating", Message: "Working towards 0.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -1208,7 +1208,7 @@ func TestOperator_sync(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -1276,7 +1276,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, @@ -1323,7 +1323,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 0.0.1-abc"}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionTrue}, }, @@ -1367,7 +1367,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, @@ -1400,7 +1400,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 0.0.1-abc"}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: configv1.ClusterStatusConditionType("Upgradeable"), Status: configv1.ConditionFalse}, @@ -1446,7 +1446,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: configv1.ClusterStatusConditionType("UpgradeableA"), Status: configv1.ConditionFalse}, @@ -1480,7 +1480,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 0.0.1-abc"}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: configv1.ClusterStatusConditionType("Upgradeable"), Status: configv1.ConditionFalse}, @@ -1522,7 +1522,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, {Type: configv1.ClusterStatusConditionType("Upgradeable"), Status: configv1.ConditionFalse}, @@ -1558,7 +1558,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 0.0.1-abc"}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, @@ -1608,7 +1608,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, @@ -1645,7 +1645,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 0.0.1-abc"}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionTrue}, }, @@ -1694,7 +1694,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, @@ -1727,7 +1727,7 @@ func TestOperator_sync(t *testing.T) { Conditions: []configv1.ClusterOperatorStatusCondition{ {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 0.0.1-abc"}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, @@ -1793,7 +1793,7 @@ func TestOperator_sync(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 4.0.1"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 4.0.1"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 4.0.1"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -2001,7 +2001,7 @@ func TestOperator_sync(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -2064,7 +2064,7 @@ func TestOperator_sync(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, @@ -2104,7 +2104,7 @@ func TestOperator_sync(t *testing.T) { {Type: ImplicitlyEnabledCapabilities, Status: "False", Reason: "AsExpected", Message: "Capabilities match configured spec"}, {Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, Message: "Done applying 0.0.1-abc"}, {Type: ClusterStatusFailing, Status: configv1.ConditionFalse}, - {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Message: "Cluster version is 0.0.1-abc"}, + {Type: configv1.OperatorProgressing, Status: configv1.ConditionFalse, Reason: "ReconcilingCompletedRelease", Message: "Cluster version is 0.0.1-abc"}, {Type: configv1.RetrievedUpdates, Status: configv1.ConditionFalse}, }, }, diff --git a/pkg/cvo/status.go b/pkg/cvo/status.go index e162316990..792fc89cd6 100644 --- a/pkg/cvo/status.go +++ b/pkg/cvo/status.go @@ -250,6 +250,7 @@ func (optr *Operator) syncStatus(ctx context.Context, original, config *configv1 resourcemerge.SetOperatorStatusCondition(&config.Status.Conditions, configv1.ClusterOperatorStatusCondition{ Type: configv1.OperatorAvailable, Status: configv1.ConditionTrue, + Reason: "AsExpected", Message: fmt.Sprintf("Done applying %s", version), LastTransitionTime: now, }) @@ -259,6 +260,8 @@ func (optr *Operator) syncStatus(ctx context.Context, original, config *configv1 resourcemerge.SetOperatorStatusCondition(&config.Status.Conditions, configv1.ClusterOperatorStatusCondition{ Type: configv1.OperatorAvailable, Status: configv1.ConditionFalse, + Reason: "Unavailable", + Message: fmt.Sprintf("No previous Available condition, and have not completely reconciled %s", version), LastTransitionTime: now, }) } @@ -266,7 +269,6 @@ func (optr *Operator) syncStatus(ctx context.Context, original, config *configv1 progressReason, progressMessage, skipFailure := convertErrorToProgressing(config.Status.History, now.Time, status) if err := status.Failure; err != nil && !skipFailure { - var reason string msg := progressMessage if uErr, ok := err.(*payload.UpdateError); ok { reason = uErr.Reason @@ -274,6 +276,7 @@ func (optr *Operator) syncStatus(ctx context.Context, original, config *configv1 msg = payload.SummaryForReason(reason, uErr.Name) } } else if msg == "" { + reason = "UnknownError" msg = "an error occurred" } @@ -307,13 +310,21 @@ func (optr *Operator) syncStatus(ctx context.Context, original, config *configv1 } else { // clear the failure condition - resourcemerge.SetOperatorStatusCondition(&config.Status.Conditions, configv1.ClusterOperatorStatusCondition{Type: ClusterStatusFailing, Status: configv1.ConditionFalse, LastTransitionTime: now}) + resourcemerge.SetOperatorStatusCondition(&config.Status.Conditions, configv1.ClusterOperatorStatusCondition{ + Type: ClusterStatusFailing, + Status: configv1.ConditionFalse, + Reason: "AsExpected", + Message: "All is well.", + LastTransitionTime: now, + }) // update progressing if status.Reconciling { message := fmt.Sprintf("Cluster version is %s", version) if len(validationErrs) > 0 { message = fmt.Sprintf("Stopped at %s: the cluster version is invalid", version) + } else { + reason = "ReconcilingCompletedRelease" } resourcemerge.SetOperatorStatusCondition(&config.Status.Conditions, configv1.ClusterOperatorStatusCondition{ Type: configv1.OperatorProgressing, @@ -333,12 +344,14 @@ func (optr *Operator) syncStatus(ctx context.Context, original, config *configv1 message = fmt.Sprintf("Working towards %s: %d of %d done (%.0f%% complete), %s", version, status.Done, status.Total, math.Trunc(float64(fractionComplete*100)), progressMessage) case fractionComplete > 0: + reason = "Updating" message = fmt.Sprintf("Working towards %s: %d of %d done (%.0f%% complete)", version, status.Done, status.Total, math.Trunc(float64(fractionComplete*100))) case skipFailure: reason = progressReason message = fmt.Sprintf("Working towards %s: %s", version, progressMessage) default: + reason = "Updating" message = fmt.Sprintf("Working towards %s", version) } resourcemerge.SetOperatorStatusCondition(&config.Status.Conditions, configv1.ClusterOperatorStatusCondition{