From 374d5319318a1bf035665c852a8b398bfe35475e Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Tue, 16 Oct 2018 15:59:17 +0800 Subject: [PATCH] add snapshot-list filter by storage type --- cmd/climc/shell/snapshots.go | 8 ++++++++ pkg/compute/models/snapshots.go | 22 +++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/cmd/climc/shell/snapshots.go b/cmd/climc/shell/snapshots.go index 9d7bf5b158..3be5a0ad2b 100644 --- a/cmd/climc/shell/snapshots.go +++ b/cmd/climc/shell/snapshots.go @@ -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") } diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index afe11e7a0a..3367203ee4 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -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")