Skip to content

Commit

Permalink
feat(RedisCluster): add cloud provider boilereplate (#1001)
Browse files Browse the repository at this point in the history
  • Loading branch information
dushanpantic authored Feb 3, 2025
1 parent df3d810 commit 7cbb9fd
Show file tree
Hide file tree
Showing 8 changed files with 285 additions and 1 deletion.
9 changes: 9 additions & 0 deletions internal/controller/cloud-control/rediscluster_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ import (
"github.com/kyma-project/cloud-manager/pkg/common/abstractions"
"github.com/kyma-project/cloud-manager/pkg/common/actions/focal"
"github.com/kyma-project/cloud-manager/pkg/composed"
awsrediscluster "github.com/kyma-project/cloud-manager/pkg/kcp/provider/aws/rediscluster"
azurerediscluster "github.com/kyma-project/cloud-manager/pkg/kcp/provider/azure/rediscluster"
gcprediscluster "github.com/kyma-project/cloud-manager/pkg/kcp/provider/gcp/rediscluster"
"github.com/kyma-project/cloud-manager/pkg/kcp/rediscluster"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/builder"
Expand All @@ -34,10 +37,16 @@ func SetupRedisClusterReconciler(
kcpManager manager.Manager,
env abstractions.Environment,
) error {
if env == nil {
env = abstractions.NewOSEnvironment()
}
return NewRedisClusterReconciler(
rediscluster.NewRedisClusterReconciler(
composed.NewStateFactory(composed.NewStateClusterFromCluster(kcpManager)),
focal.NewStateFactory(),
gcprediscluster.NewStateFactory(env),
awsrediscluster.NewStateFactory(),
azurerediscluster.NewStateFactory(),
),
).SetupWithManager(kcpManager)
}
Expand Down
51 changes: 51 additions & 0 deletions pkg/kcp/provider/aws/rediscluster/new.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package rediscluster

import (
"context"
"fmt"

"github.com/kyma-project/cloud-manager/pkg/common/actions"
"github.com/kyma-project/cloud-manager/pkg/kcp/rediscluster/types"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/kyma-project/cloud-manager/api/cloud-control/v1beta1"
cloudcontrolv1beta1 "github.com/kyma-project/cloud-manager/api/cloud-control/v1beta1"
"github.com/kyma-project/cloud-manager/pkg/composed"
)

func New(stateFactory StateFactory) composed.Action {
return func(ctx context.Context, st composed.State) (error, context.Context) {

state, err := stateFactory.NewState(ctx, st.(types.State))
if err != nil {
composed.LoggerFromCtx(ctx).Error(err, "Failed to bootstrap AWS RedisCluster state")
redisCluster := st.Obj().(*v1beta1.RedisCluster)
redisCluster.Status.State = cloudcontrolv1beta1.StateError
return composed.UpdateStatus(redisCluster).
SetExclusiveConditions(metav1.Condition{
Type: v1beta1.ConditionTypeError,
Status: metav1.ConditionTrue,
Reason: v1beta1.ReasonCloudProviderError,
Message: "Failed to create RedisCluster state",
}).
SuccessError(composed.StopAndForget).
SuccessLogMsg(fmt.Sprintf("Error creating new AWS RedisCluster state: %s", err)).
Run(ctx, st)
}

return composed.ComposeActions(
"redisCluster",
actions.AddCommonFinalizer(),
composed.IfElse(composed.Not(composed.MarkedForDeletionPredicate),
composed.ComposeActions(
"redisCluster-create",
),
composed.ComposeActions(
"redisCluster-delete",
actions.RemoveCommonFinalizer(),
),
),
composed.StopAndForgetAction,
)(ctx, state)
}
}
32 changes: 32 additions & 0 deletions pkg/kcp/provider/aws/rediscluster/state.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package rediscluster

import (
"context"

"github.com/kyma-project/cloud-manager/pkg/kcp/rediscluster/types"
)

type State struct {
types.State
}

type StateFactory interface {
NewState(ctx context.Context, redisClusterState types.State) (*State, error)
}

type stateFactory struct{}

func NewStateFactory() StateFactory {
return &stateFactory{}
}

func (statefactory *stateFactory) NewState(ctx context.Context, redisClusterState types.State) (*State, error) {

return newState(redisClusterState), nil
}

func newState(redisClusterState types.State) *State {
return &State{
State: redisClusterState,
}
}
51 changes: 51 additions & 0 deletions pkg/kcp/provider/azure/rediscluster/new.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package rediscluster

import (
"context"
"fmt"

"github.com/kyma-project/cloud-manager/pkg/common/actions"
"github.com/kyma-project/cloud-manager/pkg/kcp/rediscluster/types"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/kyma-project/cloud-manager/api/cloud-control/v1beta1"
cloudcontrolv1beta1 "github.com/kyma-project/cloud-manager/api/cloud-control/v1beta1"
"github.com/kyma-project/cloud-manager/pkg/composed"
)

func New(stateFactory StateFactory) composed.Action {
return func(ctx context.Context, st composed.State) (error, context.Context) {

state, err := stateFactory.NewState(ctx, st.(types.State))
if err != nil {
composed.LoggerFromCtx(ctx).Error(err, "Failed to bootstrap Azure RedisCluster state")
redisCluster := st.Obj().(*v1beta1.RedisCluster)
redisCluster.Status.State = cloudcontrolv1beta1.StateError
return composed.UpdateStatus(redisCluster).
SetExclusiveConditions(metav1.Condition{
Type: v1beta1.ConditionTypeError,
Status: metav1.ConditionTrue,
Reason: v1beta1.ReasonCloudProviderError,
Message: "Failed to create RedisCluster state",
}).
SuccessError(composed.StopAndForget).
SuccessLogMsg(fmt.Sprintf("Error creating new Azure RedisCluster state: %s", err)).
Run(ctx, st)
}

return composed.ComposeActions(
"redisCluster",
actions.AddCommonFinalizer(),
composed.IfElse(composed.Not(composed.MarkedForDeletionPredicate),
composed.ComposeActions(
"redisCluster-create",
),
composed.ComposeActions(
"redisCluster-delete",
actions.RemoveCommonFinalizer(),
),
),
composed.StopAndForgetAction,
)(ctx, state)
}
}
32 changes: 32 additions & 0 deletions pkg/kcp/provider/azure/rediscluster/state.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package rediscluster

import (
"context"

"github.com/kyma-project/cloud-manager/pkg/kcp/rediscluster/types"
)

type State struct {
types.State
}

type StateFactory interface {
NewState(ctx context.Context, redisClusterState types.State) (*State, error)
}

type stateFactory struct{}

func NewStateFactory() StateFactory {
return &stateFactory{}
}

func (statefactory *stateFactory) NewState(ctx context.Context, redisClusterState types.State) (*State, error) {

return newState(redisClusterState), nil
}

func newState(redisClusterState types.State) *State {
return &State{
State: redisClusterState,
}
}
51 changes: 51 additions & 0 deletions pkg/kcp/provider/gcp/rediscluster/new.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package rediscluster

import (
"context"
"fmt"

"github.com/kyma-project/cloud-manager/pkg/common/actions"
"github.com/kyma-project/cloud-manager/pkg/kcp/rediscluster/types"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/kyma-project/cloud-manager/api/cloud-control/v1beta1"
cloudcontrolv1beta1 "github.com/kyma-project/cloud-manager/api/cloud-control/v1beta1"
"github.com/kyma-project/cloud-manager/pkg/composed"
)

func New(stateFactory StateFactory) composed.Action {
return func(ctx context.Context, st composed.State) (error, context.Context) {

state, err := stateFactory.NewState(ctx, st.(types.State))
if err != nil {
composed.LoggerFromCtx(ctx).Error(err, "Failed to bootstrap GCP RedisCluster state")
redisCluster := st.Obj().(*v1beta1.RedisCluster)
redisCluster.Status.State = cloudcontrolv1beta1.StateError
return composed.UpdateStatus(redisCluster).
SetExclusiveConditions(metav1.Condition{
Type: v1beta1.ConditionTypeError,
Status: metav1.ConditionTrue,
Reason: v1beta1.ReasonCloudProviderError,
Message: "Failed to create RedisCluster state",
}).
SuccessError(composed.StopAndForget).
SuccessLogMsg(fmt.Sprintf("Error creating new GCP RedisCluster state: %s", err)).
Run(ctx, st)
}

return composed.ComposeActions(
"redisCluster",
actions.AddCommonFinalizer(),
composed.IfElse(composed.Not(composed.MarkedForDeletionPredicate),
composed.ComposeActions(
"redisCluster-create",
),
composed.ComposeActions(
"redisCluster-delete",
actions.RemoveCommonFinalizer(),
),
),
composed.StopAndForgetAction,
)(ctx, state)
}
}
38 changes: 38 additions & 0 deletions pkg/kcp/provider/gcp/rediscluster/state.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package rediscluster

import (
"context"

"github.com/kyma-project/cloud-manager/pkg/common/abstractions"

"github.com/kyma-project/cloud-manager/pkg/kcp/rediscluster/types"
)

type State struct {
types.State
}

type StateFactory interface {
NewState(ctx context.Context, redisClusterState types.State) (*State, error)
}

type stateFactory struct {
env abstractions.Environment
}

func NewStateFactory(env abstractions.Environment) StateFactory {
return &stateFactory{
env: env,
}
}

func (statefactory *stateFactory) NewState(ctx context.Context, redisClusterState types.State) (*State, error) {

return newState(redisClusterState), nil
}

func newState(redisClusterState types.State) *State {
return &State{
State: redisClusterState,
}
}
22 changes: 21 additions & 1 deletion pkg/kcp/rediscluster/reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ import (
cloudcontrolv1beta1 "github.com/kyma-project/cloud-manager/api/cloud-control/v1beta1"
"github.com/kyma-project/cloud-manager/pkg/common/actions/focal"
"github.com/kyma-project/cloud-manager/pkg/composed"
awsrediscluster "github.com/kyma-project/cloud-manager/pkg/kcp/provider/aws/rediscluster"
azurerediscluster "github.com/kyma-project/cloud-manager/pkg/kcp/provider/azure/rediscluster"
gcprediscluster "github.com/kyma-project/cloud-manager/pkg/kcp/provider/gcp/rediscluster"

"k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime"
)
Expand All @@ -19,16 +23,25 @@ type RedisClusterReconciler interface {
type redisClusterReconciler struct {
composedStateFactory composed.StateFactory
focalStateFactory focal.StateFactory

gcpStateFactory gcprediscluster.StateFactory
awsStateFactory awsrediscluster.StateFactory
azureStateFactory azurerediscluster.StateFactory
}

func NewRedisClusterReconciler(
composedStateFactory composed.StateFactory,
focalStateFactory focal.StateFactory,

gcpStateFactory gcprediscluster.StateFactory,
awsStateFactory awsrediscluster.StateFactory,
azureStateFactory azurerediscluster.StateFactory,
) RedisClusterReconciler {
return &redisClusterReconciler{
composedStateFactory: composedStateFactory,
focalStateFactory: focalStateFactory,
gcpStateFactory: gcpStateFactory,
awsStateFactory: awsStateFactory,
azureStateFactory: azureStateFactory,
}
}

Expand All @@ -51,6 +64,13 @@ func (r *redisClusterReconciler) newAction() composed.Action {
return composed.ComposeActions(
"redisClusterCommon",
loadIpRange,
composed.BuildSwitchAction(
"providerSwitch",
nil,
composed.NewCase(focal.GcpProviderPredicate, gcprediscluster.New(r.gcpStateFactory)),
composed.NewCase(focal.AwsProviderPredicate, awsrediscluster.New(r.awsStateFactory)),
composed.NewCase(focal.AzureProviderPredicate, azurerediscluster.New(r.azureStateFactory)),
),
)(ctx, newState(st.(focal.State)))
},
)
Expand Down

0 comments on commit 7cbb9fd

Please sign in to comment.