func()

in pkg/webhook/volumes.go [36:82]


func (si *SidecarInjector) isGcsFuseCSIVolume(volume corev1.Volume, namespace string) (bool, bool, map[string]string, error) {
	var isDynamicMount bool

	// Check if it is ephemeral volume.
	if volume.CSI != nil {
		if volume.CSI.Driver == gcsFuseCsiDriverName {
			// Ephemeral volume is using dynamic mounting,
			// See details: https://cloud.google.com/storage/docs/gcsfuse-mount#dynamic-mount
			if val, ok := volume.CSI.VolumeAttributes["bucketName"]; ok && val == "_" {
				isDynamicMount = true
			}

			return true, isDynamicMount, volume.CSI.VolumeAttributes, nil
		}

		return false, false, nil, nil
	}

	// Check if it's a persistent volume.
	pvc := volume.PersistentVolumeClaim
	if pvc == nil {
		return false, false, nil, nil
	}
	pvcName := pvc.ClaimName
	pvcObj, err := si.GetPVC(namespace, pvcName)
	if err != nil {
		return false, false, nil, err
	}

	// Check if the PVC is a preprovisioned gcsfuse volume.
	pv, ok, err := si.GetPreprovisionCSIVolume(gcsFuseCsiDriverName, pvcObj)
	if err != nil || pv == nil {
		klog.Warningf("unable to determine if PVC %s/%s is a pre-provisioned gcsfuse volume: %v", namespace, pvcName, err)

		return false, false, nil, nil
	}

	if ok {
		if pv.Spec.CSI != nil && pv.Spec.CSI.VolumeHandle == "_" {
			isDynamicMount = true
		}

		return true, isDynamicMount, pv.Spec.CSI.VolumeAttributes, nil
	}

	return false, false, nil, nil
}