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
525 changes: 525 additions & 0 deletions config/crd/bases/pxc.percona.com_perconaxtradbclusters.yaml

Large diffs are not rendered by default.

525 changes: 525 additions & 0 deletions deploy/bundle.yaml

Large diffs are not rendered by default.

525 changes: 525 additions & 0 deletions deploy/crd.yaml

Large diffs are not rendered by default.

525 changes: 525 additions & 0 deletions deploy/cw-bundle.yaml

Large diffs are not rendered by default.

91 changes: 75 additions & 16 deletions pkg/apis/pxc/v1/pxc_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -549,22 +549,31 @@ type PodSpec struct {
// Deprecated: Use ServiceExpose.Labels instead
ReplicasServiceLabels map[string]string `json:"replicasServiceLabels,omitempty"`

SchedulerName string `json:"schedulerName,omitempty"`
ReadinessInitialDelaySeconds *int32 `json:"readinessDelaySec,omitempty"`
ReadinessProbes corev1.Probe `json:"readinessProbes,omitempty"`
LivenessInitialDelaySeconds *int32 `json:"livenessDelaySec,omitempty"`
LivenessProbes corev1.Probe `json:"livenessProbes,omitempty"`
PodSecurityContext *corev1.PodSecurityContext `json:"podSecurityContext,omitempty"`
ContainerSecurityContext *corev1.SecurityContext `json:"containerSecurityContext,omitempty"`
ServiceAccountName string `json:"serviceAccountName,omitempty"`
ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"`
Sidecars []corev1.Container `json:"sidecars,omitempty"`
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
SidecarPVCs []corev1.PersistentVolumeClaim `json:"sidecarPVCs,omitempty"`
RuntimeClassName *string `json:"runtimeClassName,omitempty"`
HookScript string `json:"hookScript,omitempty"`
Lifecycle corev1.Lifecycle `json:"lifecycle,omitempty"`
TopologySpreadConstraints []corev1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"`
SchedulerName string `json:"schedulerName,omitempty"`
ReadinessInitialDelaySeconds *int32 `json:"readinessDelaySec,omitempty"`
ReadinessProbes corev1.Probe `json:"readinessProbes,omitempty"`
LivenessInitialDelaySeconds *int32 `json:"livenessDelaySec,omitempty"`
LivenessProbes corev1.Probe `json:"livenessProbes,omitempty"`
PodSecurityContext *corev1.PodSecurityContext `json:"podSecurityContext,omitempty"`
ContainerSecurityContext *corev1.SecurityContext `json:"containerSecurityContext,omitempty"`
ServiceAccountName string `json:"serviceAccountName,omitempty"`
ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"`
Sidecars []corev1.Container `json:"sidecars,omitempty"`
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// +kubebuilder:validation:items:XEmbeddedResource
SidecarPVCs []corev1.PersistentVolumeClaim `json:"sidecarPVCs,omitempty"`
RuntimeClassName *string `json:"runtimeClassName,omitempty"`
HookScript string `json:"hookScript,omitempty"`
Lifecycle corev1.Lifecycle `json:"lifecycle,omitempty"`
TopologySpreadConstraints []corev1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"`
ExtraPVCs []ExtraPVC `json:"extraPVCs,omitempty"`
}

type ExtraPVC struct {
// +kubebuilder:validation:EmbeddedResource
VolumeClaimTemplate corev1.PersistentVolumeClaim `json:"volumeClaimTemplate,omitempty"`
MountPath string `json:"mountPath,omitempty"`
ReadOnly *bool `json:"readOnly,omitempty"`
}

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

func AddExtraVolumeMounts(log logr.Logger, existing []corev1.VolumeMount, extraPVCs []ExtraPVC) []corev1.VolumeMount {
if len(extraPVCs) == 0 {
return existing
}

names := make(map[string]struct{}, len(existing))
for _, v := range existing {
names[v.Name] = struct{}{}
}

for _, v := range extraPVCs {
name := v.VolumeClaimTemplate.GetName()
if _, ok := names[name]; ok {
log.Info("Volume name already exists, it is skipped", "volumeName", name)
continue
}

existing = append(existing, corev1.VolumeMount{
Name: name,
MountPath: v.MountPath,
ReadOnly: *v.ReadOnly,
})
}

return existing
}

func AddExtraPVCs(log logr.Logger, existing []corev1.PersistentVolumeClaim, extraPVCs []ExtraPVC) []corev1.PersistentVolumeClaim {
if len(extraPVCs) == 0 {
return existing
}

names := make(map[string]struct{}, len(existing))
for _, p := range existing {
names[p.Name] = struct{}{}
}

for _, p := range extraPVCs {
name := p.VolumeClaimTemplate.GetName()
if _, ok := names[name]; ok {
log.Info("PVC name already exists, it is skipped", "PVCName", name)
continue
}

existing = append(existing, p.VolumeClaimTemplate)
}

return existing
}

func (cr *PerconaXtraDBCluster) ProxySQLUnreadyServiceNamespacedName() types.NamespacedName {
return types.NamespacedName{
Name: cr.Name + "-proxysql-unready",
Expand Down
28 changes: 28 additions & 0 deletions pkg/apis/pxc/v1/zz_generated.deepcopy.go

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

3 changes: 2 additions & 1 deletion pkg/controller/pxcrestore/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ func TestOperatorRestart(t *testing.T) {
ctx := context.Background()

const clusterName = "test-cluster"
const datadirPvcName = "datadir-" + clusterName + "-pxc-0"
const namespace = "namespace"
const backupName = clusterName + "-backup"
const restoreName = clusterName + "-restore"
Expand Down Expand Up @@ -436,7 +437,7 @@ func TestOperatorRestart(t *testing.T) {
cr.Status.State = state
objects := append(tt.objects, tt.bcp, cr, cluster, crSecret, &corev1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{
Name: "pvc1",
Name: datadirPvcName,
Namespace: namespace,
Labels: statefulset.NewNode(cluster).Labels(),
},
Expand Down
14 changes: 11 additions & 3 deletions pkg/k8s/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ func PauseClusterWithWait(ctx context.Context, cl client.Client, cr *api.Percona
}
}

err = waitForPVCShutdown(ctx, cl, ls, cr.Namespace)
err = waitForPVCShutdown(ctx, cl, ls, cr.Namespace, pvcNameTemplate)
if err != nil {
return errors.Wrap(err, "shutdown pvc")
}
Expand Down Expand Up @@ -172,7 +172,7 @@ func waitForPodsShutdown(ctx context.Context, cl client.Client, ls map[string]st

const waitLimitSec int64 = 300

func waitForPVCShutdown(ctx context.Context, cl client.Client, ls map[string]string, namespace string) error {
func waitForPVCShutdown(ctx context.Context, cl client.Client, ls map[string]string, namespace, pvcNameTemplate string) error {
for i := int64(0); i < waitLimitSec; i++ {
pvcs := corev1.PersistentVolumeClaimList{}

Expand All @@ -188,7 +188,15 @@ func waitForPVCShutdown(ctx context.Context, cl client.Client, ls map[string]str
return errors.Wrap(err, "get pvc list")
}

if len(pvcs.Items) == 1 {
filtered := []corev1.PersistentVolumeClaim{}
for _, pvc := range pvcs.Items {
// check prefix to filter out extraPVCs
if strings.HasPrefix(pvc.Name, pvcNameTemplate) {
filtered = append(filtered, pvc)
}
}

if len(filtered) == 1 {
return nil
}

Expand Down
3 changes: 3 additions & 0 deletions pkg/pxc/statefulset.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ func StatefulSet(
return nil, errors.Wrap(err, "app container")
}

appC.VolumeMounts = api.AddExtraVolumeMounts(log, appC.VolumeMounts, podSpec.ExtraPVCs)

pmmC, err := sfs.PMMContainer(ctx, cl, cr.Spec.PMM, secret, cr)
if err != nil {
log.Info(`"pmm container error"`, "secrets", cr.Spec.SecretsName, "internalSecrets", "internal-"+cr.Name, "error", err)
Expand Down Expand Up @@ -138,6 +140,7 @@ func StatefulSet(
obj.Spec.VolumeClaimTemplates = sfsVolume.PVCs
}
obj.Spec.VolumeClaimTemplates = api.AddSidecarPVCs(log, obj.Spec.VolumeClaimTemplates, podSpec.SidecarPVCs)
obj.Spec.VolumeClaimTemplates = api.AddExtraPVCs(log, obj.Spec.VolumeClaimTemplates, podSpec.ExtraPVCs)

return obj, nil
}
Expand Down