Skip to content

Commit 827d841

Browse files
Merge pull request #1216 from petr-muller/ota-1578-disable-rri
OTA-1578: Disable `ResourceReconciliationIssues` condition
2 parents 0947d3e + 28a376a commit 827d841

File tree

4 files changed

+29
-151
lines changed

4 files changed

+29
-151
lines changed

pkg/cvo/reconciliation_issues.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,6 @@ import (
1212

1313
const (
1414
reconciliationIssuesConditionType configv1.ClusterStatusConditionType = "ReconciliationIssues"
15-
16-
noReconciliationIssuesReason string = "NoIssues"
17-
noReconciliationIssuesMessage string = "No issues found during reconciliation"
18-
19-
reconciliationIssuesFoundReason string = "IssuesFound"
2015
)
2116

2217
// errorWalkCallback processes an error. It returns an error to fail the walk.

pkg/cvo/status.go

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -411,25 +411,9 @@ func updateClusterVersionStatus(cvStatus *configv1.ClusterVersionStatus, status
411411
}
412412
}
413413

414-
oldRiCondition := resourcemerge.FindOperatorStatusCondition(cvStatus.Conditions, reconciliationIssuesConditionType)
415-
if enabledGates.ReconciliationIssuesCondition() || (oldRiCondition != nil && enabledGates.UnknownVersion()) {
416-
riCondition := configv1.ClusterOperatorStatusCondition{
417-
Type: reconciliationIssuesConditionType,
418-
Status: configv1.ConditionFalse,
419-
Reason: noReconciliationIssuesReason,
420-
Message: noReconciliationIssuesMessage,
421-
}
422-
if status.Failure != nil {
423-
message, err := reconciliationIssueFromError(status.Failure)
424-
if err != nil {
425-
message = err.Error()
426-
}
427-
riCondition.Status = configv1.ConditionTrue
428-
riCondition.Reason = reconciliationIssuesFoundReason
429-
riCondition.Message = message
430-
}
431-
resourcemerge.SetOperatorStatusCondition(&cvStatus.Conditions, riCondition)
432-
} else if oldRiCondition != nil {
414+
// Pre-GA 4.20 TechPreview clusters may have this condition and we need to remove it if it exists when updated to this version
415+
// TODO: Remove this code in 4.21
416+
if oldRiCondition := resourcemerge.FindOperatorStatusCondition(cvStatus.Conditions, reconciliationIssuesConditionType); oldRiCondition != nil {
433417
resourcemerge.RemoveOperatorStatusCondition(&cvStatus.Conditions, reconciliationIssuesConditionType)
434418
}
435419

pkg/cvo/status_test.go

Lines changed: 19 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -200,20 +200,15 @@ func TestOperator_syncFailingStatus(t *testing.T) {
200200
}
201201

202202
type fakeRiFlags struct {
203-
unknownVersion bool
204-
reconciliationIssuesCondition bool
205-
statusReleaseArchitecture bool
206-
cvoConfiguration bool
203+
unknownVersion bool
204+
statusReleaseArchitecture bool
205+
cvoConfiguration bool
207206
}
208207

209208
func (f fakeRiFlags) UnknownVersion() bool {
210209
return f.unknownVersion
211210
}
212211

213-
func (f fakeRiFlags) ReconciliationIssuesCondition() bool {
214-
return f.reconciliationIssuesCondition
215-
}
216-
217212
func (f fakeRiFlags) StatusReleaseArchitecture() bool {
218213
return f.statusReleaseArchitecture
219214
}
@@ -222,59 +217,46 @@ func (f fakeRiFlags) CVOConfiguration() bool {
222217
return f.cvoConfiguration
223218
}
224219

225-
func TestUpdateClusterVersionStatus_UnknownVersionAndReconciliationIssues(t *testing.T) {
226-
ignoreLastTransitionTime := cmpopts.IgnoreFields(configv1.ClusterOperatorStatusCondition{}, "LastTransitionTime")
227-
220+
// TODO: Can be removed in 4.21
221+
func TestUpdateClusterVersionStatus_AlwaysRemove_ReconciliationIssues(t *testing.T) {
228222
testCases := []struct {
229223
name string
230224

231225
unknownVersion bool
232226
oldCondition *configv1.ClusterOperatorStatusCondition
233227
failure error
234-
235-
expectedRiCondition *configv1.ClusterOperatorStatusCondition
236228
}{
237229
{
238-
name: "ReconciliationIssues disabled, version known, no failure => condition not present",
239-
unknownVersion: false,
240-
expectedRiCondition: nil,
230+
name: "version known, no failure => condition not present",
231+
unknownVersion: false,
241232
},
242233
{
243-
name: "ReconciliationIssues disabled, version known, failure => condition not present",
244-
unknownVersion: false,
245-
failure: fmt.Errorf("Something happened"),
246-
expectedRiCondition: nil,
234+
name: "version known, failure => condition not present",
235+
unknownVersion: false,
236+
failure: fmt.Errorf("something happened"),
247237
},
248238
{
249-
name: "ReconciliationIssues disabled, version unknown, failure, existing condition => condition present",
239+
name: "version unknown, failure, existing condition => condition present",
250240
oldCondition: &configv1.ClusterOperatorStatusCondition{
251241
Type: reconciliationIssuesConditionType,
252242
Status: configv1.ConditionFalse,
253-
Reason: noReconciliationIssuesReason,
243+
Reason: "noReconciliationIssuesReason",
254244
Message: "Happy condition is happy",
255245
},
256246
unknownVersion: true,
257-
failure: fmt.Errorf("Something happened"),
258-
expectedRiCondition: &configv1.ClusterOperatorStatusCondition{
259-
Type: reconciliationIssuesConditionType,
260-
Status: configv1.ConditionTrue,
261-
Reason: reconciliationIssuesFoundReason,
262-
Message: `{"message":"Something happened"}`,
263-
},
247+
failure: fmt.Errorf("something happened"),
264248
},
265249
{
266-
name: "ReconciliationIssues disabled, version unknown, failure, no existing condition => condition not present",
267-
unknownVersion: true,
268-
failure: fmt.Errorf("Something happened"),
269-
expectedRiCondition: nil,
250+
name: "version unknown, failure, no existing condition => condition not present",
251+
unknownVersion: true,
252+
failure: fmt.Errorf("something happened"),
270253
},
271254
}
272255
for _, tc := range testCases {
273256
tc := tc
274257
t.Run(tc.name, func(t *testing.T) {
275258
gates := fakeRiFlags{
276-
unknownVersion: tc.unknownVersion,
277-
reconciliationIssuesCondition: false,
259+
unknownVersion: tc.unknownVersion,
278260
}
279261
release := configv1.Release{}
280262
getAvailableUpdates := func() *availableUpdates { return nil }
@@ -285,80 +267,15 @@ func TestUpdateClusterVersionStatus_UnknownVersionAndReconciliationIssues(t *tes
285267
}
286268
updateClusterVersionStatus(&cvStatus, &SyncWorkerStatus{Failure: tc.failure}, release, getAvailableUpdates, gates, noErrors)
287269
condition := resourcemerge.FindOperatorStatusCondition(cvStatus.Conditions, reconciliationIssuesConditionType)
288-
if diff := cmp.Diff(tc.expectedRiCondition, condition, ignoreLastTransitionTime); diff != "" {
289-
t.Errorf("unexpected condition\n:%s", diff)
270+
if condition != nil {
271+
t.Errorf("expected condition %s to not be present, but it was: %v", reconciliationIssuesConditionType, condition)
290272
}
291273
})
292274

293275
}
294276

295277
}
296278

297-
func TestUpdateClusterVersionStatus_ReconciliationIssues(t *testing.T) {
298-
ignoreLastTransitionTime := cmpopts.IgnoreFields(configv1.ClusterOperatorStatusCondition{}, "LastTransitionTime")
299-
300-
testCases := []struct {
301-
name string
302-
syncWorkerStatus SyncWorkerStatus
303-
304-
enabled bool
305-
306-
expectedCondition *configv1.ClusterOperatorStatusCondition
307-
}{
308-
{
309-
name: "ReconciliationIssues present and happy when gate is enabled and no failures happened",
310-
syncWorkerStatus: SyncWorkerStatus{},
311-
enabled: true,
312-
expectedCondition: &configv1.ClusterOperatorStatusCondition{
313-
Type: reconciliationIssuesConditionType,
314-
Status: configv1.ConditionFalse,
315-
Reason: noReconciliationIssuesReason,
316-
Message: noReconciliationIssuesMessage,
317-
},
318-
},
319-
{
320-
name: "ReconciliationIssues present and unhappy when gate is enabled and failures happened",
321-
syncWorkerStatus: SyncWorkerStatus{
322-
Failure: fmt.Errorf("Something happened"),
323-
},
324-
enabled: true,
325-
expectedCondition: &configv1.ClusterOperatorStatusCondition{
326-
Type: reconciliationIssuesConditionType,
327-
Status: configv1.ConditionTrue,
328-
Reason: reconciliationIssuesFoundReason,
329-
Message: `{"message":"Something happened"}`,
330-
},
331-
},
332-
{
333-
name: "ReconciliationIssues not present when gate is enabled and failures happened",
334-
syncWorkerStatus: SyncWorkerStatus{
335-
Failure: fmt.Errorf("Something happened"),
336-
},
337-
enabled: false,
338-
expectedCondition: nil,
339-
},
340-
}
341-
342-
for _, tc := range testCases {
343-
tc := tc
344-
t.Run(tc.name, func(t *testing.T) {
345-
gates := fakeRiFlags{
346-
unknownVersion: false,
347-
reconciliationIssuesCondition: tc.enabled,
348-
}
349-
release := configv1.Release{}
350-
getAvailableUpdates := func() *availableUpdates { return nil }
351-
var noErrors field.ErrorList
352-
cvStatus := configv1.ClusterVersionStatus{}
353-
updateClusterVersionStatus(&cvStatus, &tc.syncWorkerStatus, release, getAvailableUpdates, gates, noErrors)
354-
condition := resourcemerge.FindOperatorStatusCondition(cvStatus.Conditions, reconciliationIssuesConditionType)
355-
if diff := cmp.Diff(tc.expectedCondition, condition, ignoreLastTransitionTime); diff != "" {
356-
t.Errorf("unexpected condition\n:%s", diff)
357-
}
358-
})
359-
}
360-
}
361-
362279
func TestUpdateClusterVersionStatus_FilteringMultipleErrorsForFailingCondition(t *testing.T) {
363280
ignoreLastTransitionTime := cmpopts.IgnoreFields(configv1.ClusterOperatorStatusCondition{}, "LastTransitionTime")
364281
type args struct {

pkg/featuregates/featuregates.go

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,6 @@ type CvoGateChecker interface {
2828
// to restart when the flags change.
2929
UnknownVersion() bool
3030

31-
// ReconciliationIssuesCondition controls whether CVO maintains a Condition with
32-
// ReconciliationIssues type, containing a JSON that describes all "issues" that prevented
33-
// or delayed CVO from reconciling individual resources in the cluster. This is a pseudo-API
34-
// that the experimental work for "oc adm upgrade status" uses to report upgrade status, and
35-
// should never be relied upon by any production code. We may want to eventually turn this into
36-
// some kind of "real" API.
37-
ReconciliationIssuesCondition() bool
38-
3931
// StatusReleaseArchitecture controls whether CVO populates
4032
// Release.Architecture in status properties like status.desired and status.history[].
4133
StatusReleaseArchitecture() bool
@@ -54,14 +46,9 @@ type CvoGates struct {
5446
desiredVersion string
5547

5648
// individual flags mirror the CvoGateChecker interface
57-
unknownVersion bool
58-
reconciliationIssuesCondition bool
59-
statusReleaseArchitecture bool
60-
cvoConfiguration bool
61-
}
62-
63-
func (c CvoGates) ReconciliationIssuesCondition() bool {
64-
return c.reconciliationIssuesCondition
49+
unknownVersion bool
50+
statusReleaseArchitecture bool
51+
cvoConfiguration bool
6552
}
6653

6754
func (c CvoGates) StatusReleaseArchitecture() bool {
@@ -79,11 +66,10 @@ func (c CvoGates) CVOConfiguration() bool {
7966
// DefaultCvoGates apply when actual features for given version are unknown
8067
func DefaultCvoGates(version string) CvoGates {
8168
return CvoGates{
82-
desiredVersion: version,
83-
unknownVersion: true,
84-
reconciliationIssuesCondition: false,
85-
statusReleaseArchitecture: false,
86-
cvoConfiguration: false,
69+
desiredVersion: version,
70+
unknownVersion: true,
71+
statusReleaseArchitecture: false,
72+
cvoConfiguration: false,
8773
}
8874
}
8975

@@ -101,8 +87,6 @@ func CvoGatesFromFeatureGate(gate *configv1.FeatureGate, version string) CvoGate
10187
enabledGates.unknownVersion = false
10288
for _, enabled := range g.Enabled {
10389
switch enabled.Name {
104-
case features.FeatureGateUpgradeStatus:
105-
enabledGates.reconciliationIssuesCondition = true
10690
case features.FeatureGateImageStreamImportMode:
10791
enabledGates.statusReleaseArchitecture = true
10892
case features.FeatureGateCVOConfiguration:
@@ -111,8 +95,6 @@ func CvoGatesFromFeatureGate(gate *configv1.FeatureGate, version string) CvoGate
11195
}
11296
for _, disabled := range g.Disabled {
11397
switch disabled.Name {
114-
case features.FeatureGateUpgradeStatus:
115-
enabledGates.reconciliationIssuesCondition = false
11698
case features.FeatureGateImageStreamImportMode:
11799
enabledGates.statusReleaseArchitecture = false
118100
case features.FeatureGateCVOConfiguration:

0 commit comments

Comments
 (0)