Skip to content

Commit a0dc469

Browse files
Persist deprecation conditions
- leave BundleDeprecated at Unknown/Absent when nothing installs - flip package/channel/bundle to True/Deprecated when the catalog says so - keep the conditions at False/NotDeprecated (empty message) when no warnings exist Assisted-by: Cursor
1 parent e3849c7 commit a0dc469

4 files changed

Lines changed: 72 additions & 36 deletions

File tree

api/v1/common_types.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ const (
2929
ReasonBlocked = "Blocked"
3030

3131
// Deprecation reasons
32-
ReasonDeprecated = "Deprecated"
32+
ReasonDeprecated = "Deprecated"
33+
ReasonNotDeprecated = "NotDeprecated"
3334

3435
// Common reasons
3536
ReasonSucceeded = "Succeeded"

internal/operator-controller/conditionsets/conditionsets.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ var ConditionTypes = []string{
3636
var ConditionReasons = []string{
3737
ocv1.ReasonSucceeded,
3838
ocv1.ReasonDeprecated,
39+
ocv1.ReasonNotDeprecated,
3940
ocv1.ReasonFailed,
4041
ocv1.ReasonBlocked,
4142
ocv1.ReasonRetrying,

internal/operator-controller/controllers/clusterextension_controller.go

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -355,9 +355,15 @@ type DeprecationInfo struct {
355355

356356
// SetDeprecationStatus updates the ClusterExtension deprecation conditions using the
357357
// catalog data from resolve plus the name of the bundle that actually landed. Examples:
358-
// - no bundle installed -> bundle status stays Unknown/Absent
359-
// - installed bundle marked deprecated -> bundle status True/Deprecated
360-
// - installed bundle not deprecated -> bundle status False/Deprecated
358+
// - No bundle installed -> BundleDeprecated stays Unknown/Absent (ReasonAbsent) because we
359+
// cannot judge a bundle that never landed.
360+
// - Catalog marks the package or one of the requested channels deprecated -> the matching
361+
// conditions flip to Status=True and Reason=Deprecated, with the catalog's message.
362+
// - Catalog marks the installed bundle deprecated -> BundleDeprecated becomes Status=True
363+
// and Reason=Deprecated, again echoing the catalog message.
364+
// - Catalog says nothing about a particular level (package/channel/bundle) -> that condition
365+
// stays Status=False with Reason=NotDeprecated and an empty message so users can rely on
366+
// the field existing even when everything is healthy.
361367
//
362368
// This keeps the deprecation conditions focused on catalog information:
363369
// - PackageDeprecated: true if the catalog marks the package deprecated
@@ -379,39 +385,67 @@ func SetDeprecationStatus(ext *ocv1.ClusterExtension, installedBundleName string
379385
messages = slices.Concat(messages, bundleMessages)
380386

381387
status := metav1.ConditionFalse
388+
reason := ocv1.ReasonNotDeprecated
389+
message := ""
382390
if len(messages) > 0 {
383391
status = metav1.ConditionTrue
392+
reason = ocv1.ReasonDeprecated
393+
message = strings.Join(messages, "\n")
384394
}
385395

386396
SetStatusCondition(&ext.Status.Conditions, metav1.Condition{
387397
Type: ocv1.TypeDeprecated,
388398
Status: status,
389-
Reason: ocv1.ReasonDeprecated,
390-
Message: strings.Join(messages, "\n"),
399+
Reason: reason,
400+
Message: message,
391401
ObservedGeneration: ext.GetGeneration(),
392402
})
393403

404+
packageStatus := conditionStatus(len(packageMessages) > 0)
405+
packageReason := ocv1.ReasonNotDeprecated
406+
packageMessage := ""
407+
if packageStatus == metav1.ConditionTrue {
408+
packageReason = ocv1.ReasonDeprecated
409+
packageMessage = strings.Join(packageMessages, "\n")
410+
}
411+
394412
SetStatusCondition(&ext.Status.Conditions, metav1.Condition{
395413
Type: ocv1.TypePackageDeprecated,
396-
Status: conditionStatus(len(packageMessages) > 0),
397-
Reason: ocv1.ReasonDeprecated,
398-
Message: strings.Join(packageMessages, "\n"),
414+
Status: packageStatus,
415+
Reason: packageReason,
416+
Message: packageMessage,
399417
ObservedGeneration: ext.GetGeneration(),
400418
})
401419

420+
channelStatus := conditionStatus(len(channelMessages) > 0)
421+
channelReason := ocv1.ReasonNotDeprecated
422+
channelMessage := ""
423+
if channelStatus == metav1.ConditionTrue {
424+
channelReason = ocv1.ReasonDeprecated
425+
channelMessage = strings.Join(channelMessages, "\n")
426+
}
427+
402428
SetStatusCondition(&ext.Status.Conditions, metav1.Condition{
403429
Type: ocv1.TypeChannelDeprecated,
404-
Status: conditionStatus(len(channelMessages) > 0),
405-
Reason: ocv1.ReasonDeprecated,
406-
Message: strings.Join(channelMessages, "\n"),
430+
Status: channelStatus,
431+
Reason: channelReason,
432+
Message: channelMessage,
407433
ObservedGeneration: ext.GetGeneration(),
408434
})
409435

410-
bundleReason := ocv1.ReasonDeprecated
411-
bundleMessage := strings.Join(bundleMessages, "\n")
412-
if info.BundleStatus == metav1.ConditionUnknown {
436+
var bundleReason string
437+
var bundleMessage string
438+
439+
switch info.BundleStatus {
440+
case metav1.ConditionTrue:
441+
bundleReason = ocv1.ReasonDeprecated
442+
bundleMessage = strings.Join(bundleMessages, "\n")
443+
case metav1.ConditionUnknown:
413444
bundleReason = ocv1.ReasonAbsent
414445
bundleMessage = ""
446+
default:
447+
bundleReason = ocv1.ReasonNotDeprecated
448+
bundleMessage = ""
415449
}
416450

417451
SetStatusCondition(&ext.Status.Conditions, metav1.Condition{

internal/operator-controller/controllers/clusterextension_controller_test.go

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -321,15 +321,15 @@ func TestClusterExtensionResolutionSuccessfulUnpackFails(t *testing.T) {
321321
deprecatedCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1.TypeDeprecated)
322322
require.NotNil(t, deprecatedCond)
323323
require.Equal(t, metav1.ConditionFalse, deprecatedCond.Status)
324-
require.Equal(t, ocv1.ReasonDeprecated, deprecatedCond.Reason)
324+
require.Equal(t, ocv1.ReasonNotDeprecated, deprecatedCond.Reason)
325325
pkgCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1.TypePackageDeprecated)
326326
require.NotNil(t, pkgCond)
327327
require.Equal(t, metav1.ConditionFalse, pkgCond.Status)
328-
require.Equal(t, ocv1.ReasonDeprecated, pkgCond.Reason)
328+
require.Equal(t, ocv1.ReasonNotDeprecated, pkgCond.Reason)
329329
chanCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1.TypeChannelDeprecated)
330330
require.NotNil(t, chanCond)
331331
require.Equal(t, metav1.ConditionFalse, chanCond.Status)
332-
require.Equal(t, ocv1.ReasonDeprecated, chanCond.Reason)
332+
require.Equal(t, ocv1.ReasonNotDeprecated, chanCond.Reason)
333333
bundleCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1.TypeBundleDeprecated)
334334
require.NotNil(t, bundleCond)
335335
require.Equal(t, metav1.ConditionUnknown, bundleCond.Status)
@@ -418,15 +418,15 @@ func TestClusterExtensionResolutionAndUnpackSuccessfulApplierFails(t *testing.T)
418418
deprecatedCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1.TypeDeprecated)
419419
require.NotNil(t, deprecatedCond)
420420
require.Equal(t, metav1.ConditionFalse, deprecatedCond.Status)
421-
require.Equal(t, ocv1.ReasonDeprecated, deprecatedCond.Reason)
421+
require.Equal(t, ocv1.ReasonNotDeprecated, deprecatedCond.Reason)
422422
pkgCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1.TypePackageDeprecated)
423423
require.NotNil(t, pkgCond)
424424
require.Equal(t, metav1.ConditionFalse, pkgCond.Status)
425-
require.Equal(t, ocv1.ReasonDeprecated, pkgCond.Reason)
425+
require.Equal(t, ocv1.ReasonNotDeprecated, pkgCond.Reason)
426426
chanCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1.TypeChannelDeprecated)
427427
require.NotNil(t, chanCond)
428428
require.Equal(t, metav1.ConditionFalse, chanCond.Status)
429-
require.Equal(t, ocv1.ReasonDeprecated, chanCond.Reason)
429+
require.Equal(t, ocv1.ReasonNotDeprecated, chanCond.Reason)
430430
bundleCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1.TypeBundleDeprecated)
431431
require.NotNil(t, bundleCond)
432432
require.Equal(t, metav1.ConditionUnknown, bundleCond.Status)
@@ -505,19 +505,19 @@ func TestClusterExtensionBoxcutterApplierFailsDoesNotLeakDeprecationErrors(t *te
505505
deprecatedCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1.TypeDeprecated)
506506
require.NotNil(t, deprecatedCond)
507507
require.Equal(t, metav1.ConditionFalse, deprecatedCond.Status)
508-
require.Equal(t, ocv1.ReasonDeprecated, deprecatedCond.Reason)
508+
require.Equal(t, ocv1.ReasonNotDeprecated, deprecatedCond.Reason)
509509
require.Empty(t, deprecatedCond.Message)
510510

511511
packageCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1.TypePackageDeprecated)
512512
require.NotNil(t, packageCond)
513513
require.Equal(t, metav1.ConditionFalse, packageCond.Status, "catalog said nothing about the package, so stay False")
514-
require.Equal(t, ocv1.ReasonDeprecated, packageCond.Reason)
514+
require.Equal(t, ocv1.ReasonNotDeprecated, packageCond.Reason)
515515
require.Empty(t, packageCond.Message)
516516

517517
channelCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1.TypeChannelDeprecated)
518518
require.NotNil(t, channelCond)
519519
require.Equal(t, metav1.ConditionFalse, channelCond.Status, "channel also has no deprecation info")
520-
require.Equal(t, ocv1.ReasonDeprecated, channelCond.Reason)
520+
require.Equal(t, ocv1.ReasonNotDeprecated, channelCond.Reason)
521521
require.Empty(t, channelCond.Message)
522522

523523
bundleCond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1.TypeBundleDeprecated)
@@ -1052,19 +1052,19 @@ func TestSetDeprecationStatus(t *testing.T) {
10521052
Conditions: []metav1.Condition{
10531053
{
10541054
Type: ocv1.TypeDeprecated,
1055-
Reason: ocv1.ReasonDeprecated,
1055+
Reason: ocv1.ReasonNotDeprecated,
10561056
Status: metav1.ConditionFalse,
10571057
ObservedGeneration: 1,
10581058
},
10591059
{
10601060
Type: ocv1.TypePackageDeprecated,
1061-
Reason: ocv1.ReasonDeprecated,
1061+
Reason: ocv1.ReasonNotDeprecated,
10621062
Status: metav1.ConditionFalse,
10631063
ObservedGeneration: 1,
10641064
},
10651065
{
10661066
Type: ocv1.TypeChannelDeprecated,
1067-
Reason: ocv1.ReasonDeprecated,
1067+
Reason: ocv1.ReasonNotDeprecated,
10681068
Status: metav1.ConditionFalse,
10691069
ObservedGeneration: 1,
10701070
},
@@ -1110,19 +1110,19 @@ func TestSetDeprecationStatus(t *testing.T) {
11101110
Conditions: []metav1.Condition{
11111111
{
11121112
Type: ocv1.TypeDeprecated,
1113-
Reason: ocv1.ReasonDeprecated,
1113+
Reason: ocv1.ReasonNotDeprecated,
11141114
Status: metav1.ConditionFalse,
11151115
ObservedGeneration: 1,
11161116
},
11171117
{
11181118
Type: ocv1.TypePackageDeprecated,
1119-
Reason: ocv1.ReasonDeprecated,
1119+
Reason: ocv1.ReasonNotDeprecated,
11201120
Status: metav1.ConditionFalse,
11211121
ObservedGeneration: 1,
11221122
},
11231123
{
11241124
Type: ocv1.TypeChannelDeprecated,
1125-
Reason: ocv1.ReasonDeprecated,
1125+
Reason: ocv1.ReasonNotDeprecated,
11261126
Status: metav1.ConditionFalse,
11271127
ObservedGeneration: 1,
11281128
},
@@ -1179,19 +1179,19 @@ func TestSetDeprecationStatus(t *testing.T) {
11791179
Conditions: []metav1.Condition{
11801180
{
11811181
Type: ocv1.TypeDeprecated,
1182-
Reason: ocv1.ReasonDeprecated,
1182+
Reason: ocv1.ReasonNotDeprecated,
11831183
Status: metav1.ConditionFalse,
11841184
ObservedGeneration: 1,
11851185
},
11861186
{
11871187
Type: ocv1.TypePackageDeprecated,
1188-
Reason: ocv1.ReasonDeprecated,
1188+
Reason: ocv1.ReasonNotDeprecated,
11891189
Status: metav1.ConditionFalse,
11901190
ObservedGeneration: 1,
11911191
},
11921192
{
11931193
Type: ocv1.TypeChannelDeprecated,
1194-
Reason: ocv1.ReasonDeprecated,
1194+
Reason: ocv1.ReasonNotDeprecated,
11951195
Status: metav1.ConditionFalse,
11961196
ObservedGeneration: 1,
11971197
},
@@ -1256,7 +1256,7 @@ func TestSetDeprecationStatus(t *testing.T) {
12561256
},
12571257
{
12581258
Type: ocv1.TypePackageDeprecated,
1259-
Reason: ocv1.ReasonDeprecated,
1259+
Reason: ocv1.ReasonNotDeprecated,
12601260
Status: metav1.ConditionFalse,
12611261
ObservedGeneration: 1,
12621262
},
@@ -1413,7 +1413,7 @@ func TestSetDeprecationStatus(t *testing.T) {
14131413
},
14141414
{
14151415
Type: ocv1.TypePackageDeprecated,
1416-
Reason: ocv1.ReasonDeprecated,
1416+
Reason: ocv1.ReasonNotDeprecated,
14171417
Status: metav1.ConditionFalse,
14181418
ObservedGeneration: 1,
14191419
},
@@ -1570,7 +1570,7 @@ func TestSetDeprecationStatus(t *testing.T) {
15701570
},
15711571
{
15721572
Type: ocv1.TypePackageDeprecated,
1573-
Reason: ocv1.ReasonDeprecated,
1573+
Reason: ocv1.ReasonNotDeprecated,
15741574
Status: metav1.ConditionFalse,
15751575
ObservedGeneration: 1,
15761576
},

0 commit comments

Comments
 (0)