diff --git a/cmd/climc/shell/compute/servers.go b/cmd/climc/shell/compute/servers.go index 7e1fed8b14..f7010d38a7 100644 --- a/cmd/climc/shell/compute/servers.go +++ b/cmd/climc/shell/compute/servers.go @@ -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{}) diff --git a/pkg/apis/compute/guests.go b/pkg/apis/compute/guests.go index 3a2a0ce5ab..060c951d58 100644 --- a/pkg/apis/compute/guests.go +++ b/pkg/apis/compute/guests.go @@ -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"` +} diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 4ed834fc7c..aafdbc2efe 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -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 +}