in plugins/rbd.go [169:213]
func (p rbdCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error) {
if pv == nil || pv.Spec.RBD == nil {
return nil, fmt.Errorf("pv is nil or RBD Volume not defined on pv")
}
var volID string
volumeAttributes := make(map[string]string)
if pv.Annotations[CSIRBDVolHandleAnnKey] != "" {
volID = pv.Annotations[CSIRBDVolHandleAnnKey]
volumeAttributes[clusterIDKey] = pv.Annotations[clusterIDKey]
} else {
mons := strings.Join(pv.Spec.RBD.CephMonitors, ",")
pool := pv.Spec.RBD.RBDPool
image := pv.Spec.RBD.RBDImage
volumeAttributes[staticVolKey] = defaultMigStaticVal
volumeAttributes[clusterIDKey] = fmt.Sprintf("%x", md5.Sum([]byte(mons)))
volID = composeMigVolID(mons, pool, image)
}
err := fillVolAttrsForRequest(pv, volumeAttributes)
if err != nil {
return nil, err
}
if volumeAttributes[imgFeatureKey] == "" {
volumeAttributes[imgFeatureKey] = defaultImgFeatureVal
}
var am v1.PersistentVolumeAccessMode
if pv.Spec.RBD.ReadOnly {
am = v1.ReadOnlyMany
} else {
am = v1.ReadWriteOnce
}
pv.Spec.AccessModes = []v1.PersistentVolumeAccessMode{am}
csiSource := &v1.CSIPersistentVolumeSource{
Driver: RBDDriverName,
FSType: pv.Spec.RBD.FSType,
VolumeHandle: volID,
VolumeAttributes: volumeAttributes,
NodeStageSecretRef: pv.Spec.RBD.SecretRef,
ControllerExpandSecretRef: pv.Spec.RBD.SecretRef,
}
pv.Spec.RBD = nil
pv.Spec.CSI = csiSource
return pv, nil
}