mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
fix(host): change storage clone disk add encrypt info (#22229)
This commit is contained in:
@@ -43,6 +43,7 @@ import (
|
||||
"yunion.io/x/onecloud/pkg/hostman/monitor"
|
||||
"yunion.io/x/onecloud/pkg/hostman/options"
|
||||
"yunion.io/x/onecloud/pkg/hostman/storageman"
|
||||
"yunion.io/x/onecloud/pkg/mcclient/auth"
|
||||
"yunion.io/x/onecloud/pkg/util/cgrouputils/cpuset"
|
||||
"yunion.io/x/onecloud/pkg/util/procutils"
|
||||
"yunion.io/x/onecloud/pkg/util/qemuimg"
|
||||
@@ -2935,8 +2936,15 @@ func (t *SGuestStorageCloneDiskTask) Start(guestRunning bool) {
|
||||
return
|
||||
}
|
||||
|
||||
resp, err := t.params.TargetStorage.CloneDiskFromStorage(
|
||||
t.ctx, t.params.SourceStorage, t.params.SourceDisk, t.params.TargetDiskId, !guestRunning)
|
||||
encryptInfo, err := t.getEncryptKey(t.ctx, auth.AdminCredential())
|
||||
if err != nil {
|
||||
hostutils.TaskFailed(
|
||||
t.ctx, fmt.Sprintf("failed get guest encrypt info %s", t.params.SourceDisk.GetId()),
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
resp, err := t.params.TargetStorage.CloneDiskFromStorage(t.ctx, t.params.SourceStorage, t.params.SourceDisk, t.params.TargetDiskId, !guestRunning, encryptInfo)
|
||||
if err != nil {
|
||||
hostutils.TaskFailed(
|
||||
t.ctx, fmt.Sprintf("Clone disk %s to storage %s failed %s",
|
||||
|
||||
@@ -133,7 +133,7 @@ type IStorage interface {
|
||||
// GetCloneTargetDiskPath generate target disk path by target disk id
|
||||
GetCloneTargetDiskPath(ctx context.Context, targetDiskId string) string
|
||||
// CloneDiskFromStorage clone disk from other storage
|
||||
CloneDiskFromStorage(ctx context.Context, srcStorage IStorage, srcDisk IDisk, targetDiskId string, fullCopy bool) (*hostapi.ServerCloneDiskFromStorageResponse, error)
|
||||
CloneDiskFromStorage(ctx context.Context, srcStorage IStorage, srcDisk IDisk, targetDiskId string, fullCopy bool, encInfo apis.SEncryptInfo) (*hostapi.ServerCloneDiskFromStorageResponse, error)
|
||||
|
||||
CreateSnapshotFormUrl(ctx context.Context, snapshotUrl, diskId, snapshotPath string) error
|
||||
|
||||
@@ -477,7 +477,7 @@ func (s *SBaseStorage) GetCloneTargetDiskPath(ctx context.Context, targetDiskId
|
||||
}
|
||||
|
||||
func (s *SBaseStorage) CloneDiskFromStorage(
|
||||
ctx context.Context, srcStorage IStorage, srcDisk IDisk, targetDiskId string, fullCopy bool,
|
||||
ctx context.Context, srcStorage IStorage, srcDisk IDisk, targetDiskId string, fullCopy bool, encInfo apis.SEncryptInfo,
|
||||
) (*hostapi.ServerCloneDiskFromStorageResponse, error) {
|
||||
return nil, httperrors.ErrNotImplemented
|
||||
}
|
||||
|
||||
@@ -984,14 +984,15 @@ func (s *SLocalStorage) GetCloneTargetDiskPath(ctx context.Context, targetDiskId
|
||||
return path.Join(s.GetPath(), targetDiskId)
|
||||
}
|
||||
|
||||
func (s *SLocalStorage) CloneDiskFromStorage(
|
||||
ctx context.Context, srcStorage IStorage, srcDisk IDisk, targetDiskId string, fullCopy bool,
|
||||
) (*hostapi.ServerCloneDiskFromStorageResponse, error) {
|
||||
func (s *SLocalStorage) CloneDiskFromStorage(ctx context.Context, srcStorage IStorage, srcDisk IDisk, targetDiskId string, fullCopy bool, encInfo apis.SEncryptInfo) (*hostapi.ServerCloneDiskFromStorageResponse, error) {
|
||||
srcDiskPath := srcDisk.GetPath()
|
||||
srcImg, err := qemuimg.NewQemuImage(srcDiskPath)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "Get source image %q info", srcDiskPath)
|
||||
}
|
||||
if encInfo.Id != "" {
|
||||
srcImg.SetPassword(encInfo.Key)
|
||||
}
|
||||
|
||||
// start create target disk. if full copy is false, just create
|
||||
// empty target disk with same size and format
|
||||
@@ -1004,7 +1005,7 @@ func (s *SLocalStorage) CloneDiskFromStorage(
|
||||
return nil, errors.Wrap(err, "failed new qemu image")
|
||||
}
|
||||
|
||||
err = newImg.CreateQcow2(srcImg.GetSizeMB(), false, "", "", "", "")
|
||||
err = newImg.CreateQcow2(srcImg.GetSizeMB(), false, "", encInfo.Key, qemuimg.EncryptFormatLuks, encInfo.Alg)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "Clone source disk to target local storage")
|
||||
|
||||
@@ -594,14 +594,15 @@ func (s *SLVMStorage) StorageBackup(ctx context.Context, params *SStorageBackup)
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (s *SLVMStorage) CloneDiskFromStorage(
|
||||
ctx context.Context, srcStorage IStorage, srcDisk IDisk, targetDiskId string, fullCopy bool,
|
||||
) (*hostapi.ServerCloneDiskFromStorageResponse, error) {
|
||||
func (s *SLVMStorage) CloneDiskFromStorage(ctx context.Context, srcStorage IStorage, srcDisk IDisk, targetDiskId string, fullCopy bool, encInfo apis.SEncryptInfo) (*hostapi.ServerCloneDiskFromStorageResponse, error) {
|
||||
srcDiskPath := srcDisk.GetPath()
|
||||
srcImg, err := qemuimg.NewQemuImage(srcDiskPath)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "Get source image %q info", srcDiskPath)
|
||||
}
|
||||
if encInfo.Id != "" {
|
||||
srcImg.SetPassword(encInfo.Key)
|
||||
}
|
||||
|
||||
// create target disk lv
|
||||
lvSize := lvmutils.GetQcow2LvSize(srcImg.SizeBytes/1024/1024) * 1024 * 1024
|
||||
@@ -620,7 +621,7 @@ func (s *SLVMStorage) CloneDiskFromStorage(
|
||||
return nil, errors.Wrap(err, "failed new qemu image")
|
||||
}
|
||||
|
||||
err = newImg.CreateQcow2(srcImg.GetSizeMB(), false, "", "", "", "")
|
||||
err = newImg.CreateQcow2(srcImg.GetSizeMB(), false, "", encInfo.Key, qemuimg.EncryptFormatLuks, encInfo.Alg)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "Clone source disk to target local storage")
|
||||
|
||||
@@ -28,6 +28,7 @@ import (
|
||||
"yunion.io/x/pkg/util/qemuimgfmt"
|
||||
"yunion.io/x/pkg/utils"
|
||||
|
||||
apis2 "yunion.io/x/onecloud/pkg/apis"
|
||||
api "yunion.io/x/onecloud/pkg/apis/compute"
|
||||
hostapi "yunion.io/x/onecloud/pkg/apis/host"
|
||||
deployapi "yunion.io/x/onecloud/pkg/hostman/hostdeployer/apis"
|
||||
@@ -669,9 +670,7 @@ func (s *SRbdStorage) GetCloneTargetDiskPath(ctx context.Context, targetDiskId s
|
||||
return s.GetDiskPath(targetDiskId)
|
||||
}
|
||||
|
||||
func (s *SRbdStorage) CloneDiskFromStorage(
|
||||
ctx context.Context, srcStorage IStorage, srcDisk IDisk, targetDiskId string, fullCopy bool,
|
||||
) (*hostapi.ServerCloneDiskFromStorageResponse, error) {
|
||||
func (s *SRbdStorage) CloneDiskFromStorage(ctx context.Context, srcStorage IStorage, srcDisk IDisk, targetDiskId string, fullCopy bool, encInfo apis2.SEncryptInfo) (*hostapi.ServerCloneDiskFromStorageResponse, error) {
|
||||
srcDiskPath := srcDisk.GetPath()
|
||||
srcImg, err := qemuimg.NewQemuImage(srcDiskPath)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user