95 lines
1.7 KiB
Go
95 lines
1.7 KiB
Go
|
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 *Stats) 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)
|
||
|
}
|
||
|
}
|