From 451d11143f6ff62474516a618c1ea398bb0bf7fc Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Wed, 24 Apr 2019 13:45:28 +0800 Subject: [PATCH] import from libvirt link disk, do not move --- pkg/compute/models/guest_actions.go | 4 ++++ pkg/compute/models/guests.go | 4 ++++ pkg/compute/tasks/host_import_libvirt_servers_task.go | 1 + pkg/hostman/guestman/libvirt.go | 8 ++++++-- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 3b0079979f..6c50d8de8d 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -2075,6 +2075,10 @@ func (self *SGuest) PerformDiskSnapshot(ctx context.Context, userCred mcclient.T if !utils.IsInStringArray(self.Status, []string{api.VM_RUNNING, api.VM_READY}) { return nil, httperrors.NewInvalidStatusError("Cannot do snapshot when VM in status %s", self.Status) } + if self.IsImport(userCred) { + return nil, httperrors.NewBadRequestError("VM is import form libvirt, can't do snapshot") + } + diskId, err := data.GetString("disk_id") if err != nil { return nil, httperrors.NewBadRequestError(err.Error()) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 5f1390584d..e89bb19568 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -4342,3 +4342,7 @@ func (self *SGuest) ToIsolatedDevicesConfig() []*api.IsolatedDeviceConfig { } return ret } + +func (self *SGuest) IsImport(userCred mcclient.TokenCredential) bool { + return self.GetMetadata("__is_import", userCred) == "true" +} diff --git a/pkg/compute/tasks/host_import_libvirt_servers_task.go b/pkg/compute/tasks/host_import_libvirt_servers_task.go index 9ef9527727..911edea3ea 100644 --- a/pkg/compute/tasks/host_import_libvirt_servers_task.go +++ b/pkg/compute/tasks/host_import_libvirt_servers_task.go @@ -98,6 +98,7 @@ func (self *HostImportLibvirtServersTask) StartImportServers( } if success { + guest.SetMetadata(ctx, "__is_import", "ture", self.UserCred) db.OpsLog.LogEvent(host, db.ACT_HOST_IMPORT_LIBVIRT_SERVERS, note, self.UserCred) } else { log.Errorln(note) diff --git a/pkg/hostman/guestman/libvirt.go b/pkg/hostman/guestman/libvirt.go index 6864048d0d..f9c9b71e78 100644 --- a/pkg/hostman/guestman/libvirt.go +++ b/pkg/hostman/guestman/libvirt.go @@ -45,9 +45,10 @@ func (m *SGuestManager) GuestCreateFromLibvirt( } iDisk := storage.CreateDisk(diskId) - output, err := procutils.NewCommand("mv", diskPath, iDisk.GetPath()).Run() + // use symbol link replace mv, more security + output, err := procutils.NewCommand("ln", "-s", diskPath, iDisk.GetPath()).Run() if err != nil { - return nil, fmt.Errorf("Mv disk from %s to %s error %s", diskPath, iDisk.GetPath(), output) + return nil, fmt.Errorf("Symbol link disk from %s to %s error %s", diskPath, iDisk.GetPath(), output) } disksPath.Set(diskId, jsonutils.NewString(iDisk.GetPath())) } @@ -221,6 +222,9 @@ func (m *SGuestManager) LibvirtDomainDiskToDiskConfig( domainDisks []libvirtxml.DomainDisk) ([]compute.SImportDisk, error) { var diskConfigs = []compute.SImportDisk{} for _, disk := range domainDisks { + if disk.Device != "disk" { + continue + } if disk.Source == nil || disk.Source.File == nil { return nil, fmt.Errorf("Domain disk missing source file ?") }