Skip to content

Commit

Permalink
Merge pull request #108 from pPrecel/deleted-condition
Browse files Browse the repository at this point in the history
implement condition `Deleted`
  • Loading branch information
kyma-bot authored May 30, 2023
2 parents 19fe950 + 1c8e4b6 commit 5e78c4c
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 87 deletions.
6 changes: 6 additions & 0 deletions api/v1alpha1/serverless_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,19 @@ const (
// prerequisites and soft dependencies
ConditionTypeConfigured = ConditionType("Configured")

// deletion
ConditionTypeDeleted = ConditionType("Deleted")

ConditionReasonConfigurationCheck = ConditionReason("ConfigurationCheck")
ConditionReasonConfigurationErr = ConditionReason("ConfigurationCheckErr")
ConditionReasonConfigured = ConditionReason("Configured")
ConditionReasonInstallation = ConditionReason("Installation")
ConditionReasonInstallationErr = ConditionReason("InstallationErr")
ConditionReasonInstalled = ConditionReason("Installed")
ConditionReasonServerlessDuplicated = ConditionReason("ServerlessDuplicated")
ConditionReasonDeletion = ConditionReason("Deletion")
ConditionReasonDeletionErr = ConditionReason("DeletionErr")
ConditionReasonDeleted = ConditionReason("Deleted")

Finalizer = "serverless-manager.kyma-project.io/deletion-hook"
)
Expand Down
3 changes: 2 additions & 1 deletion internal/chart/check.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"sigs.k8s.io/controller-runtime/pkg/client"
)

func CheckCRDOrphanResources(config *Config) error {
Expand All @@ -31,7 +32,7 @@ func CheckCRDOrphanResources(config *Config) error {
}

err = config.Cluster.Client.List(config.Ctx, &crList)
if err != nil {
if client.IgnoreNotFound(err) != nil {
return err
}

Expand Down
16 changes: 9 additions & 7 deletions internal/state/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,11 @@ const (
// delete serverless based on previously installed resources
func sFnDeleteResources() stateFn {
return func(ctx context.Context, r *reconciler, s *systemState) (stateFn, *ctrl.Result, error) {
if !s.instance.IsInState(v1alpha1.StateDeleting) {
if !s.instance.IsCondition(v1alpha1.ConditionTypeDeleted) {
return nextState(
sFnUpdateDeletingState(
"Deletion",
v1alpha1.ConditionTypeDeleted,
v1alpha1.ConditionReasonDeletion,
"Uninstalling",
),
)
Expand Down Expand Up @@ -65,8 +66,9 @@ func sFnSafeDeletionState(_ context.Context, r *reconciler, s *systemState) (sta
if err := chart.CheckCRDOrphanResources(s.chartConfig); err != nil {
// stop state machine with an error and requeue reconciliation in 1min
return nextState(
sFnUpdateDeletingErrorState(
"Deletion",
sFnUpdateErrorState(
v1alpha1.ConditionTypeDeleted,
v1alpha1.ConditionReasonDeletionErr,
err,
),
)
Expand All @@ -81,9 +83,9 @@ func deleteResourcesWithFilter(r *reconciler, s *systemState, filterFuncs ...cha
r.log.Warnf("error while uninstalling resource %s: %s",
client.ObjectKeyFromObject(&s.instance), err.Error())
return nextState(
sFnUpdateDeletingErrorState(

"Deletion",
sFnUpdateErrorState(
v1alpha1.ConditionTypeDeleted,
v1alpha1.ConditionReasonDeletionErr,
err,
),
)
Expand Down
21 changes: 16 additions & 5 deletions internal/state/delete_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,20 @@ import (
"github.com/kyma-project/serverless-manager/internal/chart"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

var (
testDeletingServerless = func() v1alpha1.Serverless {
serverless := testInstalledServerless
serverless.Status.State = v1alpha1.StateDeleting
serverless.Status.Conditions = []metav1.Condition{
{
Type: string(v1alpha1.ConditionTypeDeleted),
Reason: string(v1alpha1.ConditionReasonDeletion),
Status: metav1.ConditionUnknown,
},
}
return serverless
}()
)
Expand All @@ -28,7 +36,8 @@ func Test_sFnDeleteResources(t *testing.T) {
next, result, err := stateFn(nil, nil, s)

expectedNext := sFnUpdateDeletingState(
"Deletion",
v1alpha1.ConditionTypeDeleted,
v1alpha1.ConditionReasonDeletion,
"Uninstalling",
)

Expand Down Expand Up @@ -92,8 +101,9 @@ func Test_sFnDeleteResources(t *testing.T) {

next, result, err := stateFn(nil, r, s)

expectedNext := sFnUpdateDeletingErrorState(
"Deletion",
expectedNext := sFnUpdateErrorState(
v1alpha1.ConditionTypeDeleted,
v1alpha1.ConditionReasonDeletionErr,
errors.New("test error"),
)

Expand All @@ -120,8 +130,9 @@ func Test_sFnDeleteResources(t *testing.T) {

next, result, err := stateFn(nil, r, s)

expectedNext := sFnUpdateDeletingErrorState(
"Deletion",
expectedNext := sFnUpdateErrorState(
v1alpha1.ConditionTypeDeleted,
v1alpha1.ConditionReasonDeletionErr,
errors.New("test error"),
)

Expand Down
13 changes: 0 additions & 13 deletions internal/state/emit_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,6 @@ import (
ctrl "sigs.k8s.io/controller-runtime"
)

func sFnEmitStrictEvent(next stateFn, result *ctrl.Result, err error, eventType, eventReason, eventMessage string) stateFn {
return func(ctx context.Context, r *reconciler, s *systemState) (stateFn, *ctrl.Result, error) {
r.Event(
&s.instance,
eventType,
eventReason,
eventMessage,
)

return next, result, err
}
}

func buildSFnEmitEvent(next stateFn, result *ctrl.Result, err error) stateFn {
return func(_ context.Context, m *reconciler, s *systemState) (stateFn, *ctrl.Result, error) {
// compare if any condition change
Expand Down
29 changes: 0 additions & 29 deletions internal/state/emit_event_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,35 +48,6 @@ var (
}
)

func Test_sFnEmitStrictEvent(t *testing.T) {
t.Run("emit event", func(t *testing.T) {
eventRecorder := record.NewFakeRecorder(1)
r := &reconciler{
k8s: k8s{
EventRecorder: eventRecorder,
},
}

s := &systemState{
instance: v1alpha1.Serverless{},
}

stateFn := sFnEmitStrictEvent(
nil, nil, nil,
"test-type",
"test-reason",
"test-message",
)

next, result, err := stateFn(nil, r, s)
require.Nil(t, next)
require.Nil(t, result)
require.Nil(t, err)

require.Len(t, eventRecorder.Events, 1)
})
}

func Test_sFnEmitEventfunc(t *testing.T) {
t.Run("don't emit event", func(t *testing.T) {
s := &systemState{
Expand Down
14 changes: 6 additions & 8 deletions internal/state/remove_finalizer.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,21 @@ package state
import (
"context"

"github.com/kyma-project/serverless-manager/api/v1alpha1"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
)

func sFnRemoveFinalizer() stateFn {
return func(ctx context.Context, r *reconciler, s *systemState) (stateFn, *ctrl.Result, error) {
if controllerutil.RemoveFinalizer(&s.instance, r.finalizer) {
return nextState(
sFnUpdateServerless(),
)
if !controllerutil.RemoveFinalizer(&s.instance, r.finalizer) {
return requeue()
}

return nextState(
sFnEmitStrictEvent(
nil, nil, nil,
"Normal",
"Deleted",
sFnUpdateDeletingTrueState(
v1alpha1.ConditionTypeDeleted,
v1alpha1.ConditionReasonDeleted,
"Serverless module deleted",
),
)
Expand Down
18 changes: 8 additions & 10 deletions internal/state/remove_finalizer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"github.com/kyma-project/serverless-manager/api/v1alpha1"
"github.com/stretchr/testify/require"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
ctrl "sigs.k8s.io/controller-runtime"
)

func Test_sFnRemoveFinalizer(t *testing.T) {
Expand All @@ -28,7 +29,11 @@ func Test_sFnRemoveFinalizer(t *testing.T) {
// remove finalizer
next, result, err := sFnRemoveFinalizer()(nil, r, s)

expectedNext := sFnUpdateServerless()
expectedNext := sFnUpdateDeletingTrueState(
v1alpha1.ConditionTypeDeleted,
v1alpha1.ConditionReasonDeleted,
"Serverless module deleted",
)

requireEqualFunc(t, expectedNext, next)
require.Nil(t, result)
Expand All @@ -50,15 +55,8 @@ func Test_sFnRemoveFinalizer(t *testing.T) {
// remove finalizer
next, result, err := sFnRemoveFinalizer()(nil, r, s)

expectedNext := sFnEmitStrictEvent(
nil, nil, nil,
"Normal",
"Deleted",
"Serverless module deleted",
)

requireEqualFunc(t, expectedNext, next)
require.Nil(t, result)
require.Nil(t, next)
require.Equal(t, &ctrl.Result{Requeue: true}, result)
require.Nil(t, err)
})
}
20 changes: 6 additions & 14 deletions internal/state/update_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,29 +48,21 @@ func sFnUpdateErrorState(condition v1alpha1.ConditionType, reason v1alpha1.Condi
}
}

func sFnUpdateDeletingState(eventReason, eventMessage string) stateFn {
func sFnUpdateDeletingState(condition v1alpha1.ConditionType, reason v1alpha1.ConditionReason, msg string) stateFn {
return func(ctx context.Context, r *reconciler, s *systemState) (stateFn, *ctrl.Result, error) {
s.setState(v1alpha1.StateDeleting)
s.instance.UpdateConditionUnknown(condition, reason, msg)

return updateServerlessStatus(sFnEmitStrictEvent(
sFnRequeue(), nil, nil,
"Normal",
eventReason,
eventMessage,
), ctx, r, s)
return updateServerlessStatus(buildSFnEmitEvent(sFnRequeue(), nil, nil), ctx, r, s)
}
}

func sFnUpdateDeletingErrorState(eventReason string, err error) stateFn {
func sFnUpdateDeletingTrueState(condition v1alpha1.ConditionType, reason v1alpha1.ConditionReason, msg string) stateFn {
return func(ctx context.Context, r *reconciler, s *systemState) (stateFn, *ctrl.Result, error) {
s.setState(v1alpha1.StateDeleting)
s.instance.UpdateConditionTrue(condition, reason, msg)

return updateServerlessStatus(sFnEmitStrictEvent(
nil, nil, err,
"Warning",
eventReason,
err.Error(),
), ctx, r, s)
return updateServerlessStatus(buildSFnEmitEvent(sFnRequeue(), nil, nil), ctx, r, s)
}
}

Expand Down

0 comments on commit 5e78c4c

Please sign in to comment.