Merge pull request #10822 from rainzm/ecloud/snapshots

feat(multicloud): add snapshots list for ecloud
This commit is contained in:
Zexi Li
2021-04-20 17:14:48 +08:00
committed by GitHub
3 changed files with 138 additions and 3 deletions
+27 -3
View File
@@ -62,6 +62,7 @@ type SDisk struct {
type SDiskManualAttr struct {
IsVirtual bool
TempalteId string
ServerId string
}
func (d *SDisk) GetBillingType() string {
@@ -202,15 +203,38 @@ func (s *SDisk) CreateISnapshot(ctx context.Context, name string, desc string) (
}
func (s *SDisk) GetISnapshot(id string) (cloudprovider.ICloudSnapshot, error) {
return nil, cloudprovider.ErrNotImplemented
parentId, isSystem := s.ID, false
if s.ManualAttr.IsVirtual {
parentId, isSystem = s.ManualAttr.ServerId, true
}
snapshots, err := s.storage.zone.region.GetSnapshots(id, parentId, isSystem)
if err != nil {
return nil, err
}
if len(snapshots) == 0 {
return nil, cloudprovider.ErrNotFound
}
return &snapshots[0], nil
}
func (s *SDisk) GetISnapshots() ([]cloudprovider.ICloudSnapshot, error) {
return nil, cloudprovider.ErrNotImplemented
parentId, isSystem := s.ID, false
if s.ManualAttr.IsVirtual {
parentId, isSystem = s.ManualAttr.ServerId, true
}
snapshots, err := s.storage.zone.region.GetSnapshots("", parentId, isSystem)
if err != nil {
return nil, err
}
isnapshots := make([]cloudprovider.ICloudSnapshot, len(snapshots))
for i := range snapshots {
isnapshots[i] = &snapshots[i]
}
return isnapshots, nil
}
func (s *SDisk) GetExtSnapshotPolicyIds() ([]string, error) {
return []string{}, cloudprovider.ErrNotImplemented
return []string{}, nil
}
func (s *SDisk) Resize(ctx context.Context, newSizeMB int64) error {
+1
View File
@@ -364,6 +364,7 @@ func (in *SInstance) fetchSysDisk() {
ManualAttr: SDiskManualAttr{
IsVirtual: true,
TempalteId: in.ImageRef,
ServerId: in.Id,
},
SCreateTime: in.SCreateTime,
SZoneRegionBase: in.SZoneRegionBase,
+110
View File
@@ -0,0 +1,110 @@
package ecloud
import (
"context"
"strings"
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/cloudprovider"
"yunion.io/x/onecloud/pkg/multicloud"
)
type SSnapshot struct {
multicloud.SResourceBase
region *SRegion
SCreateTime
BackupType string
CreateBy string
Description string
EcType string
Id string
Name string
Size int
VolumeId string
VolumeType string
Status string
IsSystem bool
SystemDisk string
}
func (s *SSnapshot) GetId() string {
return s.Id
}
func (s *SSnapshot) GetName() string {
return s.Name
}
func (s *SSnapshot) GetStatus() string {
switch strings.ToLower(s.Status) {
case "available", "in_use", "active":
return api.SNAPSHOT_READY
case "creating", "attaching", "backing_up", "saving", "queued":
return api.SNAPSHOT_CREATING
case "deleting":
return api.SNAPSHOT_DELETING
case "error_deleting":
return api.SNAPSHOT_DELETE_FAILED
case "error":
return api.SNAPSHOT_FAILED
default:
return api.SNAPSHOT_UNKNOWN
}
}
func (s *SSnapshot) GetSizeMb() int32 {
return int32(s.Size)
}
func (s *SSnapshot) GetDiskId() string {
if s.IsSystem {
return s.SystemDisk
}
return s.VolumeId
}
func (s *SSnapshot) GetDiskType() string {
if s.IsSystem {
return api.DISK_TYPE_SYS
}
return api.DISK_TYPE_DATA
}
func (s *SSnapshot) GetGlobalId() string {
return s.Id
}
func (s *SSnapshot) Delete() error {
return cloudprovider.ErrNotImplemented
}
func (s *SSnapshot) GetProjectId() string {
return ""
}
func (s *SRegion) GetSnapshots(snapshotId string, parentId string, isSystem bool) ([]SSnapshot, error) {
var apiRequest *SApiRequest
query := map[string]string{}
if len(snapshotId) > 0 {
query["backupId"] = snapshotId
}
if isSystem {
if len(parentId) > 0 {
query["serverId"] = parentId
}
apiRequest = NewApiRequest(s.ID, "/api/v2/vmBackup", query, nil)
} else {
if len(parentId) > 0 {
query["volumeId"] = parentId
}
apiRequest = NewApiRequest(s.ID, "/api/v2/volume/volumebackup", query, nil)
}
request := NewNovaRequest(apiRequest)
snapshots := make([]SSnapshot, 0)
err := s.client.doList(context.Background(), request, &snapshots)
if err != nil {
return nil, err
}
return snapshots, nil
}