diff --git a/apis/autoscaling/v1alpha1/elasticsearch_webhook.go b/apis/autoscaling/v1alpha1/elasticsearch_webhook.go index 508c4bffa8..b389fe94cc 100644 --- a/apis/autoscaling/v1alpha1/elasticsearch_webhook.go +++ b/apis/autoscaling/v1alpha1/elasticsearch_webhook.go @@ -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" @@ -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 { diff --git a/apis/autoscaling/v1alpha1/mongodb_webhook.go b/apis/autoscaling/v1alpha1/mongodb_webhook.go index 50b8c741ac..61bcffad5a 100644 --- a/apis/autoscaling/v1alpha1/mongodb_webhook.go +++ b/apis/autoscaling/v1alpha1/mongodb_webhook.go @@ -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" @@ -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 { @@ -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). } } @@ -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{} @@ -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 { @@ -200,5 +215,6 @@ func (in *MongoDBAutoscaler) ValidateFields(mg *dbapi.MongoDB) error { } } } + return nil } diff --git a/apis/autoscaling/v1alpha1/mysql_webhook.go b/apis/autoscaling/v1alpha1/mysql_webhook.go index 45e5a20fb3..418dae4741 100644 --- a/apis/autoscaling/v1alpha1/mysql_webhook.go +++ b/apis/autoscaling/v1alpha1/mysql_webhook.go @@ -100,7 +100,3 @@ func (in *MySQLAutoscaler) validate() error { } return nil } - -func (in *MySQLAutoscaler) ValidateFields() error { - return nil -} diff --git a/apis/autoscaling/v1alpha1/postgres_webhook.go b/apis/autoscaling/v1alpha1/postgres_webhook.go index 7aea753716..a608b462b0 100644 --- a/apis/autoscaling/v1alpha1/postgres_webhook.go +++ b/apis/autoscaling/v1alpha1/postgres_webhook.go @@ -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{} @@ -100,7 +97,3 @@ func (in *PostgresAutoscaler) validate() error { } return nil } - -func (in *PostgresAutoscaler) ValidateFields() error { - return nil -} diff --git a/apis/autoscaling/v1alpha1/proxysql_webhook.go b/apis/autoscaling/v1alpha1/proxysql_webhook.go index 65cc97a399..cf3d107937 100644 --- a/apis/autoscaling/v1alpha1/proxysql_webhook.go +++ b/apis/autoscaling/v1alpha1/proxysql_webhook.go @@ -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{} @@ -96,7 +93,3 @@ func (in *ProxySQLAutoscaler) validate() error { } return nil } - -func (in *ProxySQLAutoscaler) ValidateFields() error { - return nil -} diff --git a/apis/autoscaling/v1alpha1/redis_sentinel_webhook.go b/apis/autoscaling/v1alpha1/redis_sentinel_webhook.go index 1e82e811c4..c44df8986f 100644 --- a/apis/autoscaling/v1alpha1/redis_sentinel_webhook.go +++ b/apis/autoscaling/v1alpha1/redis_sentinel_webhook.go @@ -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{} @@ -96,7 +93,3 @@ func (in *RedisSentinelAutoscaler) validate() error { } return nil } - -func (in *RedisSentinelAutoscaler) ValidateFields() error { - return nil -} diff --git a/apis/autoscaling/v1alpha1/redis_webhook.go b/apis/autoscaling/v1alpha1/redis_webhook.go index a86b2beaf0..fba715d3ef 100644 --- a/apis/autoscaling/v1alpha1/redis_webhook.go +++ b/apis/autoscaling/v1alpha1/redis_webhook.go @@ -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" @@ -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{} @@ -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 { diff --git a/apis/autoscaling/v1alpha1/type.go b/apis/autoscaling/v1alpha1/type.go index 926fd53df6..f95b9f6e97 100644 --- a/apis/autoscaling/v1alpha1/type.go +++ b/apis/autoscaling/v1alpha1/type.go @@ -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 { @@ -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 + }) +}