mirror of
https://github.com/lxc/incus.git
synced 2026-02-06 03:46:32 +01:00
58 lines
1.7 KiB
Go
58 lines
1.7 KiB
Go
package instance
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
)
|
|
|
|
// IsRootDiskDevice returns true if the given device representation is configured as root disk for
|
|
// an instance. It typically get passed a specific entry of api.Instance.Devices.
|
|
func IsRootDiskDevice(device map[string]string) bool {
|
|
// Root disk devices also need a non-empty "pool" property, but we can't check that here
|
|
// because this function is used with clients talking to older servers where there was no
|
|
// concept of a storage pool, and also it is used for migrating from old to new servers.
|
|
// The validation of the non-empty "pool" property is done inside the disk device itself.
|
|
if device["type"] == "disk" && device["path"] == "/" && device["source"] == "" {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// ErrNoRootDisk means there is no root disk device found.
|
|
var ErrNoRootDisk = errors.New("No root device could be found")
|
|
|
|
// GetRootDiskDevice returns the instance device that is configured as root disk.
|
|
// Returns the device name and device config map.
|
|
func GetRootDiskDevice(devices map[string]map[string]string) (string, map[string]string, error) {
|
|
var devName string
|
|
var dev map[string]string
|
|
|
|
for n, d := range devices {
|
|
if IsRootDiskDevice(d) {
|
|
if devName != "" {
|
|
return "", nil, errors.New("More than one root device found")
|
|
}
|
|
|
|
devName = n
|
|
dev = d
|
|
}
|
|
}
|
|
|
|
if devName != "" {
|
|
return devName, dev, nil
|
|
}
|
|
|
|
return "", nil, ErrNoRootDisk
|
|
}
|
|
|
|
// SplitVolumeSource splits the volume name and any provided sub-path.
|
|
func SplitVolumeSource(source string) (string, string) {
|
|
volFields := strings.SplitN(source, "/", 2)
|
|
if len(volFields) == 1 {
|
|
return volFields[0], ""
|
|
}
|
|
|
|
return volFields[0], volFields[1]
|
|
}
|