Test Cgroup creation and memory allocations
Signed-off-by: Lorenzo Fontana <lo@linux.com>
This commit is contained in:
parent
74a1729647
commit
c0e6e12f9d
|
@ -3,12 +3,175 @@
|
||||||
package specconv
|
package specconv
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/opencontainers/runc/libcontainer/configs/validate"
|
"github.com/opencontainers/runc/libcontainer/configs/validate"
|
||||||
"github.com/opencontainers/runtime-spec/specs-go"
|
"github.com/opencontainers/runtime-spec/specs-go"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestLinuxCgroupWithMemoryResource(t *testing.T) {
|
||||||
|
cgroupsPath := "/user/cgroups/path/id"
|
||||||
|
|
||||||
|
spec := &specs.Spec{}
|
||||||
|
devices := []specs.LinuxDeviceCgroup{
|
||||||
|
{
|
||||||
|
Allow: false,
|
||||||
|
Access: "rwm",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
limit := int64(100)
|
||||||
|
reservation := int64(50)
|
||||||
|
swap := int64(20)
|
||||||
|
kernel := int64(40)
|
||||||
|
kernelTCP := int64(45)
|
||||||
|
swappiness := uint64(1)
|
||||||
|
swappinessPtr := &swappiness
|
||||||
|
disableOOMKiller := true
|
||||||
|
resources := &specs.LinuxResources{
|
||||||
|
Devices: devices,
|
||||||
|
Memory: &specs.LinuxMemory{
|
||||||
|
Limit: &limit,
|
||||||
|
Reservation: &reservation,
|
||||||
|
Swap: &swap,
|
||||||
|
Kernel: &kernel,
|
||||||
|
KernelTCP: &kernelTCP,
|
||||||
|
Swappiness: swappinessPtr,
|
||||||
|
DisableOOMKiller: &disableOOMKiller,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
spec.Linux = &specs.Linux{
|
||||||
|
CgroupsPath: cgroupsPath,
|
||||||
|
Resources: resources,
|
||||||
|
}
|
||||||
|
|
||||||
|
opts := &CreateOpts{
|
||||||
|
CgroupName: "ContainerID",
|
||||||
|
UseSystemdCgroup: false,
|
||||||
|
Spec: spec,
|
||||||
|
}
|
||||||
|
|
||||||
|
cgroup, err := createCgroupConfig(opts)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Couldn't create Cgroup config: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if cgroup.Path != cgroupsPath {
|
||||||
|
t.Errorf("Wrong cgroupsPath, expected '%s' got '%s'", cgroupsPath, cgroup.Path)
|
||||||
|
}
|
||||||
|
if cgroup.Resources.Memory != limit {
|
||||||
|
t.Errorf("Expected to have %d as memory limit, got %d", limit, cgroup.Resources.Memory)
|
||||||
|
}
|
||||||
|
if cgroup.Resources.MemoryReservation != reservation {
|
||||||
|
t.Errorf("Expected to have %d as memory reservation, got %d", reservation, cgroup.Resources.MemoryReservation)
|
||||||
|
}
|
||||||
|
if cgroup.Resources.MemorySwap != swap {
|
||||||
|
t.Errorf("Expected to have %d as swap, got %d", swap, cgroup.Resources.MemorySwap)
|
||||||
|
}
|
||||||
|
if cgroup.Resources.KernelMemory != kernel {
|
||||||
|
t.Errorf("Expected to have %d as Kernel Memory, got %d", kernel, cgroup.Resources.KernelMemory)
|
||||||
|
}
|
||||||
|
if cgroup.Resources.KernelMemoryTCP != kernelTCP {
|
||||||
|
t.Errorf("Expected to have %d as TCP Kernel Memory, got %d", kernelTCP, cgroup.Resources.KernelMemoryTCP)
|
||||||
|
}
|
||||||
|
if cgroup.Resources.MemorySwappiness != swappinessPtr {
|
||||||
|
t.Errorf("Expected to have %d as memory swappiness, got %d", swappinessPtr, cgroup.Resources.MemorySwappiness)
|
||||||
|
}
|
||||||
|
if cgroup.Resources.OomKillDisable != disableOOMKiller {
|
||||||
|
t.Errorf("The OOMKiller should be enabled")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLinuxCgroupSystemd(t *testing.T) {
|
||||||
|
cgroupsPath := "parent:scopeprefix:name"
|
||||||
|
|
||||||
|
spec := &specs.Spec{}
|
||||||
|
spec.Linux = &specs.Linux{
|
||||||
|
CgroupsPath: cgroupsPath,
|
||||||
|
}
|
||||||
|
|
||||||
|
opts := &CreateOpts{
|
||||||
|
UseSystemdCgroup: true,
|
||||||
|
Spec: spec,
|
||||||
|
}
|
||||||
|
|
||||||
|
cgroup, err := createCgroupConfig(opts)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Couldn't create Cgroup config: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedParent := "parent"
|
||||||
|
if cgroup.Parent != expectedParent {
|
||||||
|
t.Errorf("Expected to have %s as Parent instead of %s", expectedParent, cgroup.Parent)
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedScopePrefix := "scopeprefix"
|
||||||
|
if cgroup.ScopePrefix != expectedScopePrefix {
|
||||||
|
t.Errorf("Expected to have %s as ScopePrefix instead of %s", expectedScopePrefix, cgroup.ScopePrefix)
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedName := "name"
|
||||||
|
if cgroup.Name != expectedName {
|
||||||
|
t.Errorf("Expected to have %s as Name instead of %s", expectedName, cgroup.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLinuxCgroupSystemdWithEmptyPath(t *testing.T) {
|
||||||
|
cgroupsPath := ""
|
||||||
|
|
||||||
|
spec := &specs.Spec{}
|
||||||
|
spec.Linux = &specs.Linux{
|
||||||
|
CgroupsPath: cgroupsPath,
|
||||||
|
}
|
||||||
|
|
||||||
|
opts := &CreateOpts{
|
||||||
|
CgroupName: "ContainerID",
|
||||||
|
UseSystemdCgroup: true,
|
||||||
|
Spec: spec,
|
||||||
|
}
|
||||||
|
|
||||||
|
cgroup, err := createCgroupConfig(opts)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Couldn't create Cgroup config: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedParent := "system.slice"
|
||||||
|
if cgroup.Parent != expectedParent {
|
||||||
|
t.Errorf("Expected to have %s as Parent instead of %s", expectedParent, cgroup.Parent)
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedScopePrefix := "runc"
|
||||||
|
if cgroup.ScopePrefix != expectedScopePrefix {
|
||||||
|
t.Errorf("Expected to have %s as ScopePrefix instead of %s", expectedScopePrefix, cgroup.ScopePrefix)
|
||||||
|
}
|
||||||
|
|
||||||
|
if cgroup.Name != opts.CgroupName {
|
||||||
|
t.Errorf("Expected to have %s as Name instead of %s", opts.CgroupName, cgroup.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLinuxCgroupSystemdWithInvalidPath(t *testing.T) {
|
||||||
|
cgroupsPath := "/user/cgroups/path/id"
|
||||||
|
|
||||||
|
spec := &specs.Spec{}
|
||||||
|
spec.Linux = &specs.Linux{
|
||||||
|
CgroupsPath: cgroupsPath,
|
||||||
|
}
|
||||||
|
|
||||||
|
opts := &CreateOpts{
|
||||||
|
CgroupName: "ContainerID",
|
||||||
|
UseSystemdCgroup: true,
|
||||||
|
Spec: spec,
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := createCgroupConfig(opts)
|
||||||
|
if err == nil {
|
||||||
|
t.Error("Expected to produce an error if not using the correct format for cgroup paths belonging to systemd")
|
||||||
|
}
|
||||||
|
}
|
||||||
func TestLinuxCgroupsPathSpecified(t *testing.T) {
|
func TestLinuxCgroupsPathSpecified(t *testing.T) {
|
||||||
cgroupsPath := "/user/cgroups/path/id"
|
cgroupsPath := "/user/cgroups/path/id"
|
||||||
|
|
||||||
|
@ -97,6 +260,10 @@ func TestDupNamespaces(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRootlessSpecconvValidate(t *testing.T) {
|
func TestRootlessSpecconvValidate(t *testing.T) {
|
||||||
|
if _, err := os.Stat("/proc/self/ns/user"); os.IsNotExist(err) {
|
||||||
|
t.Skip("userns is unsupported")
|
||||||
|
}
|
||||||
|
|
||||||
spec := Example()
|
spec := Example()
|
||||||
spec.Root.Path = "/"
|
spec.Root.Path = "/"
|
||||||
ToRootless(spec)
|
ToRootless(spec)
|
||||||
|
|
Loading…
Reference in New Issue