From b76b22a8fbee67dd878c76440c4a51b55ca45852 Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 23 Mar 2026 12:29:35 +0100 Subject: [PATCH] Pv + Pvc for admiralty purpose --- tools/kubernetes.go | 44 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/tools/kubernetes.go b/tools/kubernetes.go index 9878984..f9d6bb6 100644 --- a/tools/kubernetes.go +++ b/tools/kubernetes.go @@ -599,11 +599,38 @@ func (k *KubernetesService) CreateSecret(context context.Context, minioId string return nil } -// CreatePVC creates a PersistentVolumeClaim in the given namespace. -// Uses "local-path-immediate" StorageClass (volumeBindingMode: Immediate) to avoid -// the WaitForFirstConsumer deadlock with Admiralty virtual nodes. +// CreatePVC creates a static PersistentVolume + PersistentVolumeClaim in the given namespace. +// Static provisioning (no StorageClass) avoids the WaitForFirstConsumer deadlock +// with Admiralty virtual nodes — the PVC binds immediately. func (k *KubernetesService) CreatePVC(ctx context.Context, name, namespace, storageSize string) error { - storageClassName := "local-path-immediate" + storageClassName := "" + pv := &v1.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: v1.PersistentVolumeSpec{ + Capacity: v1.ResourceList{ + v1.ResourceStorage: resource.MustParse(storageSize), + }, + AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}, + StorageClassName: storageClassName, + PersistentVolumeReclaimPolicy: v1.PersistentVolumeReclaimDelete, + PersistentVolumeSource: v1.PersistentVolumeSource{ + HostPath: &v1.HostPathVolumeSource{ + Path: "/var/lib/oc-storage/" + name, + }, + }, + ClaimRef: &v1.ObjectReference{ + Namespace: namespace, + Name: name, + }, + }, + } + _, err := k.Set.CoreV1().PersistentVolumes().Create(ctx, pv, metav1.CreateOptions{}) + if err != nil && !apierrors.IsAlreadyExists(err) { + return fmt.Errorf("CreatePV %s: %w", name, err) + } + pvc := &v1.PersistentVolumeClaim{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -612,6 +639,7 @@ func (k *KubernetesService) CreatePVC(ctx context.Context, name, namespace, stor Spec: v1.PersistentVolumeClaimSpec{ AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}, StorageClassName: &storageClassName, + VolumeName: name, Resources: v1.VolumeResourceRequirements{ Requests: v1.ResourceList{ v1.ResourceStorage: resource.MustParse(storageSize), @@ -619,19 +647,23 @@ func (k *KubernetesService) CreatePVC(ctx context.Context, name, namespace, stor }, }, } - _, err := k.Set.CoreV1().PersistentVolumeClaims(namespace).Create(ctx, pvc, metav1.CreateOptions{}) + _, err = k.Set.CoreV1().PersistentVolumeClaims(namespace).Create(ctx, pvc, metav1.CreateOptions{}) if err != nil && !apierrors.IsAlreadyExists(err) { return fmt.Errorf("CreatePVC %s/%s: %w", namespace, name, err) } return nil } -// DeletePVC deletes a PersistentVolumeClaim from the given namespace. +// DeletePVC deletes a PersistentVolumeClaim and its associated PersistentVolume. func (k *KubernetesService) DeletePVC(ctx context.Context, name, namespace string) error { err := k.Set.CoreV1().PersistentVolumeClaims(namespace).Delete(ctx, name, metav1.DeleteOptions{}) if err != nil && !apierrors.IsNotFound(err) { return fmt.Errorf("DeletePVC %s/%s: %w", namespace, name, err) } + err = k.Set.CoreV1().PersistentVolumes().Delete(ctx, name, metav1.DeleteOptions{}) + if err != nil && !apierrors.IsNotFound(err) { + return fmt.Errorf("DeletePV %s: %w", name, err) + } return nil }