modelartsBugFix

This commit is contained in:
mhf
2022-09-15 21:22:40 +08:00
parent c6b99377eb
commit dea296172a
14 changed files with 135 additions and 102 deletions
+8 -8
View File
@@ -1883,8 +1883,8 @@ func syncPublicCloudProviderInfo(
}
if cloudprovider.IsSupportModelartsPool(driver) && syncRange.NeedSyncResource(cloudprovider.CLOUD_CAPABILITY_MODELARTES) {
syncModelartsPools(ctx, userCred, syncResults, provider, driver)
syncModelartsPoolSku(ctx, userCred, syncResults, provider, driver)
syncModelartsPoolSkus(ctx, userCred, syncResults, provider, localRegion, remoteRegion)
syncModelartsPools(ctx, userCred, syncResults, provider, localRegion, remoteRegion)
}
return nil
@@ -2347,26 +2347,26 @@ func syncTablestore(ctx context.Context, userCred mcclient.TokenCredential, sync
return nil
}
func syncModelartsPools(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, provider *SCloudprovider, driver cloudprovider.ICloudProvider) error {
ipools, err := driver.GetIModelartsPools()
func syncModelartsPools(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, provider *SCloudprovider, localRegion *SCloudregion, remoteRegion cloudprovider.ICloudRegion) error {
ipools, err := remoteRegion.GetIModelartsPools()
if err != nil {
msg := fmt.Sprintf("GetIModelartsPools for provider %s failed %s", err, ipools)
log.Errorf(msg)
return err
}
result := provider.SyncModelartsPools(ctx, userCred, ipools)
result := localRegion.SyncModelartsPools(ctx, userCred, provider, ipools)
log.Infof("SyncModelartsPools for region %s result: %s", provider.GetName(), result.Result())
return nil
}
func syncModelartsPoolSkus(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, provider *SCloudprovider, driver cloudprovider.ICloudProvider) error {
ipools, err := driver.GetIModelartsPoolSku()
func syncModelartsPoolSkus(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, provider *SCloudprovider, localRegion *SCloudregion, remoteRegion cloudprovider.ICloudRegion) error {
ipools, err := remoteRegion.GetIModelartsPoolSku()
if err != nil {
msg := fmt.Sprintf("GetIModelartsPoolSku for provider %s failed %s", err, ipools)
log.Errorf(msg)
return err
}
result := provider.SyncModelartsPoolSkus(ctx, userCred, ipools)
result := localRegion.SyncModelartsPoolSkus(ctx, userCred, provider, ipools)
log.Infof("SyncModelartsPoolSkus for region %s result: %s", provider.GetName(), result.Result())
return nil
}
+23 -19
View File
@@ -16,7 +16,6 @@ package models
import (
"context"
"fmt"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
@@ -37,6 +36,7 @@ type SModelartsPoolSkuManager struct {
db.SExternalizedResourceBaseManager
db.SEnabledStatusStandaloneResourceBaseManager
SCloudregionResourceBaseManager
SManagedResourceBaseManager
}
@@ -59,6 +59,7 @@ type SModelartsPoolSku struct {
SManagedResourceBase
db.SEnabledStatusStandaloneResourceBase
db.SExternalizedResourceBase
SCloudregionResourceBase
Type string `width:"128" charset:"ascii" nullable:"true" list:"user" create:"admin_optional" update:"admin"` // 资源规格类型
// CPU 架构 x86|xarm
@@ -100,6 +101,10 @@ func (man *SModelartsPoolSkuManager) ListItemFilter(
if err != nil {
return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter")
}
q, err = man.SCloudregionResourceBaseManager.ListItemFilter(ctx, q, userCred, query.RegionalFilterListInput)
if err != nil {
return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.ListItemFilter")
}
return q, nil
}
@@ -122,6 +127,10 @@ func (man *SModelartsPoolSkuManager) OrderByExtraFields(
if err != nil {
return nil, errors.Wrap(err, "SManagedResourceBaseManager.OrderByExtraFields")
}
q, err = man.SCloudregionResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.RegionalFilterListInput)
if err != nil {
return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.OrderByExtraFields")
}
return q, nil
}
@@ -148,11 +157,13 @@ func (manager *SModelartsPoolSkuManager) FetchCustomizeColumns(
rows := make([]api.ModelartsPoolSkuDetails, len(objs))
enabledRows := manager.SEnabledStatusStandaloneResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
manRows := manager.SManagedResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
regRows := manager.SCloudregionResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
for i := range rows {
rows[i] = api.ModelartsPoolSkuDetails{
EnabledStatusStandaloneResourceDetails: enabledRows[i],
ManagedResourceInfo: manRows[i],
CloudregionResourceInfo: regRows[i],
}
}
@@ -179,8 +190,11 @@ func (manager *SModelartsPoolSkuManager) ListItemExportKeys(ctx context.Context,
return q, nil
}
func (self *SCloudprovider) GetModelartsPoolSkus() ([]SModelartsPoolSku, error) {
q := ModelartsPoolSkuManager.Query()
func (self *SCloudregion) GetModelartsPoolSkus(managerId string) ([]SModelartsPoolSku, error) {
q := ModelartsPoolSkuManager.Query().Equals("cloudregion_id", self.Id)
if len(managerId) > 0 {
q = q.Equals("manager_id", managerId)
}
ret := []SModelartsPoolSku{}
err := db.FetchModelObjects(ModelartsPoolSkuManager, q, &ret)
if err != nil {
@@ -189,12 +203,12 @@ func (self *SCloudprovider) GetModelartsPoolSkus() ([]SModelartsPoolSku, error)
return ret, nil
}
func (self *SCloudprovider) SyncModelartsPoolSkus(ctx context.Context, userCred mcclient.TokenCredential, exts []cloudprovider.ICloudModelartsPoolSku) compare.SyncResult {
func (self *SCloudregion) SyncModelartsPoolSkus(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, exts []cloudprovider.ICloudModelartsPoolSku) compare.SyncResult {
// 加锁防止重入
lockman.LockRawObject(ctx, self.Provider, "modelarts-pool-sku")
defer lockman.ReleaseRawObject(ctx, self.Provider, "modelarts-pool-sku")
result := compare.SyncResult{}
dbPoolSku, err := self.GetModelartsPoolSkus()
dbPoolSku, err := self.GetModelartsPoolSkus(provider.Id)
if err != nil {
result.Error(err)
return result
@@ -233,7 +247,7 @@ func (self *SCloudprovider) SyncModelartsPoolSkus(ctx context.Context, userCred
// 创建本地没有的云上资源
for i := 0; i < len(added); i++ {
err := self.newFromCloudModelartsPoolSku(ctx, userCred, added[i])
err := self.newFromCloudModelartsPoolSku(ctx, userCred, provider, added[i])
if err != nil {
result.AddError(err)
continue
@@ -262,9 +276,10 @@ func (self *SModelartsPoolSku) syncWithCloudSku(ctx context.Context, userCred mc
return err
}
func (self *SCloudprovider) newFromCloudModelartsPoolSku(ctx context.Context, userCred mcclient.TokenCredential, isku cloudprovider.ICloudModelartsPoolSku) error {
func (self *SCloudregion) newFromCloudModelartsPoolSku(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, isku cloudprovider.ICloudModelartsPoolSku) error {
sku := SModelartsPoolSku{}
sku.SetModelManager(ModelartsPoolSkuManager, &sku)
sku.CloudregionId = self.Id
sku.Name = isku.GetName()
sku.CpuCount = isku.GetCpuCoreCount()
sku.CpuArch = isku.GetCpuArch()
@@ -277,17 +292,6 @@ func (self *SCloudprovider) newFromCloudModelartsPoolSku(ctx context.Context, us
sku.NpuType = isku.GetNpuType()
sku.NpuSize = isku.GetNpuSize()
sku.ExternalId = isku.GetGlobalId()
sku.ManagerId = provider.Id
return ModelartsPoolSkuManager.TableSpec().Insert(ctx, &sku)
}
func syncModelartsPoolSku(ctx context.Context, userCred mcclient.TokenCredential, syncResults SSyncResultSet, provider *SCloudprovider, driver cloudprovider.ICloudProvider) error {
ipools, err := driver.GetIModelartsPoolSku()
if err != nil {
msg := fmt.Sprintf("GetIModelartsPoolsSku for provider %s failed %s", err, ipools)
log.Errorf(msg)
return err
}
result := provider.SyncModelartsPoolSkus(ctx, userCred, ipools)
log.Infof("SyncModelartsPools for region %s result: %s", provider.GetName(), result.Result())
return nil
}
+48 -23
View File
@@ -20,6 +20,7 @@ import (
"time"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/pkg/errors"
"yunion.io/x/pkg/util/compare"
"yunion.io/x/sqlchemy"
@@ -41,6 +42,7 @@ type SModelartsPoolManager struct {
db.SExternalizedResourceBaseManager
SDeletePreventableResourceBaseManager
SCloudregionResourceBaseManager
SManagedResourceBaseManager
}
@@ -64,6 +66,7 @@ type SModelartsPool struct {
SManagedResourceBase
SBillingResourceBase
SCloudregionResourceBase
SDeletePreventableResourceBase
InstanceType string `width:"72" charset:"ascii" nullable:"true" list:"user" update:"user" create:"optional"`
@@ -73,7 +76,7 @@ type SModelartsPool struct {
}
func (manager *SModelartsPoolManager) GetContextManagers() [][]db.IModelManager {
return [][]db.IModelManager{}
return [][]db.IModelManager{{CloudregionManager}}
}
// Pool实例列表
@@ -100,7 +103,10 @@ func (man *SModelartsPoolManager) ListItemFilter(
if err != nil {
return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter")
}
q, err = man.SCloudregionResourceBaseManager.ListItemFilter(ctx, q, userCred, query.RegionalFilterListInput)
if err != nil {
return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.ListItemFilter")
}
return q, nil
}
@@ -114,6 +120,10 @@ func (man *SModelartsPoolManager) OrderByExtraFields(
if err != nil {
return nil, errors.Wrap(err, "SVirtualResourceBaseManager.OrderByExtraFields")
}
q, err = man.SCloudregionResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.RegionalFilterListInput)
if err != nil {
return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.OrderByExtraFields")
}
q, err = man.SManagedResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.ManagedResourceListInput)
if err != nil {
return nil, errors.Wrap(err, "SManagedResourceBaseManager.OrderByExtraFields")
@@ -126,6 +136,10 @@ func (man *SModelartsPoolManager) QueryDistinctExtraField(q *sqlchemy.SQuery, fi
if err == nil {
return q, nil
}
q, err = man.SCloudregionResourceBaseManager.QueryDistinctExtraField(q, field)
if err == nil {
return q, nil
}
q, err = man.SManagedResourceBaseManager.QueryDistinctExtraField(q, field)
if err == nil {
return q, nil
@@ -148,11 +162,13 @@ func (manager *SModelartsPoolManager) FetchCustomizeColumns(
rows := make([]api.ModelartsPoolDetails, len(objs))
virtRows := manager.SVirtualResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
manRows := manager.SManagedResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
regRows := manager.SCloudregionResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
for i := range rows {
rows[i] = api.ModelartsPoolDetails{
VirtualResourceDetails: virtRows[i],
ManagedResourceInfo: manRows[i],
VirtualResourceDetails: virtRows[i],
ManagedResourceInfo: manRows[i],
CloudregionResourceInfo: regRows[i],
}
}
@@ -176,8 +192,11 @@ func (manager *SModelartsPoolManager) ListItemExportKeys(ctx context.Context,
}
return q, nil
}
func (self *SCloudprovider) GetPools() ([]SModelartsPool, error) {
q := ModelartsPoolManager.Query().Equals("manager_id", self.Id)
func (self *SCloudregion) GetPools(managerId string) ([]SModelartsPool, error) {
q := ModelartsPoolManager.Query().Equals("cloudregion_id", self.Id)
if len(managerId) > 0 {
q = q.Equals("manager_id", managerId)
}
ret := []SModelartsPool{}
err := db.FetchModelObjects(ModelartsPoolManager, q, &ret)
if err != nil {
@@ -186,12 +205,12 @@ func (self *SCloudprovider) GetPools() ([]SModelartsPool, error) {
return ret, nil
}
func (self *SCloudprovider) SyncModelartsPools(ctx context.Context, userCred mcclient.TokenCredential, exts []cloudprovider.ICloudModelartsPool) compare.SyncResult {
func (self *SCloudregion) SyncModelartsPools(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, exts []cloudprovider.ICloudModelartsPool) compare.SyncResult {
// 加锁防止重入
lockman.LockRawObject(ctx, ModelartsPoolManager.KeywordPlural(), fmt.Sprintf("%s", self.Id))
defer lockman.ReleaseRawObject(ctx, ModelartsPoolManager.KeywordPlural(), fmt.Sprintf("%s", self.Id))
lockman.LockRawObject(ctx, ModelartsPoolManager.KeywordPlural(), fmt.Sprintf("%s-%s", provider.Id, self.Id))
defer lockman.ReleaseRawObject(ctx, ModelartsPoolManager.KeywordPlural(), fmt.Sprintf("%s-%s", provider.Id, self.Id))
result := compare.SyncResult{}
dbPools, err := self.GetPools()
dbPools, err := self.GetPools(provider.Id)
if err != nil {
result.Error(err)
return result
@@ -230,7 +249,7 @@ func (self *SCloudprovider) SyncModelartsPools(ctx context.Context, userCred mcc
// 创建本地没有的云上资源
for i := 0; i < len(added); i++ {
_, err := self.newFromCloudModelartsPool(ctx, userCred, self, added[i])
_, err := self.newFromCloudModelartsPool(ctx, userCred, provider, added[i])
if err != nil {
result.AddError(err)
continue
@@ -241,7 +260,8 @@ func (self *SCloudprovider) SyncModelartsPools(ctx context.Context, userCred mcc
}
// 判断资源是否可以删除
func (self *SModelartsPool) ValidateDeleteCondition(ctx context.Context) error {
func (self *SModelartsPool) ValidateDeleteCondition(ctx context.Context, info jsonutils.JSONObject) error {
log.Errorln("this is IN Validata")
if self.DisableDelete.IsTrue() {
return httperrors.NewInvalidStatusError("ModelartsPool is locked, cannot delete")
}
@@ -313,14 +333,6 @@ func (self *SModelartsPool) CustomizeDelete(ctx context.Context, userCred mcclie
return self.StartDeleteTask(ctx, userCred, "")
}
func (self *SModelartsPool) GetICloudModelartsPool(ctx context.Context) (cloudprovider.ICloudModelartsPool, error) {
iProvider, err := self.GetDriver(ctx)
if err != nil {
return nil, errors.Wrap(err, "self.GetDriver")
}
return iProvider.GetIModelartsPoolById(self.ExternalId)
}
func (self *SModelartsPool) StartDeleteTask(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error {
task, err := taskman.TaskManager.NewTask(ctx, "ModelartsPoolDeleteTask", self, userCred, nil, parentTaskId, "", nil)
if err != nil {
@@ -331,16 +343,28 @@ func (self *SModelartsPool) StartDeleteTask(ctx context.Context, userCred mcclie
return nil
}
func (self *SModelartsPool) GetIRegion() (cloudprovider.ICloudRegion, error) {
region, err := self.GetRegion()
if err != nil {
return nil, errors.Wrapf(err, "GetRegion")
}
provider, err := self.GetDriver(context.Background())
if err != nil {
return nil, errors.Wrap(err, "self.GetDriver")
}
return provider.GetIRegionById(region.GetExternalId())
}
// 获取云上对应的资源
func (self *SModelartsPool) GetIModelartsPool() (cloudprovider.ICloudModelartsPool, error) {
if len(self.ExternalId) == 0 {
return nil, errors.Wrapf(cloudprovider.ErrNotFound, "empty externalId")
}
iProvider, err := self.GetDriver(context.Background())
iRegion, err := self.GetIRegion()
if err != nil {
return nil, errors.Wrap(err, "self.GetDriver")
}
return iProvider.GetIModelartsPoolById(self.ExternalId)
return iRegion.GetIModelartsPoolById(self.ExternalId)
}
// 同步资源属性
@@ -374,11 +398,12 @@ func (self *SModelartsPool) SyncWithCloudModelartsPool(ctx context.Context, user
return nil
}
func (self *SCloudprovider) newFromCloudModelartsPool(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, ext cloudprovider.ICloudModelartsPool) (*SModelartsPool, error) {
func (self *SCloudregion) newFromCloudModelartsPool(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, ext cloudprovider.ICloudModelartsPool) (*SModelartsPool, error) {
pool := SModelartsPool{}
pool.SetModelManager(ModelartsPoolManager, &pool)
pool.ExternalId = ext.GetGlobalId()
pool.CloudregionId = self.Id
pool.ManagerId = provider.Id
pool.IsEmulated = ext.IsEmulated()
pool.Status = ext.GetStatus()
@@ -52,13 +52,13 @@ func (self *ModelartsPoolCreateTask) OnInit(ctx context.Context, obj db.IStandal
InstanceType: pool.InstanceType,
WorkType: pool.WorkType,
}
iProvider, err := pool.GetDriver(ctx)
iRegion, err := pool.GetIRegion()
if err != nil {
self.taskFailed(ctx, pool, errors.Wrapf(err, "pool.GetDriver"))
return
}
ipool, err := iProvider.CreateIModelartsPool(opts)
ipool, err := iRegion.CreateIModelartsPool(opts)
if err != nil {
self.taskFailed(ctx, pool, errors.Wrapf(err, "iProvider.CreateIModelartsPool"))
return