fix(cloudid): batch detach policy (#25163)

This commit is contained in:
屈轩
2026-07-16 19:08:08 +08:00
committed by GitHub
parent 25ec1683c8
commit a9761ea558
4 changed files with 71 additions and 26 deletions

View File

@@ -16,6 +16,12 @@ definitions:
description: 权限Id
type: string
x-go-name: CloudpolicyId
cloudpolicy_ids:
description: 权限Id列表
items:
type: string
type: array
x-go-name: CloudpolicyIds
type: object
x-go-package: yunion.io/x/onecloud/pkg/apis/cloudid
CloudgroupCreateInput:
@@ -95,6 +101,12 @@ definitions:
description: 权限Id
type: string
x-go-name: CloudpolicyId
cloudpolicy_ids:
description: 权限Id列表
items:
type: string
type: array
x-go-name: CloudpolicyIds
type: object
x-go-package: yunion.io/x/onecloud/pkg/apis/cloudid
CloudgroupDetails:

View File

@@ -122,6 +122,8 @@ type CloudgroupAttachPolicyInput struct {
// 权限Id
CloudpolicyId string `json:"cloudpolicy_id"`
// 权限Id列表
CloudpolicyIds []string `json:"cloudpolicy_ids"`
}
type CloudgroupSetUsersInput struct {
@@ -140,6 +142,8 @@ type CloudgroupDetachPolicyInput struct {
// 权限Id
CloudpolicyId string `json:"cloudpolicy_id"`
// 权限Id列表
CloudpolicyIds []string `json:"cloudpolicy_ids"`
}
type CloudgroupSyncstatusInput struct {

View File

@@ -692,25 +692,34 @@ func (self *SCloudgroup) PerformAttachPolicy(ctx context.Context, userCred mccli
if self.Status != apis.STATUS_AVAILABLE {
return nil, httperrors.NewInvalidStatusError("Can not attach policy in status %s", self.Status)
}
policyObj, err := validators.ValidateModel(ctx, userCred, CloudpolicyManager, &input.CloudpolicyId)
if err != nil {
return nil, err
policyIds := input.CloudpolicyIds
if len(input.CloudpolicyId) > 0 {
policyIds = append(policyIds, input.CloudpolicyId)
}
policy := policyObj.(*SCloudpolicy)
if policy.ManagerId != self.ManagerId || policy.CloudaccountId != self.CloudaccountId {
return nil, httperrors.NewConflictError("policy and groups do not belong to the same account")
}
_, err = self.GetCloudpolicy(input.CloudpolicyId)
if err == nil || errors.Cause(err) == sqlchemy.ErrDuplicateEntry {
return nil, httperrors.NewDuplicateResourceError("policy %s has aleady in this group", input.CloudpolicyId)
if len(policyIds) == 0 {
return nil, httperrors.NewMissingParameterError("cloudpolicy_ids")
}
add := []api.SPolicy{
{
add := []api.SPolicy{}
for i := range policyIds {
policyObj, err := validators.ValidateModel(ctx, userCred, CloudpolicyManager, &policyIds[i])
if err != nil {
return nil, err
}
policy := policyObj.(*SCloudpolicy)
if policy.ManagerId != self.ManagerId || policy.CloudaccountId != self.CloudaccountId {
return nil, httperrors.NewConflictError("policy and groups do not belong to the same account")
}
_, err = self.GetCloudpolicy(policy.Id)
if err == nil || errors.Cause(err) == sqlchemy.ErrDuplicateEntry {
return nil, httperrors.NewDuplicateResourceError("policy %s has aleady in this group", policy.Id)
}
add = append(add, api.SPolicy{
Name: policy.Name,
ExternalId: policy.ExternalId,
PolicyType: policy.PolicyType,
},
})
}
return nil, self.StartSetPoliciesTask(ctx, userCred, add, nil, "")
@@ -723,23 +732,35 @@ func (self *SCloudgroup) PerformDetachPolicy(ctx context.Context, userCred mccli
return nil, httperrors.NewInvalidStatusError("Can not detach policy in status %s", self.Status)
}
policObj, err := validators.ValidateModel(ctx, userCred, CloudpolicyManager, &input.CloudpolicyId)
if err != nil {
return nil, err
policyIds := input.CloudpolicyIds
if len(input.CloudpolicyId) > 0 {
policyIds = append(policyIds, input.CloudpolicyId)
}
policy := policObj.(*SCloudpolicy)
_, err = self.GetCloudpolicy(input.CloudpolicyId)
if err != nil && errors.Cause(err) == sql.ErrNoRows {
return nil, nil
if len(policyIds) == 0 {
return nil, httperrors.NewMissingParameterError("cloudpolicy_ids")
}
del := []api.SPolicy{
{
del := []api.SPolicy{}
for i := range policyIds {
policObj, err := validators.ValidateModel(ctx, userCred, CloudpolicyManager, &policyIds[i])
if err != nil {
return nil, err
}
policy := policObj.(*SCloudpolicy)
_, err = self.GetCloudpolicy(policy.Id)
if err != nil && errors.Cause(err) == sql.ErrNoRows {
continue
}
del = append(del, api.SPolicy{
Name: policy.Name,
ExternalId: policy.ExternalId,
PolicyType: policy.PolicyType,
},
})
}
if len(del) == 0 {
return nil, nil
}
return nil, self.StartSetPoliciesTask(ctx, userCred, nil, del, "")

View File

@@ -57,11 +57,19 @@ func (opts *CloudgroupIdOptions) Params() (jsonutils.JSONObject, error) {
type CloudgroupPolicyOptions struct {
CloudgroupIdOptions
CLOUDPOLICY_ID string `help:"Cloudpolicy Id"`
CLOUDPOLICY_ID string `help:"Cloudpolicy Id"`
CloudpolicyIds []string `help:"Cloudpolicy Ids"`
}
func (opts *CloudgroupPolicyOptions) Params() (jsonutils.JSONObject, error) {
return jsonutils.Marshal(map[string]string{"cloudpolicy_id": opts.CLOUDPOLICY_ID}), nil
params := jsonutils.NewDict()
if len(opts.CLOUDPOLICY_ID) > 0 {
params.Set("cloudpolicy_id", jsonutils.NewString(opts.CLOUDPOLICY_ID))
}
if len(opts.CloudpolicyIds) > 0 {
params.Set("cloudpolicy_ids", jsonutils.Marshal(opts.CloudpolicyIds))
}
return params, nil
}
type CloudgroupUserOptions struct {