Skip to content

Commit

Permalink
Implement validator for autoscalers (#1105)
Browse files Browse the repository at this point in the history
Signed-off-by: Arnob kumar saha <arnob@appscode.com>
  • Loading branch information
ArnobKumarSaha authored Jan 10, 2024
1 parent 6a45459 commit 4e194f0
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 49 deletions.
16 changes: 13 additions & 3 deletions apis/autoscaling/v1alpha1/elasticsearch_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,15 @@ limitations under the License.
package v1alpha1

import (
"context"
"errors"
"fmt"

dbapi "kubedb.dev/apimachinery/apis/kubedb/v1alpha2"
opsapi "kubedb.dev/apimachinery/apis/ops/v1alpha1"

"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/builder"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/manager"
Expand Down Expand Up @@ -116,10 +119,17 @@ func (in *ElasticsearchAutoscaler) validate() error {
if in.Spec.DatabaseRef == nil {
return errors.New("databaseRef can't be empty")
}
return nil
}

func (in *ElasticsearchAutoscaler) ValidateFields(es *dbapi.Elasticsearch) error {
var es dbapi.Elasticsearch
err := DefaultClient.Get(context.TODO(), types.NamespacedName{
Name: in.Spec.DatabaseRef.Name,
Namespace: in.Namespace,
}, &es)
if err != nil {
_ = fmt.Errorf("can't get Elasticsearch %s/%s \n", in.Namespace, in.Spec.DatabaseRef.Name)
return err
}

if in.Spec.Compute != nil {
cm := in.Spec.Compute
if es.Spec.Topology != nil {
Expand Down
46 changes: 31 additions & 15 deletions apis/autoscaling/v1alpha1/mongodb_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,15 @@ limitations under the License.
package v1alpha1

import (
"context"
"errors"
"fmt"

dbapi "kubedb.dev/apimachinery/apis/kubedb/v1alpha2"
opsapi "kubedb.dev/apimachinery/apis/ops/v1alpha1"

"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/builder"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/manager"
Expand Down Expand Up @@ -50,6 +53,16 @@ func (in *MongoDBAutoscaler) Default() {
}

func (in *MongoDBAutoscaler) setDefaults() {
var db dbapi.MongoDB
err := DefaultClient.Get(context.TODO(), types.NamespacedName{
Name: in.Spec.DatabaseRef.Name,
Namespace: in.Namespace,
}, &db)
if err != nil {
_ = fmt.Errorf("can't get MongoDB %s/%s \n", in.Namespace, in.Spec.DatabaseRef.Name)
return
}

in.setOpsReqOptsDefaults()

if in.Spec.Storage != nil {
Expand All @@ -68,6 +81,14 @@ func (in *MongoDBAutoscaler) setDefaults() {
setDefaultComputeValues(in.Spec.Compute.Mongos)
setDefaultComputeValues(in.Spec.Compute.Arbiter)
setDefaultComputeValues(in.Spec.Compute.Hidden)

setInMemoryDefaults(in.Spec.Compute.Standalone, db.Spec.StorageEngine)
setInMemoryDefaults(in.Spec.Compute.ReplicaSet, db.Spec.StorageEngine)
setInMemoryDefaults(in.Spec.Compute.Shard, db.Spec.StorageEngine)
setInMemoryDefaults(in.Spec.Compute.ConfigServer, db.Spec.StorageEngine)
setInMemoryDefaults(in.Spec.Compute.Mongos, db.Spec.StorageEngine)
// no need for Defaulting the Arbiter & Hidden PodResources.
// As arbiter is not a data-node. And hidden doesn't have the impact of storageEngine (it can't be InMemory).
}
}

Expand All @@ -82,18 +103,6 @@ func (in *MongoDBAutoscaler) setOpsReqOptsDefaults() {
}
}

func (in *MongoDBAutoscaler) SetDefaults(db *dbapi.MongoDB) {
if in.Spec.Compute != nil {
setInMemoryDefaults(in.Spec.Compute.Standalone, db.Spec.StorageEngine)
setInMemoryDefaults(in.Spec.Compute.ReplicaSet, db.Spec.StorageEngine)
setInMemoryDefaults(in.Spec.Compute.Shard, db.Spec.StorageEngine)
setInMemoryDefaults(in.Spec.Compute.ConfigServer, db.Spec.StorageEngine)
setInMemoryDefaults(in.Spec.Compute.Mongos, db.Spec.StorageEngine)
// no need for Defaulting the Arbiter & Hidden PodResources.
// As arbiter is not a data-node. And hidden doesn't have the impact of storageEngine (it can't be InMemory).
}
}

// +kubebuilder:webhook:path=/validate-schema-kubedb-com-v1alpha1-mongodbautoscaler,mutating=false,failurePolicy=fail,sideEffects=None,groups=schema.kubedb.com,resources=mongodbautoscalers,verbs=create;update;delete,versions=v1alpha1,name=vmongodbautoscaler.kb.io,admissionReviewVersions={v1,v1beta1}

var _ webhook.Validator = &MongoDBAutoscaler{}
Expand All @@ -118,10 +127,16 @@ func (in *MongoDBAutoscaler) validate() error {
if in.Spec.DatabaseRef == nil {
return errors.New("databaseRef can't be empty")
}
return nil
}
var mg dbapi.MongoDB
err := DefaultClient.Get(context.TODO(), types.NamespacedName{
Name: in.Spec.DatabaseRef.Name,
Namespace: in.Namespace,
}, &mg)
if err != nil {
_ = fmt.Errorf("can't get MongoDB %s/%s \n", in.Namespace, in.Spec.DatabaseRef.Name)
return err
}

func (in *MongoDBAutoscaler) ValidateFields(mg *dbapi.MongoDB) error {
if in.Spec.Compute != nil {
cm := in.Spec.Compute
if mg.Spec.ShardTopology != nil {
Expand Down Expand Up @@ -200,5 +215,6 @@ func (in *MongoDBAutoscaler) ValidateFields(mg *dbapi.MongoDB) error {
}
}
}

return nil
}
4 changes: 0 additions & 4 deletions apis/autoscaling/v1alpha1/mysql_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,3 @@ func (in *MySQLAutoscaler) validate() error {
}
return nil
}

func (in *MySQLAutoscaler) ValidateFields() error {
return nil
}
7 changes: 0 additions & 7 deletions apis/autoscaling/v1alpha1/postgres_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,6 @@ func (in *PostgresAutoscaler) setOpsReqOptsDefaults() {
}
}

func (in *PostgresAutoscaler) SetDefaults() {
}

// +kubebuilder:webhook:path=/validate-schema-kubedb-com-v1alpha1-postgresautoscaler,mutating=false,failurePolicy=fail,sideEffects=None,groups=schema.kubedb.com,resources=postgresautoscalers,verbs=create;update;delete,versions=v1alpha1,name=vpostgresautoscaler.kb.io,admissionReviewVersions={v1,v1beta1}

var _ webhook.Validator = &PostgresAutoscaler{}
Expand All @@ -100,7 +97,3 @@ func (in *PostgresAutoscaler) validate() error {
}
return nil
}

func (in *PostgresAutoscaler) ValidateFields() error {
return nil
}
7 changes: 0 additions & 7 deletions apis/autoscaling/v1alpha1/proxysql_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,6 @@ func (in *ProxySQLAutoscaler) setOpsReqOptsDefaults() {
}
}

func (in *ProxySQLAutoscaler) SetDefaults() {
}

// +kubebuilder:webhook:path=/validate-schema-kubedb-com-v1alpha1-proxysqlautoscaler,mutating=false,failurePolicy=fail,sideEffects=None,groups=schema.kubedb.com,resources=proxysqlautoscalers,verbs=create;update;delete,versions=v1alpha1,name=vproxysqlautoscaler.kb.io,admissionReviewVersions={v1,v1beta1}

var _ webhook.Validator = &ProxySQLAutoscaler{}
Expand All @@ -96,7 +93,3 @@ func (in *ProxySQLAutoscaler) validate() error {
}
return nil
}

func (in *ProxySQLAutoscaler) ValidateFields() error {
return nil
}
7 changes: 0 additions & 7 deletions apis/autoscaling/v1alpha1/redis_sentinel_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,6 @@ func (in *RedisSentinelAutoscaler) setOpsReqOptsDefaults() {
}
}

func (in *RedisSentinelAutoscaler) SetDefaults() {
}

// +kubebuilder:webhook:path=/validate-schema-kubedb-com-v1alpha1-redissentinelautoscaler,mutating=false,failurePolicy=fail,sideEffects=None,groups=schema.kubedb.com,resources=redissentinelautoscalers,verbs=create;update;delete,versions=v1alpha1,name=vredissentinelautoscaler.kb.io,admissionReviewVersions={v1,v1beta1}

var _ webhook.Validator = &RedisSentinelAutoscaler{}
Expand All @@ -96,7 +93,3 @@ func (in *RedisSentinelAutoscaler) validate() error {
}
return nil
}

func (in *RedisSentinelAutoscaler) ValidateFields() error {
return nil
}
19 changes: 13 additions & 6 deletions apis/autoscaling/v1alpha1/redis_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,15 @@ limitations under the License.
package v1alpha1

import (
"context"
"errors"
"fmt"

dbapi "kubedb.dev/apimachinery/apis/kubedb/v1alpha2"
opsapi "kubedb.dev/apimachinery/apis/ops/v1alpha1"

"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/builder"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/manager"
Expand Down Expand Up @@ -76,9 +79,6 @@ func (in *RedisAutoscaler) setOpsReqOptsDefaults() {
}
}

func (in *RedisAutoscaler) SetDefaults() {
}

// +kubebuilder:webhook:path=/validate-schema-kubedb-com-v1alpha1-redisautoscaler,mutating=false,failurePolicy=fail,sideEffects=None,groups=schema.kubedb.com,resources=redisautoscalers,verbs=create;update;delete,versions=v1alpha1,name=vredisautoscaler.kb.io,admissionReviewVersions={v1,v1beta1}

var _ webhook.Validator = &RedisAutoscaler{}
Expand All @@ -103,10 +103,17 @@ func (in *RedisAutoscaler) validate() error {
if in.Spec.DatabaseRef == nil {
return errors.New("databaseRef can't be empty")
}
return nil
}

func (in *RedisAutoscaler) ValidateFields(rd *dbapi.Redis) error {
var rd dbapi.Redis
err := DefaultClient.Get(context.TODO(), types.NamespacedName{
Name: in.Spec.DatabaseRef.Name,
Namespace: in.Namespace,
}, &rd)
if err != nil {
_ = fmt.Errorf("can't get Redis %s/%s \n", in.Namespace, in.Spec.DatabaseRef.Name)
return err
}

if in.Spec.Compute != nil {
cm := in.Spec.Compute
if rd.Spec.Mode == dbapi.RedisModeCluster {
Expand Down
14 changes: 14 additions & 0 deletions apis/autoscaling/v1alpha1/type.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,14 @@ limitations under the License.
package v1alpha1

import (
"sync"

opsapi "kubedb.dev/apimachinery/apis/ops/v1alpha1"

core "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
kmapi "kmodules.xyz/client-go/api/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
)

type NodeTopology struct {
Expand Down Expand Up @@ -153,3 +156,14 @@ type StatusAccessor interface {
GetStatus() AutoscalerStatus
SetStatus(_ AutoscalerStatus)
}

var (
once sync.Once
DefaultClient client.Client
)

func SetDefaultClient(kc client.Client) {
once.Do(func() {
DefaultClient = kc
})
}

0 comments on commit 4e194f0

Please sign in to comment.