diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 92ddee2795..9abdb1ec2e 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -1409,6 +1409,12 @@ func (disk *SDisk) getCandidateHostIds() ([]string, error) { } func (self *SDisk) GetMasterHost(storage *SStorage) (*SHost, error) { + if storage.StorageType == api.STORAGE_SLVM { + if guest := self.GetGuest(); guest != nil { + return guest.GetHost() + } + } + if storage.MasterHost != "" { return storage.GetMasterHost() } diff --git a/pkg/hostman/storageman/storage_lvm.go b/pkg/hostman/storageman/storage_lvm.go index a40933f7e2..cacca8598f 100644 --- a/pkg/hostman/storageman/storage_lvm.go +++ b/pkg/hostman/storageman/storage_lvm.go @@ -486,6 +486,19 @@ func (s *SLVMStorage) CreateDiskFromExistingPath(context.Context, IDisk, *SDiskC return errors.Errorf("unsupported operation") } +func (s *SLVMStorage) CreateDiskFromBackup(ctx context.Context, disk IDisk, input *SDiskCreateByDiskinfo) error { + lvSizeMb := lvmutils.GetQcow2LvSize(int64(input.DiskInfo.DiskSizeMb)) + if err := lvmutils.LvCreate(s.GetPath(), disk.GetId(), lvSizeMb*1024*1024); err != nil { + return errors.Wrap(err, "CreateRaw") + } + + err := doRestoreDisk(ctx, input.DiskInfo, disk.GetPath(), input.DiskInfo.Format) + if err != nil { + return errors.Wrap(err, "doRestoreDisk") + } + return nil +} + func (s *SLVMStorage) GetFuseTmpPath() string { localPath := options.HostOptions.ImageCachePath if len(options.HostOptions.LocalImagePath) > 0 { diff --git a/pkg/hostman/storageman/storage_slvm.go b/pkg/hostman/storageman/storage_slvm.go index 9a589362e0..e6709b7347 100644 --- a/pkg/hostman/storageman/storage_slvm.go +++ b/pkg/hostman/storageman/storage_slvm.go @@ -177,3 +177,15 @@ func (s *SSLVMStorage) SetStorageInfo(storageId, storageName string, conf jsonut } return nil } + +func (s *SSLVMStorage) CreateDiskFromBackup(ctx context.Context, disk IDisk, input *SDiskCreateByDiskinfo) error { + err := s.SLVMStorage.CreateDiskFromBackup(ctx, disk, input) + if err != nil { + return err + } + err = lvmutils.LVDeactivate(disk.GetPath()) + if err != nil { + return errors.Wrap(err, "LVDeactivate") + } + return nil +}