Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add cnpg builder cluster parameters #432

Merged
merged 1 commit into from
Jul 10, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
229 changes: 225 additions & 4 deletions shardingsphere-operator/pkg/kubernetes/cloudnative-pg/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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()
}

Expand All @@ -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
}

Expand All @@ -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
Expand All @@ -103,21 +232,113 @@ 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
return b
}

// 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
}

Expand Down
Loading