From 0d6480723df4b216458ae39e1f649010387bd0ff Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Mon, 17 Feb 2020 21:57:15 +0800 Subject: [PATCH] check scsi driver on add disk --- pkg/compute/models/guest_actions.go | 1 + pkg/compute/tasks/ha_guest_deploy_task.go | 1 + pkg/hostman/guestman/guesttasks.go | 42 +++++++++++++++++++++-- pkg/util/logclient/consts.go | 1 + 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 7c8d87c587..a862793d3f 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -2124,6 +2124,7 @@ func (self *SGuest) PerformAttachnetwork(ctx context.Context, userCred mcclient. defer host.ClearSchedDescCache() for i := 0; i < count; i++ { _, err = self.attach2NetworkDesc(ctx, userCred, host, input.Nets[i], pendingUsage, nil) + logclient.AddSimpleActionLog(self, logclient.ACT_ATTACH_NETWORK, input.Nets[i], userCred, err == nil) if err != nil { quotas.CancelPendingUsage(ctx, userCred, pendingUsage, pendingUsage) return nil, httperrors.NewBadRequestError(err.Error()) diff --git a/pkg/compute/tasks/ha_guest_deploy_task.go b/pkg/compute/tasks/ha_guest_deploy_task.go index cc1d27e8dd..feed267f4f 100644 --- a/pkg/compute/tasks/ha_guest_deploy_task.go +++ b/pkg/compute/tasks/ha_guest_deploy_task.go @@ -29,6 +29,7 @@ func (self *HAGuestDeployTask) OnDeployGuestComplete( } func (self *HAGuestDeployTask) DeployBackup(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + self.SetStage("OnDeploySlaveGuestComplete", nil) host := models.HostManager.FetchHostById(guest.BackupHostId) err := guest.GetDriver().RequestDeployGuestOnHost(ctx, guest, host, self) if err != nil { diff --git a/pkg/hostman/guestman/guesttasks.go b/pkg/hostman/guestman/guesttasks.go index 579467a5c6..1aabeebad2 100644 --- a/pkg/hostman/guestman/guesttasks.go +++ b/pkg/hostman/guestman/guesttasks.go @@ -25,6 +25,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/utils" "yunion.io/x/onecloud/pkg/appctx" "yunion.io/x/onecloud/pkg/hostman/hostutils" @@ -145,11 +146,12 @@ type SGuestDiskSyncTask struct { addDisks []jsonutils.JSONObject cdrom *string - callback func(...error) + callback func(...error) + checkeDrivers []string } func NewGuestDiskSyncTask(guest *SKVMGuestInstance, delDisks, addDisks []jsonutils.JSONObject, cdrom *string) *SGuestDiskSyncTask { - return &SGuestDiskSyncTask{guest, delDisks, addDisks, cdrom, nil} + return &SGuestDiskSyncTask{guest, delDisks, addDisks, cdrom, nil, nil} } func (d *SGuestDiskSyncTask) Start(callback func(...error)) { @@ -223,7 +225,43 @@ func (d *SGuestDiskSyncTask) onRemoveDiskSucc(results string) { d.syncDisksConf() } +func (d *SGuestDiskSyncTask) checkDiskDriver(disk jsonutils.JSONObject) { + if d.checkeDrivers == nil { + d.checkeDrivers = make([]string, 0) + } + driver, _ := disk.GetString("driver") + log.Debugf("sync disk driver: %s", driver) + if driver == DISK_DRIVER_SCSI { + if utils.IsInStringArray(DISK_DRIVER_SCSI, d.checkeDrivers) { + d.startAddDisk(disk) + } else { + cb := func(ret string) { d.checkScsiDriver(ret, disk) } + d.guest.Monitor.HumanMonitorCommand("info pci", cb) + } + } else { + d.startAddDisk(disk) + } +} + +func (d *SGuestDiskSyncTask) checkScsiDriver(ret string, disk jsonutils.JSONObject) { + if strings.Contains(ret, "SCSI controller") { + d.checkeDrivers = append(d.checkeDrivers, DISK_DRIVER_SCSI) + d.startAddDisk(disk) + } else { + cb := func(ret string) { + log.Infof("Add scsi controller %s", ret) + d.checkeDrivers = append(d.checkeDrivers, DISK_DRIVER_SCSI) + d.startAddDisk(disk) + } + d.guest.Monitor.DeviceAdd("virtio-scsi-pci", map[string]interface{}{"id": "scsi"}, cb) + } +} + func (d *SGuestDiskSyncTask) addDisk(disk jsonutils.JSONObject) { + d.checkDiskDriver(disk) +} + +func (d *SGuestDiskSyncTask) startAddDisk(disk jsonutils.JSONObject) { diskPath, _ := disk.GetString("path") iDisk := storageman.GetManager().GetDiskByPath(diskPath) if iDisk == nil { diff --git a/pkg/util/logclient/consts.go b/pkg/util/logclient/consts.go index aa73e9ce75..81a9a2e590 100644 --- a/pkg/util/logclient/consts.go +++ b/pkg/util/logclient/consts.go @@ -128,6 +128,7 @@ const ( ACT_VM_RESET = "虚拟机回滚快照" ACT_VM_SNAPSHOT_AND_CLONE = "虚拟机快照并克隆" ACT_VM_BLOCK_STREAM = "同步数据" + ACT_ATTACH_NETWORK = "绑定网卡" ACT_CACHED_IMAGE = "缓存镜像"