-
Notifications
You must be signed in to change notification settings - Fork 247
Open
Description
Hello,
this code is not working
package main
import (
"github.com/containerd/cgroups/v3/cgroup1"
"github.com/opencontainers/runtime-spec/specs-go"
)
func uint32Ptr(v uint32) *uint32 {
return &v
}
func main() {
netClsController := cgroup1.NewNetCls("/sys/fs/cgroup")
err := netClsController.Create("foobar", &specs.LinuxResources{
Network: &specs.LinuxNetwork{
ClassID: uint32Ptr(0x00100010), //10:10
},
})
if err != nil {
panic(err)
}
}
but I think is equivalent of this:
mkdir /sys/fs/cgroup/net_cls
#mount -t cgroup -onet_cls net_cls /sys/fs/cgroup/net_cls
mkdir /sys/fs/cgroup/net_cls/foobar
echo 0x100010 > /sys/fs/cgroup/net_cls/foobar/net_cls.classid
except mounting part. We need mounting to get net_cls cgroup and to put classid into net_cls.classid.
I could not figure out if the package supports mounting, but if so, then how to force it to do that? If not, then I think it's an issue because Create
creates and writes to net_cls.classid
file so there is no place to put own mounting code between NewNetCls
and Create
.
To make Create work, the code should look something like this:
func (n *netclsController) Create(path string, resources *specs.LinuxResources) error {
if err := os.MkdirAll(path, defaultDirPerm); err != nil {
return err
}
if err := syscall.Mount("cgroup", n.root, "cgroup", 0, NetCls); err != nil {
if !errors.Is(err, syscall.EBUSY) { //could be already mounted and it's ok
// some other error
return err
}
}
if resources.Network != nil && resources.Network.ClassID != nil && *resources.Network.ClassID > 0 {
return os.WriteFile(
filepath.Join(n.Path(path), "net_cls.classid"),
[]byte(strconv.FormatUint(uint64(*resources.Network.ClassID), 10)),
defaultFilePerm,
)
}
return nil
}
version: github.com/containerd/cgroups/v3 v3.0.2
Metadata
Metadata
Assignees
Labels
No labels