mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
Merge pull request #14002 from ioito/hotfix/qx-host-order-by-commit-rate
fix(region): host order by commit rate
This commit is contained in:
@@ -155,7 +155,7 @@ require (
|
||||
yunion.io/x/ovsdb v0.0.0-20200526071744-27bf0940cbc7
|
||||
yunion.io/x/pkg v0.0.0-20220406030238-39fbc60d5d4e
|
||||
yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e
|
||||
yunion.io/x/sqlchemy v0.0.0-20220411140620-728b325acd1c
|
||||
yunion.io/x/sqlchemy v0.0.0-20220413030837-de1642aeb626
|
||||
yunion.io/x/structarg v0.0.0-20220312084958-9c6c79c7d1c6
|
||||
)
|
||||
|
||||
|
||||
@@ -998,7 +998,7 @@ yunion.io/x/pkg v0.0.0-20220406030238-39fbc60d5d4e h1:ovxSHuAa8hOBiZPU+ezrwqmVuC
|
||||
yunion.io/x/pkg v0.0.0-20220406030238-39fbc60d5d4e/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
|
||||
yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e h1:v+EzIadodSwkdZ/7bremd7J8J50Cise/HCylsOJngmo=
|
||||
yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e/go.mod h1:0iFKpOs1y4lbCxeOmq3Xx/0AcQoewVPwj62eRluioEo=
|
||||
yunion.io/x/sqlchemy v0.0.0-20220411140620-728b325acd1c h1:fgVbPIAVbdgnUo0JPyDR6acRh8i2PMk9k0MiveUGJw4=
|
||||
yunion.io/x/sqlchemy v0.0.0-20220411140620-728b325acd1c/go.mod h1:FTdwPdGhMgh4E+UFXc9klI1Ok34fMuybTT+jLhOaIjI=
|
||||
yunion.io/x/sqlchemy v0.0.0-20220413030837-de1642aeb626 h1:fueDcEnHrVrT8alcmOZrPeeaMMVtqCFm9jTPM/Yj0Ns=
|
||||
yunion.io/x/sqlchemy v0.0.0-20220413030837-de1642aeb626/go.mod h1:FTdwPdGhMgh4E+UFXc9klI1Ok34fMuybTT+jLhOaIjI=
|
||||
yunion.io/x/structarg v0.0.0-20220312084958-9c6c79c7d1c6 h1:WuWXhY3DvhdRTzWCJ/kwt3Ss6KIq7+KqJwb+esvNGwU=
|
||||
yunion.io/x/structarg v0.0.0-20220312084958-9c6c79c7d1c6/go.mod h1:EP6NSv2C0zzqBDTKumv8hPWLb3XvgMZDHQRfyuOrQng=
|
||||
|
||||
@@ -132,6 +132,18 @@ type HostListInput struct {
|
||||
// 按存储大小排序
|
||||
// enmu: asc,desc
|
||||
OrderByStorage string `json:"order_by_storage"`
|
||||
|
||||
// 按存储超分率排序
|
||||
// enmu: asc,desc
|
||||
OrderByStorageCommitRate string `json:"order_by_storage_commit_rate"`
|
||||
|
||||
// 按cpu超分率排序
|
||||
// enmu: asc,desc
|
||||
OrderByCpuCommitRate string `json:"order_by_cpu_commit_rate"`
|
||||
|
||||
// 按内存超分率排序
|
||||
// enmu: asc,desc
|
||||
OrderByMemCommitRate string `json:"order_by_mem_commit_rate"`
|
||||
}
|
||||
|
||||
type HostDetails struct {
|
||||
|
||||
@@ -491,6 +491,38 @@ func (manager *SHostManager) OrderByExtraFields(
|
||||
db.OrderByFields(q, []string{query.OrderByServerCount}, []sqlchemy.IQueryField{guestCounts.Field("guest_count")})
|
||||
}
|
||||
|
||||
if db.NeedOrderQuery([]string{query.OrderByCpuCommitRate}) {
|
||||
guestsQ := GuestManager.Query()
|
||||
if options.Options.IgnoreNonrunningGuests {
|
||||
guestsQ = guestsQ.Equals("status", api.VM_RUNNING)
|
||||
}
|
||||
guests := guestsQ.SubQuery()
|
||||
hosts := HostManager.Query().SubQuery()
|
||||
hostQ := hosts.Query(
|
||||
hosts.Field("id"),
|
||||
hosts.Field("cpu_count"),
|
||||
hosts.Field("cpu_reserved"),
|
||||
sqlchemy.SUM("guest_vcpu_count", guests.Field("vcpu_count")),
|
||||
).LeftJoin(guests, sqlchemy.Equals(hosts.Field("id"), guests.Field("host_id")))
|
||||
|
||||
hostSQ := hostQ.GroupBy(hostQ.Field("host_id")).SubQuery()
|
||||
|
||||
divSQ := hostSQ.Query(
|
||||
hostSQ.Field("id"),
|
||||
sqlchemy.SUB("vcpu_count", hostSQ.Field("cpu_count"), hostSQ.Field("cpu_reserved")),
|
||||
hostSQ.Field("guest_vcpu_count"),
|
||||
).SubQuery()
|
||||
|
||||
sq := divSQ.Query(
|
||||
divSQ.Field("id").Label("host_id"),
|
||||
sqlchemy.DIV("cpu_commit_rate", divSQ.Field("guest_vcpu_count"), divSQ.Field("vcpu_count")),
|
||||
).SubQuery()
|
||||
|
||||
q = q.LeftJoin(sq, sqlchemy.Equals(q.Field("id"), sq.Field("host_id")))
|
||||
|
||||
db.OrderByFields(q, []string{query.OrderByCpuCommitRate}, []sqlchemy.IQueryField{sq.Field("cpu_commit_rate")})
|
||||
}
|
||||
|
||||
if db.NeedOrderQuery([]string{query.OrderByStorage}) {
|
||||
hoststorages := HoststorageManager.Query().SubQuery()
|
||||
storages := StorageManager.Query().IsTrue("enabled").In("storage_type", api.HOST_STORAGE_LOCAL_TYPES).SubQuery()
|
||||
@@ -498,6 +530,7 @@ func (manager *SHostManager) OrderByExtraFields(
|
||||
hoststorages.Field("host_id"),
|
||||
sqlchemy.SUM("storage_capacity", storages.Field("capacity")),
|
||||
)
|
||||
|
||||
hoststoragesQ = hoststoragesQ.LeftJoin(storages, sqlchemy.Equals(hoststoragesQ.Field("storage_id"), storages.Field("id")))
|
||||
hoststoragesSQ := hoststoragesQ.GroupBy(hoststoragesQ.Field("host_id")).SubQuery()
|
||||
|
||||
@@ -505,6 +538,78 @@ func (manager *SHostManager) OrderByExtraFields(
|
||||
db.OrderByFields(q, []string{query.OrderByStorage}, []sqlchemy.IQueryField{hoststoragesSQ.Field("storage_capacity")})
|
||||
}
|
||||
|
||||
if db.NeedOrderQuery([]string{query.OrderByStorageCommitRate}) {
|
||||
hoststorages := HoststorageManager.Query().SubQuery()
|
||||
disks := DiskManager.Query().Equals("status", api.DISK_READY).SubQuery()
|
||||
storages := StorageManager.Query().IsTrue("enabled").In("storage_type", api.HOST_STORAGE_LOCAL_TYPES).SubQuery()
|
||||
|
||||
disksQ := disks.Query(
|
||||
disks.Field("storage_id"),
|
||||
sqlchemy.SUM("disk_size", disks.Field("disk_size")),
|
||||
storages.Field("capacity"),
|
||||
storages.Field("reserved"),
|
||||
).LeftJoin(storages, sqlchemy.Equals(disks.Field("storage_id"), storages.Field("id")))
|
||||
|
||||
disksSQ := disksQ.GroupBy(disksQ.Field("storage_id")).SubQuery()
|
||||
|
||||
divSQ := disksSQ.Query(
|
||||
disksSQ.Field("storage_id"),
|
||||
disksSQ.Field("disk_size"),
|
||||
sqlchemy.SUB("storage_capacity", disksSQ.Field("capacity"), disksSQ.Field("reserved")),
|
||||
).SubQuery()
|
||||
|
||||
hoststoragesQ := hoststorages.Query(
|
||||
hoststorages.Field("host_id"),
|
||||
sqlchemy.SUM("storage_used", divSQ.Field("disk_size")),
|
||||
sqlchemy.SUM("storage_capacity", divSQ.Field("storage_capacity")),
|
||||
)
|
||||
hoststoragesQ = hoststoragesQ.LeftJoin(divSQ, sqlchemy.Equals(hoststoragesQ.Field("storage_id"), divSQ.Field("storage_id")))
|
||||
hoststoragesSQ1 := hoststoragesQ.GroupBy(hoststoragesQ.Field("host_id")).SubQuery()
|
||||
|
||||
hoststoragesSQ := hoststoragesSQ1.Query(
|
||||
hoststoragesSQ1.Field("host_id"),
|
||||
sqlchemy.DIV("storage_commit_rate",
|
||||
hoststoragesSQ1.Field("storage_used"),
|
||||
hoststoragesSQ1.Field("storage_capacity"),
|
||||
),
|
||||
).SubQuery()
|
||||
|
||||
q = q.LeftJoin(hoststoragesSQ, sqlchemy.Equals(q.Field("id"), hoststoragesSQ.Field("host_id")))
|
||||
db.OrderByFields(q, []string{query.OrderByStorageCommitRate}, []sqlchemy.IQueryField{hoststoragesSQ.Field("storage_commit_rate")})
|
||||
}
|
||||
|
||||
if db.NeedOrderQuery([]string{query.OrderByMemCommitRate}) {
|
||||
guestsQ := GuestManager.Query()
|
||||
if options.Options.IgnoreNonrunningGuests {
|
||||
guestsQ = guestsQ.Equals("status", api.VM_RUNNING)
|
||||
}
|
||||
guests := guestsQ.SubQuery()
|
||||
hosts := HostManager.Query().SubQuery()
|
||||
hostQ := hosts.Query(
|
||||
hosts.Field("id"),
|
||||
hosts.Field("mem_size"),
|
||||
hosts.Field("mem_reserved"),
|
||||
sqlchemy.SUM("guest_vmem_size", guests.Field("vmem_size")),
|
||||
).LeftJoin(guests, sqlchemy.Equals(hosts.Field("id"), guests.Field("host_id")))
|
||||
|
||||
hostSQ := hostQ.GroupBy(hostQ.Field("host_id")).SubQuery()
|
||||
|
||||
divSQ := hostSQ.Query(
|
||||
hostSQ.Field("id"),
|
||||
sqlchemy.SUB("vmem_size", hostSQ.Field("mem_size"), hostSQ.Field("mem_reserved")),
|
||||
hostSQ.Field("guest_vmem_size"),
|
||||
).SubQuery()
|
||||
|
||||
sq := divSQ.Query(
|
||||
divSQ.Field("id").Label("host_id"),
|
||||
sqlchemy.DIV("mem_commit_rate", divSQ.Field("guest_vmem_size"), divSQ.Field("vmem_size")),
|
||||
).SubQuery()
|
||||
|
||||
q = q.LeftJoin(sq, sqlchemy.Equals(q.Field("id"), sq.Field("host_id")))
|
||||
|
||||
db.OrderByFields(q, []string{query.OrderByMemCommitRate}, []sqlchemy.IQueryField{sq.Field("mem_commit_rate")})
|
||||
}
|
||||
|
||||
return q, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -52,8 +52,11 @@ type HostListOptions struct {
|
||||
|
||||
Sn string `help:"find host by sn"`
|
||||
|
||||
OrderByServerCount string `help:"Order by server count" choices:"desc|asc"`
|
||||
OrderByStorage string `help:"Order by host storage" choices:"desc|asc"`
|
||||
OrderByServerCount string `help:"Order by server count" choices:"desc|asc"`
|
||||
OrderByStorage string `help:"Order by host storage" choices:"desc|asc"`
|
||||
OrderByStorageCommitRate string `help:"Order by host storage commite rate" choices:"desc|asc"`
|
||||
OrderByCpuCommitRate string `help:"Order by host cpu commit rate" choices:"desc|asc"`
|
||||
OrderByMemCommitRate string `help:"Order by host meme commit rate" choices:"desc|asc"`
|
||||
|
||||
options.BaseListOptions
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -1265,7 +1265,7 @@ yunion.io/x/pkg/util/workqueue
|
||||
yunion.io/x/pkg/utils
|
||||
# yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e
|
||||
yunion.io/x/s3cli
|
||||
# yunion.io/x/sqlchemy v0.0.0-20220411140620-728b325acd1c
|
||||
# yunion.io/x/sqlchemy v0.0.0-20220413030837-de1642aeb626
|
||||
yunion.io/x/sqlchemy
|
||||
yunion.io/x/sqlchemy/backends
|
||||
yunion.io/x/sqlchemy/backends/clickhouse
|
||||
|
||||
+24
@@ -287,3 +287,27 @@ func TimestampAdd(name string, field IQueryField, offsetSeconds int) IQueryField
|
||||
func CAST(field IQueryField, typeStr string, fieldname string) IQueryField {
|
||||
return NewFunctionField(fieldname, `CAST(%s AS `+typeStr+`)`, field)
|
||||
}
|
||||
|
||||
func bc(name, op string, fields ...IQueryField) IQueryField {
|
||||
exps := []string{}
|
||||
for i := 0; i < len(fields); i++ {
|
||||
exps = append(exps, "%s")
|
||||
}
|
||||
return NewFunctionField(name, strings.Join(exps, fmt.Sprintf(" %s ", op)), fields...)
|
||||
}
|
||||
|
||||
func ADD(name string, fields ...IQueryField) IQueryField {
|
||||
return bc(name, "+", fields...)
|
||||
}
|
||||
|
||||
func SUB(name string, fields ...IQueryField) IQueryField {
|
||||
return bc(name, "-", fields...)
|
||||
}
|
||||
|
||||
func MUL(name string, fields ...IQueryField) IQueryField {
|
||||
return bc(name, "*", fields...)
|
||||
}
|
||||
|
||||
func DIV(name string, fields ...IQueryField) IQueryField {
|
||||
return bc(name, "/", fields...)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user