Skip to content

Commit

Permalink
fix(host): change storage clone disk add encrypt info
Browse files Browse the repository at this point in the history
  • Loading branch information
wanyaoqi committed Mar 5, 2025
1 parent 1f215d3 commit 0fad143
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 14 deletions.
12 changes: 10 additions & 2 deletions pkg/hostman/guestman/guesttasks.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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",
Expand Down
2 changes: 1 addition & 1 deletion pkg/hostman/storageman/storage_base.go
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
9 changes: 5 additions & 4 deletions pkg/hostman/storageman/storage_local.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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")
Expand Down
9 changes: 5 additions & 4 deletions pkg/hostman/storageman/storage_lvm.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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")
Expand Down
5 changes: 2 additions & 3 deletions pkg/hostman/storageman/storage_rbd.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit 0fad143

Please # to comment.