diff --git a/api/v1/kubegres_types.go b/api/v1/kubegres_types.go index 28c8fd0d..b8acdc8b 100644 --- a/api/v1/kubegres_types.go +++ b/api/v1/kubegres_types.go @@ -31,6 +31,7 @@ type KubegresDatabase struct { Size string `json:"size,omitempty"` VolumeMount string `json:"volumeMount,omitempty"` StorageClassName *string `json:"storageClassName,omitempty"` + Folder string `json:"folder,omitempty"` } type KubegresBackUp struct { diff --git a/api/v1/zz_generated.deepcopy.go b/api/v1/zz_generated.deepcopy.go index cc11ebb4..73bf9b5d 100644 --- a/api/v1/zz_generated.deepcopy.go +++ b/api/v1/zz_generated.deepcopy.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated /* diff --git a/config/crd/bases/kubegres.reactive-tech.io_kubegres.yaml b/config/crd/bases/kubegres.reactive-tech.io_kubegres.yaml index 023ef7b1..bc2e5479 100644 --- a/config/crd/bases/kubegres.reactive-tech.io_kubegres.yaml +++ b/config/crd/bases/kubegres.reactive-tech.io_kubegres.yaml @@ -48,6 +48,8 @@ spec: type: string database: properties: + folder: + type: string size: type: string storageClassName: diff --git a/controllers/spec/checker/SpecChecker.go b/controllers/spec/checker/SpecChecker.go index 00097d44..48a0bc85 100644 --- a/controllers/spec/checker/SpecChecker.go +++ b/controllers/spec/checker/SpecChecker.go @@ -67,6 +67,16 @@ func (r *SpecChecker) CheckSpec() (SpecCheckResult, error) { r.kubegresContext.Kubegres.Spec.Database.VolumeMount = primaryVolumeMount r.updateKubegresSpec("spec.database.volumeMount", primaryVolumeMount) } + primaryFolder := r.GetEnv(primaryStatefulSetSpec.Template.Spec.Containers[0].Env, "PGDATA")[len(primaryVolumeMount)+1:] + if spec.Database.Folder != primaryFolder { + specCheckResult.HasSpecFatalError = true + specCheckResult.FatalErrorMessage = r.createErrMsgSpecCannotBeChanged("spec.database.folder", + primaryFolder, spec.Database.Folder, + "Otherwise, the cluster of PostgreSql servers risk of being inconsistent.") + + r.kubegresContext.Kubegres.Spec.Database.Folder = primaryFolder + r.updateKubegresSpec("spec.database.folder", primaryFolder) + } primaryStorageClassName := primaryStatefulSetSpec.VolumeClaimTemplates[0].Spec.StorageClassName if *spec.Database.StorageClassName != *primaryStorageClassName { @@ -343,3 +353,12 @@ func (r *SpecChecker) doesCurrentVolumeClaimTemplateExistInExpectedSpec(currentC } return false } + +func (r *SpecChecker) GetEnv(env []v1.EnvVar, envName string) string { + for _, envVar := range env { + if envVar.Name == envName { + return envVar.Value + } + } + return "" +} diff --git a/controllers/spec/defaultspec/UndefinedSpecValuesChecker.go b/controllers/spec/defaultspec/UndefinedSpecValuesChecker.go index 8063ea28..8b104aee 100644 --- a/controllers/spec/defaultspec/UndefinedSpecValuesChecker.go +++ b/controllers/spec/defaultspec/UndefinedSpecValuesChecker.go @@ -58,6 +58,11 @@ func (r *UndefinedSpecValuesChecker) apply() error { kubegresSpec.Database.VolumeMount = ctx.DefaultDatabaseVolumeMount r.createLog("spec.database.volumeMount", kubegresSpec.Database.VolumeMount) } + if kubegresSpec.Database.Folder == emptyStr { + wasSpecChanged = true + kubegresSpec.Database.Folder = ctx.DefaultDatabaseFolder + r.createLog("spec.database.folder", kubegresSpec.Database.Folder) + } if kubegresSpec.CustomConfig == emptyStr { wasSpecChanged = true diff --git a/controllers/spec/template/ResourcesCreatorFromTemplate.go b/controllers/spec/template/ResourcesCreatorFromTemplate.go index 4adedcd9..81390ee0 100644 --- a/controllers/spec/template/ResourcesCreatorFromTemplate.go +++ b/controllers/spec/template/ResourcesCreatorFromTemplate.go @@ -125,7 +125,7 @@ func (r *ResourcesCreatorFromTemplate) CreateReplicaStatefulSet(statefulSetInsta initContainer.Image = postgresSpec.Image initContainer.Env[0].Value = primaryServiceName initContainer.Env[1].ValueFrom = r.getEnvVar(ctx.EnvVarNameOfPostgresReplicationUserPsw).ValueFrom - initContainer.Env[2].Value = postgresSpec.Database.VolumeMount + "/" + ctx.DefaultDatabaseFolder + initContainer.Env[2].Value = postgresSpec.Database.VolumeMount + "/" + postgresSpec.Database.Folder initContainer.VolumeMounts[0].MountPath = postgresSpec.Database.VolumeMount return statefulSetTemplate, nil @@ -217,7 +217,7 @@ func (r *ResourcesCreatorFromTemplate) initStatefulSet( container.Image = postgresSpec.Image container.Ports[0].ContainerPort = postgresSpec.Port container.VolumeMounts[0].MountPath = postgresSpec.Database.VolumeMount - container.Env = append(container.Env, core.EnvVar{Name: ctx.EnvVarNamePgData, Value: postgresSpec.Database.VolumeMount + "/" + ctx.DefaultDatabaseFolder}) + container.Env = append(container.Env, core.EnvVar{Name: ctx.EnvVarNamePgData, Value: postgresSpec.Database.VolumeMount + "/" + postgresSpec.Database.Folder}) container.Env = append(container.Env, r.kubegresContext.Kubegres.Spec.Env...) statefulSetTemplate.Spec.VolumeClaimTemplates[0].Spec.StorageClassName = postgresSpec.Database.StorageClassName