fix: shared resource should not be deletable

This commit is contained in:
Qiu Jian
2020-05-07 01:37:41 +08:00
parent 68bcd4f6e5
commit 6f3e18930e
6 changed files with 44 additions and 22 deletions
+7
View File
@@ -265,3 +265,10 @@ func (model *SInfrasResourceBase) GetSharableTargetDomainIds() []string {
func (model *SInfrasResourceBase) GetRequiredSharedDomainIds() []string {
return []string{model.DomainId}
}
func (model *SInfrasResourceBase) ValidateDeleteCondition(ctx context.Context) error {
if model.IsShared() {
return httperrors.NewForbiddenError("%s %s is shared", model.Keyword(), model.Name)
}
return model.SDomainLevelResourceBase.ValidateDeleteCondition(ctx)
}
+8
View File
@@ -531,6 +531,14 @@ func SharableModelIsShared(model ISharableBaseModel) bool {
if cnt > 0 {
return true
}
switch model.GetPublicScope() {
case rbacutils.ScopeSystem:
return true
case rbacutils.ScopeDomain:
if model.GetModelManager().ResourceScope() == rbacutils.ScopeProject {
return true
}
}
return false
}
+7
View File
@@ -252,3 +252,10 @@ func (model *SSharableVirtualResourceBase) GetSharableTargetDomainIds() []string
func (model *SSharableVirtualResourceBase) GetRequiredSharedDomainIds() []string {
return []string{model.DomainId}
}
func (model *SSharableVirtualResourceBase) ValidateDeleteCondition(ctx context.Context) error {
if model.IsShared() {
return httperrors.NewForbiddenError("%s %s is shared", model.Keyword(), model.Name)
}
return model.SVirtualResourceBase.ValidateDeleteCondition(ctx)
}
+2 -2
View File
@@ -145,7 +145,7 @@ func (self *SVpc) ValidateDeleteCondition(ctx context.Context) error {
if self.Id == api.DEFAULT_VPC_ID {
return httperrors.NewProtectedResourceError("not allow to delete default vpc")
}
return self.SStandaloneResourceBase.ValidateDeleteCondition(ctx)
return self.SEnabledStatusInfrasResourceBase.ValidateDeleteCondition(ctx)
}
func (self *SVpc) getWireQuery() *sqlchemy.SQuery {
@@ -845,7 +845,7 @@ func (manager *SVpcManager) ListItemFilter(
q, err = manager.SEnabledStatusInfrasResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusInfrasResourceBaseListInput)
if err != nil {
return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemFilter")
return nil, errors.Wrap(err, "SEnabledStatusInfrasResourceBaseManager.ListItemFilter")
}
q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput)
+3 -3
View File
@@ -91,7 +91,7 @@ func (manager *SGuestImageManager) ValidateCreateData(ctx context.Context, userC
func (gi *SGuestImage) CustomizeCreate(ctx context.Context, userCred mcclient.TokenCredential,
ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) error {
err := gi.SVirtualResourceBase.CustomizeCreate(ctx, userCred, ownerId, query, data)
err := gi.SSharableVirtualResourceBase.CustomizeCreate(ctx, userCred, ownerId, query, data)
if err != nil {
return err
}
@@ -188,7 +188,7 @@ func (gi *SGuestImage) RealDelete(ctx context.Context, userCred mcclient.TokenCr
for i := range guestJoints {
guestJoints[i].Delete(ctx, userCred)
}
return gi.SVirtualResourceBase.Delete(ctx, userCred)
return gi.SSharableVirtualResourceBase.Delete(ctx, userCred)
}
func (gi *SGuestImage) CustomizeDelete(ctx context.Context, userCred mcclient.TokenCredential,
@@ -262,7 +262,7 @@ func (gi *SGuestImage) DoCancelPendingDelete(ctx context.Context, userCred mccli
return errors.Wrapf(err, "subimage %s cancel delete error", subImages[i].GetId())
}
}
err = gi.SVirtualResourceBase.DoCancelPendingDelete(ctx, userCred)
err = gi.SSharableVirtualResourceBase.DoCancelPendingDelete(ctx, userCred)
if err != nil {
return err
}
+17 -17
View File
@@ -141,7 +141,7 @@ type SImage struct {
}
func (manager *SImageManager) CustomizeHandlerInfo(info *appsrv.SHandlerInfo) {
manager.SVirtualResourceBaseManager.CustomizeHandlerInfo(info)
manager.SSharableVirtualResourceBaseManager.CustomizeHandlerInfo(info)
switch info.GetName(nil) {
case "get_details", "create", "update":
@@ -373,12 +373,12 @@ func (self *SImage) GetExtraDetailsHeaders(ctx context.Context, userCred mcclien
}
func (manager *SImageManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
input := apis.VirtualResourceCreateInput{}
input := apis.SharableVirtualResourceCreateInput{}
err := data.Unmarshal(&input)
if err != nil {
return nil, httperrors.NewInternalServerError("unmarshal StandaloneResourceCreateInput fail %s", err)
}
input, err = manager.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input)
input, err = manager.SSharableVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input)
if err != nil {
return nil, err
}
@@ -400,7 +400,7 @@ func (manager *SImageManager) ValidateCreateData(ctx context.Context, userCred m
}
func (self *SImage) CustomizeCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) error {
err := self.SVirtualResourceBase.CustomizeCreate(ctx, userCred, ownerId, query, data)
err := self.SSharableVirtualResourceBase.CustomizeCreate(ctx, userCred, ownerId, query, data)
if err != nil {
return err
}
@@ -532,7 +532,7 @@ func (self *SImage) SaveImageFromStream(reader io.Reader, calChecksum bool) erro
}
func (self *SImage) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) {
self.SVirtualResourceBase.PostCreate(ctx, userCred, ownerId, query, data)
self.SSharableVirtualResourceBase.PostCreate(ctx, userCred, ownerId, query, data)
// if SImage belong to a guest image, pending quota will not be set.
if self.IsGuestImage.IsFalse() {
@@ -651,14 +651,14 @@ func (self *SImage) ValidateUpdateData(ctx context.Context, userCred mcclient.To
}
}
}
input := apis.VirtualResourceBaseUpdateInput{}
input := apis.SharableVirtualResourceBaseUpdateInput{}
err := data.Unmarshal(&input)
if err != nil {
return nil, errors.Wrap(err, "Unmarshal")
}
input, err = self.SVirtualResourceBase.ValidateUpdateData(ctx, userCred, query, input)
input, err = self.SSharableVirtualResourceBase.ValidateUpdateData(ctx, userCred, query, input)
if err != nil {
return nil, errors.Wrap(err, "SVirtualResourceBase.ValidateUpdateData")
return nil, errors.Wrap(err, "SSharableVirtualResourceBase.ValidateUpdateData")
}
data.Update(jsonutils.Marshal(input))
@@ -666,11 +666,11 @@ func (self *SImage) ValidateUpdateData(ctx context.Context, userCred mcclient.To
}
func (self *SImage) PreUpdate(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) {
self.SVirtualResourceBase.PreUpdate(ctx, userCred, query, data)
self.SSharableVirtualResourceBase.PreUpdate(ctx, userCred, query, data)
}
func (self *SImage) PostUpdate(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) {
self.SVirtualResourceBase.PostUpdate(ctx, userCred, query, data)
self.SSharableVirtualResourceBase.PostUpdate(ctx, userCred, query, data)
if data.Contains("properties") {
// update properties
@@ -702,10 +702,10 @@ func (self *SImage) ValidateDeleteCondition(ctx context.Context) error {
if self.IsGuestImage.IsTrue() {
return httperrors.NewForbiddenError("image is the part of guest image")
}
if self.IsShared() {
return httperrors.NewForbiddenError("image is shared")
}
return self.SVirtualResourceBase.ValidateDeleteCondition(ctx)
// if self.IsShared() {
// return httperrors.NewForbiddenError("image is shared")
// }
return self.SSharableVirtualResourceBase.ValidateDeleteCondition(ctx)
}
func (self *SImage) Delete(ctx context.Context, userCred mcclient.TokenCredential) error {
@@ -714,7 +714,7 @@ func (self *SImage) Delete(ctx context.Context, userCred mcclient.TokenCredentia
}
func (self *SImage) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
return self.SVirtualResourceBase.Delete(ctx, userCred)
return self.SSharableVirtualResourceBase.Delete(ctx, userCred)
}
func (self *SImage) CustomizeDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) error {
@@ -838,7 +838,7 @@ func (manager *SImageManager) CleanPendingDeleteImages(ctx context.Context, user
}
func (self *SImage) DoPendingDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
err := self.SVirtualResourceBase.DoPendingDelete(ctx, userCred)
err := self.SSharableVirtualResourceBase.DoPendingDelete(ctx, userCred)
if err != nil {
return err
}
@@ -850,7 +850,7 @@ func (self *SImage) DoPendingDelete(ctx context.Context, userCred mcclient.Token
}
func (self *SImage) DoCancelPendingDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
err := self.SVirtualResourceBase.DoCancelPendingDelete(ctx, userCred)
err := self.SSharableVirtualResourceBase.DoCancelPendingDelete(ctx, userCred)
if err != nil {
return err
}