From a31ed4d14b54ea5c7be0cdec2026dc3c34110f11 Mon Sep 17 00:00:00 2001 From: mhf Date: Fri, 16 Sep 2022 17:31:43 +0800 Subject: [PATCH] fix modelarts create bug --- pkg/apis/compute/modelarts_pool.go | 5 ++- pkg/cloudcommon/validators/validators.go | 4 +++ pkg/cloudmon/resources/resources.go | 2 +- pkg/cloudprovider/metrics.go | 2 +- pkg/compute/models/modelarts_pools.go | 31 ++++++++++++++++--- .../tasks/modelarts_pool_create_task.go | 10 +++--- .../options/compute/modelarts_pool.go | 2 ++ pkg/multicloud/huawei/modelarts_pool.go | 2 +- pkg/multicloud/huawei/provider/provider.go | 8 +++++ 9 files changed, 52 insertions(+), 14 deletions(-) diff --git a/pkg/apis/compute/modelarts_pool.go b/pkg/apis/compute/modelarts_pool.go index fdaae29c02..33b7743e92 100644 --- a/pkg/apis/compute/modelarts_pool.go +++ b/pkg/apis/compute/modelarts_pool.go @@ -28,7 +28,10 @@ const ( ) type ModelartsPoolCreateInput struct { - apis.StatusInfrasResourceBaseCreateInput + apis.VirtualResourceCreateInput + DeletePreventableCreateInput + + CloudregionResourceInput CloudproviderResourceInput } diff --git a/pkg/cloudcommon/validators/validators.go b/pkg/cloudcommon/validators/validators.go index 76c6f1edaa..4a47ab0ca0 100644 --- a/pkg/cloudcommon/validators/validators.go +++ b/pkg/cloudcommon/validators/validators.go @@ -828,6 +828,10 @@ func NewIPv4AddrValidator(key string) *ValidatorIPv4Addr { } var ValidateModel = func(userCred mcclient.TokenCredential, manager db.IStandaloneModelManager, id *string) (db.IModel, error) { + if len(*id) == 0 { + return nil, httperrors.NewMissingParameterError(manager.Keyword()) + } + model, err := manager.FetchByIdOrName(userCred, *id) if err != nil { if errors.Cause(err) == sql.ErrNoRows { diff --git a/pkg/cloudmon/resources/resources.go b/pkg/cloudmon/resources/resources.go index 5384d94c02..28cf5bbb9b 100644 --- a/pkg/cloudmon/resources/resources.go +++ b/pkg/cloudmon/resources/resources.go @@ -689,7 +689,7 @@ func (self *SResources) CollectMetrics(ctx context.Context, userCred mcclient.To jsonutils.Update(&pools, resources) err = driver.CollectModelartsPoolMetrics(ctx, manager, provider, pools, startTime, endTime) if err != nil && errors.Cause(err) != cloudprovider.ErrNotImplemented && errors.Cause(err) != cloudprovider.ErrNotSupported { - log.Errorf("CollectK8sMetrics for %s(%s) error: %v", manager.Name, manager.Provider, err) + log.Errorf("CollectModelartsPoolMetrics for %s(%s) error: %v", manager.Name, manager.Provider, err) } }(cloudproviders[i]) } diff --git a/pkg/cloudprovider/metrics.go b/pkg/cloudprovider/metrics.go index 872c75fc58..fa247ee363 100644 --- a/pkg/cloudprovider/metrics.go +++ b/pkg/cloudprovider/metrics.go @@ -53,7 +53,7 @@ const ( METRIC_RESOURCE_TYPE_K8S TResourceType = "k8s" METRIC_RESOURCE_TYPE_STORAGE TResourceType = "storage" METRIC_RESOURCE_TYPE_CLOUD_ACCOUNT TResourceType = "cloudaccount_balance" - METRIC_RESOURCE_TYPE_MODELARTS_POOL TResourceType = "modelarts_pool" + METRIC_RESOURCE_TYPE_MODELARTS_POOL TResourceType = "modelarts" ) const ( diff --git a/pkg/compute/models/modelarts_pools.go b/pkg/compute/models/modelarts_pools.go index 48a3fdd65e..2ff7106bb8 100644 --- a/pkg/compute/models/modelarts_pools.go +++ b/pkg/compute/models/modelarts_pools.go @@ -30,6 +30,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" + "yunion.io/x/onecloud/pkg/cloudcommon/validators" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" @@ -148,6 +149,22 @@ func (man *SModelartsPoolManager) QueryDistinctExtraField(q *sqlchemy.SQuery, fi } func (man *SModelartsPoolManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, input api.ModelartsPoolCreateInput) (api.ModelartsPoolCreateInput, error) { + var err error + _, err = validators.ValidateModel(userCred, CloudproviderManager, &input.CloudproviderId) + if err != nil { + return input, err + } + input.ManagerId = input.CloudproviderId + + _, err = validators.ValidateModel(userCred, CloudregionManager, &input.CloudregionId) + if err != nil { + return input, err + } + + input.VirtualResourceCreateInput, err = man.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input.VirtualResourceCreateInput) + if err != nil { + return input, err + } return input, nil } @@ -344,15 +361,19 @@ func (self *SModelartsPool) StartDeleteTask(ctx context.Context, userCred mcclie } 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()) + region, err := self.GetRegion() + if err != nil { + return nil, errors.Wrapf(err, "GetRegion") + } + iRegion, err := provider.GetIRegionById(region.ExternalId) + if err != nil { + return nil, errors.Wrapf(err, "provider.GetIRegionById") + } + return iRegion, nil } // 获取云上对应的资源 diff --git a/pkg/compute/tasks/modelarts_pool_create_task.go b/pkg/compute/tasks/modelarts_pool_create_task.go index 9335c0249e..6e4f35632c 100644 --- a/pkg/compute/tasks/modelarts_pool_create_task.go +++ b/pkg/compute/tasks/modelarts_pool_create_task.go @@ -46,17 +46,17 @@ func (self *ModelartsPoolCreateTask) taskFailed(ctx context.Context, pool *model func (self *ModelartsPoolCreateTask) OnInit(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) { pool := obj.(*models.SModelartsPool) + iRegion, err := pool.GetIRegion() + if err != nil { + self.taskFailed(ctx, pool, errors.Wrapf(err, "pool.GetIRegion")) + return + } opts := &cloudprovider.ModelartsPoolCreateOption{ Name: pool.Name, InstanceType: pool.InstanceType, WorkType: pool.WorkType, } - iRegion, err := pool.GetIRegion() - if err != nil { - self.taskFailed(ctx, pool, errors.Wrapf(err, "pool.GetDriver")) - return - } ipool, err := iRegion.CreateIModelartsPool(opts) if err != nil { diff --git a/pkg/mcclient/options/compute/modelarts_pool.go b/pkg/mcclient/options/compute/modelarts_pool.go index 17e4488037..e6b9395a49 100644 --- a/pkg/mcclient/options/compute/modelarts_pool.go +++ b/pkg/mcclient/options/compute/modelarts_pool.go @@ -46,6 +46,8 @@ type ModelartsPoolCreateOption struct { InstanceType string `help:"Instance Type"` WorkType string `help:"Work Type"` CpuArch string `help:"Cpu Arch"` + + CloudregionId string `help:"Cloud Region ID"` } func (opts *ModelartsPoolCreateOption) Params() (jsonutils.JSONObject, error) { diff --git a/pkg/multicloud/huawei/modelarts_pool.go b/pkg/multicloud/huawei/modelarts_pool.go index 54e869bb72..8b65ee8f96 100644 --- a/pkg/multicloud/huawei/modelarts_pool.go +++ b/pkg/multicloud/huawei/modelarts_pool.go @@ -153,7 +153,7 @@ func (self *SRegion) CreateIModelartsPool(args *cloudprovider.ModelartsPoolCreat } obj, err := self.client.modelartsPoolCreate("pools", params) if err != nil { - return nil, errors.Wrap(err, "SHuaweiClient.GetPools") + return nil, errors.Wrap(err, "SHuaweiClient.CreatePools") } pool := &SModelartsPool{} obj.Unmarshal(&pool) diff --git a/pkg/multicloud/huawei/provider/provider.go b/pkg/multicloud/huawei/provider/provider.go index 951873ea56..0a2e40c2bd 100644 --- a/pkg/multicloud/huawei/provider/provider.go +++ b/pkg/multicloud/huawei/provider/provider.go @@ -304,3 +304,11 @@ func (self *SHuaweiProvider) CreateICloudSAMLProvider(opts *cloudprovider.SAMLPr } return sp, nil } + +func (self *SHuaweiProvider) GetMetrics(opts *cloudprovider.MetricListOptions) ([]cloudprovider.MetricValues, error) { + metrics, err := self.client.GetMetrics(opts) + if err != nil { + return nil, errors.Wrapf(err, "GetMetrics") + } + return metrics, nil +}