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
}