func NewPVCs()

in oracle/controllers/resources.go [300:368]


func NewPVCs(sp StsParams) ([]corev1.PersistentVolumeClaim, error) {
	var pvcs []corev1.PersistentVolumeClaim

	for _, diskSpec := range sp.Disks {
		var configSpec *commonv1alpha1.ConfigSpec
		if sp.Config != nil {
			configSpec = &sp.Config.Spec.ConfigSpec
		}
		rl := corev1.ResourceList{corev1.ResourceStorage: utils.FindDiskSize(&diskSpec, configSpec, DefaultDiskSpecs, defaultDiskSize)}
		var pvcName, mount string
		if IsReservedDiskName(diskSpec.Name) {
			pvcName, mount = GetPVCNameAndMount(sp.Inst.Name, diskSpec.Name)
		} else {
			pvcName, mount = GetCustomPVCNameAndMount(sp.Inst, diskSpec.Name)
		}
		var pvc corev1.PersistentVolumeClaim

		// Determine storage class (from disk spec or config)
		storageClass, err := utils.FindStorageClassName(&diskSpec, configSpec, utils.PlatformGCP, utils.EngineOracle)
		if err != nil || storageClass == "" {
			return nil, fmt.Errorf("failed to identify a storageClassName for disk %q", diskSpec.Name)
		}
		sp.Log.Info("storage class identified", "disk", diskSpec.Name, "StorageClass", storageClass)

		var pvcAnnotations map[string]string
		if diskSpec.Annotations != nil {
			pvcAnnotations = diskSpec.Annotations
		}

		var ownerRef []metav1.OwnerReference
		if !sp.Inst.Spec.RetainDisksAfterInstanceDeletion {
			// Instead of manually handling PVCs after an instance is deleted,
			// we leverage ownerRef to automatically delete PVCs if necessary.
			ownerRef = []metav1.OwnerReference{
				ownerref.New(sp.Inst, true, true),
			}
		}

		pvc = corev1.PersistentVolumeClaim{
			TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: "PersistentVolumeClaim"},
			ObjectMeta: metav1.ObjectMeta{
				Name:            pvcName,
				Namespace:       sp.Inst.Namespace,
				Annotations:     pvcAnnotations,
				OwnerReferences: ownerRef,
			},
			Spec: corev1.PersistentVolumeClaimSpec{
				AccessModes:      []corev1.PersistentVolumeAccessMode{"ReadWriteOnce"},
				Resources:        corev1.ResourceRequirements{Requests: rl},
				StorageClassName: func() *string { s := storageClass; return &s }(),
			},
		}

		if sp.Restore != nil && sp.Restore.BackupID != "" {
			sp.Log.Info("starting a restore process for disk", "mount", mount)
			pvc.Spec.DataSource = &corev1.TypedLocalObjectReference{
				APIGroup: func() *string { s := string("snapshot.storage.k8s.io"); return &s }(),
				Kind:     "VolumeSnapshot",
				Name:     fmt.Sprintf("%s-%s", sp.Restore.BackupID, mount),
			}
		} else {
			sp.Log.Info("starting a provisioning process for disk", "mount", mount)
		}

		pvcs = append(pvcs, pvc)
	}

	return pvcs, nil
}