From 5b51e58b3fa61654cdd57a05be42e9eec97ce098 Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Tue, 28 Mar 2023 23:15:21 +0800 Subject: [PATCH] fix(region): delete gpu device only on guest pending delete Signed-off-by: wanyaoqi --- pkg/compute/models/isolated_devices.go | 23 +++++++++++++++++++++++ pkg/compute/tasks/guest_delete_task.go | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/pkg/compute/models/isolated_devices.go b/pkg/compute/models/isolated_devices.go index d5be64020e..5a8a6bde71 100644 --- a/pkg/compute/models/isolated_devices.go +++ b/pkg/compute/models/isolated_devices.go @@ -571,6 +571,29 @@ func (manager *SIsolatedDeviceManager) findHostUnusedByDevConfig(model, devType, return devs, nil } +func (manager *SIsolatedDeviceManager) ReleaseGPUDevicesOfGuest(ctx context.Context, guest *SGuest, userCred mcclient.TokenCredential) error { + devs := manager.findAttachedDevicesOfGuest(guest) + if devs == nil { + return fmt.Errorf("fail to find attached devices") + } + for _, dev := range devs { + if !utils.IsInStringArray(dev.DevType, api.VALID_GPU_TYPES) { + continue + } + _, err := db.Update(&dev, func() error { + dev.GuestId = "" + dev.NetworkIndex = -1 + return nil + }) + if err != nil { + db.OpsLog.LogEvent(guest, db.ACT_GUEST_DETACH_ISOLATED_DEVICE_FAIL, dev.GetShortDesc(ctx), userCred) + return err + } + db.OpsLog.LogEvent(guest, db.ACT_GUEST_DETACH_ISOLATED_DEVICE, dev.GetShortDesc(ctx), userCred) + } + return nil +} + func (manager *SIsolatedDeviceManager) ReleaseDevicesOfGuest(ctx context.Context, guest *SGuest, userCred mcclient.TokenCredential) error { devs := manager.findAttachedDevicesOfGuest(guest) if devs == nil { diff --git a/pkg/compute/tasks/guest_delete_task.go b/pkg/compute/tasks/guest_delete_task.go index fd0afb73ec..8a73cba5a3 100644 --- a/pkg/compute/tasks/guest_delete_task.go +++ b/pkg/compute/tasks/guest_delete_task.go @@ -196,7 +196,7 @@ func (self *GuestDeleteTask) OnDiskDetachCompleteFailed(ctx context.Context, obj // revoke all secgroups func (self *GuestDeleteTask) doClearSecurityGroupComplete(ctx context.Context, guest *models.SGuest) { log.Debugf("doClearSecurityGroupComplete") - models.IsolatedDeviceManager.ReleaseDevicesOfGuest(ctx, guest, self.UserCred) + models.IsolatedDeviceManager.ReleaseGPUDevicesOfGuest(ctx, guest, self.UserCred) guest.RevokeAllSecgroups(ctx, self.UserCred) // sync revoked secgroups to remote cloud if jsonutils.QueryBoolean(self.Params, "purge", false) {