feat(region): add server-cpuset-cores cmd to get pinned and usable cores (#13548)

This commit is contained in:
Zexi Li
2022-02-26 21:43:51 +08:00
committed by GitHub
parent 142b36bbd0
commit d95f9ddfaa
3 changed files with 42 additions and 1 deletions
+2
View File
@@ -112,6 +112,8 @@ func init() {
cmd.Get("make-sshable-cmd", new(options.ServerIdOptions))
cmd.Get("change-owner-candidate-domains", new(options.ServerChangeOwnerCandidateDomainsOptions))
cmd.Get("change-owner-candidate-domains", new(options.ServerChangeOwnerCandidateDomainsOptions))
cmd.Get("cpuset-cores", new(options.ServerIdOptions))
cmd.GetProperty(&options.ServerStatusStatisticsOptions{})
cmd.GetProperty(&options.ServerProjectStatisticsOptions{})
cmd.GetProperty(&options.ServerDomainStatisticsOptions{})
+7
View File
@@ -811,3 +811,10 @@ type ServerCPUSetRemoveResp struct {
Done bool `json:"done"`
Error string `json:"error"`
}
type ServerGetCPUSetCoresInput struct{}
type ServerGetCPUSetCoresResp struct {
PinnedCores []int `json:"pinned_cores"`
HostCores []int `json:"host_cores"`
}
+33 -1
View File
@@ -5348,7 +5348,7 @@ func (self *SGuest) PerformProbeIsolatedDevices(ctx context.Context, userCred mc
return jsonutils.Marshal(devs), nil
}
func (self *SGuest) PerformCpuset(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *api.ServerCPUSetInput) (jsonutils.JSONObject, error) {
func (self *SGuest) getHostLogicalCores() ([]int, error) {
host, err := self.GetHost()
if err != nil {
return nil, errors.Wrap(err, "get host model")
@@ -5370,6 +5370,14 @@ func (self *SGuest) PerformCpuset(ctx context.Context, userCred mcclient.TokenCr
allCores = append(allCores, cores.LogicalProcessors...)
}
}
return allCores, nil
}
func (self *SGuest) PerformCpuset(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *api.ServerCPUSetInput) (jsonutils.JSONObject, error) {
allCores, err := self.getHostLogicalCores()
if err != nil {
return nil, err
}
if !sets.NewInt(allCores...).HasAll(data.CPUS...) {
return nil, httperrors.NewInputParameterError("Host cores %v not contains input %v", allCores, data.CPUS)
@@ -5413,3 +5421,27 @@ func (self *SGuest) PerformCpusetRemove(ctx context.Context, userCred mcclient.T
}
return resp, nil
}
func (self *SGuest) GetDetailsCpusetCores(ctx context.Context, userCred mcclient.TokenCredential, input *api.ServerGetCPUSetCoresInput) (*api.ServerGetCPUSetCoresResp, error) {
allCores, err := self.getHostLogicalCores()
if err != nil {
return nil, err
}
resp := &api.ServerGetCPUSetCoresResp{
HostCores: allCores,
}
// fetch cpuset pinned
obj := self.GetMetadataJson(ctx, api.VM_METADATA_CGROUP_CPUSET, userCred)
if obj != nil {
pinnedInput := new(api.ServerCPUSetInput)
if err := obj.Unmarshal(pinnedInput); err != nil {
log.Errorf("Unmarshal %q to ServerCPUSetInput: %v", obj, err)
} else {
resp.PinnedCores = pinnedInput.CPUS
}
}
return resp, nil
}