Skip to content

Commit

Permalink
PTEUDO-2183: Add new status condition for dbc with implicitly version…
Browse files Browse the repository at this point in the history
…ing (#399)

* PTEUDO-2183: add no db version condition

* PTEUDO-2183: remove status cond when dbVersion is present

* Update pkg/databaseclaim/claimstatus.go

Co-authored-by: Drew Wells <[email protected]>

---------

Co-authored-by: Drew Wells <[email protected]>
  • Loading branch information
bfabricio and drewwells authored Jan 27, 2025
1 parent d869227 commit b41fb22
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 2 deletions.
12 changes: 11 additions & 1 deletion api/v1/condition.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func DatabaseReadyCondition() metav1.Condition {
ConditionSync,
metav1.ConditionTrue,
ReasonAvailable,
"Database is provisioned.",
"Database is provisioned",
)
}

Expand Down Expand Up @@ -108,3 +108,13 @@ func ReconcileSuccessCondition() metav1.Condition {
"Database successfully synchronized and ready for use",
)
}

// NoDbVersionStatus reflect whether a DatabaseClaim is using an implied older version and should specify its version in .spec.dbVersion
func NoDbVersionStatus() metav1.Condition {
return CreateCondition(
ReasonNeedsMigrate,
metav1.ConditionTrue,
ReasonAvailable,
"No database version specified",
)
}
29 changes: 29 additions & 0 deletions pkg/databaseclaim/claimstatus.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,16 @@ func (m *StatusManager) SetStatusCondition(ctx context.Context, dbClaim *v1.Data
dbClaim.Status.Conditions = append(dbClaim.Status.Conditions, condition)
}

func (m *StatusManager) RemoveConditionByType(dbClaim *v1.DatabaseClaim, conditionType string) {
var newConditions []metav1.Condition
for _, cond := range dbClaim.Status.Conditions {
if cond.Type != conditionType {
newConditions = append(newConditions, cond)
}
}
dbClaim.Status.Conditions = newConditions
}

func (m *StatusManager) SetConditionAndUpdateStatus(ctx context.Context, dbClaim *v1.DatabaseClaim, condition metav1.Condition) error {
m.SetStatusCondition(ctx, dbClaim, condition)

Expand Down Expand Up @@ -212,3 +222,22 @@ func (m *StatusManager) MigrationInProgressStatus(ctx context.Context, dbClaim *
err := m.UpdateStatus(ctx, dbClaim)
return ctrl.Result{Requeue: true}, err
}

// ActiveDBSuccessReconcile clears the error status and determines if the DB version is explicitly
// defined.
func (m *StatusManager) ActiveDBSuccessReconcile(ctx context.Context, dbClaim *v1.DatabaseClaim) (reconcile.Result, error) {
result, err := m.SuccessAndUpdateCondition(ctx, dbClaim)
if err != nil {
return ctrl.Result{}, err
}

if dbClaim.Status.ActiveDB.DbState == v1.Ready && dbClaim.Spec.DBVersion == "" {
if err := m.SetConditionAndUpdateStatus(ctx, dbClaim, v1.NoDbVersionStatus()); err != nil {
return result, err
}
} else {
m.RemoveConditionByType(dbClaim, v1.NoDbVersionStatus().Type)
}

return result, err
}
69 changes: 69 additions & 0 deletions pkg/databaseclaim/claimstatus_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,3 +185,72 @@ func TestUpdateUserStatus(t *testing.T) {
t.Errorf("expected ConnectionInfoUpdatedAt to be set, got nil")
}
}

func TestActiveDBSuccessReconcile(t *testing.T) {
ctx := context.TODO()
manager := &StatusManager{
client: &role.MockClient{},
}

t.Run("Set NoDbVersionStatus when DBVersion is empty", func(t *testing.T) {
dbClaim := &v1.DatabaseClaim{
Spec: v1.DatabaseClaimSpec{
DBVersion: "",
},
Status: v1.DatabaseClaimStatus{
ActiveDB: v1.Status{
DbState: v1.Ready,
},
Conditions: []metav1.Condition{},
},
}

_, err := manager.ActiveDBSuccessReconcile(ctx, dbClaim)
if err != nil {
t.Errorf("expected error to be nil but got %v", err)
}

found := false
for _, cond := range dbClaim.Status.Conditions {
if cond.Type == v1.NoDbVersionStatus().Type {
found = true
break
}
}
if !found {
t.Errorf("expected to find no db version status condition")
}
})

t.Run("NoDbVersionStatus is not present when dbVersion is specified", func(t *testing.T) {
dbClaim := &v1.DatabaseClaim{
Spec: v1.DatabaseClaimSpec{
DBVersion: "12.1",
},
Status: v1.DatabaseClaimStatus{
ActiveDB: v1.Status{
DbState: v1.Ready,
},
Conditions: []metav1.Condition{
v1.NoDbVersionStatus(),
},
},
}

_, err := manager.ActiveDBSuccessReconcile(ctx, dbClaim)
if err != nil {
t.Errorf("expected error to be nil but got %v", err)
}

found := false
for _, cond := range dbClaim.Status.Conditions {
if cond.Type == v1.NoDbVersionStatus().Type {
found = true
break
}
}
if found {
t.Errorf("status conditions should not have been present")
}
})
}
2 changes: 1 addition & 1 deletion pkg/databaseclaim/databaseclaim.go
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,7 @@ func (r *DatabaseClaimReconciler) executeDbClaimRequest(ctx context.Context, req
}
dbClaim.Status.NewDB = v1.Status{}

return r.statusManager.SuccessAndUpdateCondition(ctx, dbClaim)
return r.statusManager.ActiveDBSuccessReconcile(ctx, dbClaim)
}

logr.Error(fmt.Errorf("unhandled mode: %v", operationMode), "unhandled mode")
Expand Down

0 comments on commit b41fb22

Please sign in to comment.