Skip to content

Commit fc5033e

Browse files
committed
cvo: set ResourceReconciliationIssues condition
When an appropriate feature flag is set, maintain a `ResourceReconciliationIssues` condition on the CV status. This condition is False when no issues were encountered (signalled by the `Failure` field on the `SyncWorkerStatus` parameter) and True otherwise.
1 parent 1e7241d commit fc5033e

3 files changed

Lines changed: 97 additions & 2 deletions

File tree

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package cvo
2+
3+
import v1 "github.com/openshift/api/config/v1"
4+
5+
const (
6+
resourceReconciliationIssuesConditionType v1.ClusterStatusConditionType = "ResourceReconciliationIssues"
7+
8+
noResourceReconciliationIssuesReason string = "NoIssues"
9+
noResourceReconciliationIssuesMessage string = "No issues found during resource reconciliation"
10+
11+
resourceReconciliationIssuesFoundReason string = "IssuesFound"
12+
resourceReconciliationIssuesFoundMessage string = "Issues found during resource reconciliation"
13+
)

pkg/cvo/status.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ func (optr *Operator) syncStatus(ctx context.Context, original, config *configv1
198198
original = config.DeepCopy()
199199
}
200200

201-
updateClusterVersionStatus(&config.Status, status, optr.release, optr.getAvailableUpdates, validationErrs)
201+
updateClusterVersionStatus(&config.Status, status, optr.release, optr.getAvailableUpdates, optr.enabledGates, validationErrs)
202202

203203
if klog.V(6).Enabled() {
204204
klog.Infof("Apply config: %s", diff.ObjectReflectDiff(original, config))
@@ -210,7 +210,8 @@ func (optr *Operator) syncStatus(ctx context.Context, original, config *configv1
210210

211211
// updateClusterVersionStatus updates the passed cvStatus with the latest status information
212212
func updateClusterVersionStatus(cvStatus *configv1.ClusterVersionStatus, status *SyncWorkerStatus,
213-
release configv1.Release, getAvailableUpdates func() *availableUpdates, validationErrs field.ErrorList) {
213+
release configv1.Release, getAvailableUpdates func() *availableUpdates, enabledGates FeatureGates,
214+
validationErrs field.ErrorList) {
214215

215216
cvStatus.ObservedGeneration = status.Generation
216217
if len(status.VersionHash) > 0 {
@@ -379,6 +380,21 @@ func updateClusterVersionStatus(cvStatus *configv1.ClusterVersionStatus, status
379380
}
380381
}
381382

383+
if enabledGates.ResourceReconciliationIssuesCondition {
384+
rriCondition := configv1.ClusterOperatorStatusCondition{
385+
Type: resourceReconciliationIssuesConditionType,
386+
Status: configv1.ConditionFalse,
387+
Reason: noResourceReconciliationIssuesReason,
388+
Message: noResourceReconciliationIssuesMessage,
389+
}
390+
if status.Failure != nil {
391+
rriCondition.Status = configv1.ConditionTrue
392+
rriCondition.Reason = resourceReconciliationIssuesFoundReason
393+
rriCondition.Message = fmt.Sprintf("%s: %s", resourceReconciliationIssuesFoundMessage, status.Failure.Error())
394+
}
395+
resourcemerge.SetOperatorStatusCondition(&cvStatus.Conditions, rriCondition)
396+
}
397+
382398
// default retrieved updates if it is not set
383399
if resourcemerge.FindOperatorStatusCondition(cvStatus.Conditions, configv1.RetrievedUpdates) == nil {
384400
resourcemerge.SetOperatorStatusCondition(&cvStatus.Conditions, configv1.ClusterOperatorStatusCondition{

pkg/cvo/status_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ import (
66
"reflect"
77
"testing"
88

9+
"github.com/google/go-cmp/cmp"
10+
"github.com/google/go-cmp/cmp/cmpopts"
11+
"github.com/openshift/cluster-version-operator/lib/resourcemerge"
912
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1013
"k8s.io/apimachinery/pkg/util/diff"
14+
"k8s.io/apimachinery/pkg/util/validation/field"
1115
"k8s.io/client-go/tools/record"
1216

1317
configv1 "github.com/openshift/api/config/v1"
@@ -190,3 +194,65 @@ func TestOperator_syncFailingStatus(t *testing.T) {
190194
})
191195
}
192196
}
197+
198+
func TestUpdateClusterVersionStatus_ResourceReconciliationIssues(t *testing.T) {
199+
ignoreLastTransitionTime := cmpopts.IgnoreFields(configv1.ClusterOperatorStatusCondition{}, "LastTransitionTime")
200+
201+
testCases := []struct {
202+
name string
203+
syncWorkerStatus SyncWorkerStatus
204+
205+
enabled bool
206+
207+
expectedCondition *configv1.ClusterOperatorStatusCondition
208+
}{
209+
{
210+
name: "ResourceReconciliationIssues present and happy when gate is enabled and no failures happened",
211+
syncWorkerStatus: SyncWorkerStatus{},
212+
enabled: true,
213+
expectedCondition: &configv1.ClusterOperatorStatusCondition{
214+
Type: resourceReconciliationIssuesConditionType,
215+
Status: configv1.ConditionFalse,
216+
Reason: noResourceReconciliationIssuesReason,
217+
Message: noResourceReconciliationIssuesMessage,
218+
},
219+
},
220+
{
221+
name: "ResourceReconciliationIssues present and unhappy when gate is enabled and failures happened",
222+
syncWorkerStatus: SyncWorkerStatus{
223+
Failure: fmt.Errorf("Something happened"),
224+
},
225+
enabled: true,
226+
expectedCondition: &configv1.ClusterOperatorStatusCondition{
227+
Type: resourceReconciliationIssuesConditionType,
228+
Status: configv1.ConditionTrue,
229+
Reason: resourceReconciliationIssuesFoundReason,
230+
Message: "Issues found during resource reconciliation: Something happened",
231+
},
232+
},
233+
{
234+
name: "ResourceReconciliationIssues not present when gate is enabled and failures happened",
235+
syncWorkerStatus: SyncWorkerStatus{
236+
Failure: fmt.Errorf("Something happened"),
237+
},
238+
enabled: false,
239+
expectedCondition: nil,
240+
},
241+
}
242+
243+
for _, tc := range testCases {
244+
tc := tc
245+
t.Run(tc.name, func(t *testing.T) {
246+
gates := FeatureGates{ResourceReconciliationIssuesCondition: tc.enabled}
247+
release := configv1.Release{}
248+
getAvailableUpdates := func() *availableUpdates { return nil }
249+
var noErrors field.ErrorList
250+
cvStatus := configv1.ClusterVersionStatus{}
251+
updateClusterVersionStatus(&cvStatus, &tc.syncWorkerStatus, release, getAvailableUpdates, gates, noErrors)
252+
condition := resourcemerge.FindOperatorStatusCondition(cvStatus.Conditions, resourceReconciliationIssuesConditionType)
253+
if diff := cmp.Diff(tc.expectedCondition, condition, ignoreLastTransitionTime); diff != "" {
254+
t.Errorf("unexpected condition\n:%s", diff)
255+
}
256+
})
257+
}
258+
}

0 commit comments

Comments
 (0)