fix(region): set sys disk index to 0 (#13322)

This commit is contained in:
屈轩
2022-01-28 11:16:32 +08:00
committed by GitHub
parent 1475e23270
commit ce83a5319c
3 changed files with 45 additions and 7 deletions
+4 -6
View File
@@ -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 != "" {
+1 -1
View File
@@ -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 {
+40
View File
@@ -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"))