From 8435ad48eab2cb693a41535b7a4dfc5a01b2eda4 Mon Sep 17 00:00:00 2001 From: Timmy Date: Thu, 13 Jul 2023 14:15:16 +0800 Subject: [PATCH] feat: aggregate_resource_types support any (#2085) --- saas/backend/apps/application/base_serializers.py | 2 +- saas/backend/trans/policy.py | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/saas/backend/apps/application/base_serializers.py b/saas/backend/apps/application/base_serializers.py index b9f2e6c07..095c5bee2 100644 --- a/saas/backend/apps/application/base_serializers.py +++ b/saas/backend/apps/application/base_serializers.py @@ -35,7 +35,7 @@ class AggActionSLZ(serializers.Serializer): class BaseAggActionListSLZ(serializers.Serializer): actions = serializers.ListField(label="操作策略", child=AggActionSLZ(label="策略"), allow_empty=False) aggregate_resource_types = serializers.ListField( - label="聚合资源类型列表", child=AggResourceTypeSLZ(label="聚合资源类型"), allow_empty=False + label="聚合资源类型列表", child=AggResourceTypeSLZ(label="聚合资源类型"), allow_empty=True ) diff --git a/saas/backend/trans/policy.py b/saas/backend/trans/policy.py index 7c9d93acc..e6f9c9ddf 100644 --- a/saas/backend/trans/policy.py +++ b/saas/backend/trans/policy.py @@ -11,7 +11,7 @@ 主要是将API请求里的操作或操作组合等权限数据,转换为PolicyBean或List[PolicyBean],便于进行下一步处理 """ from collections import defaultdict -from typing import Any, Dict, List +from typing import Any, Dict, List, Optional from pydantic.tools import parse_obj_as @@ -34,7 +34,9 @@ class PolicyTrans: action_biz = ActionBiz() action_check_biz = ActionCheckBiz() - def _gen_instance_condition_by_aggregate_resources(self, aggregate_resource_types: List[Dict]) -> ConditionBean: + def _gen_instance_condition_by_aggregate_resources( + self, aggregate_resource_types: List[Dict] + ) -> Optional[ConditionBean]: """ 将操作聚合里选择的资源实例转换为Policy里资源的Condition [{ @@ -46,6 +48,9 @@ def _gen_instance_condition_by_aggregate_resources(self, aggregate_resource_type ] }] """ + if not aggregate_resource_types: + return None + instance_beans: List[InstanceBean] = [] for aggregate_resource_type in aggregate_resource_types: system_id, resource_type_id, instances = ( @@ -67,7 +72,7 @@ def _gen_instance_condition_by_aggregate_resources(self, aggregate_resource_type return ConditionBean(instances=instance_beans, attributes=[]) def _gen_policy_by_action_and_condition( - self, action: ActionBean, condition: ConditionBean, expired_at: int + self, action: ActionBean, condition: Optional[ConditionBean], expired_at: int ) -> PolicyBean: """通过操作模型和选择里实例的Condition生成对应策略""" return PolicyBean( @@ -76,7 +81,9 @@ def _gen_policy_by_action_and_condition( ResourceGroup( id=gen_uuid(), related_resource_types=[ - RelatedResourceBean(system_id=rrt.system_id, type=rrt.id, condition=[condition]) + RelatedResourceBean( + system_id=rrt.system_id, type=rrt.id, condition=[condition] if condition else [] + ) for rrt in action.related_resource_types ], )