mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/yunionio/cloudpods.git
synced 2026-09-20 08:03:53 +08:00
Merge pull request #2543 from ioito/automated-cherry-pick-of-#2512-upstream-release-2.12
Automated cherry pick of #2512: fix: add external perform change-project
This commit is contained in:
@@ -57,10 +57,10 @@ func init() {
|
||||
PROJECT string `help:"Local project ID or Name"`
|
||||
}
|
||||
|
||||
R(&ExternalProjectUpdateOptions{}, "external-project-update", "Update external project point to local project", func(s *mcclient.ClientSession, args *ExternalProjectUpdateOptions) error {
|
||||
R(&ExternalProjectUpdateOptions{}, "external-project-change-project", "Change external project point to local project", func(s *mcclient.ClientSession, args *ExternalProjectUpdateOptions) error {
|
||||
params := jsonutils.NewDict()
|
||||
params.Add(jsonutils.NewString(args.PROJECT), "project")
|
||||
result, err := modules.ExternalProjects.Update(s, args.ID, params)
|
||||
result, err := modules.ExternalProjects.PerformAction(s, args.ID, "change-project", params)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ package models
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
@@ -28,6 +27,7 @@ import (
|
||||
"yunion.io/x/onecloud/pkg/cloudprovider"
|
||||
"yunion.io/x/onecloud/pkg/httperrors"
|
||||
"yunion.io/x/onecloud/pkg/mcclient"
|
||||
"yunion.io/x/onecloud/pkg/util/logclient"
|
||||
"yunion.io/x/sqlchemy"
|
||||
)
|
||||
|
||||
@@ -58,8 +58,6 @@ type SExternalProject struct {
|
||||
db.SProjectizedResourceBase
|
||||
|
||||
db.SExternalizedResourceBase
|
||||
|
||||
//ProjectId string `name:"tenant_id" width:"128" charset:"ascii" nullable:"true" list:"admin" update:"admin"`
|
||||
}
|
||||
|
||||
func (manager *SExternalProjectManager) AllowListItems(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) bool {
|
||||
@@ -67,21 +65,7 @@ func (manager *SExternalProjectManager) AllowListItems(ctx context.Context, user
|
||||
}
|
||||
|
||||
func (self *SExternalProject) AllowUpdateItem(ctx context.Context, userCred mcclient.TokenCredential) bool {
|
||||
return db.IsAdminAllowUpdate(userCred, self)
|
||||
}
|
||||
|
||||
func (self *SExternalProject) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
|
||||
if project := jsonutils.GetAnyString(data, []string{"project_id", "project", "tenant_id", "tenant"}); len(project) > 0 {
|
||||
_project, err := db.TenantCacheManager.FetchByIdOrName(userCred, project)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, httperrors.NewTenantNotFoundError("tenant %s not find", project)
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
data.Set("tenant_id", jsonutils.NewString(_project.GetId()))
|
||||
}
|
||||
return self.SStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, data)
|
||||
return false
|
||||
}
|
||||
|
||||
func (manager *SExternalProjectManager) getProjectsByProviderId(providerId string) ([]SExternalProject, error) {
|
||||
@@ -236,6 +220,58 @@ func (manager *SExternalProjectManager) newFromCloudProject(ctx context.Context,
|
||||
return &project, nil
|
||||
}
|
||||
|
||||
func (self *SExternalProject) AllowPerformChangeProject(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
|
||||
return db.IsAdminAllowPerform(userCred, self, "change-project")
|
||||
}
|
||||
|
||||
func (self *SExternalProject) PerformChangeProject(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
project, err := data.GetString("project")
|
||||
if err != nil {
|
||||
return nil, httperrors.NewMissingParameterError("project")
|
||||
}
|
||||
|
||||
tenant, err := db.TenantCacheManager.FetchTenantByIdOrName(ctx, project)
|
||||
if err != nil {
|
||||
return nil, httperrors.NewNotFoundError("project %s not found", project)
|
||||
}
|
||||
|
||||
if self.ProjectId == tenant.Id {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
if self.DomainId != tenant.DomainId {
|
||||
return nil, httperrors.NewForbiddenError("not allow change project across domain")
|
||||
}
|
||||
|
||||
notes := struct {
|
||||
OldProjectId string
|
||||
OldDomainId string
|
||||
NewProjectId string
|
||||
NewProject string
|
||||
NewDomainId string
|
||||
NewDomain string
|
||||
}{
|
||||
OldProjectId: self.ProjectId,
|
||||
OldDomainId: self.DomainId,
|
||||
NewProjectId: tenant.Id,
|
||||
NewProject: tenant.Name,
|
||||
NewDomainId: tenant.DomainId,
|
||||
NewDomain: tenant.Domain,
|
||||
}
|
||||
|
||||
_, err = db.Update(self, func() error {
|
||||
self.ProjectId = tenant.Id
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
log.Errorf("Update external project error: %v", err)
|
||||
return nil, httperrors.NewGeneralError(err)
|
||||
}
|
||||
|
||||
logclient.AddSimpleActionLog(self, logclient.ACT_CHANGE_OWNER, notes, userCred, true)
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (manager *SExternalProjectManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) {
|
||||
var err error
|
||||
q, err = managedResourceFilterByAccount(q, query, "", nil)
|
||||
|
||||
Reference in New Issue
Block a user