subsystem.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package cgroups
  2. import (
  3. "fmt"
  4. specs "github.com/opencontainers/runtime-spec/specs-go"
  5. )
  6. // Name is a typed name for a cgroup subsystem
  7. type Name string
  8. const (
  9. Devices Name = "devices"
  10. Hugetlb Name = "hugetlb"
  11. Freezer Name = "freezer"
  12. Pids Name = "pids"
  13. NetCLS Name = "net_cls"
  14. NetPrio Name = "net_prio"
  15. PerfEvent Name = "perf_event"
  16. Cpuset Name = "cpuset"
  17. Cpu Name = "cpu"
  18. Cpuacct Name = "cpuacct"
  19. Memory Name = "memory"
  20. Blkio Name = "blkio"
  21. )
  22. // Subsystems returns a complete list of the default cgroups
  23. // avaliable on most linux systems
  24. func Subsystems() []Name {
  25. n := []Name{
  26. Hugetlb,
  27. Freezer,
  28. Pids,
  29. NetCLS,
  30. NetPrio,
  31. PerfEvent,
  32. Cpuset,
  33. Cpu,
  34. Cpuacct,
  35. Memory,
  36. Blkio,
  37. }
  38. if !isUserNS {
  39. n = append(n, Devices)
  40. }
  41. return n
  42. }
  43. type Subsystem interface {
  44. Name() Name
  45. }
  46. type pather interface {
  47. Subsystem
  48. Path(path string) string
  49. }
  50. type creator interface {
  51. Subsystem
  52. Create(path string, resources *specs.LinuxResources) error
  53. }
  54. type deleter interface {
  55. Subsystem
  56. Delete(path string) error
  57. }
  58. type stater interface {
  59. Subsystem
  60. Stat(path string, stats *Metrics) error
  61. }
  62. type updater interface {
  63. Subsystem
  64. Update(path string, resources *specs.LinuxResources) error
  65. }
  66. // SingleSubsystem returns a single cgroup subsystem within the base Hierarchy
  67. func SingleSubsystem(baseHierarchy Hierarchy, subsystem Name) Hierarchy {
  68. return func() ([]Subsystem, error) {
  69. subsystems, err := baseHierarchy()
  70. if err != nil {
  71. return nil, err
  72. }
  73. for _, s := range subsystems {
  74. if s.Name() == subsystem {
  75. return []Subsystem{
  76. s,
  77. }, nil
  78. }
  79. }
  80. return nil, fmt.Errorf("unable to find subsystem %s", subsystem)
  81. }
  82. }