From a6ecd32f35fcaf9a640e00ec0e274022a89644ef Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Tue, 7 Jan 2020 14:57:37 +0800 Subject: [PATCH] fix: guess brand on guest create --- pkg/compute/models/cloudaccounts.go | 39 +++++++++++++++++++++++++++++ pkg/compute/models/disks.go | 3 ++- pkg/compute/models/guests.go | 3 ++- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 3cd5b1efde..ef169b2f34 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -1709,3 +1709,42 @@ func (manager *SCloudaccountManager) FilterByOwner(q *sqlchemy.SQuery, owner mcc } return q } + +func (manager *SCloudaccountManager) getBrandsOfProvider(provider string) ([]string, error) { + q := manager.Query().Equals("provider", provider) + cloudaccounts := make([]SCloudaccount, 0) + err := db.FetchModelObjects(manager, q, &cloudaccounts) + if err != nil { + return nil, errors.Wrap(err, "db.FetchModelObjects") + } + ret := make([]string, 0) + for i := range cloudaccounts { + if cloudaccounts[i].IsAvailable() && !utils.IsInStringArray(cloudaccounts[i].Brand, ret) { + ret = append(ret, cloudaccounts[i].Brand) + } + } + return ret, nil +} + +func guessBrandForHypervisor(hypervisor string) string { + driver := GetDriver(hypervisor) + if driver == nil { + log.Errorf("guestBrandFromHypervisor: fail to find driver for hypervisor %s", hypervisor) + return "" + } + provider := driver.GetProvider() + if len(provider) == 0 { + log.Errorf("guestBrandFromHypervisor: fail to find provider for hypervisor %s", hypervisor) + return "" + } + brands, err := CloudaccountManager.getBrandsOfProvider(provider) + if err != nil { + log.Errorf("guestBrandFromHypervisor: fail to find brands for hypervisor %s", hypervisor) + return "" + } + if len(brands) != 1 { + log.Errorf("guestBrandFromHypervisor: find mistached number of brands for hypervisor %s %s", hypervisor, brands) + return "" + } + return brands[0] +} diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 6f73a766d2..61ca229ef7 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -404,10 +404,11 @@ func (self *SDisk) ValidateUpdateData(ctx context.Context, userCred mcclient.Tok func diskCreateInput2ComputeQuotaKeys(input api.DiskCreateInput, ownerId mcclient.IIdentityProvider) SComputeResourceKeys { // input.Hypervisor must be set + brand := guessBrandForHypervisor(input.Hypervisor) keys := GetDriver(input.Hypervisor).GetComputeQuotaKeys( rbacutils.ScopeProject, ownerId, - "", + brand, ) if len(input.PreferHost) > 0 { hostObj, _ := HostManager.FetchById(input.PreferHost) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index c02bfe4481..3a9d49071c 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -872,10 +872,11 @@ func (self *SGuest) ValidateUpdateData(ctx context.Context, userCred mcclient.To func serverCreateInput2ComputeQuotaKeys(input api.ServerCreateInput, ownerId mcclient.IIdentityProvider) SComputeResourceKeys { // input.Hypervisor must be set + brand := guessBrandForHypervisor(input.Hypervisor) keys := GetDriver(input.Hypervisor).GetComputeQuotaKeys( rbacutils.ScopeProject, ownerId, - "", + brand, ) if len(input.PreferHost) > 0 { hostObj, _ := HostManager.FetchById(input.PreferHost)