diff --git a/pkg/compute/guestdrivers/virtualization.go b/pkg/compute/guestdrivers/virtualization.go index 6aef096b8b..ffe3aeccfe 100644 --- a/pkg/compute/guestdrivers/virtualization.go +++ b/pkg/compute/guestdrivers/virtualization.go @@ -198,7 +198,18 @@ func (self *SVirtualizedGuestDriver) ChooseHostStorage(host *models.SHost, guest if len(storageIds) == 0 { return host.GetLeastUsedStorage(diskConfig.Backend), nil } - return models.StorageManager.FetchStorageById(storageIds[0]), nil + ss, err := models.StorageManager.FetchStorageByIds(storageIds) + if err != nil { + return nil, errors.Wrapf(err, "fetch storages by ids: %v", storageIds) + } + // try to find mediumType matched storage + for _, s := range ss { + tmp := s + if s.MediumType == diskConfig.Medium { + return &tmp, nil + } + } + return &ss[0], nil } func (self *SVirtualizedGuestDriver) RequestGuestCreateInsertIso(ctx context.Context, imageId string, guest *models.SGuest, task taskman.ITask) error { diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index 519a4697d5..1118955084 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -1334,6 +1334,15 @@ func (manager *SStorageManager) FetchStorageById(storageId string) *SStorage { return obj.(*SStorage) } +func (manager *SStorageManager) FetchStorageByIds(ids []string) ([]SStorage, error) { + objs := make([]SStorage, 0) + q := manager.Query().In("id", ids) + if err := db.FetchModelObjects(manager, q, &objs); err != nil { + return nil, err + } + return objs, nil +} + func (manager *SStorageManager) InitializeData() error { storages := make([]SStorage, 0) q := manager.Query()