From 8ddd892072998896cb7fd6eff45f3f6afbad230b Mon Sep 17 00:00:00 2001 From: Julio Montes Date: Fri, 6 Dec 2019 15:43:08 +0000 Subject: [PATCH] libcontainer: add method to get cgroup config from cgroup Manager `configs.Cgroup` contains the configuration used to create cgroups. This configuration must be saved to disk, since it's required to restore the cgroup manager that was used to create the cgroups. Add method to get cgroup configuration from cgroup Manager to allow API users save it to disk and restore a cgroup manager later. fixes #2176 Signed-off-by: Julio Montes --- libcontainer/cgroups/cgroups.go | 3 +++ libcontainer/cgroups/fs/apply_raw.go | 4 ++++ libcontainer/cgroups/systemd/apply_nosystemd.go | 4 ++++ libcontainer/cgroups/systemd/apply_systemd.go | 4 ++++ libcontainer/cgroups/systemd/unified_hierarchy.go | 4 ++++ libcontainer/container_linux_test.go | 7 +++++++ 6 files changed, 26 insertions(+) diff --git a/libcontainer/cgroups/cgroups.go b/libcontainer/cgroups/cgroups.go index de835866..c0a96592 100644 --- a/libcontainer/cgroups/cgroups.go +++ b/libcontainer/cgroups/cgroups.go @@ -46,6 +46,9 @@ type Manager interface { // Sets the cgroup as configured. Set(container *configs.Config) error + + // Gets the cgroup as configured. + GetCgroups() (*configs.Cgroup, error) } type NotFoundError struct { diff --git a/libcontainer/cgroups/fs/apply_raw.go b/libcontainer/cgroups/fs/apply_raw.go index fc40bf55..fc9a164f 100644 --- a/libcontainer/cgroups/fs/apply_raw.go +++ b/libcontainer/cgroups/fs/apply_raw.go @@ -467,3 +467,7 @@ func CheckCpushares(path string, c uint64) error { return nil } + +func (m *Manager) GetCgroups() (*configs.Cgroup, error) { + return m.Cgroups, nil +} diff --git a/libcontainer/cgroups/systemd/apply_nosystemd.go b/libcontainer/cgroups/systemd/apply_nosystemd.go index 3a312752..ef0db5ae 100644 --- a/libcontainer/cgroups/systemd/apply_nosystemd.go +++ b/libcontainer/cgroups/systemd/apply_nosystemd.go @@ -61,3 +61,7 @@ func (m *Manager) Freeze(state configs.FreezerState) error { func Freeze(c *configs.Cgroup, state configs.FreezerState) error { return fmt.Errorf("Systemd not supported") } + +func (m *Manager) GetCgroups() (*configs.Cgroup, error) { + return nil, fmt.Errorf("Systemd not supported") +} diff --git a/libcontainer/cgroups/systemd/apply_systemd.go b/libcontainer/cgroups/systemd/apply_systemd.go index adc5f3bf..c4b19b3e 100644 --- a/libcontainer/cgroups/systemd/apply_systemd.go +++ b/libcontainer/cgroups/systemd/apply_systemd.go @@ -528,3 +528,7 @@ func isUnitExists(err error) bool { } return false } + +func (m *LegacyManager) GetCgroups() (*configs.Cgroup, error) { + return m.Cgroups, nil +} diff --git a/libcontainer/cgroups/systemd/unified_hierarchy.go b/libcontainer/cgroups/systemd/unified_hierarchy.go index cdee5767..6d1c7082 100644 --- a/libcontainer/cgroups/systemd/unified_hierarchy.go +++ b/libcontainer/cgroups/systemd/unified_hierarchy.go @@ -346,3 +346,7 @@ func (m *UnifiedManager) Set(container *configs.Config) error { } return nil } + +func (m *UnifiedManager) GetCgroups() (*configs.Cgroup, error) { + return m.Cgroups, nil +} diff --git a/libcontainer/container_linux_test.go b/libcontainer/container_linux_test.go index 549c299a..f8af05d7 100644 --- a/libcontainer/container_linux_test.go +++ b/libcontainer/container_linux_test.go @@ -61,6 +61,9 @@ func (m *mockCgroupManager) GetUnifiedPath() (string, error) { func (m *mockCgroupManager) Freeze(state configs.FreezerState) error { return nil } +func (m *mockCgroupManager) GetCgroups() (*configs.Cgroup, error) { + return nil, nil +} func (m *mockIntelRdtManager) Apply(pid int) error { return nil @@ -82,6 +85,10 @@ func (m *mockIntelRdtManager) Set(container *configs.Config) error { return nil } +func (m *mockIntelRdtManager) GetCgroups() (*configs.Cgroup, error) { + return nil, nil +} + type mockProcess struct { _pid int started uint64