From c90204f5917e04b33f034396d1a9b618fb837a09 Mon Sep 17 00:00:00 2001 From: souravbiswassanto Date: Thu, 24 Oct 2024 18:36:00 +0600 Subject: [PATCH] Add PITR Replication Strategy API Signed-off-by: souravbiswassanto --- apis/kubedb/v1/openapi_generated.go | 6 ++++++ apis/kubedb/v1/postgres_helpers.go | 4 ++++ apis/kubedb/v1/types.go | 19 ++++++++++++++++++- apis/kubedb/v1/zz_generated.deepcopy.go | 5 +++++ apis/kubedb/v1alpha2/openapi_generated.go | 6 ++++++ apis/kubedb/v1alpha2/types.go | 19 ++++++++++++++++++- .../v1alpha2/zz_generated.conversion.go | 8 ++++++++ apis/kubedb/v1alpha2/zz_generated.deepcopy.go | 5 +++++ crds/kubedb.com_druids.yaml | 7 +++++++ crds/kubedb.com_elasticsearches.yaml | 14 ++++++++++++++ crds/kubedb.com_etcds.yaml | 7 +++++++ crds/kubedb.com_mariadbs.yaml | 14 ++++++++++++++ crds/kubedb.com_mongodbs.yaml | 14 ++++++++++++++ crds/kubedb.com_mssqlservers.yaml | 7 +++++++ crds/kubedb.com_mysqls.yaml | 14 ++++++++++++++ crds/kubedb.com_perconaxtradbs.yaml | 14 ++++++++++++++ crds/kubedb.com_postgreses.yaml | 14 ++++++++++++++ crds/kubedb.com_redises.yaml | 14 ++++++++++++++ crds/kubedb.com_singlestores.yaml | 7 +++++++ openapi/swagger.json | 3 +++ 20 files changed, 199 insertions(+), 2 deletions(-) diff --git a/apis/kubedb/v1/openapi_generated.go b/apis/kubedb/v1/openapi_generated.go index e8be620333..f52831fd2b 100644 --- a/apis/kubedb/v1/openapi_generated.go +++ b/apis/kubedb/v1/openapi_generated.go @@ -25572,6 +25572,12 @@ func schema_apimachinery_apis_kubedb_v1_ArchiverRecovery(ref common.ReferenceCal Ref: ref("kmodules.xyz/client-go/api/v1.ObjectReference"), }, }, + "replicationStrategy": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, }, Required: []string{"recoveryTimestamp"}, }, diff --git a/apis/kubedb/v1/postgres_helpers.go b/apis/kubedb/v1/postgres_helpers.go index 2c0520e16d..ddf77bdfa1 100644 --- a/apis/kubedb/v1/postgres_helpers.go +++ b/apis/kubedb/v1/postgres_helpers.go @@ -34,6 +34,7 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" + "k8s.io/utils/ptr" kmapi "kmodules.xyz/client-go/api/v1" "kmodules.xyz/client-go/apiextensions" meta_util "kmodules.xyz/client-go/meta" @@ -266,6 +267,9 @@ func (p *Postgres) SetDefaults(postgresVersion *catalog.PostgresVersion) { p.Spec.Monitor.Prometheus.Exporter.SecurityContext.RunAsGroup = postgresVersion.Spec.SecurityContext.RunAsUser } } + if p.Spec.Init != nil && p.Spec.Init.Archiver != nil && p.Spec.Init.Archiver.ReplicationStrategy == nil { + p.Spec.Init.Archiver.ReplicationStrategy = ptr.To(ReplicationStrategyNone) + } } func getMajorPgVersion(postgresVersion *catalog.PostgresVersion) (uint64, error) { diff --git a/apis/kubedb/v1/types.go b/apis/kubedb/v1/types.go index 9a9d904ea6..77f5c68efa 100644 --- a/apis/kubedb/v1/types.go +++ b/apis/kubedb/v1/types.go @@ -133,6 +133,22 @@ const ( StatsServiceAlias ServiceAlias = "stats" ) +// +kubebuilder:validation:Enum=fscopy;clone;sync;none +type PITRReplicationStrategy string + +const ( + // ReplicationStrategySync means data will be synced from primary to secondary + ReplicationStrategySync PITRReplicationStrategy = "sync" + // ReplicationStrategyFSCopy means data will be copied from primary filesystem to secondary filesystem + ReplicationStrategyFSCopy PITRReplicationStrategy = "fscopy" + // ReplicationStrategyClone means volumesnapshot will be used to create pvc's of both primary and secondary + // cluster should have the pvc cloning property + ReplicationStrategyClone PITRReplicationStrategy = "clone" + // ReplicationStrategyNone means no replication will be used + // data will be fully restored in every replicas instead of replication + ReplicationStrategyNone PITRReplicationStrategy = "none" +) + // +kubebuilder:validation:Enum=DNS;IP;IPv4;IPv6 type AddressType string @@ -214,5 +230,6 @@ type ArchiverRecovery struct { ManifestRepository *kmapi.ObjectReference `json:"manifestRepository,omitempty"` // FullDBRepository means db restore + manifest restore - FullDBRepository *kmapi.ObjectReference `json:"fullDBRepository,omitempty"` + FullDBRepository *kmapi.ObjectReference `json:"fullDBRepository,omitempty"` + ReplicationStrategy *PITRReplicationStrategy `json:"replicationStrategy,omitempty"` } diff --git a/apis/kubedb/v1/zz_generated.deepcopy.go b/apis/kubedb/v1/zz_generated.deepcopy.go index e3f3575407..93baadace9 100644 --- a/apis/kubedb/v1/zz_generated.deepcopy.go +++ b/apis/kubedb/v1/zz_generated.deepcopy.go @@ -141,6 +141,11 @@ func (in *ArchiverRecovery) DeepCopyInto(out *ArchiverRecovery) { *out = new(apiv1.ObjectReference) **out = **in } + if in.ReplicationStrategy != nil { + in, out := &in.ReplicationStrategy, &out.ReplicationStrategy + *out = new(PITRReplicationStrategy) + **out = **in + } return } diff --git a/apis/kubedb/v1alpha2/openapi_generated.go b/apis/kubedb/v1alpha2/openapi_generated.go index 8c58dc2eed..fe80d76c5c 100644 --- a/apis/kubedb/v1alpha2/openapi_generated.go +++ b/apis/kubedb/v1alpha2/openapi_generated.go @@ -25664,6 +25664,12 @@ func schema_apimachinery_apis_kubedb_v1alpha2_ArchiverRecovery(ref common.Refere Ref: ref("kmodules.xyz/client-go/api/v1.ObjectReference"), }, }, + "replicationStrategy": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, }, Required: []string{"recoveryTimestamp"}, }, diff --git a/apis/kubedb/v1alpha2/types.go b/apis/kubedb/v1alpha2/types.go index 61cb5e739b..fd06b20ec5 100644 --- a/apis/kubedb/v1alpha2/types.go +++ b/apis/kubedb/v1alpha2/types.go @@ -135,6 +135,22 @@ const ( SecondaryServiceAlias ServiceAlias = "secondary" ) +// +kubebuilder:validation:Enum=fscopy;clone;sync;none +type PITRReplicationStrategy string + +const ( + // ReplicationStrategySync means data will be synced from primary to secondary + ReplicationStrategySync PITRReplicationStrategy = "sync" + // ReplicationStrategyFSCopy means data will be copied from primary filesystem to secondary filesystem + ReplicationStrategyFSCopy PITRReplicationStrategy = "fscopy" + // ReplicationStrategyClone means volumesnapshot will be used to create pvc's of both primary and secondary + // cluster should have the pvc cloning property + ReplicationStrategyClone PITRReplicationStrategy = "clone" + // ReplicationStrategyNone means no replication will be used + // data will be restored instead of replication + ReplicationStrategyNone PITRReplicationStrategy = "none" +) + // +kubebuilder:validation:Enum=DNS;IP;IPv4;IPv6 type AddressType string @@ -231,5 +247,6 @@ type ArchiverRecovery struct { ManifestRepository *kmapi.ObjectReference `json:"manifestRepository,omitempty"` // FullDBRepository means db restore + manifest restore - FullDBRepository *kmapi.ObjectReference `json:"fullDBRepository,omitempty"` + FullDBRepository *kmapi.ObjectReference `json:"fullDBRepository,omitempty"` + ReplicationStrategy *PITRReplicationStrategy `json:"replicationStrategy,omitempty"` } diff --git a/apis/kubedb/v1alpha2/zz_generated.conversion.go b/apis/kubedb/v1alpha2/zz_generated.conversion.go index 75a0fcdfce..a9586fa311 100644 --- a/apis/kubedb/v1alpha2/zz_generated.conversion.go +++ b/apis/kubedb/v1alpha2/zz_generated.conversion.go @@ -1100,6 +1100,7 @@ func autoConvert_v1alpha2_ArchiverRecovery_To_v1_ArchiverRecovery(in *ArchiverRe out.EncryptionSecret = (*clientgoapiv1.ObjectReference)(unsafe.Pointer(in.EncryptionSecret)) out.ManifestRepository = (*clientgoapiv1.ObjectReference)(unsafe.Pointer(in.ManifestRepository)) out.FullDBRepository = (*clientgoapiv1.ObjectReference)(unsafe.Pointer(in.FullDBRepository)) + out.ReplicationStrategy = (*v1.PITRReplicationStrategy)(unsafe.Pointer(in.ReplicationStrategy)) return nil } @@ -1113,6 +1114,7 @@ func autoConvert_v1_ArchiverRecovery_To_v1alpha2_ArchiverRecovery(in *v1.Archive out.EncryptionSecret = (*clientgoapiv1.ObjectReference)(unsafe.Pointer(in.EncryptionSecret)) out.ManifestRepository = (*clientgoapiv1.ObjectReference)(unsafe.Pointer(in.ManifestRepository)) out.FullDBRepository = (*clientgoapiv1.ObjectReference)(unsafe.Pointer(in.FullDBRepository)) + out.ReplicationStrategy = (*PITRReplicationStrategy)(unsafe.Pointer(in.ReplicationStrategy)) return nil } @@ -2354,6 +2356,8 @@ func autoConvert_v1_MemcachedSpec_To_v1alpha2_MemcachedSpec(in *v1.MemcachedSpec out.Replicas = (*int32)(unsafe.Pointer(in.Replicas)) out.Monitor = (*monitoringagentapiapiv1.AgentSpec)(unsafe.Pointer(in.Monitor)) out.ConfigSecret = (*corev1.LocalObjectReference)(unsafe.Pointer(in.ConfigSecret)) + // WARNING: in.AuthSecret requires manual conversion: does not exist in peer-type + // WARNING: in.DisableAuth requires manual conversion: does not exist in peer-type out.DataVolume = (*corev1.VolumeSource)(unsafe.Pointer(in.DataVolume)) if err := Convert_v2_PodTemplateSpec_To_v1_PodTemplateSpec(&in.PodTemplate, &out.PodTemplate, s); err != nil { return err @@ -3415,6 +3419,7 @@ func autoConvert_v1alpha2_PgBouncerSpec_To_v1_PgBouncerSpec(in *PgBouncerSpec, o out.TLS = (*clientgoapiv1.TLSConfig)(unsafe.Pointer(in.TLS)) // WARNING: in.TerminationPolicy requires manual conversion: does not exist in peer-type out.HealthChecker = in.HealthChecker + out.Halted = in.Halted return nil } @@ -3439,6 +3444,7 @@ func autoConvert_v1_PgBouncerSpec_To_v1alpha2_PgBouncerSpec(in *v1.PgBouncerSpec out.TLS = (*clientgoapiv1.TLSConfig)(unsafe.Pointer(in.TLS)) // WARNING: in.DeletionPolicy requires manual conversion: does not exist in peer-type out.HealthChecker = in.HealthChecker + out.Halted = in.Halted return nil } @@ -3818,6 +3824,7 @@ func autoConvert_v1alpha2_ProxySQLSpec_To_v1_ProxySQLSpec(in *ProxySQLSpec, out out.TLS = (*clientgoapiv1.TLSConfig)(unsafe.Pointer(in.TLS)) // WARNING: in.TerminationPolicy requires manual conversion: does not exist in peer-type out.HealthChecker = in.HealthChecker + out.Halted = in.Halted return nil } @@ -3840,6 +3847,7 @@ func autoConvert_v1_ProxySQLSpec_To_v1alpha2_ProxySQLSpec(in *v1.ProxySQLSpec, o out.TLS = (*clientgoapiv1.TLSConfig)(unsafe.Pointer(in.TLS)) // WARNING: in.DeletionPolicy requires manual conversion: does not exist in peer-type out.HealthChecker = in.HealthChecker + out.Halted = in.Halted return nil } diff --git a/apis/kubedb/v1alpha2/zz_generated.deepcopy.go b/apis/kubedb/v1alpha2/zz_generated.deepcopy.go index 7e98f2fd00..cc663b6e7b 100644 --- a/apis/kubedb/v1alpha2/zz_generated.deepcopy.go +++ b/apis/kubedb/v1alpha2/zz_generated.deepcopy.go @@ -142,6 +142,11 @@ func (in *ArchiverRecovery) DeepCopyInto(out *ArchiverRecovery) { *out = new(apiv1.ObjectReference) **out = **in } + if in.ReplicationStrategy != nil { + in, out := &in.ReplicationStrategy, &out.ReplicationStrategy + *out = new(PITRReplicationStrategy) + **out = **in + } return } diff --git a/crds/kubedb.com_druids.yaml b/crds/kubedb.com_druids.yaml index aa763ade60..bc37d6eb67 100644 --- a/crds/kubedb.com_druids.yaml +++ b/crds/kubedb.com_druids.yaml @@ -145,6 +145,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object diff --git a/crds/kubedb.com_elasticsearches.yaml b/crds/kubedb.com_elasticsearches.yaml index 1c182edce8..ea27064318 100644 --- a/crds/kubedb.com_elasticsearches.yaml +++ b/crds/kubedb.com_elasticsearches.yaml @@ -141,6 +141,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object @@ -39761,6 +39768,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object diff --git a/crds/kubedb.com_etcds.yaml b/crds/kubedb.com_etcds.yaml index 9a33935e85..3826a1977a 100644 --- a/crds/kubedb.com_etcds.yaml +++ b/crds/kubedb.com_etcds.yaml @@ -100,6 +100,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object diff --git a/crds/kubedb.com_mariadbs.yaml b/crds/kubedb.com_mariadbs.yaml index 7ae0220a92..3e88cc5657 100644 --- a/crds/kubedb.com_mariadbs.yaml +++ b/crds/kubedb.com_mariadbs.yaml @@ -219,6 +219,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object @@ -5080,6 +5087,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object diff --git a/crds/kubedb.com_mongodbs.yaml b/crds/kubedb.com_mongodbs.yaml index 681aa6e4dc..c6d731bdf9 100644 --- a/crds/kubedb.com_mongodbs.yaml +++ b/crds/kubedb.com_mongodbs.yaml @@ -6481,6 +6481,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object @@ -26207,6 +26214,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object diff --git a/crds/kubedb.com_mssqlservers.yaml b/crds/kubedb.com_mssqlservers.yaml index 79876c0eeb..0507fb2e8a 100644 --- a/crds/kubedb.com_mssqlservers.yaml +++ b/crds/kubedb.com_mssqlservers.yaml @@ -245,6 +245,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object diff --git a/crds/kubedb.com_mysqls.yaml b/crds/kubedb.com_mysqls.yaml index 60825e52f5..b1eedf8a52 100644 --- a/crds/kubedb.com_mysqls.yaml +++ b/crds/kubedb.com_mysqls.yaml @@ -289,6 +289,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object @@ -8363,6 +8370,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object diff --git a/crds/kubedb.com_perconaxtradbs.yaml b/crds/kubedb.com_perconaxtradbs.yaml index 6d674da13f..5b925921f2 100644 --- a/crds/kubedb.com_perconaxtradbs.yaml +++ b/crds/kubedb.com_perconaxtradbs.yaml @@ -203,6 +203,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object @@ -5063,6 +5070,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object diff --git a/crds/kubedb.com_postgreses.yaml b/crds/kubedb.com_postgreses.yaml index 5af5a699db..a492661406 100644 --- a/crds/kubedb.com_postgreses.yaml +++ b/crds/kubedb.com_postgreses.yaml @@ -282,6 +282,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object @@ -5291,6 +5298,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object diff --git a/crds/kubedb.com_redises.yaml b/crds/kubedb.com_redises.yaml index 8a9b13a184..46b19c2d39 100644 --- a/crds/kubedb.com_redises.yaml +++ b/crds/kubedb.com_redises.yaml @@ -214,6 +214,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object @@ -5075,6 +5082,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object diff --git a/crds/kubedb.com_singlestores.yaml b/crds/kubedb.com_singlestores.yaml index 46f0979758..e927a5a8cb 100644 --- a/crds/kubedb.com_singlestores.yaml +++ b/crds/kubedb.com_singlestores.yaml @@ -126,6 +126,13 @@ spec: recoveryTimestamp: format: date-time type: string + replicationStrategy: + enum: + - fscopy + - clone + - sync + - none + type: string required: - recoveryTimestamp type: object diff --git a/openapi/swagger.json b/openapi/swagger.json index 3c0806b790..ca016f4553 100644 --- a/openapi/swagger.json +++ b/openapi/swagger.json @@ -23049,6 +23049,9 @@ }, "recoveryTimestamp": { "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "replicationStrategy": { + "type": "string" } } },