From 5cd2c9fb4e64da4075da66a30ea00d9b58b8bba1 Mon Sep 17 00:00:00 2001 From: CMGS Date: Fri, 26 May 2023 13:03:27 +0800 Subject: [PATCH 1/3] add client for cpumen plugin --- resource/plugins/cpumem/client/node.go | 70 ++++++++++++++++++++++ resource/plugins/cpumem/client/workload.go | 30 ++++++++++ 2 files changed, 100 insertions(+) create mode 100644 resource/plugins/cpumem/client/node.go create mode 100644 resource/plugins/cpumem/client/workload.go diff --git a/resource/plugins/cpumem/client/node.go b/resource/plugins/cpumem/client/node.go new file mode 100644 index 000000000..1885b5184 --- /dev/null +++ b/resource/plugins/cpumem/client/node.go @@ -0,0 +1,70 @@ +package client + +import ( + "encoding/json" + "strconv" + "strings" + + "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 []string `json:"numa-cpu"` + NUMAMemory []int64 `json:"numa-memory"` + + NUMACPUMap types.NUMA `json:"-"` + NUMAMemoryMap types.NUMAMemory `json:"-"` +} + +// NewNodeResourceRequest . +func NewNodeResourceRequest[T cpuType](cpu T, share, memory int64, NUMACPUMap types.NUMA, NUMAMemoryMap types.NUMAMemory) (*NodeResourceRequest[T], error) { + r := &NodeResourceRequest[T]{ + CPU: cpu, + Share: share, + Memory: memory, + } + tmpNUMA := map[int][]string{} + for cpuID, nodeID := range NUMACPUMap { + nID, err := strconv.Atoi(nodeID) + if err != nil { + return nil, err + } + if tmpNUMA[nID] == nil { + tmpNUMA[nID] = []string{cpuID} + continue + } + tmpNUMA[nID] = append(tmpNUMA[nID], cpuID) + } + r.NUMA = make([]string, len(tmpNUMA)) + for nodeID, cpus := range tmpNUMA { + r.NUMA[nodeID] = strings.Join(cpus, ",") + } + + tmpNUMAMemory := map[int]int64{} + for nodeID, memory := range NUMAMemoryMap { + nID, err := strconv.Atoi(nodeID) + if err != nil { + return nil, err + } + tmpNUMAMemory[nID] = memory + } + r.NUMAMemory = make([]int64, len(tmpNUMAMemory)) + for nodeID, memory := range tmpNUMAMemory { + r.NUMAMemory[nodeID] = memory + } + + 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) +} From 3f28f1b57159b174c3f81b7195c1c78be4b62f2c Mon Sep 17 00:00:00 2001 From: CMGS Date: Fri, 26 May 2023 13:25:45 +0800 Subject: [PATCH 2/3] refactor cpumem addnode stage2 --- resource/plugins/cpumem/client/node.go | 54 ++++++-------------------- resource/plugins/cpumem/types/node.go | 25 +++--------- rpc/transform.go | 6 +++ 3 files changed, 22 insertions(+), 63 deletions(-) diff --git a/resource/plugins/cpumem/client/node.go b/resource/plugins/cpumem/client/node.go index 1885b5184..677931071 100644 --- a/resource/plugins/cpumem/client/node.go +++ b/resource/plugins/cpumem/client/node.go @@ -2,8 +2,6 @@ package client import ( "encoding/json" - "strconv" - "strings" "github.com/projecteru2/core/resource/plugins/cpumem/types" ) @@ -14,53 +12,23 @@ type cpuType interface { // 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 []string `json:"numa-cpu"` - NUMAMemory []int64 `json:"numa-memory"` + CPU T `json:"cpu"` + Share int64 `json:"share"` + Memory int64 `json:"memory"` - NUMACPUMap types.NUMA `json:"-"` - NUMAMemoryMap types.NUMAMemory `json:"-"` + NUMA types.NUMA `json:"numa-cpu"` + NUMAMemory types.NUMAMemory `json:"numa-memory"` } // NewNodeResourceRequest . -func NewNodeResourceRequest[T cpuType](cpu T, share, memory int64, NUMACPUMap types.NUMA, NUMAMemoryMap types.NUMAMemory) (*NodeResourceRequest[T], error) { +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, + CPU: cpu, + Share: share, + Memory: memory, + NUMA: NUMA, + NUMAMemory: NUMAMemory, } - tmpNUMA := map[int][]string{} - for cpuID, nodeID := range NUMACPUMap { - nID, err := strconv.Atoi(nodeID) - if err != nil { - return nil, err - } - if tmpNUMA[nID] == nil { - tmpNUMA[nID] = []string{cpuID} - continue - } - tmpNUMA[nID] = append(tmpNUMA[nID], cpuID) - } - r.NUMA = make([]string, len(tmpNUMA)) - for nodeID, cpus := range tmpNUMA { - r.NUMA[nodeID] = strings.Join(cpus, ",") - } - - tmpNUMAMemory := map[int]int64{} - for nodeID, memory := range NUMAMemoryMap { - nID, err := strconv.Atoi(nodeID) - if err != nil { - return nil, err - } - tmpNUMAMemory[nID] = memory - } - r.NUMAMemory = make([]int64, len(tmpNUMAMemory)) - for nodeID, memory := range tmpNUMAMemory { - r.NUMAMemory[nodeID] = memory - } - return r, nil } diff --git a/resource/plugins/cpumem/types/node.go b/resource/plugins/cpumem/types/node.go index 14d92f3d0..bacec47d3 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,17 @@ 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") { + n.NUMAMemory[nodeID] = int64(nodeMemory.(float64)) } - return nil } diff --git a/rpc/transform.go b/rpc/transform.go index 85424f379..d0b2b8d44 100644 --- a/rpc/transform.go +++ b/rpc/transform.go @@ -12,6 +12,7 @@ import ( pb "github.com/projecteru2/core/rpc/gen" "github.com/projecteru2/core/types" "github.com/projecteru2/core/utils" + "github.com/sanity-io/litter" "golang.org/x/net/context" ) @@ -539,12 +540,17 @@ func toCoreRemoveImageOptions(opts *pb.RemoveImageOptions) *types.ImageOptions { func toCoreResources(resources map[string][]byte) resourcetypes.Resources { r := resourcetypes.Resources{} for k, v := range resources { + fmt.Println("==============") + fmt.Println(k, string(v)) + fmt.Println("==============") rp := resourcetypes.RawParams{} if err := json.Unmarshal(v, &rp); err != nil { log.WithFunc("toCoreResources").Errorf(nil, err, "%v", string(v)) // nolint continue } r[k] = rp + litter.Dump(rp) + fmt.Println("==============") } return r } From 9fa57af87d750d5415de9230dfcdf9041ecb9fcb Mon Sep 17 00:00:00 2001 From: CMGS Date: Fri, 26 May 2023 14:15:58 +0800 Subject: [PATCH 3/3] minor revise for cpumem client stage3 --- resource/plugins/cpumem/client/cpu.go | 35 +++++++++++++++++++++++++++ resource/plugins/cpumem/types/node.go | 1 + rpc/transform.go | 6 ----- 3 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 resource/plugins/cpumem/client/cpu.go 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/types/node.go b/resource/plugins/cpumem/types/node.go index bacec47d3..9456baf2e 100644 --- a/resource/plugins/cpumem/types/node.go +++ b/resource/plugins/cpumem/types/node.go @@ -215,6 +215,7 @@ func (n *NodeResourceRequest) Parse(config coretypes.Config, rawParams resourcet } 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 diff --git a/rpc/transform.go b/rpc/transform.go index d0b2b8d44..85424f379 100644 --- a/rpc/transform.go +++ b/rpc/transform.go @@ -12,7 +12,6 @@ import ( pb "github.com/projecteru2/core/rpc/gen" "github.com/projecteru2/core/types" "github.com/projecteru2/core/utils" - "github.com/sanity-io/litter" "golang.org/x/net/context" ) @@ -540,17 +539,12 @@ func toCoreRemoveImageOptions(opts *pb.RemoveImageOptions) *types.ImageOptions { func toCoreResources(resources map[string][]byte) resourcetypes.Resources { r := resourcetypes.Resources{} for k, v := range resources { - fmt.Println("==============") - fmt.Println(k, string(v)) - fmt.Println("==============") rp := resourcetypes.RawParams{} if err := json.Unmarshal(v, &rp); err != nil { log.WithFunc("toCoreResources").Errorf(nil, err, "%v", string(v)) // nolint continue } r[k] = rp - litter.Dump(rp) - fmt.Println("==============") } return r }