From ce83a5319cebf5b0719108839b786f47c12d53c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Fri, 28 Jan 2022 11:16:32 +0800 Subject: [PATCH] fix(region): set sys disk index to 0 (#13322) --- pkg/compute/models/disks.go | 10 +++----- pkg/compute/models/guest_queries.go | 2 +- pkg/compute/models/guests.go | 40 +++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 3f8da3523f..d49766d132 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -190,18 +190,16 @@ func (manager *SDiskManager) ListItemFilter( guestId := query.ServerId if len(guestId) > 0 { - iGuest, err := GuestManager.FetchByIdOrName(userCred, guestId) - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError("guest %q not found", guestId) - } else if err != nil { + server, err := validators.ValidateModel(userCred, GuestManager, &guestId) + if err != nil { return nil, err } - guest := iGuest.(*SGuest) + guest := server.(*SGuest) guestDisks := GuestdiskManager.Query().SubQuery() q = q.Join(guestDisks, sqlchemy.AND( sqlchemy.Equals(guestDisks.Field("disk_id"), q.Field("id")), sqlchemy.Equals(guestDisks.Field("guest_id"), guest.Id), - )) + )).Asc(guestDisks.Field("index")) } if diskType := query.DiskType; diskType != "" { diff --git a/pkg/compute/models/guest_queries.go b/pkg/compute/models/guest_queries.go index 6c33e96f63..04f498f2fb 100644 --- a/pkg/compute/models/guest_queries.go +++ b/pkg/compute/models/guest_queries.go @@ -248,7 +248,7 @@ func fetchGuestDisksInfo(guestIds []string) map[string][]api.GuestDiskInfo { ) q = q.Join(guestdisks, sqlchemy.Equals(guestdisks.Field("disk_id"), disks.Field("id"))) q = q.Join(storages, sqlchemy.Equals(disks.Field("storage_id"), storages.Field("id"))) - q = q.Filter(sqlchemy.In(guestdisks.Field("guest_id"), guestIds)) + q = q.Filter(sqlchemy.In(guestdisks.Field("guest_id"), guestIds)).Asc(guestdisks.Field("index")) gds := []sGuestDiskInfo{} err := q.All(&gds) if err != nil { diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 0e152d3df2..526d03e591 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -3274,9 +3274,49 @@ func (self *SGuest) SyncVMDisks(ctx context.Context, userCred mcclient.TokenCred result.Add() } + err = self.fixSysDiskIndex() + if err != nil { + result.Error(errors.Wrapf(err, "fixSysDiskIndex")) + } + return result } +func (self *SGuest) fixSysDiskIndex() error { + disks := DiskManager.Query().SubQuery() + sysQ := GuestdiskManager.Query().Equals("guest_id", self.Id) + sysQ = sysQ.Join(disks, sqlchemy.Equals(disks.Field("id"), sysQ.Field("disk_id"))).Filter(sqlchemy.Equals(disks.Field("disk_type"), api.DISK_TYPE_SYS)) + sysDisk := &SGuestdisk{} + sysDisk.SetModelManager(GuestdiskManager, sysDisk) + err := sysQ.First(sysDisk) + if err != nil { + return err + } + if sysDisk.Index == 0 { + return nil + } + q := GuestdiskManager.Query().Equals("guest_id", self.Id).Equals("index", 0) + + firstDisk := &SGuestdisk{} + firstDisk.SetModelManager(GuestdiskManager, firstDisk) + err = q.First(firstDisk) + if err != nil { + return err + } + _, err = db.Update(firstDisk, func() error { + firstDisk.Index = sysDisk.Index + return nil + }) + if err != nil { + return err + } + _, err = db.Update(sysDisk, func() error { + sysDisk.Index = 0 + return nil + }) + return err +} + func filterGuestByRange(q *sqlchemy.SQuery, rangeObjs []db.IStandaloneModel, hostTypes []string, resourceTypes []string, providers []string, brands []string, cloudEnv string) *sqlchemy.SQuery { hosts := HostManager.Query().SubQuery() subq := hosts.Query(hosts.Field("id"))