From 4f2d9bd1231a01fef43d27ad3fa555ae1e7d3f4f Mon Sep 17 00:00:00 2001 From: li <1312513963@qq.com> Date: Mon, 10 Jul 2023 18:14:56 +0800 Subject: [PATCH] feat: add cnpg builder cluster parameters --- .../pkg/kubernetes/cloudnative-pg/builder.go | 229 +++++++++++++++++- 1 file changed, 225 insertions(+), 4 deletions(-) diff --git a/shardingsphere-operator/pkg/kubernetes/cloudnative-pg/builder.go b/shardingsphere-operator/pkg/kubernetes/cloudnative-pg/builder.go index 14c1ec8a..aadf86c1 100644 --- a/shardingsphere-operator/pkg/kubernetes/cloudnative-pg/builder.go +++ b/shardingsphere-operator/pkg/kubernetes/cloudnative-pg/builder.go @@ -23,26 +23,109 @@ import ( "github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/api/v1alpha1" cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" ) +// nolint:gocognit // NewCluster returns a new Cluster func NewCluster(sn *v1alpha1.StorageNode, sp *v1alpha1.StorageProvider) *cnpgv1.Cluster { builder := NewClusterBuilder(sn.GetObjectMeta(), sn.GetObjectKind().GroupVersionKind()) builder.SetName(sn.Name) builder.SetNamespace(sn.Namespace) + if len(sp.Spec.Parameters["description"]) > 0 { + builder.SetDescription(sp.Spec.Parameters["description"]) + } + if len(sp.Spec.Parameters["imageName"]) > 0 { builder.SetImageName(sp.Spec.Parameters["imageName"]) } + if len(sp.Spec.Parameters["imagePullPolicy"]) > 0 { + builder.SetImagePullPolicy(sp.Spec.Parameters["imagePullPolicy"]) + } + + if len(sp.Spec.Parameters["postgresUID"]) > 0 { + pUID, _ := strconv.ParseInt(sp.Spec.Parameters["postgresUID"], 10, 64) + builder.SetPostgresUID(pUID) + } + + if len(sp.Spec.Parameters["postgresGID"]) > 0 { + pGID, _ := strconv.ParseInt(sp.Spec.Parameters["postgresGID"], 10, 64) + builder.SetPostgresGID(pGID) + } + + if len(sp.Spec.Parameters["minSyncReplicas"]) > 0 { + minSyncReplicas, _ := strconv.Atoi(sp.Spec.Parameters["minSyncReplicas"]) + builder.SetMinSyncReplicas(minSyncReplicas) + } + + if len(sp.Spec.Parameters["maxSyncReplicas"]) > 0 { + maxSyncReplicas, _ := strconv.Atoi(sp.Spec.Parameters["maxSyncReplicas"]) + builder.SetMaxSyncReplicas(maxSyncReplicas) + } + + if len(sp.Spec.Parameters["replicaCluster.enabled"]) > 0 { + enabledrc, _ := strconv.ParseBool(sp.Spec.Parameters["replicaCluster.enabled"]) + builder.SetReplicaClusterEnabled(enabledrc) + } + + if len(sp.Spec.Parameters["replicaCluster.source"]) > 0 { + builder.SetReplicaClusterSource(sp.Spec.Parameters["replicaCluster.source"]) + } + + if len(sp.Spec.Parameters["enableSuperuserAccess"]) > 0 { + enablesa, _ := strconv.ParseBool(sp.Spec.Parameters["enableSuperuserAccess"]) + builder.SetEnableSuperuserAccess(&enablesa) + } + + if len(sp.Spec.Parameters["superuserSecret"]) > 0 { + builder.SetSuperuserSecret(sp.Spec.Parameters["superuserSecret"]) + } + + builder.SetCertificates( + sp.Spec.Parameters["certificates.serverCASecret"], + sp.Spec.Parameters["certificates.serverTLSSecret"], + sp.Spec.Parameters["certificates.replicationTLSSecret"], + sp.Spec.Parameters["certificates.clientCASecret"], + []string{sp.Spec.Parameters["certificates.ServerAltDNSNames"]}) + + if len(sp.Spec.Parameters["maxStartDelay"]) > 0 { + maxStartDelay, _ := strconv.ParseInt(sp.Spec.Parameters["maxStartDelay"], 10, 32) + builder.SetMaxStartDelay(int32(maxStartDelay)) + } + + if len(sp.Spec.Parameters["maxStopDelay"]) > 0 { + maxStopDelay, _ := strconv.ParseInt(sp.Spec.Parameters["maxStopDelay"], 10, 32) + builder.SetMaxStopDelay(int32(maxStopDelay)) + } + + if len(sp.Spec.Parameters["maxSwitchoverDelay"]) > 0 { + maxSwitchoverDelay, _ := strconv.ParseInt(sp.Spec.Parameters["maxSwitchoverDelay"], 10, 32) + builder.SetMaxSwitchoverDelay(int32(maxSwitchoverDelay)) + } + + if len(sp.Spec.Parameters["failoverDelay"]) > 0 { + failoverDelay, _ := strconv.ParseInt(sp.Spec.Parameters["failoverDelay"], 10, 32) + builder.SetFailoverDelay(int32(failoverDelay)) + } + + if len(sp.Spec.Parameters["primaryUpdateStrategy"]) > 0 { + builder.SetPrimaryUpdateStrategy(sp.Spec.Parameters["primaryUpdateStrategy"]) + } + + if len(sp.Spec.Parameters["primaryUpdateMethod"]) > 0 { + builder.SetPrimaryUpdateMethod(sp.Spec.Parameters["primaryUpdateMethod"]) + } + if len(sp.Spec.Parameters["backup.retentionPolicy"]) > 0 { builder.SetBackupRetentionPolicy(sp.Spec.Parameters["backup.retentionPolicy"]) } if len(sp.Spec.Parameters["backup.target"]) > 0 { - builder.SetBackupTarget(cnpgv1.BackupTarget(sp.Spec.Parameters["backup.target"])) + builder.SetBackupTarget(sp.Spec.Parameters["backup.target"]) } if len(sp.Spec.Parameters["instances"]) > 0 { @@ -54,6 +137,10 @@ func NewCluster(sn *v1alpha1.StorageNode, sp *v1alpha1.StorageProvider) *cnpgv1. builder.SetStorageSize(sp.Spec.Parameters["storage.size"]) } + if len(sp.Spec.Parameters["logLevel"]) > 0 { + builder.SetLogLevel(sp.Spec.Parameters["logLevel"]) + } + return builder.Build() } @@ -67,11 +154,29 @@ func NewClusterBuilder(meta metav1.Object, gvk schema.GroupVersionKind) ClusterB type ClusterBuilder interface { SetName(name string) ClusterBuilder SetNamespace(namespace string) ClusterBuilder + SetDescription(description string) ClusterBuilder SetInstances(n int) ClusterBuilder SetImageName(name string) ClusterBuilder + SetImagePullPolicy(p string) ClusterBuilder + SetPostgresUID(u int64) ClusterBuilder + SetPostgresGID(g int64) ClusterBuilder + SetMinSyncReplicas(n int) ClusterBuilder + SetMaxSyncReplicas(n int) ClusterBuilder + SetReplicaClusterEnabled(e bool) ClusterBuilder + SetReplicaClusterSource(s string) ClusterBuilder + SetSuperuserSecret(s string) ClusterBuilder + SetEnableSuperuserAccess(e *bool) ClusterBuilder + SetCertificates(serverCASecret, serverTLSSecret, replicationTLSSecret, clientCASecret string, serverAltDNSNames []string) ClusterBuilder SetStorageSize(s string) ClusterBuilder + SetMaxStartDelay(d int32) ClusterBuilder + SetMaxStopDelay(d int32) ClusterBuilder + SetMaxSwitchoverDelay(d int32) ClusterBuilder + SetFailoverDelay(d int32) ClusterBuilder + SetPrimaryUpdateStrategy(s string) ClusterBuilder + SetPrimaryUpdateMethod(m string) ClusterBuilder SetBackupRetentionPolicy(r string) ClusterBuilder - SetBackupTarget(t cnpgv1.BackupTarget) ClusterBuilder + SetBackupTarget(t string) ClusterBuilder + SetLogLevel(l string) ClusterBuilder Build() *cnpgv1.Cluster } @@ -91,6 +196,30 @@ func (b *clusterBuilder) SetNamespace(namespace string) ClusterBuilder { return b } +// SetDescription sets the description of the cluster +func (b *clusterBuilder) SetDescription(description string) ClusterBuilder { + b.cluster.Spec.Description = description + return b +} + +// SetImagePullPolicy sets the image pull policy, default is IfNotPresent +func (b *clusterBuilder) SetImagePullPolicy(p string) ClusterBuilder { + b.cluster.Spec.ImagePullPolicy = corev1.PullPolicy(p) + return b +} + +// SetPostgresUID sets the UID of the `postgres` user inside the image, defaults to `26` +func (b *clusterBuilder) SetPostgresUID(u int64) ClusterBuilder { + b.cluster.Spec.PostgresUID = u + return b +} + +// SetPostgresGID sets the GID of the `postgres` user inside the image, defaults to `26` +func (b *clusterBuilder) SetPostgresGID(g int64) ClusterBuilder { + b.cluster.Spec.PostgresGID = g + return b +} + // SetInstances sets the number of instances func (b *clusterBuilder) SetInstances(n int) ClusterBuilder { b.cluster.Spec.Instances = n @@ -103,12 +232,98 @@ func (b *clusterBuilder) SetImageName(name string) ClusterBuilder { return b } +// SetMinSyncReplicas sets the minimum number of synchronous replicas +func (b *clusterBuilder) SetMinSyncReplicas(n int) ClusterBuilder { + b.cluster.Spec.MinSyncReplicas = n + return b +} + +// SetMaxSyncReplicas sets the maximum number of synchronous replicas +func (b *clusterBuilder) SetMaxSyncReplicas(n int) ClusterBuilder { + b.cluster.Spec.MaxSyncReplicas = n + return b +} + +// SetReplicaClusterEnabled sets whether this cluster is a replica of an existing cluster +func (b *clusterBuilder) SetReplicaClusterEnabled(e bool) ClusterBuilder { + b.cluster.Spec.ReplicaCluster.Enabled = e + return b +} + +// SetReplicaClusterSource sets the source cluster of this replica +func (b *clusterBuilder) SetReplicaClusterSource(s string) ClusterBuilder { + b.cluster.Spec.ReplicaCluster.Source = s + return b +} + +// SetSuperuserSecret sets the secret containing the superuser password +func (b *clusterBuilder) SetSuperuserSecret(s string) ClusterBuilder { + b.cluster.Spec.SuperuserSecret.Name = s + return b +} + +// SetEnableSuperuserAccess sets whether superuser access is enabled +func (b *clusterBuilder) SetEnableSuperuserAccess(e *bool) ClusterBuilder { + b.cluster.Spec.EnableSuperuserAccess = e + return b +} + +// SetCertificates sets the configuration for the CA and related certificates +func (b *clusterBuilder) SetCertificates(serverCASecret, serverTLSSecret, replicationTLSSecret, clientCASecret string, serverAltDNSNames []string) ClusterBuilder { + b.cluster.Spec.Certificates.ServerCASecret = serverCASecret + b.cluster.Spec.Certificates.ServerTLSSecret = serverTLSSecret + b.cluster.Spec.Certificates.ReplicationTLSSecret = replicationTLSSecret + b.cluster.Spec.Certificates.ClientCASecret = clientCASecret + b.cluster.Spec.Certificates.ServerAltDNSNames = serverAltDNSNames + return b +} + // SetStorageSize sets the storage size of the cluster func (b *clusterBuilder) SetStorageSize(s string) ClusterBuilder { b.cluster.Spec.StorageConfiguration.Size = s return b } +// SetMaxStartDelay sets the time in seconds that is allowed for a PostgreSQL instance to +// successfully start up (default 30) +func (b *clusterBuilder) SetMaxStartDelay(d int32) ClusterBuilder { + b.cluster.Spec.MaxStartDelay = d + return b +} + +// SetMaxStopDelay sets the time in seconds that is allowed for a PostgreSQL instance to +// gracefully shutdown (default 30) +func (b *clusterBuilder) SetMaxStopDelay(d int32) ClusterBuilder { + b.cluster.Spec.MaxStopDelay = d + return b +} + +// SetMaxSwitchoverDelay sets the time in seconds that is allowed for a primary PostgreSQL instance +// to gracefully shutdown during a switchover +func (b *clusterBuilder) SetMaxSwitchoverDelay(d int32) ClusterBuilder { + b.cluster.Spec.MaxSwitchoverDelay = d + return b +} + +// SetFailoverDelay sets the amount of time (in seconds) to wait before triggering a failover after +// the primary PostgreSQL instance in the cluster was detected to be unhealthy +func (b *clusterBuilder) SetFailoverDelay(d int32) ClusterBuilder { + b.cluster.Spec.FailoverDelay = d + return b +} + +// SetPrimaryUpdateStrategy sets the primary update strategy of the cluster +func (b *clusterBuilder) SetPrimaryUpdateStrategy(s string) ClusterBuilder { + b.cluster.Spec.PrimaryUpdateStrategy = cnpgv1.PrimaryUpdateStrategy(s) + return b +} + +// SetPrimaryUpdateMethod sets the primary update method of the cluster +func (b *clusterBuilder) SetPrimaryUpdateMethod(m string) ClusterBuilder { + b.cluster.Spec.PrimaryUpdateMethod = cnpgv1.PrimaryUpdateMethod(m) + return b +} + // SetBackupRetentionPolicy sets the backup retention policy of the cluster func (b *clusterBuilder) SetBackupRetentionPolicy(r string) ClusterBuilder { b.cluster.Spec.Backup.RetentionPolicy = r @@ -116,8 +331,14 @@ func (b *clusterBuilder) SetBackupRetentionPolicy(r string) ClusterBuilder { } // SetBackupTarget sets the backup target of the cluster -func (b *clusterBuilder) SetBackupTarget(t cnpgv1.BackupTarget) ClusterBuilder { - b.cluster.Spec.Backup.Target = t +func (b *clusterBuilder) SetBackupTarget(t string) ClusterBuilder { + b.cluster.Spec.Backup.Target = cnpgv1.BackupTarget(t) + return b +} + +// SetLogLevel sets the instances' log level +func (b *clusterBuilder) SetLogLevel(l string) ClusterBuilder { + b.cluster.Spec.LogLevel = l return b }