package cgroups import ( "fmt" specs "github.com/opencontainers/runtime-spec/specs-go" ) // Name is a typed name for a cgroup subsystem type Name string const ( Devices Name = "devices" Hugetlb Name = "hugetlb" Freezer Name = "freezer" Pids Name = "pids" NetCLS Name = "net_cls" NetPrio Name = "net_prio" PerfEvent Name = "perf_event" Cpuset Name = "cpuset" Cpu Name = "cpu" Cpuacct Name = "cpuacct" Memory Name = "memory" Blkio Name = "blkio" ) // Subsystems returns a complete list of the default cgroups // avaliable on most linux systems func Subsystems() []Name { n := []Name{ Hugetlb, Freezer, Pids, NetCLS, NetPrio, PerfEvent, Cpuset, Cpu, Cpuacct, Memory, Blkio, } if !isUserNS { n = append(n, Devices) } return n } type Subsystem interface { Name() Name } type pather interface { Subsystem Path(path string) string } type creator interface { Subsystem Create(path string, resources *specs.LinuxResources) error } type deleter interface { Subsystem Delete(path string) error } type stater interface { Subsystem Stat(path string, stats *Metrics) error } type updater interface { Subsystem Update(path string, resources *specs.LinuxResources) error } // SingleSubsystem returns a single cgroup subsystem within the base Hierarchy func SingleSubsystem(baseHierarchy Hierarchy, subsystem Name) Hierarchy { return func() ([]Subsystem, error) { subsystems, err := baseHierarchy() if err != nil { return nil, err } for _, s := range subsystems { if s.Name() == subsystem { return []Subsystem{ s, }, nil } } return nil, fmt.Errorf("unable to find subsystem %s", subsystem) } }