123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- package zfs
- // ZFS zpool states, which can indicate if a pool is online, offline,
- // degraded, etc. More information regarding zpool states can be found here:
- // https://docs.oracle.com/cd/E19253-01/819-5461/gamno/index.html.
- const (
- ZpoolOnline = "ONLINE"
- ZpoolDegraded = "DEGRADED"
- ZpoolFaulted = "FAULTED"
- ZpoolOffline = "OFFLINE"
- ZpoolUnavail = "UNAVAIL"
- ZpoolRemoved = "REMOVED"
- )
- // Zpool is a ZFS zpool. A pool is a top-level structure in ZFS, and can
- // contain many descendent datasets.
- type Zpool struct {
- Name string
- Health string
- Allocated uint64
- Size uint64
- Free uint64
- Fragmentation uint64
- ReadOnly bool
- Freeing uint64
- Leaked uint64
- DedupRatio float64
- }
- // zpool is a helper function to wrap typical calls to zpool.
- func zpool(arg ...string) ([][]string, error) {
- c := command{Command: "zpool"}
- return c.Run(arg...)
- }
- // GetZpool retrieves a single ZFS zpool by name.
- func GetZpool(name string) (*Zpool, error) {
- args := zpoolArgs
- args = append(args, name)
- out, err := zpool(args...)
- if err != nil {
- return nil, err
- }
- // there is no -H
- out = out[1:]
- z := &Zpool{Name: name}
- for _, line := range out {
- if err := z.parseLine(line); err != nil {
- return nil, err
- }
- }
- return z, nil
- }
- // Datasets returns a slice of all ZFS datasets in a zpool.
- func (z *Zpool) Datasets() ([]*Dataset, error) {
- return Datasets(z.Name)
- }
- // Snapshots returns a slice of all ZFS snapshots in a zpool.
- func (z *Zpool) Snapshots() ([]*Dataset, error) {
- return Snapshots(z.Name)
- }
- // CreateZpool creates a new ZFS zpool with the specified name, properties,
- // and optional arguments.
- // A full list of available ZFS properties and command-line arguments may be
- // found here: https://www.freebsd.org/cgi/man.cgi?zfs(8).
- func CreateZpool(name string, properties map[string]string, args ...string) (*Zpool, error) {
- cli := make([]string, 1, 4)
- cli[0] = "create"
- if properties != nil {
- cli = append(cli, propsSlice(properties)...)
- }
- cli = append(cli, name)
- cli = append(cli, args...)
- _, err := zpool(cli...)
- if err != nil {
- return nil, err
- }
- return &Zpool{Name: name}, nil
- }
- // Destroy destroys a ZFS zpool by name.
- func (z *Zpool) Destroy() error {
- _, err := zpool("destroy", z.Name)
- return err
- }
- // ListZpools list all ZFS zpools accessible on the current system.
- func ListZpools() ([]*Zpool, error) {
- args := []string{"list", "-Ho", "name"}
- out, err := zpool(args...)
- if err != nil {
- return nil, err
- }
- var pools []*Zpool
- for _, line := range out {
- z, err := GetZpool(line[0])
- if err != nil {
- return nil, err
- }
- pools = append(pools, z)
- }
- return pools, nil
- }
|