Skip to content
Open
Show file tree
Hide file tree
Changes from 4 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
79 changes: 79 additions & 0 deletions pkg/apis/cpo.opensource.cybertec.at/v1/crds.go
Original file line number Diff line number Diff line change
Expand Up @@ -1347,6 +1347,85 @@ var PostgresCRDResourceValidation = apiextv1.CustomResourceValidation{
},
},
},
"walPvc": {
Type: "object",
Nullable: true,
Properties: map[string]apiextv1.JSONSchemaProps{
"waldir": {
Type: "string",
},
"walvolume": {
Type: "object",
Required: []string{"size"},
Properties: map[string]apiextv1.JSONSchemaProps{
"iops": {
Type: "integer",
},
"selector": {
Type: "object",
Properties: map[string]apiextv1.JSONSchemaProps{
"matchExpressions": {
Type: "array",
Items: &apiextv1.JSONSchemaPropsOrArray{
Schema: &apiextv1.JSONSchemaProps{
Type: "object",
Required: []string{"key", "operator"},
Properties: map[string]apiextv1.JSONSchemaProps{
"key": {
Type: "string",
},
"operator": {
Type: "string",
Enum: []apiextv1.JSON{
{
Raw: []byte(`"DoesNotExist"`),
},
{
Raw: []byte(`"Exists"`),
},
{
Raw: []byte(`"In"`),
},
{
Raw: []byte(`"NotIn"`),
},
},
},
"values": {
Type: "array",
Items: &apiextv1.JSONSchemaPropsOrArray{
Schema: &apiextv1.JSONSchemaProps{
Type: "string",
},
},
},
},
},
},
},
"matchLabels": {
Type: "object",
XPreserveUnknownFields: util.True(),
},
},
},
"size": {
Type: "string",
Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$",
},
"storageClass": {
Type: "string",
},
"subPath": {
Type: "string",
},
"throughput": {
Type: "integer",
},
},
},
},
},
},
},
"status": {
Expand Down
6 changes: 6 additions & 0 deletions pkg/apis/cpo.opensource.cybertec.at/v1/postgresql_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,12 @@ type PostgresSpec struct {
Backup *Backup `json:"backup,omitempty"`
TDE *TDE `json:"tde,omitempty"`
Monitoring *Monitoring `json:"monitor,omitempty"`
WalPvc *PVCVolume `json:"walPvc,omitempty"`
}

type PVCVolume struct {
WalVolume Volume `json:"walvolume,omitempty"`
WalDir string `json:"waldir,omitempty"`
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
Expand Down
22 changes: 22 additions & 0 deletions pkg/apis/cpo.opensource.cybertec.at/v1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 29 additions & 3 deletions pkg/cluster/k8sres.go
Original file line number Diff line number Diff line change
Expand Up @@ -659,6 +659,14 @@ func generateVolumeMounts(volume cpov1.Volume) []v1.VolumeMount {
}
}

func generateWalVolumeMounts(volume cpov1.Volume, dir string) v1.VolumeMount {
return v1.VolumeMount{
Name: dir,
MountPath: constants.PostgresWalMount, //TODO: fetch from manifest
SubPath: volume.SubPath,
}
}

func generateContainer(
name string,
dockerImage *string,
Expand Down Expand Up @@ -1004,6 +1012,9 @@ func (c *Cluster) generateSpiloPodEnvVars(
if spec.Monitoring != nil {
envVars = append(envVars, v1.EnvVar{Name: "cpo_monitoring_stack", Value: "true"})
}
if spec.WalPvc != nil {
envVars = append(envVars, v1.EnvVar{Name: "WALDIR", Value: spec.WalPvc.WalDir})
}

if c.OpConfig.EnablePgVersionEnvVar {
envVars = append(envVars, v1.EnvVar{Name: "PGVERSION", Value: c.GetDesiredMajorVersion()})
Expand Down Expand Up @@ -1290,9 +1301,9 @@ func (c *Cluster) generateStatefulSet(spec *cpov1.PostgresSpec) (*appsv1.Statefu
sidecarContainers []v1.Container
podTemplate *v1.PodTemplateSpec
volumeClaimTemplate *v1.PersistentVolumeClaim
WalPvcClaim *v1.PersistentVolumeClaim
additionalVolumes = spec.AdditionalVolumes
)

defaultResources := makeDefaultResources(&c.OpConfig)
resourceRequirements, err := c.generateResourceRequirements(
spec.Resources, defaultResources, constants.PostgresContainerName)
Expand Down Expand Up @@ -1365,6 +1376,10 @@ func (c *Cluster) generateStatefulSet(spec *cpov1.PostgresSpec) (*appsv1.Statefu

volumeMounts := generateVolumeMounts(spec.Volume)

if spec.WalPvc != nil {
volumeMounts = append(volumeMounts, generateWalVolumeMounts(spec.WalPvc.WalVolume, spec.WalPvc.WalDir))
}

// configure TLS with a custom secret volume
if spec.TLS != nil && spec.TLS.SecretName != "" {
getSpiloTLSEnv := func(k string) string {
Expand Down Expand Up @@ -1509,7 +1524,13 @@ func (c *Cluster) generateStatefulSet(spec *cpov1.PostgresSpec) (*appsv1.Statefu
additionalVolumes = append(additionalVolumes, c.generateCertSecretVolume())
}
}

if spec.WalPvc != nil {
WalPvcClaim, err = c.generatePersistentVolumeClaimTemplate(spec.WalPvc.WalVolume.Size,
spec.WalPvc.WalVolume.StorageClass, spec.WalPvc.WalVolume.Selector, spec.WalPvc.WalDir)
if err != nil {
c.logger.Errorf("could not generate volume claim template for WAL directory: %v", err)
}
}
// generate pod template for the statefulset, based on the spilo container and sidecars
podTemplate, err = c.generatePodTemplate(
c.Namespace,
Expand Down Expand Up @@ -1578,6 +1599,11 @@ func (c *Cluster) generateStatefulSet(spec *cpov1.PostgresSpec) (*appsv1.Statefu
persistentVolumeClaimRetentionPolicy.WhenScaled = appsv1.RetainPersistentVolumeClaimRetentionPolicyType
}

final_vols := []v1.PersistentVolumeClaim{*volumeClaimTemplate}
if spec.WalPvc != nil {
final_vols = []v1.PersistentVolumeClaim{*volumeClaimTemplate, *WalPvcClaim}
}

statefulSet := &appsv1.StatefulSet{
ObjectMeta: metav1.ObjectMeta{
Name: c.statefulSetName(),
Expand All @@ -1590,7 +1616,7 @@ func (c *Cluster) generateStatefulSet(spec *cpov1.PostgresSpec) (*appsv1.Statefu
Selector: c.labelsSelector(TYPE_POSTGRESQL),
ServiceName: c.serviceName(Master),
Template: *podTemplate,
VolumeClaimTemplates: []v1.PersistentVolumeClaim{*volumeClaimTemplate},
VolumeClaimTemplates: final_vols, //[]v1.PersistentVolumeClaim{*volumeClaimTemplate, *WalPvcClaim},
UpdateStrategy: updateStrategy,
PodManagementPolicy: podManagementPolicy,
PersistentVolumeClaimRetentionPolicy: &persistentVolumeClaimRetentionPolicy,
Expand Down
2 changes: 1 addition & 1 deletion pkg/cluster/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -1632,7 +1632,7 @@ func (c *Cluster) syncPgbackrestJob(forceRemove bool) error {
if err := c.createPgbackrestJob(job); err != nil {
return fmt.Errorf("could not create a pgbackrest cronjob: %v", err)
}
c.logger.Info("pgbackrest cronjob for %v %v has been successfully created", rep, schedul)
c.logger.Infof("pgbackrest cronjob for %v %v has been successfully created", rep, schedul)
}
}
}
Expand Down
14 changes: 7 additions & 7 deletions pkg/generated/clientset/versioned/fake/register.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 7 additions & 7 deletions pkg/generated/clientset/versioned/scheme/register.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions pkg/util/constants/postgresql.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,6 @@ const (

RunVolumeName = "postgresql-run"
RunVolumePath = "/var/run/postgresql"

PostgresWalMount = "/home/postgres/pgwal"
)