lxd/storage_ceph_utils.go
func getRBDMappedDevPath(clusterName string, poolName string, volumeType string,
	volumeName string, doMap bool, userName string) (string, int) {
	files, err := ioutil.ReadDir("/sys/devices/rbd")
	if err != nil {
		if os.IsNotExist(err) {
			if doMap {
				goto mapImage
			}

			return "", 0
		}

		return "", -1
	}

	for _, f := range files {
		if !f.IsDir() {
			continue
		}

		fName := f.Name()
		idx, err := strconv.ParseUint(fName, 10, 64)
		if err != nil {
			continue
		}

		tmp := fmt.Sprintf("/sys/devices/rbd/%s/pool", fName)
		contents, err := ioutil.ReadFile(tmp)
		if err != nil {
			if os.IsNotExist(err) {
				continue
			}

			return "", -1
		}

		detectedPoolName := strings.TrimSpace(string(contents))
		if detectedPoolName != poolName {
			continue
		}

		tmp = fmt.Sprintf("/sys/devices/rbd/%s/name", fName)
		contents, err = ioutil.ReadFile(tmp)
		if err != nil {
			if os.IsNotExist(err) {
				continue
			}

			return "", -1
		}

		typedVolumeName := fmt.Sprintf("%s_%s", volumeType, volumeName)
		detectedVolumeName := strings.TrimSpace(string(contents))
		if detectedVolumeName != typedVolumeName {
			continue
		}

		tmp = fmt.Sprintf("/sys/devices/rbd/%s/snap", fName)
		contents, err = ioutil.ReadFile(tmp)
		if err != nil {
			if os.IsNotExist(err) {
				return fmt.Sprintf("/dev/rbd%d", idx), 1
			}

			return "", -1
		}

		detectedSnapName := strings.TrimSpace(string(contents))
		if detectedSnapName != "-" {
			continue
		}

		return fmt.Sprintf("/dev/rbd%d", idx), 1
	}

	if !doMap {
		return "", 0
	}

mapImage:
	devPath, err := cephRBDVolumeMap(clusterName, poolName,
		volumeName, volumeType, userName)
	if err != nil {
		return "", -1
	}

	return strings.TrimSpace(devPath), 2
}
func getRBDMappedDevPath(clusterName string, poolName string, volumeType string,
	volumeName string, doMap bool, userName string) (string, int) {
	files, err := ioutil.ReadDir("/sys/devices/rbd")
	if err != nil {
		if os.IsNotExist(err) {
			if doMap {
				goto mapImage
			}

			return "", 0
		}

		return "", -1
	}

	for _, f := range files {
		if !f.IsDir() {
			continue
		}

		fName := f.Name()
		idx, err := strconv.ParseUint(fName, 10, 64)
		if err != nil {
			continue
		}

		tmp := fmt.Sprintf("/sys/devices/rbd/%s/pool", fName)
		contents, err := ioutil.ReadFile(tmp)
		if err != nil {
			if os.IsNotExist(err) {
				continue
			}

			return "", -1
		}

		detectedPoolName := strings.TrimSpace(string(contents))
		if detectedPoolName != poolName {
			continue
		}

		tmp = fmt.Sprintf("/sys/devices/rbd/%s/name", fName)
		contents, err = ioutil.ReadFile(tmp)
		if err != nil {
			if os.IsNotExist(err) {
				continue
			}

			return "", -1
		}

		typedVolumeName := fmt.Sprintf("%s_%s", volumeType, volumeName)
		detectedVolumeName := strings.TrimSpace(string(contents))
		if detectedVolumeName != typedVolumeName {
			continue
		}

		tmp = fmt.Sprintf("/sys/devices/rbd/%s/snap", fName)
		contents, err = ioutil.ReadFile(tmp)
		if err != nil {
			if os.IsNotExist(err) {
				return fmt.Sprintf("/dev/rbd%d", idx), 1
			}

			return "", -1
		}

		detectedSnapName := strings.TrimSpace(string(contents))
		if detectedSnapName != "-" {
			continue
		}

		return fmt.Sprintf("/dev/rbd%d", idx), 1
	}

	if !doMap {
		return "", 0
	}

mapImage:
	devPath, err := cephRBDVolumeMap(clusterName, poolName,
		volumeName, volumeType, userName)
	if err != nil {
		return "", -1
	}

	return strings.TrimSpace(devPath), 2
}
func getRBDMappedDevPath ( clusterName string , poolName string , volumeType string , volumeName string , doMap bool , userName string ) ( string , int ) { files , err := ioutil . ReadDir ( " " ) if err != nil { if os . IsNotExist ( err ) { if doMap { goto mapImage } return " " , 0 } return " " , - 1 } for _ , f := range files { if ! f . IsDir ( ) { continue } fName := f . Name ( ) idx , err := strconv . ParseUint ( fName , 10 , 64 ) if err != nil { continue } tmp := fmt . Sprintf ( " " , fName ) contents , err := ioutil . ReadFile ( tmp ) if err != nil { if os . IsNotExist ( err ) { continue } return " " , - 1 } detectedPoolName := strings . TrimSpace ( string ( contents ) ) if detectedPoolName != poolName { continue } tmp = fmt . Sprintf ( " " , fName ) contents , err = ioutil . ReadFile ( tmp ) if err != nil { if os . IsNotExist ( err ) { continue } return " " , - 1 } typedVolumeName := fmt . Sprintf ( " " , volumeType , volumeName ) detectedVolumeName := strings . TrimSpace ( string ( contents ) ) if detectedVolumeName != typedVolumeName { continue } tmp = fmt . Sprintf ( " " , fName ) contents , err = ioutil . ReadFile ( tmp ) if err != nil { if os . IsNotExist ( err ) { return fmt . Sprintf ( " " , idx ) , 1 } return " " , - 1 } detectedSnapName := strings . TrimSpace ( string ( contents ) ) if detectedSnapName != " " { continue } return fmt . Sprintf ( " " , idx ) , 1 } if ! doMap { return " " , 0 } mapImage : devPath , err := cephRBDVolumeMap ( clusterName , poolName , volumeName , volumeType , userName ) if err != nil { return " " , - 1 } return strings . TrimSpace ( devPath ) , 2 }
// getRBDMappedDevPath looks at sysfs to retrieve the device path
// "/dev/rbd<idx>" for an RBD image. If it doesn't find it it will map it if
// told to do so.
getRBDMappedDevPath looks at sysfs to retrieve the device path / dev / rbd<idx > for an RBD image . If it doesn t find it it will map it if told to do so .