Merge pull request #1292 from wanyaoqi/bugfix/wyq/unshare-porjects-on-change-owner

unshare projects on change owner
This commit is contained in:
Zexi Li
2019-06-18 23:57:33 +08:00
committed by GitHub
3 changed files with 41 additions and 15 deletions
+6 -15
View File
@@ -144,6 +144,9 @@ func (model *SSharableVirtualResourceBase) PerformPublic(ctx context.Context, us
if tenant.DomainId != model.DomainId {
return nil, httperrors.NewBadRequestError("can't shared project to other domain")
}
if tenant.GetId() == model.ProjectId {
return nil, httperrors.NewBadRequestError("Can't share project to yourself")
}
nps = append(nps, tenant.GetId())
if _, ok := ops[tenant.GetId()]; !ok {
addProjects = append(addProjects, tenant.GetId())
@@ -232,21 +235,9 @@ func (model *SSharableVirtualResourceBase) PerformPrivate(ctx context.Context, u
return nil, httperrors.NewInternalServerError("Update shared resource error: %s", err)
}
}
srs := make([]SSharedResource, 0)
q := SharedResourceManager.Query()
err := q.Filter(sqlchemy.AND(
sqlchemy.Equals(q.Field("owner_project_id"), model.ProjectId),
sqlchemy.Equals(q.Field("resource_id"), model.GetId()),
sqlchemy.Equals(q.Field("resource_type"), model.GetModelManager().Keyword()),
)).All(&srs)
if err != nil {
return nil, httperrors.NewInternalServerError("Fetch project error %s", err)
}
for i := 0; i < len(srs); i++ {
srs[i].SetModelManager(SharedResourceManager, &srs[i])
if err := srs[i].Delete(ctx, userCred); err != nil {
return nil, httperrors.NewInternalServerError("Unshare project failed %s", err)
}
if err := SharedResourceManager.CleanModelSharedProjects(ctx, userCred, &model.SVirtualResourceBase); err != nil {
return nil, err
}
model.GetIStandaloneModel().ClearSchedDescCache()
return nil, nil
+28
View File
@@ -1,5 +1,13 @@
package db
import (
"context"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/sqlchemy"
)
// sharing resoure between project
type SSharedResource struct {
SResourceBase
@@ -28,3 +36,23 @@ func init() {
),
}
}
func (manager *SSharedResourceManager) CleanModelSharedProjects(ctx context.Context, userCred mcclient.TokenCredential, model *SVirtualResourceBase) error {
srs := make([]SSharedResource, 0)
q := manager.Query()
err := q.Filter(sqlchemy.AND(
sqlchemy.Equals(q.Field("owner_project_id"), model.ProjectId),
sqlchemy.Equals(q.Field("resource_id"), model.GetId()),
sqlchemy.Equals(q.Field("resource_type"), model.GetModelManager().Keyword()),
)).All(&srs)
if err != nil {
return httperrors.NewInternalServerError("Fetch project error %s", err)
}
for i := 0; i < len(srs); i++ {
srs[i].SetModelManager(manager, &srs[i])
if err := srs[i].Delete(ctx, userCred); err != nil {
return httperrors.NewInternalServerError("Unshare project failed %s", err)
}
}
return nil
}
+7
View File
@@ -329,6 +329,12 @@ func (model *SVirtualResourceBase) PerformChangeOwner(ctx context.Context, userC
formerObj := NewTenant(model.ProjectId, "unknown", model.DomainId, "unknown")
former = &formerObj
}
// clean shared projects before update project id
if err := SharedResourceManager.CleanModelSharedProjects(ctx, userCred, model); err != nil {
return nil, err
}
_, err = Update(model, func() error {
model.DomainId = ownerId.GetProjectDomainId()
model.ProjectId = ownerId.GetProjectId()
@@ -338,6 +344,7 @@ func (model *SVirtualResourceBase) PerformChangeOwner(ctx context.Context, userC
if err != nil {
return nil, err
}
OpsLog.SyncOwner(model, former, userCred)
notes := struct {
OldProjectId string