diff --git a/cmd/climc/shell/compute/hosts.go b/cmd/climc/shell/compute/hosts.go index 972e9bc213..2035edd6c1 100644 --- a/cmd/climc/shell/compute/hosts.go +++ b/cmd/climc/shell/compute/hosts.go @@ -60,6 +60,8 @@ func init() { Sn string `help:"find host by sn"` + OrderByServerCount string `help:"Order by server count" choices:"desc|asc"` + options.BaseListOptions } R(&HostListOptions{}, "host-list", "List hosts", func(s *mcclient.ClientSession, opts *HostListOptions) error { diff --git a/pkg/apis/compute/host.go b/pkg/apis/compute/host.go index 45e43731dc..1cb9eeac70 100644 --- a/pkg/apis/compute/host.go +++ b/pkg/apis/compute/host.go @@ -124,6 +124,10 @@ type HostListInput struct { ServerIdForNetwork string `json:"server_id_for_network"` // 宿主机 cpu 架构 CpuArchitecture string `json:"cpu_architecture"` + + // 按虚拟机数量排序 + // enum: asc,desc + OrderByServerCount string `json:"order_by_server_count"` } type HostDetails struct { diff --git a/pkg/cloudproxy/models/proxy_endpoints.go b/pkg/cloudproxy/models/proxy_endpoints.go index df7204ec63..f5ee1fd68d 100644 --- a/pkg/cloudproxy/models/proxy_endpoints.go +++ b/pkg/cloudproxy/models/proxy_endpoints.go @@ -110,8 +110,8 @@ func (man *SProxyEndpointManager) PerformCreateFromServer(ctx context.Context, u IntranetIpAddr: nic.IpAddr, } proxyendpoint.Name = name - proxyendpoint.DomainId = userCred.GetProjectDomainId() - proxyendpoint.ProjectId = userCred.GetProjectId() + proxyendpoint.DomainId = serverInfo.Server.DomainId + proxyendpoint.ProjectId = serverInfo.Server.ProjectId if err := man.TableSpec().Insert(ctx, proxyendpoint); err != nil { return nil, httperrors.NewServerError("database insertion error: %v", err) } diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index aa9791cb6a..63d567bdd5 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -490,6 +490,17 @@ func (manager *SHostManager) OrderByExtraFields( if err != nil { return nil, errors.Wrap(err, "SZoneResourceBaseManager.OrderByExtraFields") } + + if db.NeedOrderQuery([]string{query.OrderByServerCount}) { + guests := GuestManager.Query().SubQuery() + guestCounts := guests.Query( + guests.Field("host_id"), + sqlchemy.COUNT("id").Label("guest_count"), + ).GroupBy("host_id").SubQuery() + q = q.LeftJoin(guestCounts, sqlchemy.Equals(q.Field("id"), guestCounts.Field("host_id"))) + db.OrderByFields(q, []string{query.OrderByServerCount}, []sqlchemy.IQueryField{guestCounts.Field("guest_count")}) + } + return q, nil } diff --git a/pkg/compute/sshkeys/handler.go b/pkg/compute/sshkeys/handler.go index 864551ca99..6b1f806571 100644 --- a/pkg/compute/sshkeys/handler.go +++ b/pkg/compute/sshkeys/handler.go @@ -41,7 +41,7 @@ func AddSshKeysHandler(prefix string, app *appsrv.Application) { func adminSshKeysHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) { publicOnly := false userCred := auth.FetchUserCredential(ctx, policy.FilterPolicyCredential) - if !userCred.IsAllow(rbacutils.ScopeSystem, consts.GetServiceType(), "sshkeypairs", policy.PolicyActionGet) { + if !userCred.IsAllow(rbacutils.ScopeDomain, consts.GetServiceType(), "sshkeypairs", policy.PolicyActionGet) { publicOnly = true } params := appctx.AppContextParams(ctx) diff --git a/pkg/mcclient/models/base.go b/pkg/mcclient/models/base.go index 0af92b0fc4..d4e2d6c492 100644 --- a/pkg/mcclient/models/base.go +++ b/pkg/mcclient/models/base.go @@ -77,6 +77,7 @@ type EnabledStatusStandaloneResource struct { type VirtualResource struct { StatusStandaloneResource + DomainId string ProjectId string IsSystem bool PendingDeletedAt time.Time