diff options
-rw-r--r-- | libpod/util.go | 58 | ||||
-rw-r--r-- | libpod/util_linux.go | 69 | ||||
-rw-r--r-- | libpod/util_unsupported.go | 23 |
3 files changed, 92 insertions, 58 deletions
diff --git a/libpod/util.go b/libpod/util.go index 5b16b5755..13235059f 100644 --- a/libpod/util.go +++ b/libpod/util.go @@ -9,12 +9,10 @@ import ( "strings" "time" - "github.com/containerd/cgroups" "github.com/containers/image/signature" "github.com/containers/image/types" spec "github.com/opencontainers/runtime-spec/specs-go" "github.com/pkg/errors" - "github.com/sirupsen/logrus" ) // Runtime API constants @@ -125,62 +123,6 @@ func WaitForFile(path string, timeout time.Duration) error { } } -// systemdSliceFromPath makes a new systemd slice under the given parent with -// the given name. -// The parent must be a slice. The name must NOT include ".slice" -func systemdSliceFromPath(parent, name string) (string, error) { - cgroupPath, err := assembleSystemdCgroupName(parent, name) - if err != nil { - return "", err - } - - logrus.Debugf("Created cgroup path %s for parent %s and name %s", cgroupPath, parent, name) - - if err := makeSystemdCgroup(cgroupPath); err != nil { - return "", errors.Wrapf(err, "error creating cgroup %s", cgroupPath) - } - - logrus.Debugf("Created cgroup %s", cgroupPath) - - return cgroupPath, nil -} - -// makeSystemdCgroup creates a systemd CGroup at the given location. -func makeSystemdCgroup(path string) error { - controller, err := cgroups.NewSystemd(SystemdDefaultCgroupParent) - if err != nil { - return err - } - - return controller.Create(path, &spec.LinuxResources{}) -} - -// deleteSystemdCgroup deletes the systemd cgroup at the given location -func deleteSystemdCgroup(path string) error { - controller, err := cgroups.NewSystemd(SystemdDefaultCgroupParent) - if err != nil { - return err - } - - return controller.Delete(path) -} - -// assembleSystemdCgroupName creates a systemd cgroup path given a base and -// a new component to add. -// The base MUST be systemd slice (end in .slice) -func assembleSystemdCgroupName(baseSlice, newSlice string) (string, error) { - const sliceSuffix = ".slice" - - if !strings.HasSuffix(baseSlice, sliceSuffix) { - return "", errors.Wrapf(ErrInvalidArg, "cannot assemble cgroup path with base %q - must end in .slice", baseSlice) - } - - noSlice := strings.TrimSuffix(baseSlice, sliceSuffix) - final := fmt.Sprintf("%s/%s-%s%s", baseSlice, noSlice, newSlice, sliceSuffix) - - return final, nil -} - type byDestination []spec.Mount func (m byDestination) Len() int { diff --git a/libpod/util_linux.go b/libpod/util_linux.go new file mode 100644 index 000000000..0cd486379 --- /dev/null +++ b/libpod/util_linux.go @@ -0,0 +1,69 @@ +// +build linux + +package libpod + +import ( + "fmt" + "strings" + + "github.com/containerd/cgroups" + spec "github.com/opencontainers/runtime-spec/specs-go" + "github.com/pkg/errors" + "github.com/sirupsen/logrus" +) + +// systemdSliceFromPath makes a new systemd slice under the given parent with +// the given name. +// The parent must be a slice. The name must NOT include ".slice" +func systemdSliceFromPath(parent, name string) (string, error) { + cgroupPath, err := assembleSystemdCgroupName(parent, name) + if err != nil { + return "", err + } + + logrus.Debugf("Created cgroup path %s for parent %s and name %s", cgroupPath, parent, name) + + if err := makeSystemdCgroup(cgroupPath); err != nil { + return "", errors.Wrapf(err, "error creating cgroup %s", cgroupPath) + } + + logrus.Debugf("Created cgroup %s", cgroupPath) + + return cgroupPath, nil +} + +// makeSystemdCgroup creates a systemd CGroup at the given location. +func makeSystemdCgroup(path string) error { + controller, err := cgroups.NewSystemd(SystemdDefaultCgroupParent) + if err != nil { + return err + } + + return controller.Create(path, &spec.LinuxResources{}) +} + +// deleteSystemdCgroup deletes the systemd cgroup at the given location +func deleteSystemdCgroup(path string) error { + controller, err := cgroups.NewSystemd(SystemdDefaultCgroupParent) + if err != nil { + return err + } + + return controller.Delete(path) +} + +// assembleSystemdCgroupName creates a systemd cgroup path given a base and +// a new component to add. +// The base MUST be systemd slice (end in .slice) +func assembleSystemdCgroupName(baseSlice, newSlice string) (string, error) { + const sliceSuffix = ".slice" + + if !strings.HasSuffix(baseSlice, sliceSuffix) { + return "", errors.Wrapf(ErrInvalidArg, "cannot assemble cgroup path with base %q - must end in .slice", baseSlice) + } + + noSlice := strings.TrimSuffix(baseSlice, sliceSuffix) + final := fmt.Sprintf("%s/%s-%s%s", baseSlice, noSlice, newSlice, sliceSuffix) + + return final, nil +} diff --git a/libpod/util_unsupported.go b/libpod/util_unsupported.go new file mode 100644 index 000000000..d598b465f --- /dev/null +++ b/libpod/util_unsupported.go @@ -0,0 +1,23 @@ +// +build !linux + +package libpod + +import ( + "github.com/pkg/errors" +) + +func systemdSliceFromPath(parent, name string) (string, error) { + return "", errors.Wrapf(ErrOSNotSupported, "cgroups are not supported on non-linux OSes") +} + +func makeSystemdCgroup(path string) error { + return errors.Wrapf(ErrOSNotSupported, "cgroups are not supported on non-linux OSes") +} + +func deleteSystemdCgroup(path string) error { + return errors.Wrapf(ErrOSNotSupported, "cgroups are not supported on non-linux OSes") +} + +func assembleSystemdCgroupName(baseSlice, newSlice string) (string, error) { + return "", errors.Wrapf(ErrOSNotSupported, "cgroups are not supported on non-linux OSes") +} |