From 60a3de9d7376223879ecce9456199acf215c25ab Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 10 Apr 2020 01:29:34 +0800 Subject: [PATCH] feature: make bucket sharable virtual resource --- pkg/apis/compute/bucket.go | 8 ++-- pkg/compute/models/buckets.go | 70 +++++++++++++++-------------------- 2 files changed, 34 insertions(+), 44 deletions(-) diff --git a/pkg/apis/compute/bucket.go b/pkg/apis/compute/bucket.go index b6a5fd1c4f..a1d0502385 100644 --- a/pkg/apis/compute/bucket.go +++ b/pkg/apis/compute/bucket.go @@ -43,7 +43,7 @@ const ( ) type BucketCreateInput struct { - apis.VirtualResourceCreateInput + apis.SharableVirtualResourceCreateInput CloudregionResourceInput CloudproviderResourceInput @@ -51,7 +51,7 @@ type BucketCreateInput struct { } type BucketDetails struct { - apis.VirtualResourceDetails + apis.SharableVirtualResourceDetails ManagedResourceInfo CloudregionResourceInfo @@ -98,7 +98,7 @@ func (input *BucketMetadataInput) Validate() error { } type BucketListInput struct { - apis.VirtualResourceListInput + apis.SharableVirtualResourceListInput apis.ExternalizedResourceBaseListInput ManagedResourceListInput @@ -118,5 +118,5 @@ type BucketSyncstatusInput struct { } type BucketUpdateInput struct { - apis.VirtualResourceBaseUpdateInput + apis.SharableVirtualResourceBaseUpdateInput } diff --git a/pkg/compute/models/buckets.go b/pkg/compute/models/buckets.go index 0f2fbe2f15..50190391f2 100644 --- a/pkg/compute/models/buckets.go +++ b/pkg/compute/models/buckets.go @@ -36,7 +36,6 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/db/quotas" "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/compute/options" "yunion.io/x/onecloud/pkg/httperrors" @@ -49,7 +48,7 @@ import ( ) type SBucketManager struct { - db.SVirtualResourceBaseManager + db.SSharableVirtualResourceBaseManager db.SExternalizedResourceBaseManager SCloudregionResourceBaseManager SManagedResourceBaseManager @@ -59,7 +58,7 @@ var BucketManager *SBucketManager func init() { BucketManager = &SBucketManager{ - SVirtualResourceBaseManager: db.NewVirtualResourceBaseManager( + SSharableVirtualResourceBaseManager: db.NewSharableVirtualResourceBaseManager( SBucket{}, "buckets_tbl", "bucket", @@ -70,7 +69,7 @@ func init() { } type SBucket struct { - db.SVirtualResourceBase + db.SSharableVirtualResourceBase db.SExternalizedResourceBase SCloudregionResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` SManagedResourceBase @@ -95,7 +94,7 @@ func (manager *SBucketManager) SetHandlerProcessTimeout(info *appsrv.SHandlerInf log.Debugf("upload object, set process timeout to 2 hour!!!") return 2 * time.Hour } - return manager.SVirtualResourceBaseManager.SetHandlerProcessTimeout(info, r) + return manager.SSharableVirtualResourceBaseManager.SetHandlerProcessTimeout(info, r) } func (manager *SBucketManager) fetchBuckets(provider *SCloudprovider, region *SCloudregion) ([]SBucket, error) { @@ -233,7 +232,7 @@ func (bucket *SBucket) getStats() cloudprovider.SBucketStats { } func (bucket *SBucket) GetShortDesc(ctx context.Context) *jsonutils.JSONDict { - desc := bucket.SVirtualResourceBase.GetShortDesc(ctx) + desc := bucket.SSharableVirtualResourceBase.GetShortDesc(ctx) desc.Add(jsonutils.NewInt(bucket.SizeBytes), "size_bytes") desc.Add(jsonutils.NewInt(int64(bucket.ObjectCnt)), "object_cnt") @@ -318,7 +317,7 @@ func (bucket *SBucket) Delete(ctx context.Context, userCred mcclient.TokenCreden } func (bucket *SBucket) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error { - return bucket.SVirtualResourceBase.Delete(ctx, userCred) + return bucket.SSharableVirtualResourceBase.Delete(ctx, userCred) } func (bucket *SBucket) RemoteDelete(ctx context.Context, userCred mcclient.TokenCredential) error { @@ -398,23 +397,16 @@ func (manager *SBucketManager) ValidateCreateData( query jsonutils.JSONObject, input api.BucketCreateInput, ) (api.BucketCreateInput, error) { - data := input.JSON(input) - - cloudRegionV := validators.NewModelIdOrNameValidator("cloudregion", CloudregionManager.Keyword(), ownerId) - managerV := validators.NewModelIdOrNameValidator("manager", CloudproviderManager.Keyword(), ownerId) - for _, v := range []validators.IValidator{ - cloudRegionV, - managerV, - } { - err := v.Validate(data) - if err != nil { - return input, err - } - } - - err := data.Unmarshal(&input) + var err error + var cloudRegionV *SCloudregion + cloudRegionV, input.CloudregionResourceInput, err = ValidateCloudregionResourceInput(userCred, input.CloudregionResourceInput) if err != nil { - return input, httperrors.NewInternalServerError("unmarshal input fail %s", err) + return input, errors.Wrap(err, "ValidateCloudregionResourceInput") + } + var managerV *SCloudprovider + managerV, input.CloudproviderResourceInput, err = ValidateCloudproviderResourceInput(userCred, input.CloudproviderResourceInput) + if err != nil { + return input, errors.Wrap(err, "ValidateCloudproviderResourceInput") } if len(input.Name) == 0 { @@ -425,18 +417,16 @@ func (manager *SBucketManager) ValidateCreateData( return input, httperrors.NewInputParameterError("invalid bucket name %s: %s", input.Name, err) } - quotaKeys := fetchRegionalQuotaKeys(rbacutils.ScopeProject, ownerId, - cloudRegionV.Model.(*SCloudregion), - managerV.Model.(*SCloudprovider)) + quotaKeys := fetchRegionalQuotaKeys(rbacutils.ScopeProject, ownerId, cloudRegionV, managerV) pendingUsage := SRegionQuota{Bucket: 1} pendingUsage.SetKeys(quotaKeys) if err := quotas.CheckSetPendingQuota(ctx, userCred, &pendingUsage); err != nil { return input, httperrors.NewOutOfQuotaError("%s", err) } - input.VirtualResourceCreateInput, err = manager.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input.VirtualResourceCreateInput) + input.SharableVirtualResourceCreateInput, err = manager.SSharableVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input.SharableVirtualResourceCreateInput) if err != nil { - return input, err + return input, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ValidateCreateData") } return input, nil } @@ -495,9 +485,9 @@ func (bucket *SBucket) ValidateUpdateData( return input, httperrors.NewInputParameterError("invalid bucket name(%s): %s", input.Name, err) } } - input.VirtualResourceBaseUpdateInput, err = bucket.SVirtualResourceBase.ValidateUpdateData(ctx, userCred, query, input.VirtualResourceBaseUpdateInput) + input.SharableVirtualResourceBaseUpdateInput, err = bucket.SSharableVirtualResourceBase.ValidateUpdateData(ctx, userCred, query, input.SharableVirtualResourceBaseUpdateInput) if err != nil { - return input, errors.Wrap(err, "SVirtualResourceBase.ValidateUpdateData") + return input, errors.Wrap(err, "SSharableVirtualResourceBase.ValidateUpdateData") } return input, nil } @@ -539,14 +529,14 @@ func (manager *SBucketManager) FetchCustomizeColumns( isList bool, ) []api.BucketDetails { rows := make([]api.BucketDetails, len(objs)) - virtRows := manager.SVirtualResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) + virtRows := manager.SSharableVirtualResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) managerRows := manager.SManagedResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) regionRows := manager.SCloudregionResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList) for i := range rows { rows[i] = api.BucketDetails{ - VirtualResourceDetails: virtRows[i], - ManagedResourceInfo: managerRows[i], - CloudregionResourceInfo: regionRows[i], + SharableVirtualResourceDetails: virtRows[i], + ManagedResourceInfo: managerRows[i], + CloudregionResourceInfo: regionRows[i], } rows[i] = objs[i].(*SBucket).getMoreDetails(rows[i]) } @@ -616,9 +606,9 @@ func (manager *SBucketManager) ListItemFilter( return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") } - q, err = manager.SVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.VirtualResourceListInput) + q, err = manager.SSharableVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, query.SharableVirtualResourceListInput) if err != nil { - return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemFilter") + return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ListItemFilter") } if len(query.StorageClass) > 0 { @@ -636,7 +626,7 @@ func (manager *SBucketManager) ListItemFilter( func (manager *SBucketManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) { var err error - q, err = manager.SVirtualResourceBaseManager.QueryDistinctExtraField(q, field) + q, err = manager.SSharableVirtualResourceBaseManager.QueryDistinctExtraField(q, field) if err == nil { return q, nil } @@ -669,9 +659,9 @@ func (manager *SBucketManager) OrderByExtraFields( return nil, errors.Wrap(err, "SManagedResourceBaseManager.OrderByExtraFields") } - q, err = manager.SVirtualResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.VirtualResourceListInput) + q, err = manager.SSharableVirtualResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.SharableVirtualResourceListInput) if err != nil { - return nil, errors.Wrap(err, "SVirtualResourceBaseManager.OrderByExtraFields") + return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.OrderByExtraFields") } return q, nil @@ -1145,7 +1135,7 @@ func (bucket *SBucket) PerformSync( } func (bucket *SBucket) ValidatePurgeCondition(ctx context.Context) error { - return bucket.SVirtualResourceBase.ValidateDeleteCondition(ctx) + return bucket.SSharableVirtualResourceBase.ValidateDeleteCondition(ctx) } func (bucket *SBucket) ValidateDeleteCondition(ctx context.Context) error {