add snapshot-list filter by storage type

This commit is contained in:
wanyaoqi
2018-10-16 16:59:52 +08:00
parent e0751c0e15
commit 374d531931
2 changed files with 27 additions and 3 deletions
+8
View File
@@ -12,6 +12,8 @@ func init() {
options.BaseListOptions
Disk string `help:"Disk snapshots"`
FakeDeleted bool `help:"Show fake deleted snapshot or not"`
Local bool `help:"Show local snapshots"`
Share bool `help:"Show shared snapshots"`
DiskType string `help: "Filter by disk type" choices:"sys|data"`
Provider string `help: "Cloud provider" choices:"Aliyun|VMware|Azure"`
}
@@ -24,6 +26,12 @@ func init() {
params.Add(jsonutils.NewString(args.Disk), "disk_id")
}
params.Add(jsonutils.NewBool(args.FakeDeleted), "fake_deleted")
if args.Local {
params.Add(jsonutils.NewBool(args.Local), "local")
}
if args.Share {
params.Add(jsonutils.NewBool(args.Share), "share")
}
if len(args.Disk) > 0 {
params.Add(jsonutils.NewString(args.Disk), "disk_id")
}
+19 -3
View File
@@ -87,6 +87,20 @@ func (manager *SSnapshotManager) ListItemFilter(ctx context.Context, q *sqlchemy
q = q.Equals("fake_deleted", false)
}
if jsonutils.QueryBoolean(query, "local", false) {
storages := StorageManager.Query().SubQuery()
sq := storages.Query(storages.Field("id")).Filter(sqlchemy.Equals(storages.Field("storage_type"), STORAGE_LOCAL))
q = q.Filter(sqlchemy.In(q.Field("storage_id"), sq))
}
// Public cloud snapshot doesn't have storage id
if jsonutils.QueryBoolean(query, "share", false) {
storages := StorageManager.Query().SubQuery()
sq := storages.Query(storages.Field("id")).NotEquals("storage_type", "local")
q = q.Filter(sqlchemy.OR(sqlchemy.IsNull(q.Field("storage_id")),
sqlchemy.In(q.Field("storage_id"), sq)))
}
if diskType, err := query.GetString("disk_type"); err == nil {
diskTbl := DiskManager.Query().SubQuery()
sq := diskTbl.Query(diskTbl.Field("id")).Equals("disk_type", diskType).SubQuery()
@@ -112,12 +126,14 @@ func (self *SSnapshot) GetExtraDetails(ctx context.Context, userCred mcclient.To
}
func (self *SSnapshot) getMoreDetails(extra *jsonutils.JSONDict) *jsonutils.JSONDict {
if IStorage, _ := StorageManager.FetchById(self.StorageId); IStorage != nil {
storage := IStorage.(*SStorage)
extra.Add(jsonutils.NewString(storage.StorageType), "storage_type")
}
disk, _ := self.GetDisk()
if disk != nil {
extra.Add(jsonutils.NewString(disk.DiskType), "disk_type")
if storage := disk.GetStorage(); storage != nil {
extra.Add(jsonutils.NewString(storage.StorageType), "storage_type")
}
guests := disk.GetGuests()
if len(guests) == 1 {
extra.Add(jsonutils.NewString(guests[0].Name), "guest")