diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 67587ac0b2..30c62eb5fa 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -2432,7 +2432,14 @@ func (self *SGuest) DoCancelPendingDelete(ctx context.Context, userCred mcclient disk := guestdisk.GetDisk() disk.DoCancelPendingDelete(ctx, userCred) } - return self.SVirtualResourceBase.DoCancelPendingDelete(ctx, userCred) + err := self.SVirtualResourceBase.DoCancelPendingDelete(ctx, userCred) + if err != nil { + return err + } + if self.BillingType == billing_api.BILLING_TYPE_POSTPAID && !self.ExpiredAt.IsZero() { + return self.CancelExpireTime(ctx, userCred) + } + return nil } func (self *SGuest) StartUndeployGuestTask(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string, targetHostId string) error { diff --git a/pkg/compute/models/isolated_devices.go b/pkg/compute/models/isolated_devices.go index 7f990545e1..2d9b1c90b9 100644 --- a/pkg/compute/models/isolated_devices.go +++ b/pkg/compute/models/isolated_devices.go @@ -189,6 +189,38 @@ func (self *SIsolatedDevice) AllowDeleteItem(ctx context.Context, userCred mccli return userCred.IsSystemAdmin() } */ +func (manager *SIsolatedDeviceManager) ListItemExportKeys(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { + var err error + q, err = manager.SModelBaseManager.ListItemExportKeys(ctx, q, userCred, query) + if err != nil { + return nil, err + } + exportKeys, _ := query.GetString("export_keys") + keys := strings.Split(exportKeys, ",") + if utils.IsInStringArray("guest", keys) { + guestNameQuery := GuestManager.Query("name", "id").SubQuery() + q.LeftJoin(guestNameQuery, sqlchemy.Equals(q.Field("guest_id"), guestNameQuery.Field("id"))) + q.AppendField(guestNameQuery.Field("name", "guest")) + } + if utils.IsInStringArray("host", keys) { + hostNameQuery := HostManager.Query("name", "id").SubQuery() + q.LeftJoin(hostNameQuery, sqlchemy.Equals(q.Field("host_id"), hostNameQuery.Field("id"))) + q.AppendField(hostNameQuery.Field("name", "host")) + } + return q, nil +} + +func (manager *SIsolatedDeviceManager) GetExportExtraKeys(ctx context.Context, query jsonutils.JSONObject, rowMap map[string]string) *jsonutils.JSONDict { + res := manager.SStandaloneResourceBaseManager.GetExportExtraKeys(ctx, query, rowMap) + if guest, ok := rowMap["guest"]; ok && len(guest) > 0 { + res.Set("guest", jsonutils.NewString(guest)) + } + if host, ok := rowMap["host"]; ok { + res.Set("host", jsonutils.NewString(host)) + } + return res +} + func (self *SIsolatedDevice) ValidateDeleteCondition(ctx context.Context) error { if len(self.GuestId) > 0 { return httperrors.NewNotEmptyError("Isolated device used by server")