Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions api/v1/clusterextension_types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import (
"github.com/operator-framework/operator-controller/internal/operator-controller/conditionsets"
)

// TODO Expand these tests to cover Types/Reasons/etc. from other APIs as well

func TestClusterExtensionTypeRegistration(t *testing.T) {
types, err := parseConstants("Type")
if err != nil {
Expand Down
19 changes: 18 additions & 1 deletion api/v1/clusterextensionrevision_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,24 @@ import (
"k8s.io/apimachinery/pkg/types"
)

const ClusterExtensionRevisionKind = "ClusterExtensionRevision"
const (
ClusterExtensionRevisionKind = "ClusterExtensionRevision"

// Condition Types
ClusterExtensionRevisionTypeAvailable = "Available"
ClusterExtensionRevisionTypeSucceeded = "Succeeded"

// Condition Reasons
ClusterExtensionRevisionReasonAvailable = "Available"
ClusterExtensionRevisionReasonReconcileFailure = "ReconcileFailure"
ClusterExtensionRevisionReasonRevisionValidationFailure = "RevisionValidationFailure"
ClusterExtensionRevisionReasonPhaseValidationError = "PhaseValidationError"
ClusterExtensionRevisionReasonObjectCollisions = "ObjectCollisions"
ClusterExtensionRevisionReasonRolloutSuccess = "RolloutSuccess"
ClusterExtensionRevisionReasonProbeFailure = "ProbeFailure"
ClusterExtensionRevisionReasonIncomplete = "Incomplete"
ClusterExtensionRevisionReasonProgressing = "Progressing"
)

// ClusterExtensionRevisionSpec defines the desired state of ClusterExtensionRevision.
type ClusterExtensionRevisionSpec struct {
Expand Down
7 changes: 3 additions & 4 deletions internal/operator-controller/applier/boxcutter.go
Original file line number Diff line number Diff line change
Expand Up @@ -199,10 +199,9 @@ func (bc *Boxcutter) apply(ctx context.Context, contentFS fs.FS, ext *ocv1.Clust

// TODO: Delete archived previous revisions over a certain revision limit

// TODO: Define constants for the ClusterExtensionRevision condition types.
progressingCondition := meta.FindStatusCondition(currentRevision.Status.Conditions, "Progressing")
availableCondition := meta.FindStatusCondition(currentRevision.Status.Conditions, "Available")
succeededCondition := meta.FindStatusCondition(currentRevision.Status.Conditions, "Succeeded")
progressingCondition := meta.FindStatusCondition(currentRevision.Status.Conditions, ocv1.TypeProgressing)
availableCondition := meta.FindStatusCondition(currentRevision.Status.Conditions, ocv1.ClusterExtensionRevisionTypeAvailable)
succeededCondition := meta.FindStatusCondition(currentRevision.Status.Conditions, ocv1.ClusterExtensionRevisionTypeSucceeded)

if progressingCondition == nil && availableCondition == nil && succeededCondition == nil {
return false, "New revision created", nil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -557,8 +557,7 @@ func (d *BoxcutterRevisionStatesGetter) GetRevisionStates(ctx context.Context, e
},
}

// TODO: we should make constants for the ClusterExtensionRevision condition types.
if installedCondition := apimeta.FindStatusCondition(rev.Status.Conditions, "Succeeded"); installedCondition == nil || installedCondition.Status != metav1.ConditionTrue {
if installedCondition := apimeta.FindStatusCondition(rev.Status.Conditions, ocv1.ClusterExtensionRevisionTypeSucceeded); installedCondition == nil || installedCondition.Status != metav1.ConditionTrue {
rs.RollingOut = append(rs.RollingOut, rm)
} else {
rs.Installed = rm
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,9 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, rev
tres, err := c.RevisionEngine.Teardown(ctx, *revision)
if err != nil {
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
Type: "Available",
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
Status: metav1.ConditionFalse,
Reason: "ReconcileFailure",
Reason: ocv1.ClusterExtensionRevisionReasonReconcileFailure,
Message: err.Error(),
ObservedGeneration: rev.Generation,
})
Expand All @@ -108,9 +108,9 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, rev

if err := c.TrackingCache.Free(ctx, rev); err != nil {
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
Type: "Available",
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
Status: metav1.ConditionFalse,
Reason: "ReconcileFailure",
Reason: ocv1.ClusterExtensionRevisionReasonReconcileFailure,
Message: err.Error(),
ObservedGeneration: rev.Generation,
})
Expand All @@ -124,19 +124,19 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, rev
//
if err := c.ensureFinalizer(ctx, rev, clusterExtensionRevisionTeardownFinalizer); err != nil {
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
Type: "Available",
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
Status: metav1.ConditionFalse,
Reason: "ReconcileFailure",
Reason: ocv1.ClusterExtensionRevisionReasonReconcileFailure,
Message: err.Error(),
ObservedGeneration: rev.Generation,
})
return ctrl.Result{}, fmt.Errorf("ensure finalizer: %w", errors.Join(err, c.Client.Status().Update(ctx, rev)))
}
if err := c.establishWatch(ctx, rev, revision); err != nil {
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
Type: "Available",
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
Status: metav1.ConditionFalse,
Reason: "ReconcileFailure",
Reason: ocv1.ClusterExtensionRevisionReasonReconcileFailure,
Message: err.Error(),
ObservedGeneration: rev.Generation,
})
Expand All @@ -145,9 +145,9 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, rev
rres, err := c.RevisionEngine.Reconcile(ctx, *revision, opts...)
if err != nil {
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
Type: "Available",
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
Status: metav1.ConditionFalse,
Reason: "ReconcileFailure",
Reason: ocv1.ClusterExtensionRevisionReasonReconcileFailure,
Message: err.Error(),
ObservedGeneration: rev.Generation,
})
Expand All @@ -160,9 +160,9 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, rev
if verr := rres.GetValidationError(); verr != nil {
l.Info("preflight error, retrying after 10s", "err", verr.String())
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
Type: "Available",
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
Status: metav1.ConditionFalse,
Reason: "RevisionValidationFailure",
Reason: ocv1.ClusterExtensionRevisionReasonRevisionValidationFailure,
Message: fmt.Sprintf("revision validation error: %s", verr),
ObservedGeneration: rev.Generation,
})
Expand All @@ -172,9 +172,9 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, rev
if verr := pres.GetValidationError(); verr != nil {
l.Info("preflight error, retrying after 10s", "err", verr.String())
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
Type: "Available",
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
Status: metav1.ConditionFalse,
Reason: "PhaseValidationError",
Reason: ocv1.ClusterExtensionRevisionReasonPhaseValidationError,
Message: fmt.Sprintf("phase %d validation error: %s", i, verr),
ObservedGeneration: rev.Generation,
})
Expand All @@ -189,9 +189,9 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, rev
if len(collidingObjs) > 0 {
l.Info("object collision error, retrying after 10s", "collisions", collidingObjs)
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
Type: "Available",
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
Status: metav1.ConditionFalse,
Reason: "ObjectCollisions",
Reason: ocv1.ClusterExtensionRevisionReasonObjectCollisions,
Message: fmt.Sprintf("revision object collisions in phase %d\n%s", i, strings.Join(collidingObjs, "\n\n")),
ObservedGeneration: rev.Generation,
})
Expand All @@ -211,17 +211,17 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, rev

// Report status.
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
Type: "Available",
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
Status: metav1.ConditionTrue,
Reason: "Available",
Reason: ocv1.ClusterExtensionRevisionReasonAvailable,
Message: "Object is available and passes all probes.",
ObservedGeneration: rev.Generation,
})
if !meta.IsStatusConditionTrue(rev.Status.Conditions, "Succeeded") {
if !meta.IsStatusConditionTrue(rev.Status.Conditions, ocv1.ClusterExtensionRevisionTypeSucceeded) {
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
Type: "Succeeded",
Type: ocv1.ClusterExtensionRevisionTypeSucceeded,
Status: metav1.ConditionTrue,
Reason: "RolloutSuccess",
Reason: ocv1.ClusterExtensionRevisionReasonRolloutSuccess,
Message: "Revision succeeded rolling out.",
ObservedGeneration: rev.Generation,
})
Expand Down Expand Up @@ -250,32 +250,32 @@ func (c *ClusterExtensionRevisionReconciler) reconcile(ctx context.Context, rev
}
if len(probeFailureMsgs) > 0 {
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
Type: "Available",
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
Status: metav1.ConditionFalse,
Reason: "ProbeFailure",
Reason: ocv1.ClusterExtensionRevisionReasonProbeFailure,
Message: strings.Join(probeFailureMsgs, "\n"),
ObservedGeneration: rev.Generation,
})
} else {
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
Type: "Available",
Type: ocv1.ClusterExtensionRevisionTypeAvailable,
Status: metav1.ConditionFalse,
Reason: "Incomplete",
Reason: ocv1.ClusterExtensionRevisionReasonIncomplete,
Message: "Revision has not been rolled out completely.",
ObservedGeneration: rev.Generation,
})
}
}
if rres.InTransistion() {
meta.SetStatusCondition(&rev.Status.Conditions, metav1.Condition{
Type: "Progressing",
Type: ocv1.TypeProgressing,
Status: metav1.ConditionTrue,
Reason: "Progressing",
Reason: ocv1.ClusterExtensionRevisionReasonProgressing,
Message: "Rollout in progress.",
ObservedGeneration: rev.Generation,
})
} else {
meta.RemoveStatusCondition(&rev.Status.Conditions, "Progressing")
meta.RemoveStatusCondition(&rev.Status.Conditions, ocv1.TypeProgressing)
}

return ctrl.Result{}, c.Client.Status().Update(ctx, rev)
Expand Down Expand Up @@ -412,7 +412,7 @@ func toBoxcutterRevision(rev *ocv1.ClusterExtensionRevision) (*boxcutter.Revisio
return false, []string{".status.observedGeneration outdated"}
}
for _, cond := range depl.Status.Conditions {
if cond.Type == "Available" &&
if cond.Type == ocv1.ClusterExtensionRevisionTypeAvailable &&
cond.Status == corev1.ConditionTrue &&
depl.Status.UpdatedReplicas == *depl.Spec.Replicas {
return true, nil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,10 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionProgression(t *te
Name: clusterExtensionRevisionName,
}, rev)
require.NoError(t, err)
cond := meta.FindStatusCondition(rev.Status.Conditions, "Available")
cond := meta.FindStatusCondition(rev.Status.Conditions, ocv1.ClusterExtensionRevisionTypeAvailable)
require.NotNil(t, cond)
require.Equal(t, metav1.ConditionFalse, cond.Status)
require.Equal(t, "Incomplete", cond.Reason)
require.Equal(t, ocv1.ClusterExtensionRevisionReasonIncomplete, cond.Reason)
require.Equal(t, "Revision has not been rolled out completely.", cond.Message)
require.Equal(t, int64(1), cond.ObservedGeneration)
},
Expand Down Expand Up @@ -166,10 +166,10 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionProgression(t *te
Name: clusterExtensionRevisionName,
}, rev)
require.NoError(t, err)
cond := meta.FindStatusCondition(rev.Status.Conditions, "Available")
cond := meta.FindStatusCondition(rev.Status.Conditions, ocv1.ClusterExtensionRevisionTypeAvailable)
require.NotNil(t, cond)
require.Equal(t, metav1.ConditionFalse, cond.Status)
require.Equal(t, "ProbeFailure", cond.Reason)
require.Equal(t, ocv1.ClusterExtensionRevisionReasonProbeFailure, cond.Reason)
require.Equal(t, "Object Service.v1 my-namespace/my-service: something bad happened and something worse happened\nObject ConfigMap.v1 my-namespace/my-configmap: we have a problem", cond.Message)
require.Equal(t, int64(1), cond.ObservedGeneration)
},
Expand All @@ -191,10 +191,10 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionProgression(t *te
Name: clusterExtensionRevisionName,
}, rev)
require.NoError(t, err)
cond := meta.FindStatusCondition(rev.Status.Conditions, "Progressing")
cond := meta.FindStatusCondition(rev.Status.Conditions, ocv1.TypeProgressing)
require.NotNil(t, cond)
require.Equal(t, metav1.ConditionTrue, cond.Status)
require.Equal(t, "Progressing", cond.Reason)
require.Equal(t, ocv1.ClusterExtensionRevisionReasonProgressing, cond.Reason)
require.Equal(t, "Rollout in progress.", cond.Message)
require.Equal(t, int64(1), cond.ObservedGeneration)
},
Expand All @@ -209,9 +209,9 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionProgression(t *te
rev1 := newTestClusterExtensionRevision(clusterExtensionRevisionName)
require.NoError(t, controllerutil.SetControllerReference(ext, rev1, testScheme))
meta.SetStatusCondition(&rev1.Status.Conditions, metav1.Condition{
Type: "Progressing",
Type: ocv1.TypeProgressing,
Status: metav1.ConditionTrue,
Reason: "Progressing",
Reason: ocv1.ClusterExtensionRevisionReasonProgressing,
Message: "some message",
ObservedGeneration: 1,
})
Expand All @@ -223,7 +223,7 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionProgression(t *te
Name: clusterExtensionRevisionName,
}, rev)
require.NoError(t, err)
cond := meta.FindStatusCondition(rev.Status.Conditions, "Progressing")
cond := meta.FindStatusCondition(rev.Status.Conditions, ocv1.TypeProgressing)
require.Nil(t, cond)
},
},
Expand All @@ -244,17 +244,17 @@ func Test_ClusterExtensionRevisionReconciler_Reconcile_RevisionProgression(t *te
Name: clusterExtensionRevisionName,
}, rev)
require.NoError(t, err)
cond := meta.FindStatusCondition(rev.Status.Conditions, "Available")
cond := meta.FindStatusCondition(rev.Status.Conditions, ocv1.ClusterExtensionRevisionTypeAvailable)
require.NotNil(t, cond)
require.Equal(t, metav1.ConditionTrue, cond.Status)
require.Equal(t, "Available", cond.Reason)
require.Equal(t, ocv1.ClusterExtensionRevisionReasonAvailable, cond.Reason)
require.Equal(t, "Object is available and passes all probes.", cond.Message)
require.Equal(t, int64(1), cond.ObservedGeneration)

cond = meta.FindStatusCondition(rev.Status.Conditions, "Succeeded")
cond = meta.FindStatusCondition(rev.Status.Conditions, ocv1.ClusterExtensionRevisionTypeSucceeded)
require.NotNil(t, cond)
require.Equal(t, metav1.ConditionTrue, cond.Status)
require.Equal(t, "RolloutSuccess", cond.Reason)
require.Equal(t, ocv1.ClusterExtensionRevisionReasonRolloutSuccess, cond.Reason)
require.Equal(t, "Revision succeeded rolling out.", cond.Message)
require.Equal(t, int64(1), cond.ObservedGeneration)
},
Expand Down
Loading