Procházet zdrojové kódy

cgroups v2: add cgroup version

Nikolay Sivko před 4 roky
rodič
revize
4d54432db2
2 změnil soubory, kde provedl 17 přidání a 1 odebrání
  1. 12 1
      cgroup/cgroup.go
  2. 5 0
      cgroup/cgroup_test.go

+ 12 - 1
cgroup/cgroup.go

@@ -23,6 +23,13 @@ var (
 	systemSliceIdRegexp = regexp.MustCompile(`(/system\.slice/([^/]+))`)
 )
 
+type Version uint8
+
+const (
+	V1 Version = iota
+	V2
+)
+
 type ContainerType uint8
 
 const (
@@ -68,6 +75,7 @@ type Stats struct {
 
 type Cgroup struct {
 	Id            string
+	Version       Version
 	ContainerType ContainerType
 	ContainerId   string
 
@@ -170,8 +178,11 @@ func NewFromProcessCgroupFile(filePath string) (*Cgroup, error) {
 			cg.subsystems[cgType] = parts[2]
 		}
 	}
-	if cg.Id = cg.subsystems["cpu"]; cg.Id == "" {
+	if cg.Id = cg.subsystems["cpu"]; cg.Id != "" {
+		cg.Version = V1
+	} else {
 		cg.Id = cg.subsystems[""]
+		cg.Version = V2
 	}
 	if cg.ContainerType, cg.ContainerId, err = containerByCgroup(cg.Id); err != nil {
 		return nil, err

+ 5 - 0
cgroup/cgroup_test.go

@@ -10,6 +10,7 @@ func TestNewFromProcessCgroupFile(t *testing.T) {
 	cg, err := NewFromProcessCgroupFile(path.Join("fixtures/proc/100/cgroup"))
 	assert.Nil(t, err)
 	assert.Equal(t, "/system.slice/ssh.service", cg.Id)
+	assert.Equal(t, V1, cg.Version)
 	assert.Equal(t, "/system.slice/ssh.service", cg.ContainerId)
 	assert.Equal(t, ContainerTypeSystemdService, cg.ContainerType)
 
@@ -34,24 +35,28 @@ func TestNewFromProcessCgroupFile(t *testing.T) {
 
 	cg, err = NewFromProcessCgroupFile(path.Join("fixtures/proc/200/cgroup"))
 	assert.Nil(t, err)
+	assert.Equal(t, V1, cg.Version)
 	assert.Equal(t, "/docker/b43d92bf1e5c6f78bb9b7bc6f40721280299855ba692092716e3a1b6c0b86f3f", cg.Id)
 	assert.Equal(t, "b43d92bf1e5c6f78bb9b7bc6f40721280299855ba692092716e3a1b6c0b86f3f", cg.ContainerId)
 	assert.Equal(t, ContainerTypeDocker, cg.ContainerType)
 
 	cg, err = NewFromProcessCgroupFile(path.Join("fixtures/proc/300/cgroup"))
 	assert.Nil(t, err)
+	assert.Equal(t, V1, cg.Version)
 	assert.Equal(t, "/kubepods/burstable/pod6a4ce4a0-ba47-11ea-b2a7-0cc47ac5979e/17db96a24ae1e9dd57143e62b1cb0d2d35e693c65c774c7470e87b0572e07c1a", cg.Id)
 	assert.Equal(t, "17db96a24ae1e9dd57143e62b1cb0d2d35e693c65c774c7470e87b0572e07c1a", cg.ContainerId)
 	assert.Equal(t, ContainerTypeDocker, cg.ContainerType)
 
 	cg, err = NewFromProcessCgroupFile(path.Join("fixtures/proc/400/cgroup"))
 	assert.Nil(t, err)
+	assert.Equal(t, V2, cg.Version)
 	assert.Equal(t, "/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod8712f785_1a3e_41ec_a00b_e2dcc77431cb.slice/docker-73051af271105c07e1f493b34856a77e665e3b0b4fc72f76c807dfbffeb881bd.scope", cg.Id)
 	assert.Equal(t, "73051af271105c07e1f493b34856a77e665e3b0b4fc72f76c807dfbffeb881bd", cg.ContainerId)
 	assert.Equal(t, ContainerTypeDocker, cg.ContainerType)
 
 	cg, err = NewFromProcessCgroupFile(path.Join("fixtures/proc/500/cgroup"))
 	assert.Nil(t, err)
+	assert.Equal(t, V2, cg.Version)
 	assert.Equal(t, "/system.slice/docker-ba7b10d15d16e10e3de7a2dcd408a3d971169ae303f46cfad4c5453c6326fee2.scope", cg.Id)
 	assert.Equal(t, "ba7b10d15d16e10e3de7a2dcd408a3d971169ae303f46cfad4c5453c6326fee2", cg.ContainerId)
 	assert.Equal(t, ContainerTypeDocker, cg.ContainerType)