Skip to content

Commit a6f718e

Browse files
authored
Merge pull request #6603 from opsmill/pog-refactor-action-schema-IFC-1559
Replace boolean options with more descriptive dropdowns
2 parents 989a354 + 2e4b1b3 commit a6f718e

File tree

7 files changed

+133
-35
lines changed

7 files changed

+133
-35
lines changed

backend/infrahub/actions/constants.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,93 @@ def from_value(cls, value: str) -> BranchScope:
4646
raise NotImplementedError(f"The defined value {value} doesn't match a branch scope")
4747

4848

49+
class MemberAction(Enum):
50+
ADD_MEMBER = DropdownChoice(
51+
name="add_member",
52+
label="Add member",
53+
description="Add impacted member to the selected group",
54+
color="#86efac",
55+
)
56+
REMOVE_MEMBER = DropdownChoice(
57+
name="remove_member",
58+
label="Remove member",
59+
description="Remove impacted member from the selected group",
60+
color="#fef08a",
61+
)
62+
63+
@classmethod
64+
def available_types(cls) -> list[DropdownChoice]:
65+
return [cls.__members__[member].value for member in list(cls.__members__)]
66+
67+
@classmethod
68+
def from_value(cls, value: str) -> MemberAction:
69+
for member in cls.__members__:
70+
if value == cls.__members__[member].value.name:
71+
return cls.__members__[member]
72+
73+
raise NotImplementedError(f"The defined value {value} doesn't match a member action")
74+
75+
76+
class MemberUpdate(Enum):
77+
ADDED = DropdownChoice(
78+
name="added",
79+
label="Added",
80+
description="Trigger when members are added to this group",
81+
color="#86efac",
82+
)
83+
REMOVED = DropdownChoice(
84+
name="removed",
85+
label="Removed",
86+
description="Trigger when members are removed from this group",
87+
color="#fef08a",
88+
)
89+
90+
@classmethod
91+
def available_types(cls) -> list[DropdownChoice]:
92+
return [cls.__members__[member].value for member in list(cls.__members__)]
93+
94+
@classmethod
95+
def from_value(cls, value: str) -> MemberUpdate:
96+
for member in cls.__members__:
97+
if value == cls.__members__[member].value.name:
98+
return cls.__members__[member]
99+
100+
raise NotImplementedError(f"The defined value {value} doesn't match a MemberUpdate")
101+
102+
103+
class RelationshipMatch(Enum):
104+
ADDED = DropdownChoice(
105+
name="added",
106+
label="Added",
107+
description="Check if the selected relationship was added",
108+
color="#86efac",
109+
)
110+
REMOVED = DropdownChoice(
111+
name="removed",
112+
label="Removed",
113+
description="Check if the selected relationship was removed",
114+
color="#fef08a",
115+
)
116+
UPDATED = DropdownChoice(
117+
name="updated",
118+
label="Updated",
119+
description="Check if the selected relationship was updated, added or removed.",
120+
color="#e5e7eb",
121+
)
122+
123+
@classmethod
124+
def available_types(cls) -> list[DropdownChoice]:
125+
return [cls.__members__[member].value for member in list(cls.__members__)]
126+
127+
@classmethod
128+
def from_value(cls, value: str) -> RelationshipMatch:
129+
for member in cls.__members__:
130+
if value == cls.__members__[member].value.name:
131+
return cls.__members__[member]
132+
133+
raise NotImplementedError(f"The defined value {value} doesn't match a RelationshipMatch")
134+
135+
49136
class ValueMatch(Enum):
50137
VALUE = DropdownChoice(
51138
name="value",

backend/infrahub/actions/gather.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ async def gather_trigger_action_rules(db: InfrahubDatabase) -> list[ActionTrigge
4646
},
4747
"... on CoreNodeTriggerRelationshipMatch": {
4848
"relationship_name": {"value": None},
49-
"added": {"value": None},
49+
"modification_type": {"value": None},
5050
"peer": {"value": None},
5151
},
5252
}
5353
}
5454
},
5555
},
5656
"... on CoreGroupTriggerRule": {
57-
"members_added": {"value": None},
57+
"member_update": {"value": None},
5858
"group": {
5959
"node": {
6060
"id": None,
@@ -68,7 +68,7 @@ async def gather_trigger_action_rules(db: InfrahubDatabase) -> list[ActionTrigge
6868
"id": None,
6969
"name": {"value": None},
7070
"... on CoreGroupAction": {
71-
"add_members": {"value": None},
71+
"member_action": {"value": None},
7272
"group": {
7373
"node": {
7474
"id": None,

backend/infrahub/actions/models.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
REMOVE_ADD_NODE_FROM_GROUP,
2424
)
2525

26-
from .constants import BranchScope, ValueMatch
26+
from .constants import BranchScope, MemberAction, MemberUpdate, RelationshipMatch, ValueMatch
2727

2828

2929
class EventGroupMember(BaseModel):
@@ -40,7 +40,7 @@ class CoreGeneratorAction(CoreAction):
4040

4141

4242
class CoreGroupAction(CoreAction):
43-
add_members: bool
43+
member_action: MemberAction
4444
group_id: str
4545

4646

@@ -52,7 +52,7 @@ class CoreTriggerRule(BaseModel):
5252

5353

5454
class CoreGroupTriggerRule(CoreTriggerRule):
55-
members_added: bool
55+
member_update: MemberUpdate
5656
group_id: str
5757
group_kind: str
5858

@@ -70,7 +70,7 @@ class CoreNodeTriggerAttributeMatch(CoreNodeTriggerMatch):
7070

7171
class CoreNodeTriggerRelationshipMatch(CoreNodeTriggerMatch):
7272
relationship_name: str
73-
added: bool
73+
modification_type: RelationshipMatch
7474
peer: str | None
7575

7676

@@ -135,14 +135,16 @@ def _from_node_trigger(
135135
match_related["infrahub.attribute.value_previous"] = match.value_previous or ""
136136

137137
elif isinstance(match, CoreNodeTriggerRelationshipMatch):
138-
peer_status = "added" if match.added else "removed"
139138
match_related = {
140139
"prefect.resource.role": "infrahub.node.relationship_update",
141140
"infrahub.field.name": match.relationship_name,
142-
"infrahub.relationship.peer_status": peer_status,
143141
}
144142
if isinstance(match.peer, str):
145143
match_related["infrahub.relationship.peer_id"] = match.peer
144+
145+
if match.modification_type != RelationshipMatch.UPDATED:
146+
match_related["infrahub.relationship.peer_status"] = match.modification_type.value.name
147+
146148
related_matches.append(match_related)
147149

148150
event_trigger.match_related = related_matches or {}
@@ -164,7 +166,7 @@ def _from_node_trigger(
164166
},
165167
)
166168
elif isinstance(trigger_rule.action, CoreGroupAction):
167-
if trigger_rule.action.add_members:
169+
if trigger_rule.action.member_action == MemberAction.ADD_MEMBER:
168170
flow = ACTION_ADD_NODE_TO_GROUP
169171
else:
170172
flow = REMOVE_ADD_NODE_FROM_GROUP
@@ -198,7 +200,7 @@ def _from_group_trigger(
198200
) -> Self:
199201
event_trigger = EventTrigger()
200202

201-
if trigger_rule.members_added:
203+
if trigger_rule.member_update == MemberUpdate.ADDED:
202204
event_trigger.events.add(GroupMemberAddedEvent.event_name)
203205
else:
204206
event_trigger.events.add(GroupMemberRemovedEvent.event_name)

backend/infrahub/actions/parsers.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from infrahub.core.constants import InfrahubKind
44

5-
from .constants import BranchScope, ValueMatch
5+
from .constants import BranchScope, MemberAction, MemberUpdate, RelationshipMatch, ValueMatch
66
from .models import (
77
CoreAction,
88
CoreGeneratorAction,
@@ -35,14 +35,14 @@ def _parse_graphql_node(data: dict[str, Any]) -> CoreTriggerRule | None:
3535
action = _parse_graphql_action_response(data=data["action"]["node"])
3636
match typename:
3737
case "CoreGroupTriggerRule":
38-
members_added = data["members_added"]["value"]
38+
member_update = MemberUpdate.from_value(data["member_update"]["value"])
3939
group_id = data["group"]["node"]["id"]
4040
group_kind = data["group"]["node"]["__typename"]
4141
return CoreGroupTriggerRule(
4242
name=name,
4343
branch_scope=branch_scope,
4444
action=action,
45-
members_added=members_added,
45+
member_update=member_update,
4646
group_id=group_id,
4747
group_kind=group_kind,
4848
active=active,
@@ -70,9 +70,9 @@ def _parse_graphql_action_response(data: dict[str, Any]) -> CoreAction:
7070
generator_id = data["generator"]["node"]["id"]
7171
return CoreGeneratorAction(generator_id=generator_id)
7272
case "CoreGroupAction":
73-
add_members = data["add_members"]["value"]
73+
member_action = MemberAction.from_value(data["member_action"]["value"])
7474
group_id = data["group"]["node"]["id"]
75-
return CoreGroupAction(add_members=add_members, group_id=group_id)
75+
return CoreGroupAction(member_action=member_action, group_id=group_id)
7676

7777
raise NotImplementedError(f"{typename} is not a valid CoreAction")
7878

@@ -96,7 +96,7 @@ def _parse_node_trigger_matches(data: list[dict[str, Any]]) -> list[CoreNodeTrig
9696
matches.append(
9797
CoreNodeTriggerRelationshipMatch(
9898
relationship_name=node["relationship_name"]["value"],
99-
added=node["added"]["value"],
99+
modification_type=RelationshipMatch.from_value(node["modification_type"]["value"]),
100100
peer=node["peer"]["value"],
101101
)
102102
)

backend/infrahub/actions/schema.py

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
from infrahub.actions.constants import BranchScope, NodeAction, ValueMatch
1+
from infrahub.actions.constants import (
2+
BranchScope,
3+
MemberAction,
4+
MemberUpdate,
5+
NodeAction,
6+
RelationshipMatch,
7+
ValueMatch,
8+
)
29
from infrahub.core.constants import AllowOverrideType, BranchSupportType, InfrahubKind
310
from infrahub.core.constants import RelationshipCardinality as Cardinality
411
from infrahub.core.constants import RelationshipKind as RelKind
@@ -182,12 +189,13 @@
182189
inherit_from=[InfrahubKind.ACTION],
183190
attributes=[
184191
Attr(
185-
name="add_members",
186-
kind="Boolean",
192+
name="member_action",
193+
kind="Dropdown",
187194
description="Defines if the action should add or remove members from a group when triggered",
195+
choices=MemberAction.available_types(),
196+
default_value=MemberAction.ADD_MEMBER.value.name,
188197
unique=False,
189198
optional=False,
190-
default_value=True,
191199
order_weight=300,
192200
),
193201
],
@@ -321,13 +329,14 @@
321329
order_weight=100,
322330
),
323331
Attr(
324-
name="added",
325-
kind="Boolean",
326-
description="Indicates if the relationship was added or removed",
327-
unique=False,
332+
name="modification_type",
333+
kind="Dropdown",
334+
description="Indicates if the relationship was added or removed or just updated in any way",
335+
choices=RelationshipMatch.available_types(),
336+
default_value=RelationshipMatch.ADDED.value.name,
328337
optional=False,
329-
default_value=True,
330338
order_weight=200,
339+
allow_override=AllowOverrideType.NONE,
331340
),
332341
Attr(
333342
name="peer",
@@ -358,12 +367,12 @@
358367
inherit_from=[InfrahubKind.TRIGGERRULE],
359368
attributes=[
360369
Attr(
361-
name="members_added",
362-
kind="Boolean",
370+
name="member_update",
371+
kind="Dropdown",
363372
description="Indicate if the match should be for when members are added or removed",
364-
unique=False,
373+
choices=MemberUpdate.available_types(),
374+
default_value=MemberUpdate.ADDED.value.name,
365375
optional=False,
366-
default_value=True,
367376
order_weight=300,
368377
),
369378
],

backend/infrahub/core/protocols.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,12 +403,12 @@ class CoreGraphQLQueryGroup(CoreGroup):
403403

404404

405405
class CoreGroupAction(CoreAction):
406-
add_members: Boolean
406+
member_action: Dropdown
407407
group: RelationshipManager
408408

409409

410410
class CoreGroupTriggerRule(CoreTriggerRule):
411-
members_added: Boolean
411+
member_update: Dropdown
412412
group: RelationshipManager
413413

414414

@@ -440,7 +440,7 @@ class CoreNodeTriggerAttributeMatch(CoreNodeTriggerMatch):
440440

441441
class CoreNodeTriggerRelationshipMatch(CoreNodeTriggerMatch):
442442
relationship_name: String
443-
added: Boolean
443+
modification_type: Dropdown
444444
peer: StringOptional
445445

446446

backend/tests/unit/actions/test_gather.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ async def test_gather_trigger_gather_trigger_action_rules_node_relationship(
250250
],
251251
)
252252

253-
relationship_match.added.value = False
253+
relationship_match.modification_type.value = "removed"
254254
await relationship_match.save(db=db)
255255

256256
triggers = await gather_trigger_action_rules(db=db)
@@ -357,7 +357,7 @@ async def test_gather_trigger_gather_trigger_action_rules_group_generators(
357357
action = automation.actions[0]
358358
assert action.parameters["generator_definition_id"] == generator_definition.id
359359

360-
group_trigger.members_added.value = False
360+
group_trigger.member_update.value = "removed"
361361
group_trigger.branch_scope.value = "other_branches"
362362
await group_trigger.save(db=db)
363363

0 commit comments

Comments
 (0)