fix(region): filter disks by server list (#23643)

This commit is contained in:
屈轩
2025-10-30 17:24:35 +08:00
committed by GitHub
parent c6b4daee37
commit 1fe87cb8e6
4 changed files with 49 additions and 16 deletions
+5
View File
@@ -28,6 +28,7 @@ func init() {
MODULE string `help:"module name"`
FIELD string `help:"distinct field name to query"`
Extra bool `help:"query extra distinct field"`
Scope string `help:"resource scope" choices:"system|domain|project"`
}
R(&DistinctFieldOption{}, "distinct-field", "Query values of a distinct field for a module", func(s *mcclient.ClientSession, args *DistinctFieldOption) error {
mod, err := modulebase.GetModule(s, args.MODULE)
@@ -43,6 +44,9 @@ func init() {
} else {
params.Add(jsonutils.NewString(args.FIELD), "field")
}
if len(args.Scope) > 0 {
params.Add(jsonutils.NewString(args.Scope), "scope")
}
result, err := mod.Get(s, "distinct-field", params)
if err != nil {
return err
@@ -56,6 +60,7 @@ func init() {
Field []string `help:"distinct field name to query"`
ExtraField []string `help:"distinct field name to query"`
ExtraResource string
Scope string `help:"resource scope" choices:"system|domain|project"`
}
R(&DistinctFieldsOption{}, "distinct-fields", "Query values of a distinct fields for a module", func(s *mcclient.ClientSession, args *DistinctFieldsOption) error {
mod, err := modulebase.GetModule(s, args.MODULE)
+2 -1
View File
@@ -125,7 +125,8 @@ type DiskListInput struct {
StorageFilterListInput
SnapshotPolicyFilterListInput
ServerFilterListInput
// 虚拟机(ID或Name)列表
ServerId []string `json:"server_id"`
// filter disk by whether it is being used
Unused *bool `json:"unused"`
+33 -6
View File
@@ -221,15 +221,17 @@ func (manager *SDiskManager) ListItemFilter(
guestId := query.ServerId
if len(guestId) > 0 {
server, err := validators.ValidateModel(ctx, userCred, GuestManager, &guestId)
if err != nil {
return nil, err
}
guest := server.(*SGuest)
guests := GuestManager.Query("id")
sq := guests.Filter(
sqlchemy.OR(
sqlchemy.In(guests.Field("id"), guestId),
sqlchemy.In(guests.Field("name"), guestId),
),
).SubQuery()
guestDisks := GuestdiskManager.Query().SubQuery()
q = q.Join(guestDisks, sqlchemy.AND(
sqlchemy.Equals(guestDisks.Field("disk_id"), q.Field("id")),
sqlchemy.Equals(guestDisks.Field("guest_id"), guest.Id),
sqlchemy.In(guestDisks.Field("guest_id"), sq),
)).Asc(guestDisks.Field("index"))
}
@@ -348,6 +350,14 @@ func (manager *SDiskManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field s
q.Join(guestQuery, sqlchemy.Equals(guestQuery.Field("id"), guestDiskQuery.Field("guest_id")))
return q, nil
}
if field == "server" {
guestDiskQuery := GuestdiskManager.Query("disk_id", "guest_id").SubQuery()
q = q.LeftJoin(guestDiskQuery, sqlchemy.Equals(q.Field("id"), guestDiskQuery.Field("disk_id")))
guestQuery := GuestManager.Query().SubQuery()
q.AppendField(guestQuery.Field("name", field)).Distinct()
q.Join(guestQuery, sqlchemy.Equals(guestQuery.Field("id"), guestDiskQuery.Field("guest_id")))
return q, nil
}
q, err = manager.SStorageResourceBaseManager.QueryDistinctExtraField(q, field)
if err == nil {
return q, nil
@@ -356,6 +366,23 @@ func (manager *SDiskManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field s
return q, httperrors.ErrNotFound
}
func (manager *SDiskManager) QueryDistinctExtraFields(q *sqlchemy.SQuery, resource string, fields []string) (*sqlchemy.SQuery, error) {
switch resource {
case GuestManager.Keyword():
guestdisks := GuestdiskManager.Query("disk_id", "guest_id").SubQuery()
q = q.LeftJoin(guestdisks, sqlchemy.Equals(q.Field("id"), guestdisks.Field("disk_id")))
guestQuery := GuestManager.Query().SubQuery()
for _, field := range fields {
q = q.AppendField(guestQuery.Field(field))
}
q = q.Join(guestQuery, sqlchemy.Equals(q.Field("guest_id"), guestQuery.Field("id")))
return q, nil
}
return q, httperrors.ErrNotFound
}
func (self *SDisk) GetGuestDiskCount() (int, error) {
guestdisks := GuestdiskManager.Query()
guests := GuestManager.Query().SubQuery()
+9 -9
View File
@@ -176,15 +176,15 @@ func (o *DiskRebuildOptions) Params() (jsonutils.JSONObject, error) {
type DiskListOptions struct {
options.BaseListOptions
Unused *bool `help:"Show unused disks"`
Share *bool `help:"Show Share storage disks"`
Local *bool `help:"Show Local storage disks"`
Guest string `help:"Guest ID or name"`
GuestStatus string `help:"Guest Status"`
OrderByServer string `help:"Order By Server"`
Storage string `help:"Storage ID or name"`
Type string `help:"Disk type" choices:"sys|data|swap|volume"`
CloudType string `help:"Public cloud or private cloud" choices:"Public|Private"`
Unused *bool `help:"Show unused disks"`
Share *bool `help:"Show Share storage disks"`
Local *bool `help:"Show Local storage disks"`
ServerId []string `help:"Guest ID or name"`
GuestStatus string `help:"Guest Status"`
OrderByServer string `help:"Order By Server"`
Storage string `help:"Storage ID or name"`
Type string `help:"Disk type" choices:"sys|data|swap|volume"`
CloudType string `help:"Public cloud or private cloud" choices:"Public|Private"`
OrderByGuestCount string `help:"Order By Guest Count"`