diff --git a/resource/plugins/cpumem/client/cpu.go b/resource/plugins/cpumem/client/cpu.go new file mode 100644 index 000000000..0e2c96112 --- /dev/null +++ b/resource/plugins/cpumem/client/cpu.go @@ -0,0 +1,35 @@ +package client + +import ( + "fmt" + "strings" + + "github.com/projecteru2/core/resource/plugins/cpumem/types" + "github.com/projecteru2/core/utils" +) + +// NewNUMAFromStr . +func NewNUMAFromStr(numa []string) (types.NUMA, error) { + r := types.NUMA{} + for index, numaCPUList := range numa { + nodeID := fmt.Sprintf("%d", index) + for _, cpuID := range strings.Split(numaCPUList, ",") { + r[cpuID] = nodeID + } + } + return r, nil +} + +// NewNUMAMemoryFromStr . +func NewNUMAMemoryFromStr(numaMemory []string) (types.NUMAMemory, error) { + r := types.NUMAMemory{} + for index, nodeMemory := range numaMemory { + nodeID := fmt.Sprintf("%d", index) + mem, err := utils.ParseRAMInHuman(nodeMemory) + if err != nil { + return r, err + } + r[nodeID] = mem + } + return r, nil +} diff --git a/resource/plugins/cpumem/client/node.go b/resource/plugins/cpumem/client/node.go new file mode 100644 index 000000000..677931071 --- /dev/null +++ b/resource/plugins/cpumem/client/node.go @@ -0,0 +1,38 @@ +package client + +import ( + "encoding/json" + + "github.com/projecteru2/core/resource/plugins/cpumem/types" +) + +type cpuType interface { + string | int64 +} + +// NodeResourceRequest includes all possible fields passed by eru-core for editing node, it not parsed! +type NodeResourceRequest[T cpuType] struct { + CPU T `json:"cpu"` + Share int64 `json:"share"` + Memory int64 `json:"memory"` + + NUMA types.NUMA `json:"numa-cpu"` + NUMAMemory types.NUMAMemory `json:"numa-memory"` +} + +// NewNodeResourceRequest . +func NewNodeResourceRequest[T cpuType](cpu T, share, memory int64, NUMA types.NUMA, NUMAMemory types.NUMAMemory) (*NodeResourceRequest[T], error) { + r := &NodeResourceRequest[T]{ + CPU: cpu, + Share: share, + Memory: memory, + NUMA: NUMA, + NUMAMemory: NUMAMemory, + } + return r, nil +} + +// Encode . +func (n NodeResourceRequest[T]) Encode() ([]byte, error) { + return json.Marshal(n) +} diff --git a/resource/plugins/cpumem/client/workload.go b/resource/plugins/cpumem/client/workload.go new file mode 100644 index 000000000..fa46a67d2 --- /dev/null +++ b/resource/plugins/cpumem/client/workload.go @@ -0,0 +1,30 @@ +package client + +import "encoding/json" + +// WorkloadResourceRequest . +type WorkloadResourceRequest struct { + CPUBind bool `json:"cpu-bind"` + KeepCPUBind bool `json:"keep-cpu-bind"` + CPURequest float64 `json:"cpu-request"` + CPULimit float64 `json:"cpu-limit"` + MemRequest int64 `json:"mem-request"` + MemLimit int64 `json:"mem-limit"` +} + +// NewWorkloadResourceRequest . +func NewWorkloadResourceRequest(cpuBind, keepCPUBind bool, CPURequest, CPULimit float64, MemRequest, MemLimit int64) (*WorkloadResourceRequest, error) { + return &WorkloadResourceRequest{ + CPUBind: cpuBind, + KeepCPUBind: keepCPUBind, + CPURequest: CPURequest, + CPULimit: CPULimit, + MemRequest: MemRequest, + MemLimit: MemLimit, + }, nil +} + +// Encode . +func (w WorkloadResourceRequest) Encode() ([]byte, error) { + return json.Marshal(w) +} diff --git a/resource/plugins/cpumem/types/node.go b/resource/plugins/cpumem/types/node.go index 14d92f3d0..9456baf2e 100644 --- a/resource/plugins/cpumem/types/node.go +++ b/resource/plugins/cpumem/types/node.go @@ -179,8 +179,6 @@ type NodeResourceRequest struct { } func (n *NodeResourceRequest) Parse(config coretypes.Config, rawParams resourcetypes.RawParams) error { - var err error - if n.CPUMap == nil { n.CPUMap = CPUMap{} } @@ -208,30 +206,18 @@ func (n *NodeResourceRequest) Parse(config coretypes.Config, rawParams resourcet n.CPUMap[cpuID] = int(pieces) } } - - if n.Memory, err = coreutils.ParseRAMInHuman(rawParams.String("memory")); err != nil { - return err - } + n.Memory = rawParams.Int64("memory") n.NUMA = NUMA{} n.NUMAMemory = NUMAMemory{} - - for index, numaCPUList := range rawParams.StringSlice("numa-cpu") { - nodeID := fmt.Sprintf("%d", index) - for _, cpuID := range strings.Split(numaCPUList, ",") { - n.NUMA[cpuID] = nodeID - } + for cpuID, nodeID := range rawParams.RawParams("numa-cpu") { + n.NUMA[cpuID] = nodeID.(string) } - for index, nodeMemory := range rawParams.StringSlice("numa-memory") { - nodeID := fmt.Sprintf("%d", index) - mem, err := coreutils.ParseRAMInHuman(nodeMemory) - if err != nil { - return err - } - n.NUMAMemory[nodeID] = mem + for nodeID, nodeMemory := range rawParams.RawParams("numa-memory") { + // stupid golang covert int64 to float64 when using json.unmarshal + n.NUMAMemory[nodeID] = int64(nodeMemory.(float64)) } - return nil }