shardingsphere-operator/pkg/kubernetes/cloudnative-pg/builder.go (257 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package cloudnativepg import ( "strconv" "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(sp.Spec.Parameters["backup.target"]) } if len(sp.Spec.Parameters["instances"]) > 0 { ins, _ := strconv.Atoi(sp.Spec.Parameters["instances"]) builder.SetInstances(ins) } if len(sp.Spec.Parameters["storage.size"]) > 0 { builder.SetStorageSize(sp.Spec.Parameters["storage.size"]) } if len(sp.Spec.Parameters["logLevel"]) > 0 { builder.SetLogLevel(sp.Spec.Parameters["logLevel"]) } return builder.Build() } // NewClusterBuilder returns a ClusterBuilder func NewClusterBuilder(meta metav1.Object, gvk schema.GroupVersionKind) ClusterBuilder { return &clusterBuilder{ cluster: DefaultCluster(meta, gvk), } } 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 string) ClusterBuilder SetLogLevel(l string) ClusterBuilder Build() *cnpgv1.Cluster } type clusterBuilder struct { cluster *cnpgv1.Cluster } // SetName sets the name of the cluster func (b *clusterBuilder) SetName(name string) ClusterBuilder { b.cluster.Name = name return b } // SetNamespace sets the namespace of the cluster func (b *clusterBuilder) SetNamespace(namespace string) ClusterBuilder { b.cluster.Namespace = namespace 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 return b } // SetImageName sets the name of the container image func (b *clusterBuilder) SetImageName(name string) ClusterBuilder { b.cluster.Spec.ImageName = name 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 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 } // Build builds the cluster func (b *clusterBuilder) Build() *cnpgv1.Cluster { return b.cluster } func DefaultCluster(meta metav1.Object, gvk schema.GroupVersionKind) *cnpgv1.Cluster { return &cnpgv1.Cluster{ ObjectMeta: metav1.ObjectMeta{ Name: "shardingsphere-proxy-cnpg", Namespace: "default", Labels: map[string]string{}, }, Spec: cnpgv1.ClusterSpec{ Instances: 3, PrimaryUpdateStrategy: cnpgv1.PrimaryUpdateStrategyUnsupervised, StorageConfiguration: cnpgv1.StorageConfiguration{ Size: "1Gi", }, }, } }