本文整理汇总了Golang中github.com/juju/juju/storage.BlockDevice.InUse方法的典型用法代码示例。如果您正苦于以下问题:Golang BlockDevice.InUse方法的具体用法?Golang BlockDevice.InUse怎么用?Golang BlockDevice.InUse使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/juju/juju/storage.BlockDevice
的用法示例。
在下文中一共展示了BlockDevice.InUse方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: listBlockDevices
func listBlockDevices() ([]storage.BlockDevice, error) {
columns := []string{
"KNAME", // kernel name
"SIZE", // size
"LABEL", // filesystem label
"UUID", // filesystem UUID
"FSTYPE", // filesystem type
"TYPE", // device type
"MOUNTPOINT", // moint point
}
logger.Tracef("executing lsblk")
output, err := exec.Command(
"lsblk",
"-b", // output size in bytes
"-P", // output fields as key=value pairs
"-o", strings.Join(columns, ","),
).Output()
if err != nil {
return nil, errors.Annotate(
err, "cannot list block devices: lsblk failed",
)
}
var devices []storage.BlockDevice
s := bufio.NewScanner(bytes.NewReader(output))
for s.Scan() {
pairs := pairsRE.FindAllStringSubmatch(s.Text(), -1)
var dev storage.BlockDevice
var deviceType string
for _, pair := range pairs {
switch pair[1] {
case "KNAME":
dev.DeviceName = pair[2]
case "SIZE":
size, err := strconv.ParseUint(pair[2], 10, 64)
if err != nil {
logger.Errorf(
"invalid size %q from lsblk: %v", pair[2], err,
)
} else {
dev.Size = size / bytesInMiB
}
case "LABEL":
dev.Label = pair[2]
case "UUID":
dev.UUID = pair[2]
case "FSTYPE":
dev.FilesystemType = pair[2]
case "TYPE":
deviceType = pair[2]
case "MOUNTPOINT":
dev.MountPoint = pair[2]
default:
logger.Debugf("unexpected field from lsblk: %q", pair[1])
}
}
// We may later want to expand this, e.g. to handle lvm,
// dmraid, crypt, etc., but this is enough to cover bases
// for now.
switch deviceType {
case typeDisk, typeLoop:
default:
logger.Tracef("ignoring %q type device: %+v", deviceType, dev)
continue
}
// Check if the block device is in use. We need to know this so we can
// issue an error if the user attempts to allocate an in-use disk to a
// unit.
dev.InUse, err = blockDeviceInUse(dev)
if os.IsNotExist(err) {
// In LXC containers, lsblk will show the block devices of the
// host, but the devices will typically not be present.
continue
} else if err != nil {
logger.Infof("could not check if %q is in use: %v", dev.DeviceName, err)
// We cannot detect, so err on the side of caution and default to
// "in use" so the device cannot be used.
dev.InUse = true
}
// Add additional information from sysfs.
if err := addHardwareInfo(&dev); err != nil {
logger.Errorf(
"error getting hardware info for %q from sysfs: %v",
dev.DeviceName, err,
)
}
devices = append(devices, dev)
}
if err := s.Err(); err != nil {
return nil, errors.Annotate(err, "cannot parse lsblk output")
}
return devices, nil
}