Skip to content
Open
Show file tree
Hide file tree
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
2 changes: 2 additions & 0 deletions api/everest/v1alpha1/databasecluster_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,8 @@ type Proxy struct {
Replicas *int32 `json:"replicas,omitempty"`
// Config is the proxy configuration
Config string `json:"config,omitempty"`
// Storage is the proxy storage configuration
Storage *Storage `json:"storage"`
// Expose is the proxy expose configuration
// +kubebuilder:validation:XValidation:rule="self.type == 'internal' || !has(oldSelf.loadBalancerConfigName) || oldSelf.loadBalancerConfigName == '' || (has(self.loadBalancerConfigName) && self.loadBalancerConfigName != '')",message=".spec.proxy.expose.loadBalancerConfigName cannot be cleared once set"
Expose Expose `json:"expose,omitempty"`
Expand Down
10 changes: 7 additions & 3 deletions api/everest/v1alpha1/zz_generated.deepcopy.go

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

19 changes: 19 additions & 0 deletions config/crd/bases/everest.percona.com_databaseclusters.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,23 @@ spec:
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
type: object
storage:
description: Storage is the proxy storage configuration
properties:
class:
description: Class is the storage class to use for the persistent
volume claim
type: string
size:
anyOf:
- type: integer
- type: string
description: Size is the size of the persistent volume claim
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
required:
- size
type: object
type:
description: Type is the proxy type
enum:
Expand All @@ -502,6 +519,8 @@ spec:
- proxysql
- pgbouncer
type: string
required:
- storage
type: object
sharding:
description: Sharding is the sharding configuration. PSMDB-only
Expand Down
15 changes: 7 additions & 8 deletions internal/controller/everest/common/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -996,13 +996,12 @@ func ConfigureStorage(
c client.Client,
db *everestv1alpha1.DatabaseCluster,
currentSize resource.Quantity,
setStorageSizeFunc func(resource.Quantity),
desiredSize resource.Quantity,
storageClass *string,
setStorageSizeFunc func(resource.Quantity, *string),
) error {
meta.RemoveStatusCondition(&db.Status.Conditions, everestv1alpha1.ConditionTypeCannotResizeVolume)

desiredSize := db.Spec.Engine.Storage.Size
storageClass := db.Spec.Engine.Storage.Class

// We cannot shrink the volume size.
hasStorageShrunk := currentSize.Cmp(desiredSize) > 0 && !currentSize.IsZero()
if hasStorageShrunk {
Expand All @@ -1013,14 +1012,14 @@ func ConfigureStorage(
LastTransitionTime: metav1.Now(),
ObservedGeneration: db.GetGeneration(),
})
setStorageSizeFunc(currentSize)
setStorageSizeFunc(currentSize, storageClass)
return nil
}

// Check if storage size is being expanded. If not, set the desired size and return early.
hasStorageExpanded := currentSize.Cmp(desiredSize) < 0 && !currentSize.IsZero()
if !hasStorageExpanded {
setStorageSizeFunc(desiredSize)
setStorageSizeFunc(desiredSize, storageClass)
return nil
}

Expand All @@ -1037,11 +1036,11 @@ func ConfigureStorage(
LastTransitionTime: metav1.Now(),
ObservedGeneration: db.GetGeneration(),
})
setStorageSizeFunc(currentSize)
setStorageSizeFunc(currentSize, storageClass)
return nil
}

setStorageSizeFunc(desiredSize)
setStorageSizeFunc(desiredSize, storageClass)
return nil
}

Expand Down
11 changes: 8 additions & 3 deletions internal/controller/everest/common/helper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -294,25 +294,30 @@ func TestConfigureStorage(t *testing.T) {

// Setup test objects
var actualSize resource.Quantity
setSize := func(size resource.Quantity) {
storageClassName := tt.db.Spec.Engine.Storage.Class
desiredSize := tt.db.Spec.Engine.Storage.Size

setSize := func(size resource.Quantity, class *string) {
actualSize = size
storageClassName = class
}

// Setup fake client with storage class if needed
builder := fake.NewClientBuilder().WithScheme(scheme.Scheme)
if tt.storageClassExists && tt.db.Spec.Engine.Storage.Class != nil {
sc := &storagev1.StorageClass{
ObjectMeta: metav1.ObjectMeta{
Name: *tt.db.Spec.Engine.Storage.Class,
Name: *storageClassName,
},
AllowVolumeExpansion: &tt.storageClassAllowExpansion,
}
builder.WithObjects(sc)

}
client := builder.Build()

// Run the test
err := ConfigureStorage(t.Context(), client, tt.db, tt.currentSize, setSize)
err := ConfigureStorage(t.Context(), client, tt.db, tt.currentSize, desiredSize, storageClassName, setSize)

// Verify results
if tt.expectErr {
Expand Down
9 changes: 6 additions & 3 deletions internal/controller/everest/providers/pg/applier.go
Original file line number Diff line number Diff line change
Expand Up @@ -1373,12 +1373,15 @@ func configureStorage(
currentSize = current.DataVolumeClaimSpec.Resources.Requests[corev1.ResourceStorage]
}

setStorageSize := func(size resource.Quantity) {
storageClass := db.Spec.Engine.Storage.Class
desiredSize := db.Spec.Engine.Storage.Size

setStorageSize := func(size resource.Quantity, storageClass *string) {
desired.DataVolumeClaimSpec = corev1.PersistentVolumeClaimSpec{
AccessModes: []corev1.PersistentVolumeAccessMode{
corev1.ReadWriteOnce,
},
StorageClassName: db.Spec.Engine.Storage.Class,
StorageClassName: storageClass,
Resources: corev1.VolumeResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceStorage: size,
Expand All @@ -1387,5 +1390,5 @@ func configureStorage(
}
}

return common.ConfigureStorage(ctx, c, db, currentSize, setStorageSize)
return common.ConfigureStorage(ctx, c, db, currentSize, desiredSize, storageClass, setStorageSize)
}
9 changes: 6 additions & 3 deletions internal/controller/everest/providers/psmdb/applier.go
Original file line number Diff line number Diff line change
Expand Up @@ -940,11 +940,14 @@ func configureStorage(
currentSize = current.VolumeSpec.PersistentVolumeClaim.PersistentVolumeClaimSpec.Resources.Requests[corev1.ResourceStorage]
}

setStorageSize := func(size resource.Quantity) {
storageClass := db.Spec.Engine.Storage.Class
desiredSize := db.Spec.Engine.Storage.Size

setStorageSize := func(size resource.Quantity, storageClass *string) {
desired.VolumeSpec = &psmdbv1.VolumeSpec{
PersistentVolumeClaim: psmdbv1.PVCSpec{
PersistentVolumeClaimSpec: &corev1.PersistentVolumeClaimSpec{
StorageClassName: db.Spec.Engine.Storage.Class,
StorageClassName: storageClass,
Resources: corev1.VolumeResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceStorage: size,
Expand All @@ -955,5 +958,5 @@ func configureStorage(
}
}

return common.ConfigureStorage(ctx, c, db, currentSize, setStorageSize)
return common.ConfigureStorage(ctx, c, db, currentSize, desiredSize, storageClass, setStorageSize)
}
74 changes: 68 additions & 6 deletions internal/controller/everest/providers/pxc/applier.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,66 @@ func configureStorage(
}
currentSize := getCurrentStorageSize()

setStorageSize := func(size resource.Quantity) {
storageClass := db.Spec.Engine.Storage.Class
desiredSize := db.Spec.Engine.Storage.Size

setStorageSize := func(size resource.Quantity, storageClass *string) {
desired.PXC.PodSpec.VolumeSpec = &pxcv1.VolumeSpec{
PersistentVolumeClaim: &corev1.PersistentVolumeClaimSpec{
StorageClassName: db.Spec.Engine.Storage.Class,
StorageClassName: storageClass,
Resources: corev1.VolumeResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceStorage: size,
},
},
},
}
}

return common.ConfigureStorage(ctx, c, db, currentSize, desiredSize, storageClass, setStorageSize)
}

func configureProxySQLStorage(
ctx context.Context,
c client.Client,
desired *pxcv1.PerconaXtraDBClusterSpec,
current *pxcv1.PerconaXtraDBClusterSpec,
db *everestv1alpha1.DatabaseCluster,
) error {

getCurrentProxySQLStorageSize := func() resource.Quantity {
if db.Status.Status == everestv1alpha1.AppStateNew ||
current == nil ||
current.ProxySQL == nil ||
current.ProxySQL.PodSpec.VolumeSpec == nil ||
current.ProxySQL.PodSpec.VolumeSpec.PersistentVolumeClaim == nil {
return resource.Quantity{}
}
return current.ProxySQL.PodSpec.VolumeSpec.PersistentVolumeClaim.Resources.Requests[corev1.ResourceStorage]
}

getDesiredProxySQLStorageSize := func() resource.Quantity {
if db.Spec.Proxy.Storage == nil || db.Spec.Proxy.Storage.Size.IsZero() {
return resource.MustParse("2Gi")
}
return db.Spec.Proxy.Storage.Size
}

getStorageClass := func() *string {
if db.Spec.Proxy.Storage == nil || db.Spec.Proxy.Storage.Class == nil {
return db.Spec.Engine.Storage.Class
}
return db.Spec.Proxy.Storage.Class
}

currentSize := getCurrentProxySQLStorageSize()
desiredSize := getDesiredProxySQLStorageSize()
storageClass := getStorageClass()

setStorageProxySQLStorageSize := func(size resource.Quantity, storageClass *string) {
desired.ProxySQL.PodSpec.VolumeSpec = &pxcv1.VolumeSpec{
PersistentVolumeClaim: &corev1.PersistentVolumeClaimSpec{
StorageClassName: storageClass,
Resources: corev1.VolumeResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceStorage: size,
Expand All @@ -132,7 +188,7 @@ func configureStorage(
}
}

return common.ConfigureStorage(ctx, c, db, currentSize, setStorageSize)
return common.ConfigureStorage(ctx, c, db, currentSize, desiredSize, storageClass, setStorageProxySQLStorageSize)
}

// generatePass generates a random password.
Expand Down Expand Up @@ -479,6 +535,7 @@ func defaultSpec() pxcv1.PerconaXtraDBClusterSpec {
corev1.ResourceMemory: resource.MustParse("1G"),
corev1.ResourceCPU: resource.MustParse("600m"),
},
Requests: corev1.ResourceList{},
},
ReadinessProbes: corev1.Probe{TimeoutSeconds: haProxyProbesTimeout},
LivenessProbes: corev1.Probe{TimeoutSeconds: haProxyProbesTimeout},
Expand All @@ -492,6 +549,7 @@ func defaultSpec() pxcv1.PerconaXtraDBClusterSpec {
corev1.ResourceMemory: resource.MustParse("1G"),
corev1.ResourceCPU: resource.MustParse("600m"),
},
Requests: corev1.ResourceList{},
},
},
},
Expand Down Expand Up @@ -692,6 +750,10 @@ func (p *applier) applyProxySQLCfg() error {
}
proxySQL.Image = image

if err := configureProxySQLStorage(p.ctx, p.C, &p.PerconaXtraDBCluster.Spec, &p.currentPerconaXtraDBClusterSpec, p.DB); err != nil {
return err
}

shouldUpdateRequests := common.IsNewDatabaseCluster(p.DB.Status.Status)
if !p.DB.Spec.Proxy.Resources.CPU.IsZero() {
// When the limits are changed, triggers a pod restart, hence ensuring the requests are applied automatically (next block),
Expand All @@ -701,7 +763,7 @@ func (p *applier) applyProxySQLCfg() error {
// We now set the requests to the same value as the limits, however, we need to ensure that
// they're not automatically applied when Everest is upgraded, otherwise it leads to a proxy restart.
if shouldUpdateRequests ||
p.currentPerconaXtraDBClusterSpec.HAProxy.Resources.Requests.Cpu().
p.currentPerconaXtraDBClusterSpec.ProxySQL.Resources.Requests.Cpu().
Equal(p.DB.Spec.Proxy.Resources.CPU) {
proxySQL.Resources.Requests[corev1.ResourceCPU] = p.DB.Spec.Proxy.Resources.CPU
}
Expand All @@ -714,8 +776,8 @@ func (p *applier) applyProxySQLCfg() error {
// We now set the requests to the same value as the limits, however, we need to ensure that
// they're not automatically applied when Everest is upgraded, otherwise it leads to a proxy restart.
if shouldUpdateRequests ||
p.currentPerconaXtraDBClusterSpec.HAProxy.Resources.Requests.Cpu().
Equal(p.DB.Spec.Proxy.Resources.CPU) {
p.currentPerconaXtraDBClusterSpec.ProxySQL.Resources.Requests.Memory().
Equal(p.DB.Spec.Proxy.Resources.Memory) {
proxySQL.Resources.Requests[corev1.ResourceMemory] = p.DB.Spec.Proxy.Resources.Memory
}
}
Expand Down
Loading