diff --git a/cmd/climc/shell/snapshots.go b/cmd/climc/shell/snapshots.go index d809a1226e..967abb7387 100644 --- a/cmd/climc/shell/snapshots.go +++ b/cmd/climc/shell/snapshots.go @@ -16,6 +16,8 @@ func init() { 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"` + + Manager string `help:"Show snapshots belongs to a specific cloud provider"` } R(&SnapshotsListOptions{}, "snapshot-list", "Show snapshots", func(s *mcclient.ClientSession, args *SnapshotsListOptions) error { params, err := args.BaseListOptions.Params() @@ -41,6 +43,9 @@ func init() { if len(args.Provider) > 0 { params.Add(jsonutils.NewString(args.Provider), "provider") } + if len(args.Manager) > 0 { + params.Add(jsonutils.NewString(args.Manager), "manager") + } result, err := modules.Snapshots.List(s, params) if err != nil { return err diff --git a/cmd/climc/shell/vpcs.go b/cmd/climc/shell/vpcs.go index 547a775dd0..79517f2880 100644 --- a/cmd/climc/shell/vpcs.go +++ b/cmd/climc/shell/vpcs.go @@ -11,7 +11,7 @@ func init() { type VpcListOptions struct { options.BaseListOptions Region string `help:"ID or Name of region"` - Manager string `help:"Show regions belongs to the cloud provider"` + Manager string `help:"Show vpcs belongs to the cloud provider"` } R(&VpcListOptions{}, "vpc-list", "List VPCs", func(s *mcclient.ClientSession, args *VpcListOptions) error { var params *jsonutils.JSONDict diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index 5d5073710c..34fe6a4945 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -112,6 +112,18 @@ func (manager *SSnapshotManager) ListItemFilter(ctx context.Context, q *sqlchemy sq := cloudproviderTbl.Query(cloudproviderTbl.Field("id")).Equals("provider", provider) q = q.In("manager_id", sq) } + + if managerStr := jsonutils.GetAnyString(query, []string{"manager", "manager_id"}); len(managerStr) > 0 { + managerObj, err := CloudproviderManager.FetchByIdOrName("", managerStr) + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewNotFoundError("manager %s not found", managerStr) + } + return nil, httperrors.NewGeneralError(err) + } + q = q.Equals("manager_id", managerObj.GetId()) + } + return q, nil } diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index 060c266c62..256321c33c 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -83,7 +83,7 @@ func (manager *SStorageManager) GetContextManager() []db.IModelManager { } func (self *SStorage) ValidateDeleteCondition(ctx context.Context) error { - if self.GetHostCount() > 0 || self.GetDiskCount() > 0 { + if self.GetHostCount() > 0 || self.GetDiskCount() > 0 || self.GetSnapshotCount() > 0 { return httperrors.NewNotEmptyError("Not an empty storage provider") } return self.SEnabledStatusStandaloneResourceBase.ValidateDeleteCondition(ctx) @@ -97,6 +97,10 @@ func (self *SStorage) GetDiskCount() int { return DiskManager.Query().Equals("storage_id", self.Id).Count() } +func (self *SStorage) GetSnapshotCount() int { + return SnapshotManager.Query().Equals("storage_id", self.Id).Count() +} + func (self *SStorage) IsLocal() bool { return self.StorageType == STORAGE_LOCAL || self.StorageType == STORAGE_BAREMETAL }