diff --git a/cmd/climc/shell/disks.go b/cmd/climc/shell/disks.go index 3f4d35033b..36654af96e 100644 --- a/cmd/climc/shell/disks.go +++ b/cmd/climc/shell/disks.go @@ -10,11 +10,12 @@ import ( func init() { type DiskListOptions struct { 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"` - Storage string `help:"Storage ID or name"` + 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"` + Storage string `help:"Storage ID or name"` + Provider string `help:"Provider for disk" choices:"Aliyun|VMware"` } R(&DiskListOptions{}, "disk-list", "List virtual disks", func(s *mcclient.ClientSession, suboptions *DiskListOptions) error { params := FetchPagingParams(suboptions.BaseListOptions) @@ -33,6 +34,9 @@ func init() { if len(suboptions.Storage) > 0 { params.Add(jsonutils.NewString(suboptions.Storage), "storage") } + if len(suboptions.Provider) > 0 { + params.Add(jsonutils.NewString(suboptions.Provider), "provider") + } result, err := modules.Disks.List(s, params) if err != nil { return err diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index a5e552fd32..7b18930843 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -115,6 +115,14 @@ func (manager *SDiskManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu sq := storages.Query(storages.Field("id")).Filter(sqlchemy.In(storages.Field("storage_type"), STORAGE_LOCAL_TYPES)) q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq)) } + if provier, _ := queryDict.GetString("provider"); len(provier) > 0 { + cloudprovider := CloudproviderManager.Query().SubQuery() + sq := storages.Query(storages.Field("id")).Join(cloudprovider, + sqlchemy.AND( + sqlchemy.Equals(cloudprovider.Field("id"), storages.Field("manager_id")), + sqlchemy.Equals(cloudprovider.Field("provider"), provier))) + q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq)) + } guestId, _ := queryDict.GetString("guest") if len(guestId) != 0 { guest := GuestManager.FetchGuestById(guestId)