The rpc only reports one field, i.e. the cgroup driver, to kubelet. Containerd determines the effective cgroup driver by looking at all runtime handlers, starting from the default runtime handler (the rest in alphabetical order), and returning the cgroup driver setting of the first runtime handler that supports one. If no runtime handler supports cgroup driver (i.e. has a config option for it) containerd falls back to auto-detection, returning systemd if systemd is running and cgroupfs otherwise. This patch implements the CRI server side of Kubernetes KEP-4033: https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/4033-group-driver-detection-over-cri Signed-off-by: Markus Lehtonen <markus.lehtonen@intel.com>
61 lines
1.4 KiB
Go
61 lines
1.4 KiB
Go
package systemd
|
|
|
|
import (
|
|
"errors"
|
|
"math/big"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// RangeToBits converts a text representation of a CPU mask (as written to
|
|
// or read from cgroups' cpuset.* files, e.g. "1,3-5") to a slice of bytes
|
|
// with the corresponding bits set (as consumed by systemd over dbus as
|
|
// AllowedCPUs/AllowedMemoryNodes unit property value).
|
|
func RangeToBits(str string) ([]byte, error) {
|
|
bits := new(big.Int)
|
|
|
|
for _, r := range strings.Split(str, ",") {
|
|
// allow extra spaces around
|
|
r = strings.TrimSpace(r)
|
|
// allow empty elements (extra commas)
|
|
if r == "" {
|
|
continue
|
|
}
|
|
ranges := strings.SplitN(r, "-", 2)
|
|
if len(ranges) > 1 {
|
|
start, err := strconv.ParseUint(ranges[0], 10, 32)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
end, err := strconv.ParseUint(ranges[1], 10, 32)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if start > end {
|
|
return nil, errors.New("invalid range: " + r)
|
|
}
|
|
for i := start; i <= end; i++ {
|
|
bits.SetBit(bits, int(i), 1)
|
|
}
|
|
} else {
|
|
val, err := strconv.ParseUint(ranges[0], 10, 32)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
bits.SetBit(bits, int(val), 1)
|
|
}
|
|
}
|
|
|
|
ret := bits.Bytes()
|
|
if len(ret) == 0 {
|
|
// do not allow empty values
|
|
return nil, errors.New("empty value")
|
|
}
|
|
|
|
// fit cpuset parsing order in systemd
|
|
for l, r := 0, len(ret)-1; l < r; l, r = l+1, r-1 {
|
|
ret[l], ret[r] = ret[r], ret[l]
|
|
}
|
|
return ret, nil
|
|
}
|