mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/yunionio/cloudpods.git
synced 2026-09-20 08:03:53 +08:00
fix(cloudid): batch detach policy (#25163)
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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, "")
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user