From b4dd9943fe1b32840d4b291016e6de686d7a99eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Mon, 21 Aug 2023 15:11:28 +0800 Subject: [PATCH] fix: external project priority (#17811) --- cmd/climc/shell/compute/external_projects.go | 1 + go.mod | 2 +- go.sum | 4 ++-- pkg/cloudcommon/db/interface.go | 2 ++ pkg/cloudcommon/db/virtualresource.go | 9 +++++++++ pkg/compute/models/cloudproviders.go | 2 +- pkg/compute/models/cloudsync.go | 2 ++ pkg/compute/models/external_projects.go | 4 +++- pkg/mcclient/options/compute/external_projects.go | 9 +++++++++ vendor/modules.txt | 2 +- .../x/cloudmux/pkg/multicloud/qcloud/project.go | 2 +- 11 files changed, 32 insertions(+), 7 deletions(-) diff --git a/cmd/climc/shell/compute/external_projects.go b/cmd/climc/shell/compute/external_projects.go index 6a766009a9..08aeb5638c 100644 --- a/cmd/climc/shell/compute/external_projects.go +++ b/cmd/climc/shell/compute/external_projects.go @@ -25,6 +25,7 @@ func init() { cmd := shell.NewResourceCmd(&compute.ExternalProjects).WithKeyword("external-project") cmd.List(&opts.ExternalProjectListOptions{}) cmd.Create(&opts.ExternalProjectCreateOptions{}) + cmd.Update(&opts.ExternalProjectUpdateOptions{}) cmd.Show(&options.BaseIdOptions{}) cmd.Perform("change-project", &opts.ExterProjectChagneProjectOptions{}) } diff --git a/go.mod b/go.mod index e31e2e0a96..518bbee820 100644 --- a/go.mod +++ b/go.mod @@ -83,7 +83,7 @@ require ( k8s.io/client-go v0.19.3 k8s.io/cluster-bootstrap v0.19.3 moul.io/http2curl/v2 v2.3.0 - yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230818091626-4820b3349fb8 + yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230821061444-8327b119ec8b yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 yunion.io/x/jsonutils v1.0.1-0.20230613121553-0f3b41e2ef19 yunion.io/x/log v1.0.1-0.20230411060016-feb3f46ab361 diff --git a/go.sum b/go.sum index b36ca14e0e..93e8ccb527 100644 --- a/go.sum +++ b/go.sum @@ -1174,8 +1174,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230818091626-4820b3349fb8 h1:bF/xadUoM/W2OZeds2vkyklKpddclHdmkx1F2s80k3E= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230818091626-4820b3349fb8/go.mod h1:2sgCN7nRPQL3woLfdgqLDd92vwAHqtlz3KKiHxC5BAw= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230821061444-8327b119ec8b h1:G4lU+QiTb3C5TeZ9nuSujP9lnvyadqj2EdO5CIIhH4w= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230821061444-8327b119ec8b/go.mod h1:2sgCN7nRPQL3woLfdgqLDd92vwAHqtlz3KKiHxC5BAw= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 h1:v7POYkQwo1XzOxBoIoRVr/k0V9Y5JyjpshlIFa9raug= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= diff --git a/pkg/cloudcommon/db/interface.go b/pkg/cloudcommon/db/interface.go index cef657c8d0..9c0ff1b990 100644 --- a/pkg/cloudcommon/db/interface.go +++ b/pkg/cloudcommon/db/interface.go @@ -24,6 +24,7 @@ import ( "yunion.io/x/pkg/util/rbacscope" "yunion.io/x/sqlchemy" + "yunion.io/x/onecloud/pkg/apis" "yunion.io/x/onecloud/pkg/appsrv" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/mcclient" @@ -365,6 +366,7 @@ type IVirtualModel interface { IsOwner(userCred mcclient.TokenCredential) bool // IsAdmin(userCred mcclient.TokenCredential) bool + SetProjectSrc(apis.TOwnerSource) SyncCloudProjectId(userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider) GetIVirtualModel() IVirtualModel diff --git a/pkg/cloudcommon/db/virtualresource.go b/pkg/cloudcommon/db/virtualresource.go index ea8443072c..d6ef253e9b 100644 --- a/pkg/cloudcommon/db/virtualresource.go +++ b/pkg/cloudcommon/db/virtualresource.go @@ -532,6 +532,15 @@ func (model *SVirtualResourceBase) GetShortDesc(ctx context.Context) *jsonutils. return desc } +func (model *SVirtualResourceBase) SetProjectSrc(src apis.TOwnerSource) { + if model.ProjectSrc != string(src) { + Update(model, func() error { + model.ProjectSrc = string(apis.OWNER_SOURCE_CLOUD) + return nil + }) + } +} + func (model *SVirtualResourceBase) SyncCloudProjectId(userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider) { if model.ProjectSrc != string(apis.OWNER_SOURCE_LOCAL) && ownerId != nil && len(ownerId.GetProjectId()) > 0 { diff, _ := Update(model, func() error { diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index a8bbe8a085..26135b4aad 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -1921,7 +1921,7 @@ func (self *SCloudprovider) GetExternalProjectsByProjectIdOrName(projectId, name sqlchemy.Equals(q.Field("name"), name), sqlchemy.Equals(q.Field("tenant_id"), projectId), ), - ) + ).Desc("priority") err := db.FetchModelObjects(ExternalProjectManager, q, &projects) if err != nil { return nil, errors.Wrap(err, "db.FetchModelObjects") diff --git a/pkg/compute/models/cloudsync.go b/pkg/compute/models/cloudsync.go index 36e7fcb31b..1ce6b93539 100644 --- a/pkg/compute/models/cloudsync.go +++ b/pkg/compute/models/cloudsync.go @@ -26,6 +26,7 @@ import ( "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" + "yunion.io/x/onecloud/pkg/apis" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" @@ -2410,6 +2411,7 @@ func SyncCloudProject(ctx context.Context, userCred mcclient.TokenCredential, mo return nil, errors.Wrapf(err, "GetCloudaccount") } if rm != nil && rm.Enabled.Bool() && rm.IsNeedResourceSync() { + model.SetProjectSrc(apis.OWNER_SOURCE_CLOUD) extTags, err := extModel.GetTags() if err != nil { return nil, errors.Wrapf(err, "extModel.GetTags") diff --git a/pkg/compute/models/external_projects.go b/pkg/compute/models/external_projects.go index a7c83463c8..d06f83fe1e 100644 --- a/pkg/compute/models/external_projects.go +++ b/pkg/compute/models/external_projects.go @@ -68,7 +68,9 @@ type SExternalProject struct { db.SVirtualResourceBase db.SExternalizedResourceBase SManagedResourceBase - + // 优先级,同一个本地项目映射多个云上项目,优先级高的优先选择 + // 数值越高,优先级越大 + Priority int `default:"0" list:"user" update:"user" list:"user"` ExternalDomainId string `width:"36" charset:"ascii" nullable:"true" list:"user"` // 归属云账号ID CloudaccountId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"` diff --git a/pkg/mcclient/options/compute/external_projects.go b/pkg/mcclient/options/compute/external_projects.go index 75e1c6af04..ee3e9ff5ca 100644 --- a/pkg/mcclient/options/compute/external_projects.go +++ b/pkg/mcclient/options/compute/external_projects.go @@ -59,3 +59,12 @@ type ExternalProjectCreateOptions struct { func (opts *ExternalProjectCreateOptions) Params() (jsonutils.JSONObject, error) { return jsonutils.Marshal(opts), nil } + +type ExternalProjectUpdateOptions struct { + options.BaseUpdateOptions + Priority *int +} + +func (opts *ExternalProjectUpdateOptions) Params() (jsonutils.JSONObject, error) { + return jsonutils.Marshal(opts), nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 7a8649f11f..53def397c9 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1438,7 +1438,7 @@ sigs.k8s.io/structured-merge-diff/v4/value # sigs.k8s.io/yaml v1.2.0 ## explicit; go 1.12 sigs.k8s.io/yaml -# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230818091626-4820b3349fb8 +# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20230821061444-8327b119ec8b ## explicit; go 1.18 yunion.io/x/cloudmux/pkg/apis yunion.io/x/cloudmux/pkg/apis/billing diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/project.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/project.go index 47b7af1ca4..d8edd7c56d 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/project.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/project.go @@ -77,7 +77,7 @@ func (client *SQcloudClient) GetProjects(offset, limit int) ([]SProject, int, er if limit < 1 || limit > 1000 { limit = 1000 } - params := map[string]string{"AllList": "1"} + params := map[string]string{"AllList": "0"} params["Limit"] = fmt.Sprintf("%d", limit) params["Offset"] = fmt.Sprintf("%d", offset)