mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-08-31 01:35:56 +08:00
fix(region): filter disks by server list (#23643)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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"`
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"`
|
||||
|
||||
|
||||
Reference in New Issue
Block a user