Skip to content

Commit 2e9ee8b

Browse files
committed
feat: add support for extraPVCs
This commit introduces the `extraPVCs` field in CRD, allowing users to attach additional PVC to main container. #2126 Signed-off-by: Emin Aktas <[email protected]>
1 parent 6997d68 commit 2e9ee8b

File tree

7 files changed

+2206
-16
lines changed

7 files changed

+2206
-16
lines changed

config/crd/bases/pxc.percona.com_perconaxtradbclusters.yaml

Lines changed: 525 additions & 0 deletions
Large diffs are not rendered by default.

deploy/bundle.yaml

Lines changed: 525 additions & 0 deletions
Large diffs are not rendered by default.

deploy/crd.yaml

Lines changed: 525 additions & 0 deletions
Large diffs are not rendered by default.

deploy/cw-bundle.yaml

Lines changed: 525 additions & 0 deletions
Large diffs are not rendered by default.

pkg/apis/pxc/v1/pxc_types.go

Lines changed: 75 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -549,22 +549,31 @@ type PodSpec struct {
549549
// Deprecated: Use ServiceExpose.Labels instead
550550
ReplicasServiceLabels map[string]string `json:"replicasServiceLabels,omitempty"`
551551

552-
SchedulerName string `json:"schedulerName,omitempty"`
553-
ReadinessInitialDelaySeconds *int32 `json:"readinessDelaySec,omitempty"`
554-
ReadinessProbes corev1.Probe `json:"readinessProbes,omitempty"`
555-
LivenessInitialDelaySeconds *int32 `json:"livenessDelaySec,omitempty"`
556-
LivenessProbes corev1.Probe `json:"livenessProbes,omitempty"`
557-
PodSecurityContext *corev1.PodSecurityContext `json:"podSecurityContext,omitempty"`
558-
ContainerSecurityContext *corev1.SecurityContext `json:"containerSecurityContext,omitempty"`
559-
ServiceAccountName string `json:"serviceAccountName,omitempty"`
560-
ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"`
561-
Sidecars []corev1.Container `json:"sidecars,omitempty"`
562-
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
563-
SidecarPVCs []corev1.PersistentVolumeClaim `json:"sidecarPVCs,omitempty"`
564-
RuntimeClassName *string `json:"runtimeClassName,omitempty"`
565-
HookScript string `json:"hookScript,omitempty"`
566-
Lifecycle corev1.Lifecycle `json:"lifecycle,omitempty"`
567-
TopologySpreadConstraints []corev1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"`
552+
SchedulerName string `json:"schedulerName,omitempty"`
553+
ReadinessInitialDelaySeconds *int32 `json:"readinessDelaySec,omitempty"`
554+
ReadinessProbes corev1.Probe `json:"readinessProbes,omitempty"`
555+
LivenessInitialDelaySeconds *int32 `json:"livenessDelaySec,omitempty"`
556+
LivenessProbes corev1.Probe `json:"livenessProbes,omitempty"`
557+
PodSecurityContext *corev1.PodSecurityContext `json:"podSecurityContext,omitempty"`
558+
ContainerSecurityContext *corev1.SecurityContext `json:"containerSecurityContext,omitempty"`
559+
ServiceAccountName string `json:"serviceAccountName,omitempty"`
560+
ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"`
561+
Sidecars []corev1.Container `json:"sidecars,omitempty"`
562+
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
563+
// +kubebuilder:validation:items:XEmbeddedResource
564+
SidecarPVCs []corev1.PersistentVolumeClaim `json:"sidecarPVCs,omitempty"`
565+
RuntimeClassName *string `json:"runtimeClassName,omitempty"`
566+
HookScript string `json:"hookScript,omitempty"`
567+
Lifecycle corev1.Lifecycle `json:"lifecycle,omitempty"`
568+
TopologySpreadConstraints []corev1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"`
569+
ExtraPVCs []ExtraPVC `json:"extraPVCs,omitempty"`
570+
}
571+
572+
type ExtraPVC struct {
573+
// +kubebuilder:validation:EmbeddedResource
574+
VolumeClaimTemplate corev1.PersistentVolumeClaim `json:"volumeClaimTemplate,omitempty"`
575+
MountPath string `json:"mountPath,omitempty"`
576+
ReadOnly *bool `json:"readOnly,omitempty"`
568577
}
569578

570579
func (spec *PodSpec) HasSidecarInternalSecret(secret *corev1.Secret) bool {
@@ -1568,6 +1577,56 @@ func AddSidecarPVCs(log logr.Logger, existing, sidecarPVCs []corev1.PersistentVo
15681577
return existing
15691578
}
15701579

1580+
func AddExtraVolumeMounts(log logr.Logger, existing []corev1.VolumeMount, extraPVCs []ExtraPVC) []corev1.VolumeMount {
1581+
if len(extraPVCs) == 0 {
1582+
return existing
1583+
}
1584+
1585+
names := make(map[string]struct{}, len(existing))
1586+
for _, v := range existing {
1587+
names[v.Name] = struct{}{}
1588+
}
1589+
1590+
for _, v := range extraPVCs {
1591+
name := v.VolumeClaimTemplate.GetName()
1592+
if _, ok := names[name]; ok {
1593+
log.Info("Volume name already exists, it is skipped", "volumeName", name)
1594+
continue
1595+
}
1596+
1597+
existing = append(existing, corev1.VolumeMount{
1598+
Name: name,
1599+
MountPath: v.MountPath,
1600+
ReadOnly: *v.ReadOnly,
1601+
})
1602+
}
1603+
1604+
return existing
1605+
}
1606+
1607+
func AddExtraPVCs(log logr.Logger, existing []corev1.PersistentVolumeClaim, extraPVCs []ExtraPVC) []corev1.PersistentVolumeClaim {
1608+
if len(extraPVCs) == 0 {
1609+
return existing
1610+
}
1611+
1612+
names := make(map[string]struct{}, len(existing))
1613+
for _, p := range existing {
1614+
names[p.Name] = struct{}{}
1615+
}
1616+
1617+
for _, p := range extraPVCs {
1618+
name := p.VolumeClaimTemplate.GetName()
1619+
if _, ok := names[name]; ok {
1620+
log.Info("PVC name already exists, it is skipped", "PVCName", name)
1621+
continue
1622+
}
1623+
1624+
existing = append(existing, p.VolumeClaimTemplate)
1625+
}
1626+
1627+
return existing
1628+
}
1629+
15711630
func (cr *PerconaXtraDBCluster) ProxySQLUnreadyServiceNamespacedName() types.NamespacedName {
15721631
return types.NamespacedName{
15731632
Name: cr.Name + "-proxysql-unready",

pkg/apis/pxc/v1/zz_generated.deepcopy.go

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/pxc/statefulset.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ func StatefulSet(
6464
return nil, errors.Wrap(err, "app container")
6565
}
6666

67+
appC.VolumeMounts = api.AddExtraVolumeMounts(log, appC.VolumeMounts, podSpec.ExtraPVCs)
68+
6769
pmmC, err := sfs.PMMContainer(ctx, cl, cr.Spec.PMM, secret, cr)
6870
if err != nil {
6971
log.Info(`"pmm container error"`, "secrets", cr.Spec.SecretsName, "internalSecrets", "internal-"+cr.Name, "error", err)
@@ -138,6 +140,7 @@ func StatefulSet(
138140
obj.Spec.VolumeClaimTemplates = sfsVolume.PVCs
139141
}
140142
obj.Spec.VolumeClaimTemplates = api.AddSidecarPVCs(log, obj.Spec.VolumeClaimTemplates, podSpec.SidecarPVCs)
143+
obj.Spec.VolumeClaimTemplates = api.AddExtraPVCs(log, obj.Spec.VolumeClaimTemplates, podSpec.ExtraPVCs)
141144

142145
return obj, nil
143146
}

0 commit comments

Comments
 (0)