From e0751c0e1593f12f9daf18819e93f50de78bde64 Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Tue, 16 Oct 2018 10:49:03 +0800 Subject: [PATCH] add disk-create-snapshot, bug fix --- cmd/climc/shell/disks.go | 14 ++++++++++++++ cmd/climc/shell/snapshots.go | 11 +++++++++++ pkg/compute/models/disks.go | 14 ++++++++++++++ pkg/compute/models/snapshots.go | 17 ++++++++++++++++- pkg/mcclient/modules/mod_snapshots.go | 2 +- pkg/mcclient/options/servers.go | 4 ++-- 6 files changed, 58 insertions(+), 4 deletions(-) diff --git a/cmd/climc/shell/disks.go b/cmd/climc/shell/disks.go index 7d239376b0..a77960792c 100644 --- a/cmd/climc/shell/disks.go +++ b/cmd/climc/shell/disks.go @@ -219,4 +219,18 @@ func init() { printObject(disk) return nil }) + type DiskCreateSnapshotOptions struct { + DISK string `help:"ID or name of disk"` + SNAPSHOT_NAME string `help:"Snapshots name` + } + R(&DiskCreateSnapshotOptions{}, "disk-create-snapshot", "Disk create snapshot", func(s *mcclient.ClientSession, args *DiskCreateSnapshotOptions) error { + params := jsonutils.NewDict() + params.Add(jsonutils.NewString(args.SNAPSHOT_NAME), "name") + disk, err := modules.Disks.PerformAction(s, args.DISK, "create-snapshot", params) + if err != nil { + return err + } + printObject(disk) + return nil + }) } diff --git a/cmd/climc/shell/snapshots.go b/cmd/climc/shell/snapshots.go index 9f4fc65e90..9d7bf5b158 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"` + DiskType string `help: "Filter by disk type" choices:"sys|data"` + Provider string `help: "Cloud provider" choices:"Aliyun|VMware|Azure"` } R(&SnapshotsListOptions{}, "snapshot-list", "Show snapshots", func(s *mcclient.ClientSession, args *SnapshotsListOptions) error { params, err := args.BaseListOptions.Params() @@ -22,6 +24,15 @@ func init() { params.Add(jsonutils.NewString(args.Disk), "disk_id") } params.Add(jsonutils.NewBool(args.FakeDeleted), "fake_deleted") + if len(args.Disk) > 0 { + params.Add(jsonutils.NewString(args.Disk), "disk_id") + } + if len(args.DiskType) > 0 { + params.Add(jsonutils.NewString(args.DiskType), "disk_type") + } + if len(args.Provider) > 0 { + params.Add(jsonutils.NewString(args.Provider), "provider") + } result, err := modules.Snapshots.List(s, params) if err != nil { return err diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index c5d872f206..9165c8f407 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -410,6 +410,20 @@ func (self *SDisk) CleanUpDiskSnapshots(ctx context.Context, userCred mcclient.T return nil } +func (self *SDisk) AllowPerformCreateSnapshot(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { + return self.IsOwner(userCred) +} + +func (self *SDisk) PerformCreateSnapshot(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { + guests := self.GetGuests() + if len(guests) != 1 { + return nil, httperrors.NewBadRequestError("Disk dosen't attach guest??") + } + dataDict := data.(*jsonutils.JSONDict) + dataDict.Set("disk_id", jsonutils.NewString(self.Id)) + return guests[0].PerformDiskSnapshot(ctx, userCred, query, dataDict) +} + func (self *SDisk) AllowPerformDiskReset(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { return self.IsOwner(userCred) } diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index 02d1011d94..afe11e7a0a 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -86,6 +86,18 @@ func (manager *SSnapshotManager) ListItemFilter(ctx context.Context, q *sqlchemy } else { q = q.Equals("fake_deleted", false) } + + if diskType, err := query.GetString("disk_type"); err == nil { + diskTbl := DiskManager.Query().SubQuery() + sq := diskTbl.Query(diskTbl.Field("id")).Equals("disk_type", diskType).SubQuery() + q = q.In("disk_id", sq) + } + + if provider, err := query.GetString("provider"); err == nil { + cloudproviderTbl := CloudproviderManager.Query().SubQuery() + sq := cloudproviderTbl.Query(cloudproviderTbl.Field("id")).Equals("provider", provider) + q = q.In("manager_id", sq) + } return q, nil } @@ -103,9 +115,12 @@ func (self *SSnapshot) getMoreDetails(extra *jsonutils.JSONDict) *jsonutils.JSON 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].Id), "guest") + extra.Add(jsonutils.NewString(guests[0].Name), "guest") extra.Add(jsonutils.NewString(guests[0].Status), "guest_status") } } diff --git a/pkg/mcclient/modules/mod_snapshots.go b/pkg/mcclient/modules/mod_snapshots.go index edb86378c1..99224dbcb9 100644 --- a/pkg/mcclient/modules/mod_snapshots.go +++ b/pkg/mcclient/modules/mod_snapshots.go @@ -8,7 +8,7 @@ func init() { Snapshots = NewComputeManager("snapshot", "snapshots", []string{"ID", "Name", "Size", "Status", "Disk_id", "Guest_id", "Created_at"}, - []string{"Storage_id", "Create_by", "Location", "Out_of_chain", "disk_type", "provider"}) + []string{"Storage_id", "Storage_type", "Create_by", "Location", "Out_of_chain", "disk_type", "provider"}) registerCompute(&Snapshots) } diff --git a/pkg/mcclient/options/servers.go b/pkg/mcclient/options/servers.go index 06110971d5..6cbf88f30f 100644 --- a/pkg/mcclient/options/servers.go +++ b/pkg/mcclient/options/servers.go @@ -250,8 +250,8 @@ type ServerSendKeyOptions struct { } type ServerMonitorOptions struct { - ID string `help:"ID or Name of server" json:"-"` - CMD string `help:"Qemu Monitor command to send"` + ID string `help:"ID or Name of server" json:"-"` + COMMAND string `help:"Qemu Monitor command to send"` } type ServerSaveImageOptions struct {